Job Match Dashboard
An AI-native tool I built to run my own job search, because I got sick of doing it by hand
Concept Project — Self-Directed & Live
What It Actually Is
A dashboard that scrapes LinkedIn, Glassdoor, and Indeed every day, filters listings against real criteria (things like active security clearance requirements, which knock out a surprising number of postings), matches what’s left against my actual background, and drops it all into one triage view. I open it once, sort by score, and decide what’s worth my time. No more tab-switching. No more spreadsheet.
It’s built no-code. Apify handles the scraping side, Claude handles the matching logic, the filtering, and the dashboard itself. It runs daily on its own.
Why This One's Different From the Rest of My Portfolio
Most of my AI-native work is concept-stage. Real problems, real thinking, but hypothetical builds. This one isn’t. It’s live right now. I use it every day, for my actual job search, and you’re reading this case study about a tool that’s currently sitting open in another tab, doing its job while I write this sentence. That’s a different kind of proof than a prototype.
The Build Didn't Work on the First Try. It Didn't Work on the Second One Either.
This took 14 iterations to get right. Here’s the honest version of how that went, because the messy middle is more useful than the polished ending.
Stage One: Too Narrow
The first version matched on single keywords, no context, nothing smart about it. “Prototype” was one of them. It surfaced about 6 jobs a day, and 4 of those 6 were usually wrong. The best (worst) example: it matched me to an opening for an engineer who builds robot prototypes. I’m a Product Designer. The word matched. Nothing else did.
Stage Two: Too Broad, Plus a Bug
I fixed the matching logic properly this time, comparing listings against three real sources: my resume, my portfolio case studies, and my LinkedIn profile. That was the right move conceptually actual context instead of keyword roulette. But I overcorrected hard. Day one: 149 matches. Day two: 132. Also on day two, a duplicate-listings bug showed up, jobs from the day before quietly resurfacing like they’d never been reviewed.
149 matches a day is not a triage tool. It’s just the manual problem again, wearing a nicer outfit.
Stage Three: Where It Actually Landed
Tuned down to a realistic 30 to 50 matches a day, with only 10 to 12 needing a manual screen-out. I also added a “Not Interested” button, a simple manual override sitting on top of the automated filtering, so the system isn’t the only line of defense. That combination tighter matching plus a human control layer is what made it usable daily instead of impressive-once.
What's Actually in the Tool
- Score tiers. Strong, Good, Fair, color-coded so I can scan a full day’s results in about ten seconds without reading a single job title.
- Matched-keyword chips on each card, capped at 8 with a “+N more” overflow instead of dumping every match term onto the screen.
- A min-score slider and a hide-passed toggle, so the threshold for “worth looking at” is mine to set, not the algorithm’s.
- Live search, for when I want to check something specific instead of browsing the queue.
- Pass / Undo, the manual layer from Stage 3 one click and a job’s off my plate (or back on it, if I change my mind).
The one I’m proudest of is the Copy Apply Prompt button. Click it on any job card and it generates a ready-made prompt — job title, company, score, the listing URL copied straight to your clipboard. Paste that into a chat and you’ve got a tailored resume pass started in seconds. It’s the piece that turns “found a match” into “took action on it” without ever leaving the dashboard. That’s the whole point of building something agentic instead of just building a filter. A filter tells you what to look at. This closes the loop.
Design System
#2a78d6
#0ca30c
#d03b3b
#5b3aa7
#52514e
#ffffff
Where It Stands Now
30 to 50 matches a day, high enough signal that only a handful need a second look. That’s down from 149 on a bad day and up from 6 mostly-wrong ones on a worse day. Somewhere in the middle turned out to be the actual answer, which is rarely the exciting version of the story but is almost always the true one.
What I'd Still Fix
Deduplication happens on Claude’s side, and it’s still not perfect. Every so often a job I saw yesterday slips back into today’s results anyway. I know why it happens in general terms. I haven’t nailed the fix yet. I’d rather say that plainly than pretend the tool is finished, because it isn’t — it’s just good enough to run on its own every day while I keep an eye on it.