Project source of truth
Configure once, generate consistently
Every project created by the wizard receives an fsd.config.json file. Generators read it automatically, so developers do not repeat the same stack decisions for every feature.
Example
{
"$schema": "https://raw.githubusercontent.com/FSD-CLI/cli/main/schema/fsd.config.schema.json",
"schemaVersion": 1,
"packageManager": "npm",
"apiClient": "axios",
"serverState": "react-query",
"clientState": "zustand",
"forms": "react-hook-form-zod",
"ui": "shared-ui",
"framework": "react-vite"
}Nuxt example
{
"$schema": "https://raw.githubusercontent.com/FSD-CLI/cli/main/schema/fsd.config.schema.json",
"schemaVersion": 1,
"framework": "nuxt",
"packageManager": "npm",
"apiClient": "fetch",
"serverState": "vue-query",
"clientState": "pinia",
"forms": "vee-validate-zod",
"ui": "shared-ui"
}Nuxt defaults to its native $fetch client. Pinia and VeeValidate are registered as Nuxt modules, while Vue Query uses an SSR-aware plugin.
Vue + Vite example
{
"$schema": "https://raw.githubusercontent.com/FSD-CLI/cli/main/schema/fsd.config.schema.json",
"schemaVersion": 1,
"framework": "vue-vite",
"packageManager": "npm",
"apiClient": "axios",
"serverState": "vue-query",
"clientState": "pinia",
"forms": "vee-validate-zod",
"ui": "shared-ui"
}SvelteKit example
{
"$schema": "https://raw.githubusercontent.com/FSD-CLI/cli/main/schema/fsd.config.schema.json",
"schemaVersion": 1,
"framework": "sveltekit",
"packageManager": "npm",
"apiClient": "fetch",
"serverState": "svelte-query",
"clientState": "svelte-store",
"forms": "sveltekit-superforms-zod",
"ui": "shared-ui"
}These defaults generate Svelte 5 components, TanStack Svelte Query accessors, framework-native stores, and progressively enhanced Superforms backed by Zod 4.
Supported fields
| Field | Values | Purpose |
|---|---|---|
| framework | react-vite | nextjs | vue-vite | nuxt | sveltekit | Controls framework-native components, providers, and generators. |
| packageManager | npm | pnpm | yarn | bun | Keeps setup commands and lockfiles consistent. |
| apiClient | axios | fetch | Chooses generated request helpers. |
| serverState | react-query | vue-query | svelte-query | none | Controls the framework-compatible TanStack Query output. |
| clientState | zustand | redux | pinia | svelte-store | none | Controls client-state files and provider wiring. |
| forms | react-hook-form-zod | vee-validate-zod | sveltekit-superforms-zod | none | Controls typed forms and validation schemas. |
| ui | shared-ui | Targets the starter's shared UI primitives. |
When the file exists
The CLI validates schemaVersion and generates files from the saved choices without asking the stack questions again.
Existing projects
If the file is missing, the generator infers a compatible setup from dependencies in package.json. Adding the config later makes that behavior explicit and repeatable.
Framework compatibility is validated
The capability matrix rejects mixed stacks such as Pinia in a React project, Zustand in a Vue project, or Pinia in a SvelteKit project. Defaults are selected from the chosen framework before--yes is applied.