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.
Quick swaps via siteConfig.ui
Two pre-built switches you flip without writing a single line of CSS — they
exist because the underlying change is cross-cutting and easy to get wrong:
src/app/globals.css; nav recipes live in
src/components/layout/nav-styles.ts (each preset documents the source
site it’s modeled on). Add a new preset by extending the file — the
TypeScript union narrows automatically.
Customize with AI
Vibestrap ships intentionally few pre-built presets. Most block-level changes — the hero, pricing card, footer, button variant, card visual — are faster for an AI agent to generate than for a preset system to maintain. For the common ones,STYLES.md → AI swap recipes
ships copy-paste prompt templates that name the exact files and constraints.
Open the recipe for the block you want to change, paste the prompt into Claude
Code / Cursor / Codex, and the change usually lands in 2–5 minutes.
Recipes available:
- Swap the hero (terminal demo → centered headline / split-screen / video bg)
- Restyle the pricing card (single → two-card monthly+yearly / 3-tier / slider)
- Swap the feature-card visual (hard-border → soft-shadow / glass / gradient)
- Compact the footer (4-col → minimal one-row / mega-with-newsletter)
- Restyle the primary button (solid → outlined / gradient / ghost)
STYLES.md — same file, top of the document.
Brand identity
Editsrc/config/site.ts — the central config:
src/ai/pricing.ts for the pattern.
Colors (custom palette beyond the presets)
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.
Vibestrap is light-only — there is no .dark class and no system-mode toggle.
If you want a dark variant, see the dark-mode reference doc for a 5-step
opt-in recipe.
The default cream theme:
- Tweak a preset — edit the OKLCH values inside
.theme-cream(or.theme-white/.theme-ash) inglobals.css. shadcn/ui components consume these tokens by name, so a single edit re-skins everything. - Add a new preset — duplicate one of the
.theme-*blocks under a new name, then extend the union insiteConfig.ui.themeto include it. The TypeScript types pick it up automatically.
--accent-tech and
--accent-tech-light together — the progress-bar gradient interpolates between
them.
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/credits showing the four common
pricing patterns. Replace prices, env names, and credit grants 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.