Get started
Configuration
One file sets the product name, plan, theme, emails, and auth URLs. Change it first. The rest of the site follows.
Open config.ts. This is the product control file. The landing page, metadata, checkout button, emails, and legal contact all read from it.
Product identity
| Key | What it changes |
|---|---|
appName | Header, emails, checkout button, metadata |
appDescription | Default meta description |
domainName | Host only, no https://. Used for canonical URLs and legal copy |
Plans
stripe.plans is the pricing section. Add objects to show more cards. Each plan needs:
priceId— fromNEXT_PUBLIC_STRIPE_PRICE_ID(or another public env var if you add a second plan)name,description,price, optionalpriceAnchorfeatures— bullets on the cardisFeatured— orange ring and Popular pill. Set this on one plan
The number on the hero comes from the featured plan.
Theme and layout
| Key | What it changes |
|---|---|
colors.theme | Default DaisyUI theme on <html data-theme>. dark or light |
colors.main | Browser chrome and the top progress bar. HEX, default #FF4F01 |
layout.column | Marketing column width: 5xl, 6xl, or 7xl |
Brand colour in CSS lives in app/globals.css as --color-primary. See Branding.
Email and support
| Key | What it changes |
|---|---|
resend.fromAdmin | The address sendEmail() actually uses |
resend.fromNoReply | Reserved. Not read by the mail helper today |
resend.supportEmail | Footer support link and legal contact. Leave empty to hide it |
Use your verified Resend domain in production. The test sender works locally. See Resend.
Auth URLs
| Key | What it changes |
|---|---|
auth.loginUrl | Sign-in page. Private routes and apiClient send people here after a 401 |
auth.callbackUrl | Where a successful login lands. Default /dashboard |
Crisp (optional)
Paste a Crisp site ID into crisp.id. onlyShowOnRoutes: ["/"] keeps the widget on the homepage only. ButtonSupport opens chat on other routes. Delete onlyShowOnRoutes to show chat everywhere. Skip Crisp entirely if supportEmail is enough.
Save the file and refresh. Name, plan, and theme should already match.