create-turbo-stack

Project Config

Customize the CLI per-project with create-turbo-stack.json

Drop a create-turbo-stack.json at any level of your repo to set defaults, lock down choices, and load plugins. The CLI walks up from cwd to find it; the nearest match wins.

Two files, two responsibilities:

FileOwnerPurpose
.turbo-stack.jsonCLI (read/write)Active state — the resolved preset, catalog, generated time
create-turbo-stack.jsonYou (read-only from CLI)Defaults, policy, plugins

Don't commit .turbo-stack.json updates by hand; let the CLI manage it. Commit create-turbo-stack.json to share team conventions.

Shape

{
  "$schema": "https://create-turbo-stack.dev/schema/user-config.json",
  "defaults": { /* ... */ },
  "policy":   { /* ... */ },
  "plugins":  ["@scope/cts-plugin"]
}

defaults

Pre-fill prompt initial values. Anything not set falls back to the schema default.

{
  "defaults": {
    "basics": {
      "scope": "@acme",
      "packageManager": "pnpm",
      "linter": "biome",
      "typescript": "strict",
      "gitInit": true
    },
    "database":   { "strategy": "drizzle" },
    "api":        { "strategy": "trpc" },
    "auth":       { "provider": "better-auth" },
    "css":        { "framework": "tailwind4", "ui": "shadcn" },
    "integrations": {
      "errorTracking": "sentry",
      "envValidation": true
    }
  }
}

policy

Three-mode constraint: allow whitelists, forbid blacklists, require locks the value entirely (no prompt).

{
  "policy": {
    "allow":   { "auth": ["clerk", "better-auth"] },
    "forbid":  { "css":  ["vanilla", "tailwind3"] },
    "require": {
      "typescript": "strict",
      "envValidation": true,
      "packageManager": "pnpm",
      "database": "drizzle"
    }
  }
}

allow + forbid apply to the same enum at prompt time (forbid wins on overlap). require removes the prompt and forces the value — useful for compliance ("typescript strict everywhere", "we use Drizzle, period").

After a preset is fully assembled — interactive, --preset, or add/remove/switch — it's checked against policy a second time. Violations abort the operation.

plugins

npm package names whose default export contributes registry entries.

{ "plugins": ["cts-plugin-nuxt", "@acme/cts-internal"] }

The CLI imports each plugin at startup and registers its default export. See Plugins.

Global config

Optional. ~/.create-turbo-stack/config.json has the same shape; project values override on overlap. Useful for "always use my org's scope" preferences without committing them to every repo.

Discovery

create-turbo-stack list shows everything that's currently registered, including plugin-provided entries. Use it to confirm a plugin loaded after editing create-turbo-stack.json.

On this page