src/config/site.ts,
src/app/globals.css, and messages/{en,zh}.json. The rest is swapping logo
SVGs, editing email templates, and re-composing marketing blocks. This page is
the map.
Brand identity
Editsrc/config/site.ts — the central config:
src/ai/pricing.ts for the pattern.
Colors
Tailwind v4 reads tokens from@theme in src/app/globals.css. Every color is
OKLCH — perceptually uniform, predictable hue rotation,
copy-paste-friendly with the OKLCH color picker.
--primary,
--primary-foreground, --accent, --ring, and --chart-{1..5}. shadcn/ui
components consume these tokens by name, so a single edit re-skins everything.
Fonts
The default stack is Geist Sans + Geist Mono, loaded insrc/app/layout.tsx
via next/font/google:
next/font/google import. Update --font-sans / --font-mono in
globals.css to match the CSS variable name and you’re done — no Tailwind config
edit needed.
Marketing copy
All on-page copy lives inmessages/en.json and messages/zh.json under the
Home namespace. Both files must have identical key structure — next-intl
throws at build time if keys diverge.
Hero / features layout
The home page is a stack of independent blocks composed insrc/app/[locale]/(marketing)/page.tsx:
src/components/blocks/ reading from messages/{locale}.json — no prop wiring
across boundaries.
Pricing
Two distinct pricing surfaces insiteConfig:
For the vibestrap product itself (what you sell to your buyers):
promo.active to flip between the two. The hero, pricing block, and
checkout all read from activePriceCents() so a single edit propagates.
For your buyer’s downstream app (sample subscription + credit pack pricing
they show their own users):
/settings/billing and /settings/credits. Replace the sample
values with whatever your buyer’s product charges.
Logo
The default header and footer use theSparkles icon from lucide-react.
Replace it in two places:
src/components/layout/footer.tsx. For the OG image, replace
public/og.png (1200x630, PNG or JPG).
Email templates
React Email templates live insrc/mail/templates/:
verify-email.tsx— signup verification.welcome.tsx— sent after the user verifies.forgot-password.tsx— password reset link.
siteConfig.name,
siteConfig.mail.supportEmail) is already pulled in. To preview locally before
the email-dev script ships, trigger the auth flow and watch the dev console for
the rendered HTML.
Adding a locale
- Add the locale code to
src/config/site.ts: - Create
messages/ja.jsonmirroring the key structure ofen.json. - Translate every
*.zh.mdxto*.ja.mdxfor any docs you ship. - Done. URLs become
/ja/...automatically.
See also
- Configuration — every
siteConfigfield. - Architecture — how blocks, themes, and providers wire together.
- Env reference — keys that flip features on / off.