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
experimentalServicesinvercel.json - Nitro preset
vercelwhenVERCELenv is set
Required environment variables
| Variable | Notes |
|---|---|
DATABASE_URL | Neon PostgreSQL (pooled) |
JWT_SECRET | Min 32 characters in production |
GOOGLE_CLIENT_ID / SECRET | OAuth |
APP_URL | e.g. https://rawbeats.ro |
ALLOWED_ORIGINS | CORS 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
| Feature | Status on Vercel |
|---|---|
| REST API | Works |
| Auth | Works |
| Socket.IO messaging | Not on serverless — REST + polling by default |
| ffmpeg normalization | Verify in build logs |
| Large uploads | Prefer 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)