Skip to content
Diane Thompson
All work

JobTracker

A private job-application tracker for friends and family, with an AI-assisted pipeline for finding suitable roles.

Status
Personal use
Launched
July 2026
Built with
Node.js, Express, SQLite, JavaScript, Claude API, Docker, Railway
jobtracker
The JobTracker dashboard: counts of open jobs and of jobs in each stage, from Watching and Applying through Applied, Interview, Offers, Rejected and Ghosted

Overview

JobTracker is a private job-application tracker I built for friends and family. It keeps every application in one place, and helps find and prepare for suitable roles.

The problem

Job searching generates a lot of scattered detail: the posting, why it's a fit, which resume went out, the cover letter, salary, recruiter, dates and interview notes. A spreadsheet holds some of it, badly.

AI assistants are good at finding and assessing roles conversationally, but there was no quick way to get those leads into anything structured. Retyping the company, role, salary and fit reasoning for every lead by hand was the real bottleneck.

What I built

A single Node.js and Express server with a SQLite database and a plain JavaScript front end, packaged with Docker and deployed on Railway so it works from anywhere.

The Dashboard shows status counts and a searchable, filterable table of jobs. The Board is a drag-and-drop kanban from Watching through Applying, Applied, Interview, Offer, Rejected and Ghosted; dropping a card on Applied stamps the application date in the user's own timezone. Each job has its own page with everything in one place: description, fit, resume version, cover letter, notes, salary, recruiter, dates, interview notes, Glassdoor rating and uploaded files.

Key features

Dashboard
Status counts, multi-select filtering, search and bulk delete.
Kanban board
Drag cards between stages; moving to Applied records the date.
Job pages
Every detail about an application, plus file uploads.
Crawl queue
Import roles found by an AI-assisted search, with validation and duplicate detection.
AI assist
Tailor a resume, draft a cover letter, compare against the job, or find missing keywords.
Private accounts
Invite-only sign-up, and nobody can see anyone else's jobs, resume or notes.

Interesting problems

  1. Turning AI search results into clean data

    The crawl queue takes the JSON an AI assistant returns when asked to search for suitable roles (there's a copyable setup prompt on the page). The parser is deliberately forgiving: a single object or an array, code fences, and a wide range of key names for the same field all work. Each row gets validation warnings for missing or invalid fields, a formatted salary and a fit-score preview before anything is imported.

  2. Duplicates, without leaking anyone's data

    Incoming roles are matched against existing jobs by normalised URL, then by company and role, with the choice to skip, update the existing job, or import anyway. Duplicate checks only ever look at the current user's own jobs, so the queue can't reveal what anyone else is applying for.

  3. From a shared tracker to real accounts

    Every job, queue row and setting is scoped to its owner. Passwords are hashed with scrypt and compared in constant time, sessions are random tokens in HttpOnly cookies, and sign-up requires an invite code. When accounts were added to what had been a single shared tracker, the first account to sign up inherits the existing data, so nothing was lost in the move.

Decisions & trade-offs

  1. AI assist works with or without an API key

    With a Claude API key saved in Settings, each AI action runs in one click. Without one, the app builds the same prompt and copies it, ready to paste into a chat assistant, so the feature is still useful to everyone.

  2. One process, one database file

    A single Node process with SQLite on disk means backing up one folder backs up everything, and it runs on any host with a persistent volume.

Outcome

It started as a simple shared tracker with a name picker instead of real logins, and grew into a proper multi-user app: invite-only sign-up, with every job, resume and API key private to its owner, so each person gets a completely separate tracker.

It's been in continuous use since late July. Most improvements since then have come straight from real use: a UI bug, a privacy gap, a missing column, a tooltip that didn't render. That kind of steady feedback is the best evidence it's genuinely useful.

Tech

  • Node.js
  • Express
  • SQLite
  • JavaScript
  • Claude API
  • Docker
  • Railway