How the deployment is laid out
The repository’svercel.json defines two Vercel Services in one project:
Top-level rewrites decide which service answers a request. They’re checked in order, and the first match wins:
/api/*,/uploads/*,/mcp,/.well-known/*, and/index.html,/robots.txt,/sitemap.xml,/llms.txt,/schema.jsongo tobackend.- Any other path whose last segment has a file extension (
/assets/app.js,/favicon.ico) goes tofrontend. - Everything else, including every page address such as
/dashboardor/alex/resume, goes tobackend, which returns the HTML shell with the right metadata.
vercel.json. They replace an SPA fallback, so don’t add one.
The configuration also schedules career work once a minute. This requires Vercel Pro or Enterprise; Hobby deployments must change the cron schedule to 0 0 * * * before deploying. Daily ticks delay time-sensitive reminders and preparation. See Vercel Cron limits.
Before you start
You need:- A Vercel account and a GitHub account.
-
Two independent random secrets,
AUTH_SECRETandENCRYPTION_SECRET. Generate each one separately:Keep both in a password manager. They must stay the same for the life of the installation:AUTH_SECRETsigns sessions and tokens, andENCRYPTION_SECRETencrypts the AI provider keys people save. LosingENCRYPTION_SECRETmakes those keys unreadable.
Quotas and permitted use depend on your Vercel, Neon, and Upstash plans. Check Vercel’s Function limits, Neon, and Upstash before you pick a plan, and turn off automatic paid upgrades if you want to stay inside a free allowance.
The assistant stops working on a reply after four minutes. This keeps the reply, plus saving and cleanup, inside
Vercel Hobby’s five-minute Function limit. The limit applies to each message, not to the whole conversation, and
Docker uses the same limit.
Deploy
2
Choose the Git scope
On Hobby, select your personal GitHub account. Private repositories owned by a GitHub organization need Vercel
Pro.
3
Connect the services
Approve Neon, Upstash, and Blob. Set Blob access to private. Pick regions close to each other and to the Function
region (
iad1 by default).4
Enter the secrets
Paste
AUTH_SECRET and ENCRYPTION_SECRET.5
Deploy
Set Framework Preset to Services. Keep the project root at the repository root and keep the committed
vercel.json. Don’t select the apps/web subdirectory.The backend build compiles both apps, then runs apps/server/dist/prepare-deployment.mjs, which checks the configuration and applies database migrations before the deployment goes live. You don’t run migrations yourself.Check the deployment
- Open
https://<your-project>.vercel.app/api/health.database,storage, andredisshould each report"status": "healthy", andversionshows the release you deployed. A sleeping Neon database can fail the first check; retry once. - Open the production domain and create an account.
- Optional: to use AI features, each person adds their own provider under Settings → AI.
- Optional: configure SMTP for verification and password-reset emails. Without SMTP, emails are written to the Function logs.
- Optional: add Google, GitHub, LinkedIn, or your own identity provider. See Single sign-on (SSO) for the callback URLs.
Scheduled career work
Set a separate randomCRON_SECRET (at least 16 characters) in the Production environment and redeploy. Generate it with openssl rand -hex 32. Vercel Cron sends GET /api/career/run with Authorization: Bearer <CRON_SECRET> automatically; no separate cron service is needed. Without this token, scheduling is unavailable and the HTTP runner is closed. Cron runs on production deployments.
Users enable their own searches, preparation tasks, and reminders. Verify a due reminder after deployment; see career scheduling for delivery and retry limits.
Use a custom domain
- Add the domain to the Vercel project.
- Set
APP_URLto the full origin, for examplehttps://resume.example.com. - Update the callback URL of every OAuth provider you configured.
- Redeploy.
DEPLOYMENT_NAMESPACE.
Update the deployment
Redeploy the same project, for example by syncing your fork. Keep its connected services and secrets unchanged.- Migrations run in the build step, never in the runtime Function. A database advisory lock serializes concurrent deployments.
- Rolling back to an older deployment doesn’t roll back the database schema. Restore a database backup, or follow the rollback notes in the release’s upgrade guide.
Preview deployments
Preview builds refuse to run migrations by default, so untrusted preview code can’t change your production database. The build fails with “Preview deployment needs an isolated database” until you opt in. To enable previews:- Connect separate Neon, Upstash, and Blob resources to the Preview environment.
- Set
ALLOW_PREVIEW_MIGRATIONS=truefor Preview only.
Back up your data
Back up the Neon database and the Blob store. StoreAUTH_SECRET and ENCRYPTION_SECRET separately from those backups.
Moving between Docker and Vercel doesn’t copy the database or files. Migrate both yourself.
Build locally
A local Vercel build applies migrations, so run it only against an isolated database.APP_URL is required here; cloud builds set it automatically.
Vercel-specific variables
On Vercel, the server reads the variables that Marketplace integrations inject. A variable you set explicitly always wins over these fallbacks. For everything else (SMTP, OAuth providers, feature flags), see Environment variables.Upload limits
Vercel limits Function request bodies to 4.5 MB. The web app sends larger requests through private Blob staging, so the application’s own limits still apply:- Uploads (pictures and files): 10 MB per file.
- Assistant attachments: 25 MiB per file and 100 MiB per conversation.
/api/openapi) and MCP request bodies stay subject to the 4.5 MB limit.
Troubleshooting
Related pages
- Migrating from v5: what changes when an existing installation moves to v6.
- Single sign-on (SSO): sign in through your own identity provider.
- Environment variables: every variable the server reads.