Skip to content

Configuration

AI Web Launcher centralizes brand identity in one file (src/config.ts) and theme tokens in one place (src/app/globals.css). Everything else is optional environment variables.

init fills most of this for you
pnpm run init sets appName, appDescription, domainName, the Resend addresses and colors.main from your answers to seven questions. Read this page for what it leaves alone (the pricing plans, the auth URLs and the theme tokens) and for editing any of it by hand afterwards. See the workflow for the first run.

src/config.ts

src/config.ts is the single source of truth for your brand. These are the tokens that matter:

src/config.ts
const config = {
  // REQUIRED
  appName: "AI Web Launcher",
  appDescription: "A zero-config Next.js boilerplate for AI-powered websites.",
  // naked domain — no https://, no trailing slash
  domainName: "your-domain.com",

  crisp: { id: "", onlyShowOnRoutes: ["/"] },
  googleAnalytics: { measurementId: "", streamId: "" },

  stripe: { plans: [ /* your plans */ ] },

  resend: {
    fromNoReply: `AI Web Launcher <noreply@your-domain.com>`,
    fromAdmin: `AI Web Launcher <hello@your-domain.com>`,
    supportEmail: "hello@your-domain.com",
  },

  colors: {
    theme: "light",       // default mode (light | dark) — tokens in src/app/globals.css
    main: "#1F6F73",      // browser tab / loading-bar color (keep in sync with --color-primary)
  },

  auth: { loginUrl: "/signin", callbackUrl: "/dashboard" },
};
Start here
Changing appName, appDescription, and domainName re-brands the SEO tags, OG images, sitemap, and structured data across the whole site.

Theme & palette

Color tokens live in src/app/globals.css inside the @theme block and the [data-theme="light"] / .dark blocks. They are shadcn/ui OKLCH variables:

src/app/globals.css
:root {
  /* REPLACEABLE starter palette — Signal Violet + Circuit Cyan */
  --primary: oklch(0.542 0.179 288);   /* violet — CTAs, focus rings */
  --primary-foreground: oklch(0.985 0 0);
  --accent: oklch(0.750 0.120 218);    /* cyan — accent partner */
  --ring: oklch(0.542 0.179 288);
  --background: oklch(1 0 0);          /* page background */
  --foreground: oklch(0.18 0.006 285); /* body text */
  --secondary: oklch(0.967 0.001 286); /* cards, surfaces */
  --border: oklch(0.92 0.004 286);     /* hairlines */
}

To re-skin the whole site, change these values. The [data-theme="light"] and .dark blocks override per theme. Keep config.colors.main in sync with --color-primary so the browser chrome matches.

Docs theme
The /docs route has its own token set (--docs-*) further down in src/app/globals.css. Adjust --docs-primary to match your brand if you want docs to share the site palette.

Environment variables

All integrations are optional and env-gated — the app boots without any of them. Copy .env.example to .env.local and fill in only what you need:

Terminal
$
cp.env.example .env.local
VariablePurposeRequired?
NEXT_PUBLIC_SUPABASE_URLSupabase project URLOnly for auth / leads
NEXT_PUBLIC_SUPABASE_ANON_KEYSupabase anon keyOnly for auth / leads
SUPABASE_SERVICE_ROLE_KEYServer-side Supabase writesOnly for lead capture
RESEND_API_KEYTransactional emailOnly for email
NEXT_PUBLIC_CRISP_IDCrisp chat website IDOnly for chat
NEXT_PUBLIC_GA_IDGoogle Analytics 4 IDOnly for analytics
STRIPE_SECRET_KEYStripe paymentsOnly for checkout
NEXT_PUBLIC_DOMAINNaked domain for www→apex redirectOptional

When a key is absent, the related feature is silently disabled (no crash). See Best practices for the fail-soft pattern.