Author · 2025
Job-Application Tracker
A tracker for applications, interviews, contacts, and follow-ups that I actually use in my own job search. Node.js + TypeScript + Fastify + Prisma with JWT auth and a state machine for application status.
Why I built it
I was looking for work and keeping my pipeline in a spreadsheet. Spreadsheets are terrible at reminders, status transitions, and "when did I last hear back from this company?". So I built the tool I wanted — which is also the most defensible kind of side project: one I genuinely use (dogfooding).
What it does
- Tracks applications across companies, with role, source, and salary notes.
- Models status as an explicit state machine:
applied → screening → interview → offer | rejected. - Logs follow-ups and surfaces the ones that are overdue.
- Keeps a contacts list (recruiters, hiring managers) linked to applications.
- Shows simple funnel stats so I can see where I'm losing candidates.
Architecture decisions
- Fastify over Express — schema-based validation out of the box and a tighter typed surface, which matters when the whole point is correctness.
- Prisma for data access — typed queries and migrations without hand-rolling SQL.
- Status as a state machine, not a free-text field — illegal transitions are rejected at the boundary, so the funnel stats are trustworthy.
- JWT auth with refresh — single-user today, but structured so multi-tenant isn't a rewrite.
Status
Core flows are working and covered by Vitest tests, with CI green. The UI is intentionally out of scope for now — the value is the API and the data model.
More
Other projects
Mnemo
Live ↗Spaced-repetition flashcards for my own studying — content lives in git-versioned Markdown, scheduling state (Anki SM-2) in Postgres. Live on its own subdomain, fully serverless on the free tier.
TypeScript · Next.js 15 · Cloudflare Workers · Prisma · PostgreSQL (Neon)
Supermarket Stock System
Inventory management backend for a supermarket chain, built in Laravel with a framework-agnostic, domain-driven core. The domain is fully tested without Laravel — pure PHP.
Laravel 11 · PHP 8.3 · PostgreSQL · Pest · Docker