Resume
← Back to projects

Job-Tracker

Personal job search pipeline — applications, companies, and notes in one place.

Job Tracker is a Bun-first monorepo with two packages: a REST-style JSON API in backend/ and a single-page React app in frontend/. They communicate over HTTP; in dev, Vite proxies /api to the backend so the browser and API share an origin and HTTP-only cookie auth works cleanly.

The backend is TypeScript on Bun, using Hono for routing and middleware. MongoDB is accessed with the official driver only (no ORM): a small DB layer exposes helpers like collection access and ObjectId parsing. Data is scoped per user (userId on jobs and companies; notes hang off jobs). Auth is JWT in HTTP-only cookies, with a refresh path so the client can recover from expiry without forcing a full login. Protected routes use middleware that validates the token and attaches the user to the request context. Requests are logged with a structured logger (human-friendly in dev, JSON in production).

The frontend is React 18 + Vite, with React Router v7 for navigation and route guards (authenticated vs public-only shells). TanStack Query v5 holds all server state; thin hooks wrap each resource (useJobs, useCompanies, useNotes, etc.). On 401, the query layer can retry after calling refresh, then re-issue the failed request. UI is Radix primitives plus Tailwind v4, aligned with a shared layout and theme (light/dark). Production builds can ship as a PWA (manifest + service worker), with API traffic kept network-only so cookies are not wrongfully cached.

Testing uses Vitest against a real MongoDB test database, torn down between runs for isolation.

Deployment is Docker per service and Docker Compose for the full stack (app + Mongo), runnable locally or on something like a DigitalOcean droplet.

Job-Tracker app screenshot
Job-Tracker board or jobs list screenshot
Job-Tracker job detail or timeline screenshot