flowingkhaosSign in
Deploy your own Travolestep 4 of 7 · 0 of 14 carriedSign in to keep it
Step 4 of 7 · weight 2 · about 20 minutes

The stack and every dependency

The runtime dependencies

Every package in dependencies, and the one job it does:

Package Version Its job in Travole
next 16.2.0 The framework: routing, server components, server actions, the build
react, react-dom 19.2.1 The UI. react-dom/server also renders the PDF’s HTML
drizzle-orm ^0.45 Type-safe SQL. The schema in lib/db/schema.ts is the single source of truth
@neondatabase/serverless ^1.0 The Postgres driver that speaks HTTPS to Neon
better-auth ^1.5 Email and password accounts, sessions, the signup hook
@aws-sdk/client-s3 3.726.1 Upload, download and delete receipts in R2, which speaks the S3 API
exceljs ^4.4 Writes the .xlsx export
playwright 1.62.1 Launches a headless Chromium to print the PDF report
swr ^2.3 Client-side fetching with cache, for the few interactive widgets
radix-ui ^1.6 Accessible primitives (dialogs, menus, tabs)
lucide-react ^0.556 Icons
class-variance-authority, clsx, tailwind-merge Compose CSS class names without conflicts

The development dependencies

Package Its job
typescript Types. bun run typecheck runs tsc --noEmit
tailwindcss 4, @tailwindcss/postcss Styles. The tokens live in .brand/tokens.css
drizzle-kit Generates SQL migrations from the schema and applies them
vitest Unit tests (bun run test)
@playwright/test End-to-end tests in a real browser (bun run e2e)
pdfjs-dist Reads the generated PDF back in the tests, to check what it says
eslint, eslint-config-next Lint

The scripts

bun run dev          # local server on http://localhost:3000
bun run build        # production build
bun run test         # unit tests
bun run e2e          # end-to-end tests
bun run db:generate  # write a migration after you change lib/db/schema.ts
bun run db:migrate   # apply migrations to DATABASE_URL
bun run db:seed      # insert the categories and the 230 countries

The outside services, and their free tiers

Service What Travole stores there Free tier covers a personal install?
Neon every row: users, trips, expenses yes
Cloudflare R2 receipt PDFs yes
Vercel the running app yes, for personal use

One dependency to watch

playwright prints the PDF by launching Chromium. On your machine that works after bunx playwright install chromium. A Vercel function does not ship a Chromium binary, so the PDF export needs extra work there (step 7 covers it). The Excel export has no such dependency.

The gate · a reading check closes this stepweight 2 of Σw 14

Check what you read in “The stack and every dependency”

The questions are public; scoring them needs an account. They were generated once for this step, and the key never leaves the server.

Loading the check…

All 7 stepsGo to the gate

Luke Sidney writes and builds everything here, alone, in the open. lukesidney.me