Of all the shit I jump over on this job search odyssey, nothing grates on me more than Maryland’s weekly unemployment job contact forms. Every time I finish, I spot a dozen ways it could be better. I keep my job hunt organized in huntr.co, a kanban-style tracker with columns for every stage, note, and activity. It’s the only thing keeping me from losing my mind.

huntr.co | the kanbaniest job tracker

I toss interview transcripts and notes into huntr—shoutout to krisp.ai for making that painless —and set reminders for follow-ups, and flick roles into the ‘rejected’ column with a satisfying drag. After so much practice, it’s second nature. But the real grind is opening each role, hunting for updates, and copying over every detail—URLs, titles, addresses, dates, interviews, interests, the whole parade. It’s so tedious that I procrastinate until Sunday, courtesy of my ADHD, because the process wants my soul.

md beacon | pile of shit and a captcha from hell
md workforce exchange | a smaller pile of shit

So I decided to spend an afternoon bludgeoning this mess. I thought building a CLI that logs in and spits out jobs, activities, job boards, etc., was a good place to start. With filters for the past week and customizable fields, it finally feels like I’m in control. Honestly, the commands themselves are the real storytellers here!

# Machine-readable profile
huntr me --json | jq '{name: (.givenName + " " + .familyName), email}'
# Export boards to CSV
huntr boards list --format csv > boards.csv
# Find jobs with "engineer" in the title
huntr jobs list $BOARD --json | jq '[.[] | select(.title | test("engineer"; "i"))]'
# What statuses are your jobs moving to?
huntr activities list $BOARD --days 30 --types JOB_MOVED --json \
| jq '[.[].data.toList.name] | group_by(.) | map({status: .[0], count: length}) | sort_by(-.count)'

It all began as a scrappy prototype, just me tinkering and trying to crack the authentication rabbithole.

all your data belong to us | obligatory

1) Huntr only has an API if you have an organizational account. No API for my piddling single-user account.

2) Huntr uses Clerk for auth tokens, and they’re completely ephemeral.

Tracking down the right JWT was terrible—401 errors everywhere, copying and pasting sessions and tokens between Chrome’s console and my silly scripts was tedious. But after grinding for a bit, huzzah, Huntr uses Clerk to generate tokens on the fly! Jackpot: Chrome had exactly what I needed, and I can get to it through the remote debugger. Now we stash the token in my Keychain for safekeeping and just grab a fresh one whenever I need to make a request.

thank god for claude + figma

All in all, this turned out to be a pretty awesome Sunday side quest. Next step, better job posting ingestion and wiring up other CLIs for MWE and Beacon! It’s on GitHub and npm… holy shit, my first ‘released’ piece of software! More to come!

Leave a Reply

Discover more from Matt McKnight's Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading