Building Your AppConfiguration

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:

SectionControls
projectSlug, name, default language, and the apps array
appShared app-level defaults (landing page, theme, API tracing)
seoOpen Graph and Twitter card defaults
storageFile storage provider and upload settings
cacheCache provider, TTL, and prefix
rateLimitRate limiter provider, window, and limit
featuresThe 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

TypeBehavior
ObjectsRecursively merged (the per-app value wins on conflict)
ArraysReplaced entirely by the per-app value
ScalarsReplaced 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.

Next steps