Open source · in daily use · Apache-2.0→

The job application tracker that never leaves your machine.

Track every application, recruiter, interview round, follow-up and offer.
A self-hosted, open-source CRM for your job hunt, built by a software engineer for software engineers. Kanban board, recruiter CRM, interview rounds, follow-ups, offers and a Sankey funnel, all in a folder on your disk.

$ git clone https://github.com/waddington/job-application-tracker.git
  • Apache-2.0
  • No account
  • No telemetry
  • No scraping
  • Runs on localhost
127.0.0.1:8770
The Overview page of Job Application Tracker: counts, the pipeline by stage, what needs attention and what's coming up (made-up demo data)
  • ✦Kanban board
  • ✦Recruiter CRM
  • ✦Interview rounds
  • ✦Sankey funnel
  • ✦Offers side by side
  • ✦Next actions
  • ✦Timeline
  • ✦To-dos
  • ✦Markdown notes
  • ✦CV versions
  • ✦.eml import
  • ✦Full-text search
  • ✦Duplicate warnings
  • ✦Git snapshots
  • ✦Roles to decide
  • ✦Recruiter scorecard

The problem

Recruiters pitch five roles in one call. Processes drag on for six rounds. Half the companies ghost you. And your spreadsheet has no idea who to chase today.

So here's a CRM for your job hunt.

accounts to create
0
bytes of telemetry
0
of your data on your disk
100%
features built
26

Features

Built for how tech hiring actually works.

Not another spreadsheet template. A proper app with a recruiter CRM, a real stage workflow and a page that tells you what to do next.

Next actions

Know exactly who to chase today.

Replies to read, your own to-dos, follow-ups due, offers to answer and everything that's gone quiet. Follow up, snooze or mark Ghosted in one click.

Next actions: replies to read, to-dos, offers to answer, waiting to hear back and follow-ups
Kanban board

Every application, one drag away.

Drag between stages, see the interview round on each card and who's gone quiet in red. Undo a move you didn't mean.

Kanban board of applications by stage, with interview round badges
Recruiter CRM

One recruiter, five roles, zero chaos.

Calls with an agenda, the roles they pitched, apply or pass on each, and every application they're part of.

A recruiter's page with a booked call, a past call and the roles they mentioned
Sankey funnel

See where it all leaks.

Every application's path, from applied to offer (or to ghosted).

A Sankey diagram of a job search funnel
Offers

Salary vs day rate, settled.

Bonus, equity, pension and IR35, side by side with a worth-a-year figure.

Two offers compared: a salary package and a contract day rate
Timeline

Everything that happened.

Stage moves, messages, calls, rounds and offers, by day or as lanes.

The Timeline as lanes, one row per application

Notes are real .md files

Edit them in the app or in your own editor. They're just Markdown on disk.

Drop in emails

Exported .eml files land on the timeline at the time they were sent.

Search everything

Press / to search applications, people, debriefs, notes, files and links.

CV versions

Every tailored CV and cover letter, and which one each company got.

Duplicate warnings

Know before two agencies put you forward for the same job.

Your workflow

Your own stages, any-to-any moves, or strict Jira-style transitions.

How it works

A day in your job hunt.

  1. 08:55

    Coffee. Open the Overview.

    What's active, what needs attention, who you're waiting on and what's coming up today, before you've finished the first sip.

    The Overview page
  2. 10:30

    A recruiter calls with three roles.

    Log the call against them, add each role they mentioned, and book the follow-up with an agenda.

    A recruiter's page with calls and the roles they pitched
  3. 11:15

    Apply, or pass with a reason.

    Each role gets a page. Drop the job description on it: it follows the role onto your application.

    A role's page with pay, the recruiter, notes and the job description
  4. 14:00

    Round 3: system design.

    Interview rounds in your own words, prep and debrief notes, the CV you sent and the full history, all in one place.

    An application's page with interview rounds, notes, links and files
  5. 17:40

    Chase, snooze, or call it ghosted.

    Next actions lists who to follow up with. One click each, then close the laptop.

    The Next actions page
  6. Friday

    Look back at the week.

    Conversion per stage, time in stage, direct vs recruiter outcomes and a scorecard for every recruiter.

    Conversion, time in stage and a recruiter scorecard

Why not a spreadsheet?

Spreadsheets don't nudge you.

And hosted trackers want your data, your email and a subscription. This one wants nothing.

FeatureSpreadsheet or NotionHosted trackers (Huntr, Teal…)Job Application Tracker
Your data stays on your machineSometimes✕✓
Recruiters with several rolesManualPartial✓ First-class
Real stage workflow and history✕Partial✓
Notes, files, emails and CV versionsMessyPartial✓
"Who do I chase today?"✕Partial✓
Free and open source✓✕✓ Apache-2.0

It's also deliberately not a job-search engine: no scraping, no job-board feeds. It tracks the applications you make.

Local-first, for real

Your job hunt is nobody else's business.

Salaries, recruiters' names, interview notes and the CV you tailored at 1am: none of it should live on someone else's server. Here it lives in one folder you own, in formats you can read without the app.

  • Runs on 127.0.0.1. No accounts, no cloud, no telemetry. It never sends email or fetches from the web.
  • Plain files. SQLite for speed, a JSON Lines export you can diff, real Markdown notes and your files as they are.
  • Backups for free. Make the folder a private git repo: the app commits a snapshot after each burst of changes, and jat push sends them off-machine.
How your data is stored →
Your browser127.0.0.1:8770React · Mantine · d3-sankey
jat serveFastAPI + SQLitePython 3.12 · run with uv
Your data folder~/job-search-dataexport/*.jsonl · notes/*.md · files/
jat pushYour private git repofull history, off-machine
Built withPython 3.12uvFastAPISQLAlchemyAlembicSQLiteReact 19TypeScriptMantineTanStackd3-sankeyVite

Quick start

From git clone to tracking in a few commands.

Fair warning: this is a tool for developers. There's no installer and no hosted version. If you're happy in a terminal, you'll be fine.

Linux or macOS. Windows isn't supported (the app uses Unix file locking).

$ git clone https://github.com/waddington/job-application-tracker.git
$ cd job-application-tracker
$ uv sync
$ pnpm --dir frontend install && pnpm --dir frontend build
✓ built the web UI into frontend/dist

The user guide covers the rest: where your data lives, backups and restoring, a second computer, your own stages and every command.

FAQ

Questions, answered.

Anything else? Ask in an issue: there are no silly questions about job hunting.

Is it free?

Yes. It's open source under the Apache-2.0 licence. No plans, no seats, no trial.

Where is my data stored?

In one folder on your own machine that you choose, kept separate from the code: a SQLite database, a readable JSON Lines export, your Markdown notes and your files. Nothing is uploaded anywhere.

Does it scrape LinkedIn or job boards?

No. By design it tracks the applications you make. It never searches for jobs, never fetches from the web and never contacts anyone.

What do I need to run it?

It's a developer tool: Python 3.12+ with uv, Node.js 22.12+ with pnpm to build the web UI, and git for automatic snapshots. Linux or macOS. Ideally your data folder is a private git repo, so every change is backed up.

How do I back it up?

If the data folder is a git repo, the app commits a snapshot after each burst of changes and jat push sends them to your private remote. For a single file, download a zip from the sidebar or run jat archive.

Can I use it on two computers?

Yes, one at a time: clone your private data repo on the second machine, point JAT_DATA_DIR at it and run jat init. When you switch, push on one, then pull and jat restore --force on the other.

Can I use it for non-software jobs?

Yes. It's built with tech hiring in mind (recruiters, coding interviews, take-home tasks), but the stages are yours to configure in config.toml.

Is it ready?

Yes. Every planned feature is built, and it's in daily use for a real job search. The version is still 0.1.0 only because it hasn't been bumped to 1.0 yet. Issues and pull requests are very welcome.

Is it multi-user?

No. It's a personal tool for one job seeker, running on localhost.

Your next offer is in there somewhere.

Clone it, run it, and never lose track of a recruiter again.