Read it, then pass the check at the end to open the final check.
Verify it in production
Updated
Prove it works, in production
Run through this list on the production URL, not on localhost:
-
/signupcreated your account, and a second attempt with another address is refused. - You can create a trip with a budget.
- You can add an expense in a foreign currency, and the Canadian total is right.
- You can attach a PDF receipt, and download it again from the expense page.
- The dashboard shows the trip under, near or over budget.
- Export → Excel downloads a
.xlsxfile with your expense in it. - Settings → Invitations creates a link bound to one address.
The PDF export on Vercel
The PDF report is printed by a headless Chromium through playwright. Vercel functions do not
include a Chromium binary, so on a plain deploy this export is expected to fail while everything
else works. Test it, and if it fails you have two honest options:
- Use a serverless Chromium build. Add
@sparticuz/chromiumand pass itsexecutablePath()tochromium.launch()inlib/report/pdf.ts. Keepplaywrightfor local runs. - Host the app in a container. On Railway, Fly.io or your own server, install Chromium in the
image with
bunx playwright install --with-deps chromium. The code needs no change.
Option 1 keeps you on the free tier. Option 2 costs a few dollars a month and removes the difference between your laptop and production.
Close the bootstrap door for good
It already closed itself when you signed up: the first account claims a one-row latch that is
never released, even if every user is deleted. You can still set AUTH_ALLOW_FIRST_USER=false in
Vercel and redeploy, so the setting says what the database already enforces.
You are done
You have a deployed Travole with your own database, your own receipt storage, and you as its only admin. From here:
- read
lib/auth/policy.tsto see how one function guards every way to create an account; - read
lib/report/shape.tsto see how one data shape feeds three outputs; - change
lib/db/schema.ts, runbun run db:generate, and ship your first migration — migrate first, deploy second.
Check what you read in “Verify it in production”
Three questions drawn from a larger pool, so no two papers are quite the same. Two right passes it and opens the next step. The questions are public; scoring them needs an account, and the key never leaves the server.
Loading the check…