Stack

Deployment

Production runs on Vercel Services — one project with two services: Nuxt frontend (web) and Express API (api). See DEPLOY.md in the repo root for the full runbook.

Vercel Services

  • web — Nuxt 3 at /
  • api — Express at /api, /storage, /audio
  • Configured via experimentalServices in vercel.json
  • Nitro preset vercel when VERCEL env is set

Required environment variables

VariableNotes
DATABASE_URLNeon PostgreSQL (pooled)
JWT_SECRETMin 32 characters in production
GOOGLE_CLIENT_ID / SECRETOAuth
APP_URLe.g. https://rawbeats.ro
ALLOWED_ORIGINSCORS allow-list
R2_* / AWS_*Cloudflare R2 credentials
SMTP_*Password reset email

File storage (R2)

Vercel's filesystem is ephemeral. Uploads persist in Cloudflare R2 when AWS_BUCKET_NAME and related vars are set. Migrate legacy Railway files with ./scripts/migrate-railway-to-r2.sh.

Known platform limits

FeatureStatus on Vercel
REST APIWorks
AuthWorks
Socket.IO messagingNot on serverless — REST + polling by default
ffmpeg normalizationVerify in build logs
Large uploadsPrefer direct-to-R2 for production

Local development

vercel env pull .env.local --yes
npm run api:dev    # Express :4000
npm run dev        # Nuxt :3000 (proxies /api)