voyant.config.ts. It is the single declaration of what the deployment is, and the framework reads it to assemble the app at build time. This page explains what the manifest declares, how the framework turns it into a running app, and the CLI commands that inspect and gate it. Configuration is the seam that lets a deployment shrink to its identity (its config, the providers it chose, and the small amount it added) instead of being a fork full of hand-maintained glue.
What the manifest declares
voyant.config.ts is config-shaped. A deployment’s manifest declares, at a high level:
| Key | What it declares |
|---|---|
deployment | Deployment-level identity and settings. |
projectConfig | Branding and locale for the app. |
modules | The modules this deployment mounts. This is the spine the framework composes from. |
additionalSchemas | Extra schema closures that are migrated but not mounted as runtime modules (optional verticals like charters or cruises that stay on their own cadence). |
plugins | Distribution bundles the deployment installs. |
featureFlags | Deployment feature toggles. |
admin | Admin metadata the dashboard derives nav, routes, and destinations from. |
src/modules, src/extensions, src/links, src/admin), discovered at build time rather than enumerated in the manifest.
How the framework reads the manifest
The manifest is not decoration. The framework reads it to assemble the app, and it does so at build time because Cloudflare Workers compose statically (no runtimerequire of arbitrary modules). Three things are derived from it.
Schemas
The manifest’s
modules, extensions, and additionalSchemas (package closures) plus schemas (starter-local files) resolve into a committed drizzle.schemas.generated.ts, which drizzle.config.ts imports. The schema set is derived, never hand-listed. To change it, edit the manifest and regenerate, do not edit the generated file.Routes
The modules in
config.modules mount their route surfaces into the API. Admin routes are generated from the manifest into admin.routes.generated.tsx, so adding a module to the manifest contributes its routes without hand-wiring.config to assemble the standard module set, derives the admin chrome from module metadata, mounts the generated routes, and wires the deployment’s injected providers and extensions. The deployment file collapses toward config plus providers plus its own extensions, with no glue that can silently drift on upgrade.
The standard deployment then upgrades by bumping the framework version and running migrations, with no code merge, because config and provider wiring are stable contracts and framework changes arrive as package updates. Custom deployments do the same and reconcile only their own
src/ extensions.Inspecting the manifest
The CLI reads the nearestvoyant.config.* and can show it, validate it, or tell you which file resolved.
voyant config path first when a deployment is behaving as if it read a different manifest than you expect (a common surprise in a workspace with multiple config files). voyant config validate checks the manifest is well-formed before you rely on anything derived from it.
To inspect what the manifest derives on the database side, use the schema and admin commands:
--check forms verify the generated artifacts are in sync with the manifest without rewriting them, which is what you want in CI.
The doctor preflight gates
voyant doctor is the single preflight that makes a deployment safe to run and to upgrade. It runs a set of gates and exits non-zero on any failure.
- Env, bindings, and secrets. It validates required env at startup instead of letting a missing value fail at first use as a runtime 500, and it checks
env.d.tsagainstwrangler.jsonc(including catching placeholder values like unreplaced KV ids). - Composition drift. It asserts that
config.modules, the mounted registry, the derived nav, icons, and destinations, and the generated routes are all in sync, and that every installed module’s migrations are applied. A module present inconfig.modulesbut missing an icon, label, destination, or migration fails the gate. This is what keeps an upstream domain from silently vanishing from the nav on upgrade.
Admin generation from the manifest
The dashboard is assembled from the manifest, not hand-registered.voyant admin generate emits the generated admin artifacts so adding a module to config.modules contributes its admin presence automatically.
src/admin/<name>/ rather than declared in the manifest, the same drop-a-folder build-time discovery used for custom modules and extensions. So the manifest stays the source of truth for the standard admin, while the deployment’s own admin additions live in code it owns and that survives voyant upgrade.
Next steps
Modules
What the manifest’s
modules actually compose.Data models
How the manifest derives the schema set and migrations.
Architecture
Build-time composition and the deployment boundary.
Command reference
Every
voyant config, voyant admin, and voyant doctor command.