Customization
Rebrand the boilerplate by editing branding, logo, social, and SEO fields in @repo/config plus your English i18n copy - one source of truth per surface.
Branding and identity live in the config object exported from packages/config/src/index.ts (@repo/config); all user-facing copy lives in i18n translation files. Rebranding is mostly editing a handful of fields - each surface has a single source of truth, so one change propagates everywhere.
Brandable surfaces
Each surface has one source of truth. Change it there and it propagates everywhere.
| Surface | Where | Default |
|---|---|---|
| siteName | config.siteName | "GenerateSaaS" |
| fullSiteName | config.fullSiteName | "GenerateSaaS.com" |
| domain | config.domain (bare, no protocol) | "generatesaas.com" |
| baseUrl | config.baseUrl (prefer BASE_URL env) | "https://generatesaas.com" |
| logo | config.logo | { main, square } SVGs |
| business | config.business | { name, address, registrationNumber } |
| phone | config.phone | { number, formatted } |
| social | config.social | x, youtube only |
| seo | config.seo | { description, foundingDate } |
| landing | socialProofAvatars in packages/config/src/landing.ts | 5 placeholder webp faces |
| footer | getFooterColumns() in packages/config/src/footer.ts | i18n-keyed columns |
| All copy | i18n translation files | en/*.json |
Identity fields
Edit these top-level keys in packages/config/src/index.ts:
// @repo/config
export const config = {
siteName: "Acme", // short name in titles + UI
fullSiteName: "Acme.com",
domain: "acme.com", // bare domain, no protocol
baseUrl: process.env.BASE_URL ?? "https://acme.com",
indexable: true, // false on demo/staging to block SEO + sitemap
logo: { main: "/images/logo.svg", square: "/images/logo-square.svg" },
business: { name: "Acme Inc.", address: "...", registrationNumber: "..." },
phone: { number: "+1234567890", formatted: "+1 (234) 567 890" },
social: { x: "https://x.com/acme", youtube: "..." },
seo: { description: "...", foundingDate: "2024-01-01" },
// ...feature flags
};- logo / avatars: config holds the paths; replace the actual asset files in each app's public directory. Optional
logowidth/heightfall back to 184x184 for structured data. - social: add
discord,linkedin,instagram,facebook,tiktok,pinterest,github, ortelegram; absent links are hidden in the footer. - footer: columns are i18n-keyed (
footer.columns.*); blog items carryenabled: config.blog.enabledand vanish when the blog is off. Legal links (/terms,/privacy,/cookies,/refund) and/contactare static.
Use config.routes, never hardcoded paths
Reference config.routes.* for navigation and redirects so one change updates every link. Defaults: home: "/", auth: "/auth", loginRedirect: "/dashboard", dashboard: "/dashboard", pricing: "/pricing", onboarding: "/onboarding", settings: "/settings/profile", notifications: "/notifications", admin: "/admin/users".
Stay update-friendly
You own this code - build anything you want. To keep generatesaas update clean, source identity from config and i18n instead of hardcoding:
- Brand name:
config.siteName, never a literal. - Copy: generic i18n keys (
dashboard.welcome_message, notdashboard.welcome_to_acme).
Config values stay yours; restaged shared files merge cleanly. Rewrite shared files freely - you just resolve those diffs on update. See the update guide.
Replace the placeholder content
Sample content ships so the app looks alive. Swap it for yours:
- Dashboard badges:
Demo/Placeholdermarks (thedemo.*andplaceholder_*keys) on the usage and recent-activity cards. Wire to real data, drop the badges. - Landing demo video: plays a placeholder clip. Point it at yours or remove the section.
- Social-proof faces:
socialProofAvatarsinpackages/config/src/landing.ts- placeholder webps.
Hide a feature by toggling its flag, not by deleting UI. Disabled features (config.blog, config.payment, config.notifications, …) already hide themselves when their enabled flag is false.
Edit only en/*.json under packages/i18n/translations/ - other locales are generated from en. See Internationalization for the translate pipeline.
Frequently asked questions
Where do I change the app name?
Set config.siteName once. It flows into page titles, metadata, emails, and the navbar automatically.
Why edit only en/*.json?
Other locales are auto-generated from English by the translation pipeline; editing them directly gets overwritten.
How do I keep generatesaas update painless?
Drive branding and copy from config + i18n, not hardcoded values - restaged files then merge cleanly. Your AI assistant walks any rewritten boilerplate diff-by-diff. See the update guide.
Where are colors, fonts, and dark mode?
Those are theming concerns, not @repo/config. See the theming guide below.
Configuration
Every config key and default, plus how feature flags gate the app.
Theming
Colors, fonts, dark mode, and the theme switcher.
Internationalization
Translation files, scopes, and the locale pipeline.
Marketing & SEO
Landing sections, metadata, and search visibility.
Updates
Pull the latest boilerplate version while keeping your customizations.