Configuration
The sk-config.jsonc manifest, per-app overrides, the feature hierarchy, and how regeneration works.
The project manifest
config/sk-config.jsonc is the single source of truth for your project. It defines:
| Section | Controls |
|---|---|
project | Slug, name, default language, and the apps array |
app | Shared app-level defaults (landing page, theme, API tracing) |
seo | Open Graph and Twitter card defaults |
storage | File storage provider and upload settings |
cache | Cache provider, TTL, and prefix |
rateLimit | Rate limiter provider, window, and limit |
features | The feature tree (database, auth, billing, email, i18n, …) |
The feature hierarchy
Features are nested. Each top-level feature has an enabled flag, and sub-features nest under their parent:
"features": {
"database": { "enabled": true, "provider": "postgres" },
"i18n": { "enabled": true, "languages": [] },
"auth": {
"enabled": true,
"credentials": { "enabled": true, "resetPassword": true },
"social": { "enabled": true, "providers": [] },
"magicLink": { "enabled": true },
"organizations": { "enabled": true },
"billing": { "enabled": true, "processors": [] }
},
"email": { "enabled": true, "provider": "resend" }
}
The generator resolves implicit dependencies automatically — enabling magic-link sign-in, for example, also enables email.
Per-app overrides
Each app can override project-level defaults in config/<app>/config.jsonc:
// config/my-app/config.jsonc
{
"app": { "theme": "custom-theme" },
"storage": { "s3Bucket": "my-app-bucket" }
}
Merge rules
| Type | Behavior |
|---|---|
| Objects | Recursively merged (the per-app value wins on conflict) |
| Arrays | Replaced entirely by the per-app value |
| Scalars | Replaced by the per-app value |
Regenerate after changes
After editing config — by hand or in Studio — regenerate the derived files:
pnpm sk:generate
This rewrites routing, i18n config, feature flags, env templates, and the merged Prisma schema. It also runs automatically during pnpm app create and pnpm app dev.
Most config changes are easiest in Studio, which writes the JSONC and regenerates for you. Use the raw editor for advanced settings that don't have dedicated UI.