All docs

Deployment

The app builds to a standalone output (output: "standalone" in ), so it runs anywhere Node runs.

You need two things in production: a PostgreSQL database with pgvector and your environment variables.

Option A — Vercel

  1. Push the repo to GitHub and import it in Vercel.
  2. Provision a Postgres database with the vector extension (Neon, Supabase, or any Postgres 16+). Copy its connection string into DATABASE_URL.
  3. Add every variable from in the Vercel project settings. Set NEXT_PUBLIC_APP_URL to your domain.
  4. Run migrations against the production database:
    bash
    npm run db:deploy
  5. Add the Stripe production webhook (see ).
  6. Deploy.

Option B — Docker

The repo ships a multi-stage .

bash
# Build the imagedocker build -t nova .
# Run it (point DATABASE_URL at your Postgres)docker run -p 3000:3000 --env-file .env nova

docker-compose.yml also defines a full app + db stack behind the full profile:

bash
docker compose --profile full up --build

Run migrations against the target database before first boot:

bash
npm run db:deploy

Production checklist

  • DATABASE_URL points at a Postgres with the vector extension
  • Migrations applied (npm run db:deploy)
  • BETTER_AUTH_SECRET set to a strong secret
  • NEXT_PUBLIC_APP_URL set to your domain
  • OAuth redirect URIs updated to your domain
  • Live Stripe keys + production webhook configured
  • At least one AI provider key set
  • For a public demo, set NEXT_PUBLIC_DEMO_MODE="true" (disables sign up so only the shared demo account is usable) and tune config/demo.ts credits; otherwise disable it (enabled: false)