Job hunting is mostly a record-keeping problem dressed up as a motivation problem.
Early on I would send out twenty applications and then lose track of who replied, who
ghosted me, and which role I actually wanted. So I built a dashboard to run the whole
thing. It lives on localhost, stores everything in SQLite, and runs as one Python
process. Nothing touches a cloud.
It is a fork of Pickle-Pixel/ApplyPilot,
and this post is a tour of what I added. My fork is public at
github.com/msohailse/ApplyPilot.
Top of the dashboard: the todo list, the notes I am studying toward, and the headline
counts.
A daily goal, with a streak
I apply to five jobs a day. That is the whole game. A small bar at the top of the job
list shows how far along I am, and when I mark the fifth one it throws confetti. It
also reports how long it took, counted from my first application of the day to the one
that finished the goal. Today it was 1h 46m.
Five out of five, a one day streak, and the time it took to get there.
It sounds silly, and it is. But the streak is the only thing that has gotten me to
open the dashboard on a day I did not feel like it.
Every job card is where the work happens
Each row in the list is one job. The score sits on the left, the title and company
follow, and everything I might need is on the same card.
One job: score, tags, description, the files I generated, the status buttons, and the
note fields.
From here I can mark a job as View, Applied, Failed, Not Available, or Not Interested,
and later move the ones I applied to into interviewing, rejected, or no deal. Two
decisions I am glad I made: a rejection does not erase the application date, and jobs
that vanish from the board stay in the database but drop off the active list. If I
deleted them, my success rate would look better than it truly is, and I would be lying
to myself.
Generate a resume and a cover letter for each job
The same card has Generate Resume and Generate Cover Letter. Both are written from the
job description, and I can type a short instruction first, something like "lead with
the platform work, skip the frontend bullets." The output lands in a downloads folder,
and each file shows up on the card with its own small delete button, so I can drop a
bad one without touching the rest.
I also keep two versions of my resume, one for Italy with my Italian number and a
Florence address, one for Norway. A dropdown in the top bar picks the variant and it
flows through the generated resume, the cover letter, and the PDF links on my site.
Adding a third country is a single command.
Notes, on the job and in a list
Every card has a note field and a separate "Personal Note for Study" for the gaps a job
exposes, like a stack I keep seeing but have not used yet. For everything else there is
a todo list at the top of the page, and each item can carry a tag so I can filter it
later.
The todo list. Each task can have a tag, and the dropdown filters by tag.
Filters, including the one that matters to me
The filter bar is where I actually spend my time. I can narrow by score, status,
language, employment type, work mode, company, and country. The country filter is the
reason I built it: I apply in both Norway and Italy, and mixing those results together
is useless.
Score, status, language, type, work mode, country, company, and a free text search.
There is also a score distribution you can click to filter by an exact score, and a
list of sources that works the same way.
The report
The report tab is the honest ledger. It shows applications sent, how many went out
today and this week, a pipeline with the success rate at each stage, and a day by day
count.
Applications sent, the pipeline and success ratio, and a day by day breakdown.
The headline number is simply applications sent. No invented score, no vanity metric.
A skills analysis across my best matches
I hit one button and it reads every job I scored 7 or higher, then writes up which
skills keep coming back and where my gaps are. It is a view of the market rather than
of a single posting, and I re-read it before starting a new batch. Highlighting a
single job does the smaller version of the same thing, pulling its key concepts onto
the card.
What I would tell you
Fix your data before you add features. My Apply button was broken because the scraper
had stored the literal string "None" for 369 jobs, so every click sent me to
localhost/None. Cleaning that up did more for the tool than any new button I built.
Then pick one number you refuse to fudge. Mine is applications sent. Once that number
is true, everything else gets easier.
The code
- Original project: Pickle-Pixel/ApplyPilot
- My fork with everything above: github.com/msohailse/ApplyPilot



















