Deployment
Node deployment
Run bun install --frozen-lockfile, then bun run build. Supply the production app URL, signing key, encryption key and database environment on the host before running bun run start. The output entry is .output/server/index.mjs.
Cloudflare Workers and Pages
Choose a deployment target independently of feature flags:
bun run deploy --target worker --build-only
bun run deploy --target pages --build-only
For an actual release, create wrangler.jsonc from wrangler.example.jsonc, configure bindings and production URLs, and set runtime secrets through Cloudflare. Copy deploy.env.example to deploy.env; Pages additionally needs CF_PAGES_PROJECT. Remove --build-only only when ready to publish.
Database changes
Generate and review migrations before applying them to production. The deployment wrapper does not migrate or reset databases. Keep the SQLite, PostgreSQL and MySQL schema templates aligned. Workers retain the official D1/Hyperdrive integration.
Public content without a database
Use BLOG_STORAGE_MODE=mdx and an empty DATABASE_URL with the SQLite provider for bundled public content. Enable the individual features your app needs. Persisted features report their database requirement explicitly.