GenerateSaaS

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.

SurfaceWhereDefault
siteNameconfig.siteName"GenerateSaaS"
fullSiteNameconfig.fullSiteName"GenerateSaaS.com"
domainconfig.domain (bare, no protocol)"generatesaas.com"
baseUrlconfig.baseUrl (prefer BASE_URL env)"https://generatesaas.com"
logoconfig.logo{ main, square } SVGs
businessconfig.business{ name, address, registrationNumber }
phoneconfig.phone{ number, formatted }
socialconfig.socialx, youtube only
seoconfig.seo{ description, foundingDate }
landingsocialProofAvatars in packages/config/src/landing.ts5 placeholder webp faces
footergetFooterColumns() in packages/config/src/footer.tsi18n-keyed columns
All copyi18n translation filesen/*.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 logo width/height fall back to 184x184 for structured data.
  • social: add discord, linkedin, instagram, facebook, tiktok, pinterest, github, or telegram; absent links are hidden in the footer.
  • footer: columns are i18n-keyed (footer.columns.*); blog items carry enabled: config.blog.enabled and vanish when the blog is off. Legal links (/terms, /privacy, /cookies, /refund) and /contact are 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, not dashboard.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 / Placeholder marks (the demo.* and placeholder_* 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: socialProofAvatars in packages/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.

On this page