Configuration
The .coldstart.json schema, all options, validation rules, and defaults
Every scaffold saves a .coldstart.json at the project root. This file captures all configuration options and enables deterministic regeneration via coldstart replay.
Complete example
Here is a realistic full-stack configuration:
{
"name": "fittrack",
"displayName": "FitTrack",
"description": "A fitness tracking app with workout plans, nutrition, and social features",
"packageScope": "@fittrack",
"platforms": ["web", "mobile", "api"],
"webMode": "landing+app",
"domain": "health",
"billing": "freemium",
"billingProvider": "polar",
"i18n": true,
"locales": ["en", "fr"],
"multiTenant": false,
"rbac": false,
"oauthProviders": ["google", "apple"],
"outputDir": "./fittrack"
}Schema reference
Project identity
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | Yes | — | Lowercase alphanumeric + dashes. Used for directory name, package names, and URLs. |
displayName | string | Yes | Auto from name | Human-readable name. Must not contain shell-unsafe characters (", ', `, $, ;, |, &, \). |
description | string | Yes | — | Short project description. Must not contain backtick characters. |
packageScope | string | Yes | @{name} | npm scope for all packages (e.g. @fittrack). Must start with @. |
Platforms
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
platforms | string[] | Yes | — | At least one of: web, mobile, desktop, api. |
webMode | string | If web in platforms | — | One of: landing, app, landing+app. |
Features
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
billing | string | Yes | none | Billing model. One of: none, freemium, subscription, one-time, credits, per-seat, multi-tier. |
billingProvider | string | Yes | polar | Payment provider. One of: polar, stripe. |
i18n | boolean | Yes | true | Enable internationalization via next-intl. |
locales | string[] | Yes | ["en", "fr"] | Supported locale codes. At least 1 required when i18n is true. |
multiTenant | boolean | Yes | false | Enable organization support (multi-tenant). |
rbac | boolean | Yes | false | Enable role-based access control. Requires multiTenant. |
oauthProviders | string[] | No | [] | Social login providers: google, github, apple. |
Context
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
domain | string | Yes | general | Product category. Injects domain-specific guidelines into CLAUDE.md. One of: finance, health, education, ecommerce, social, productivity, media, food, gaming, general. |
outputDir | string | Yes | ./{name} | Output directory path for the generated project. |
Constraints
The Zod schema enforces the following constraints at validation time. Invalid configs are rejected with clear error messages.
Desktop requires web — The desktop platform (Tauri) shares the web frontend. In interactive mode, web is auto-added. In replay mode, validation fails if desktop is in platforms but web is not.
Per-seat billing requires multiTenant — Per-seat pricing is organization-based. In interactive mode, multiTenant is auto-enabled. In replay mode, validation fails if billing is per-seat but multiTenant is false.
RBAC requires multiTenant — Roles and permissions only make sense with organizations. Validation fails if rbac is true but multiTenant is false.
webMode required with web — When web is in platforms, you must specify webMode. Omitting it causes a validation error.
At least 1 locale when i18n is enabled — When i18n is true, the locales array must contain at least one entry.
Validation
The config is validated using a Zod schema (projectConfigSchema). Validation happens in all commands that read a config: init, create, replay, setup, and add.
When validation fails, the CLI prints each issue with its field path and message:
✖ Invalid configuration:
→ webMode: webMode is required when platforms includes web
→ multiTenant: multiTenant must be enabled for per-seat billingValidation runs .refine() checks after basic type validation, so you get all type errors first, then constraint errors. The exit code is 1 on any validation failure.
Platforms
| Platform | Scaffolding | Stack | Includes |
|---|---|---|---|
web | create-next-app | Next.js 16, Tailwind v4, shadcn/ui, next-themes | Auth pages (if api), PostHog analytics, SEO meta, portless dev proxy |
mobile | create-expo-app | Expo 55, React Native 0.83, Uniwind, HeroUI Native | Auth screens (if api), PostHog analytics, RevenueCat (if billing), tab navigation |
desktop | Generated | Tauri 2, shared web frontend, Rust backend | Auto-updater config, window management, native menu |
api | Generated | Hono, Better Auth, Drizzle ORM, Neon, Docker | REST routes, OpenAPI schema, webhooks, React Email templates, env validation |
Web modes
| Mode | Description |
|---|---|
landing | Marketing/SEO-focused page. Generates a hero section, feature grid, pricing table, and footer. No auth routes, no sidebar. Optimized for public-facing pages with generateStaticParams. |
app | Dashboard/SaaS application. Generates a sidebar layout with navigation, auth routes (sign-in, sign-up), settings page, and admin panel. Protected routes with middleware. |
landing+app | Both combined. A public marketing landing page at / and an authenticated application under /app. Separate layouts: landing uses a centered layout, app uses a sidebar layout. This is the most common choice for SaaS products. |
Billing models
| Model | Key field | Middleware | Provider support | Generated files |
|---|---|---|---|---|
freemium | isPremium | requirePremium | Stripe, Polar, RevenueCat | Billing schema, webhook handler, premium gate middleware, upgrade page |
subscription | subscriptionStatus | requireSubscription | Stripe, Polar, RevenueCat | Billing schema, webhook handler, subscription check middleware, billing portal page |
one-time | subscriptionStatus | requirePayment | Stripe, Polar, RevenueCat | Billing schema, webhook handler, payment gate middleware, checkout page |
credits | credits + transaction log | requireCredits(n) | Stripe, Polar, RevenueCat | Billing schema with transaction table, webhook handler, credit deduction middleware, usage tracking, top-up page |
per-seat | maxSeats | checkSeatLimit | Stripe, Polar | Billing schema with seat tracking, webhook handler, seat limit middleware, member management page |
multi-tier | tier | requireTier(min) | Stripe, Polar, RevenueCat | Billing schema with tier enum, webhook handler, tier gate middleware, plan comparison page |
All billing models generate:
packages/db/src/billing-schema.ts— Drizzle schema for billing dataapps/api/src/routes/webhooks.ts— Webhook handler for the chosen providerapps/api/src/middleware/billing.ts— Route protection middleware- Provider-specific client helpers (Polar SDK or Stripe SDK)
- Web billing pages (if web platform present)
- Mobile billing integration via RevenueCat (if mobile platform present)
Default values
When using coldstart create with natural language inference, or when fields are omitted in interactive mode, these defaults apply:
| Field | Default | Condition |
|---|---|---|
billingProvider | polar | Always (unless stripe keyword detected) |
i18n | true | Always in interactive mode |
locales | ["en", "fr"] | When i18n is enabled |
multiTenant | false | Unless per-seat billing selected |
rbac | false | Unless multiTenant is true (then defaults to true) |
oauthProviders | [] | Always |
billing | freemium | In create mode, when api or mobile selected and no billing keyword |
billing | none | In create mode, when only web selected and no billing keyword |
Generated AI context
Every project gets three AI integration points, conditional on the platforms and features selected:
| What | Location | Purpose |
|---|---|---|
| CLAUDE.md | Root | Stack documentation, domain-specific rules, conventions, commands, how-to guides |
| Skills | scripts/install-skills.sh | 5-40 Claude Code skills tailored to the project's platforms |
| MCP servers | .claude/settings.json | Neon, Vercel, Polar, RevenueCat, Resend, Expo (only services used) |
The skills and MCP servers are conditional. A web-only project gets Vercel + Tailwind + React skills. A fullstack project with mobile and billing gets everything including RevenueCat, Expo, and Drizzle skills.
The domain field injects industry-specific guidelines into CLAUDE.md that steer all AI-assisted development toward best practices for that domain (e.g., money-as-integers for finance, HIPAA awareness for health, cursor-based pagination for social).