Job Tracker
Personal project
Scroll down
The personal tool
Job Tracker is a 2026 open-source personal project I built to organize my own job search. It represents each opening as a card moving through five fixed stages, from Interested and Applied through In Process, Offer and Closed.
Each card stores company, role and application details, while its detail page combines an editable form with a chronological event history. Users can add events such as interviews, and every stage change creates its own history entry automatically.
What I built
I built the board, job detail workflow, manual and automatic timeline events, and a persistent light and dark theme. I also implemented email and password authentication with database-backed cookie sessions, bcrypt and a pepper, plus Google OAuth as a second login path.
The application uses Next.js 14 with the Pages Router and next-connect, Tailwind CSS for the interface and SWR for client-side data fetching. It is written in JavaScript and deployed continuously to Vercel.
Domain and data flow
The code follows a compact MVC structure: models contain business rules and handwritten SQL, controllers live in versioned API routes, and pages plus components render the views. PostgreSQL is accessed through pg without an ORM, with node-pg-migrate keeping schema changes versioned and a standard error object shared across endpoints.
The stage transition and its timeline record are modeled together so the board cannot change without producing history. That keeps the card's current state and its event trail consistent instead of duplicating transition logic in multiple screens.
Testing the real stack
I developed the API with TDD, writing success and error cases before each endpoint. Jest integration tests call a real Next.js server and PostgreSQL instance supplied by Docker rather than replacing the database with mocks.
The pull-request pipeline also runs ESLint, Prettier and Secretlint, then produces Vercel preview deployments. This made authentication, database errors and exact API response shapes testable under the same components used by the application.
Every stage change becomes part of the application's history.
Drag to explore


