GenerateSaaS

Manifest

The .generatesaas/manifest.json file records every option your project was built with, so update can re-shape new boilerplate versions into your exact configuration.

.generatesaas/manifest.json is the record of how your project was scaffolded. It stores the full set of options you chose at init (minus secrets), so generatesaas update can re-shape each new boilerplate version into your exact configuration before diffing. It is the single input that makes updates show only changes that actually apply to your project.

You normally never edit this file by hand. init writes it, and update keeps it current. Editing an option here changes how the next update shapes the template - which is exactly how a feature gets adopted (see below).

How update keeps the manifest current

The boilerplate gains new options over time. When your project predates one, your manifest simply lacks that field. On every real update, update does two things before staging:

Default-fills every option your manifest is missing, at the value that preserves your current behavior. Your manifest stays structurally complete, and nothing about your project changes - the values just become explicit.
Surfaces newly adoptable options - features added since your version - to your AI assistant, which presents each one with a recommendation so you can adopt it or keep the default. Adopting one writes the flag to the manifest and re-stages, so re-shaping brings the feature in cleanly.

This runs in all four interaction modes. The new-options review always happens, even in Automatic mode (see update) - surfacing a new feature is exactly the kind of decision the update should never assume.

Init-locked vs adoptable

  • Init-locked options (frontend, architecture, providers, identity) are recorded but never re-offered. Switching them after the fact is not a safe update operation - it is a migration, not an update.
  • Adoptable options are features you can turn on during an update because they were added since you built. They default to off, so an existing project's behavior never changes until you choose to adopt.

Field reference

Type is the JSON value. Default is what an absent field is filled with (the behavior-preserving value). Adoptable marks options the update flow offers when they are newly available.

Project

FieldTypeDefaultAdoptableNotes
frontend"nuxt" | "nextjs""nuxt"NoWhich frontend the project was generated with.

Infrastructure

FieldTypeDefaultAdoptableNotes
architecture"fullstack" | "separate""fullstack"NoFrontend-hosted API or standalone Hono backend.
deploymentTarget"node" | "vercel""node"NoLong-running runtime or Vercel serverless.
databaseProvider"postgres" | "neon" | "supabase""postgres"NoDatabase driver and connection style.
cacheProvider"redis" | "upstash""redis"NoCache/session backend.

Features

FieldTypeDefaultAdoptableNotes
paymentProvider"stripe" | "polar" | "none""none"NoBilling provider.
defaultCurrencycurrency code"USD"NoBilling and pricing currency.
emailProvider"smtp" | "ses" | "resend""smtp"NoTransactional email provider.
multiTenancybooleanfalseYesOrganizations - teams, members, shared resources.
blogbooleanfalseYesThe marketing blog (content collection, list and post pages).
docsbooleanfalseYesThe self-hosted Fumadocs docs app (apps/docs).
desktopbooleanfalseYesThe cross-platform desktop app (apps/electron, built with Electron).
aibooleanfalseYesThe app's AI features (config.ai.enabled): chat, models, schedules, integrations. Master gate for the AI sub-options below - when off they are forced off and the AI nav self-hides. A desktop project always ships the app's local AI stack: this option sets config.desktop.agents.enabled (the runtime gate on those screens) and decides whether a companion daemon is bundled inside the packaged build. That daemon half is why it is structural - turning it on later re-runs init/update to bring the daemon source in.
companionbooleanfalseYesLets your users install a companion daemon that runs their own AI subscriptions on their hardware. Point at an existing shared companion like OpenCompanion (default), or vendor and publish your own branded daemon. Requires AI features.
companionSource"shared" | "vendored""vendored" on a desktop project with AI (it bundles its own daemon) or when companionName is already recorded, else "shared"YesWhere the daemon comes from: point at an existing shared companion repo, or vendor and publish your own. Requires the companion, or a desktop app with AI. A desktop app with AI bundles the daemon inside its build, so it is always "vendored" there - an explicit "shared" on such a project is rejected.
companionRepoUrlstring"https://github.com/Duzbee/OpenCompanion"YesGitHub URL of the shared companion this project points at; its brand.json supplies the daemon identity and its latest release is what users install. Requires a shared-source companion.
companionNamestringderived from the project nameYesDisplay name of the companion daemon this project ships (e.g. "Acme Saas Companion") - what your web users install, and what a desktop app bundles. It names the daemon's binary, its OS service and its data folder, so it is PERSISTED once and never re-derived (renaming your project must not orphan the service already installed on your users' machines). Defaults to the title-cased project name plus " Companion". Requires a bundled daemon: a vendored companion, or a desktop app with AI.
creditsbooleanfalseYesMetered usage credits on top of subscription plans. Requires a payment provider.
revenueSharingbooleanfalseYesOpt-in MRR leaderboard with dofollow backlinks.

Tooling

FieldTypeDefaultAdoptableNotes
dockerServicesstring[][]NoLocal services scaffolded in docker-compose.
aiToolsstring[][]NoWhich AI assistants receive the bundled skill files.

System fields

These are not options. They are written by init and maintained by the CLI - do not edit them.

FieldNotes
versionThe boilerplate version the project is currently on. update bumps it when an apply completes.
initialVersionThe version the project was first scaffolded from.
repoThe source boilerplate repository.
appNameDisplay name of the app.
projectNameSlug used for the project directory and package names.
baseUrlPublic base URL baked into config and .env, when set.
licenseTokenSigned license token; refreshed by update for the target version.
licenseKeyHashHash of the license key, for attribution.
installIdPer-install identifier used by the heartbeat.

On this page