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

I was spending about 20 hours a week just searching. Not applying. Not tailoring resumes. Searching. Opening LinkedIn, then Glassdoor, then Indeed, scanning the same postings across three tabs, saving the ones that looked promising into a spreadsheet that was already out of date by the next morning.That’s basically a part-time job. And it’s the part of job hunting that adds zero value to anyone, least of all me. So I built something to do it instead.

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

The dashboard uses a light, high-contrast surface deliberately — this is a tool I check first thing in the morning and want to scan in seconds, not a dark, moody interface to admire. Color carries real meaning throughout: blue signals the primary action and mid-tier matches, green marks strong matches and salary data, purple distinguishes seniority level from everything else, and red is reserved specifically for “Not Interested” — the one destructive-feeling action in the whole tool. Every rounded element, from score badges to buttons to pills, uses the same full-pill shape, so the eye reads “these are all interactive or informational” at a glance without needing to think about it.
Color System
Accent
#2a78d6
Good
#0ca30c
Danger
#d03b3b
Level
#5b3aa7
Fair
#52514e
Surface
#ffffff
Score Tiers
57% 37% 20%
Pills & Chips
$100,000/yr Senior-level Product Design Figma +12 more
Actions

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.