Reactive Resume ships as a Docker image and as a Vercel project. The CI workflow (.github/workflows/ci.yml) includes an offline Vercel artifact build that runs on every pull request and a live smoke test you start by hand. These jobs catch problems that only show up in a deployed build. You can run the same smoke test against your own installation.
Artifact build#
The artifact job runs on every pull request, every push to main, and manual runs with live_smoke left off. It needs no Vercel account and no secrets, so pull requests from forks run it safely.
The job:
- Starts an isolated PostgreSQL service.
- Writes a local
.vercel/project.jsonwith theservicesframework, then runsvercel build --prod --standaloneoffline with placeholder Blob credentials. Vercel packages dependencies into the Function output; the build applies migrations to the isolated database. - Checks the
backendservice Function:- its runtime is
nodejs24.x,maxDurationis300, and its handler isapps/server/vercel.mjs; - a copy of the Function outside the checkout loads with
--no-experimental-require-module, like the Vercel runtime does, so a dependency the build left out fails the job; - the copy rejects an unauthenticated upload-staging request with
401and serves the prerendered homepage with its JSON-LD metadata.
- its runtime is
When the loading check fails#
If a new server dependency breaks the loading check, add it and its own dependencies to bundledInteropPackages in apps/server/tsdown.config.ts. CommonJS dependencies need this, because Vercel’s service builder leaves out the pnpm links they load through.
Live smoke test#
The live-smoke job runs only when you start CI manually (workflow_dispatch) with live_smoke enabled. This skips the other CI jobs. It uses the vercel-smoke GitHub environment and runs tooling/deployment/smoke.mjs against the installation at VERCEL_SMOKE_URL.
Point the smoke test only at a dedicated test installation. It signs up a new account, publishes a resume, and uploads files, then deletes the account and everything in it.
The script checks, in order:
/api/healthreportshealthy, and/,/auth/login,/robots.txt,/sitemap.xml, and/.well-known/oauth-protected-resourcerespond. A missing asset returns404.- An email sign-up creates a session.
- A resume created from sample data can be read back and made public, and its public page and server-rendered public PDF load.
- A 10 MiB file uploads, downloads intact, and is deleted. On Vercel the upload goes through a staged request, and the script checks that a staged request can’t be replayed.
- Optionally, a 25 MiB assistant attachment uploads and is deleted (see below).
- The account is deleted, even if an earlier check failed.
The installation must allow sign-ups and email sign-in, so FLAG_DISABLE_SIGNUPS and FLAG_DISABLE_EMAIL_AUTH must not be true.
Attachment check#
To include the 25 MiB attachment check, configure an OpenAI-compatible test provider that answers a connection test for the model smoke-model. No paid AI model is needed; a deterministic stub works.
| Name | Kind | Value |
|---|---|---|
VERCEL_SMOKE_URL | Variable | Origin of the test installation |
VERCEL_SMOKE_AI_BASE_URL | Variable | Base URL of the test provider |
VERCEL_SMOKE_AI_API_KEY | Secret | API key for the test provider |
The installation needs ENCRYPTION_SECRET set to save the provider. A provider on a private or http:// address also needs FLAG_ALLOW_UNSAFE_AI_BASE_URL=true, which is only safe on an isolated test installation.
Run the smoke test yourself#
The script needs only Node.js 24 and a checkout. Set SMOKE_URL to the installation’s origin:
Add SMOKE_AI_BASE_URL and SMOKE_AI_API_KEY to include the attachment check. The script detects the platform on its own: on Docker, the staging endpoint returns 404 and uploads go directly to the server.
Related pages#
- Development setup: run the app and the test suites locally.
- Deploying to Vercel: set up your own Vercel installation.
- Self-hosting with Docker: run the production image.