Back to all work
Pharos — self-built AI job search tool

Apply Now (and choose… wisely)

Job scoring, resume tailoring, market intelligence

Any system that scores job postings against your resume is going to be wrong sometimes, which means most of the design work is ensuring that what you put in front of a person allows them to disagree intelligently.

Role
Designer & engineer
Scope
Human–AI decision support
Outcome
12+ sources daily · 1,100+ postings scored · tailored resume per job

Pharos is a tool I built and run every day: it sweeps a dozen job boards each morning, scores what it finds against my resume, generates a keyword-tailored PDF for each survivor, and hands me three or four postings to actually decide on.

Along the way it tracks the market: a salary survey built from real posting data, a keyword-demand signal that shows which skills are heating up week over week, and a hiring-contact lookup so the follow-up DM is ready before I hit apply.

The decisions that carry the weight: the resume is the rubric, so there’s no setup wizard; anything 3/5 or below never reaches the board; and the AI surfaces and scores but never acts. Every apply-or-discard call is mine, and none of it is locked in.

Hello? Is it me you’re looking for?

Forty apps a week gets you two replies: one is a rejection, and the other is a rejection for a position older than your kid.

Pharos sweeps a dozen job boards every morning before I’m awake, scores what it finds against my resume, throws out anything that isn’t worth an afternoon, and hands me three or four postings to actually decide on. I’ve been running my own job search on it daily since the start of July.

It exists because the alternative was forty applications a week and two replies, one of them a rejection template that didn’t name the role. The less you hear back, the more broadly you apply, and the more broadly you apply the less any single application is aimed at anything, which is exactly what drives the response rate down: a spiral nobody designed that everybody ends up in anyway.

Mobile
9:41Pharos CRM job board — mobile view
Desktop
Pharos CRM job board — desktop view
The daily board. A real morning’s worth of scored postings. The red dot means I’ve applied there before, the amber one means the application process is long enough to be worth knowing about in advance, and the sys / org badge is the call on which of the two resume variants to send. Company names, role titles, salary bands and locations are replaced throughout — the scoring, the reasoning and the structure are exactly what the tool produces, but the live board is a record of where I am currently applying.

Why I didn’t just buy one

Tools that promise better odds only provide better MRR for themselves, so I decided to make my own.

There are tools for this already. Teal and Huntr and Jobscan have been selling versions of it for years at somewhere between thirty and fifty dollars a month6. Structurally, it’s the same arrangement LinkedIn Premium is currently under investigation for: people paying a subscription for better odds of not being unemployed. The worse your situation gets, the more the thing is worth to you, which is a business model with a very unpleasant gradient running through it.

The investigation is real. In July the Texas Attorney General demanded documents4 on whether LinkedIn had been selling Premium on the promise of a job marketplace while profiting from listings that weren’t real openings. Nothing has been filed and LinkedIn says its policies require postings to be authentic, so make of it what you will. The underlying number isn’t really in dispute, though: Greenhouse put ghost jobs at 18 to 22% of all online postings2, one analysis of LinkedIn specifically landed on 27%3, and the Attorney General’s office puts it somewhere between a fifth and a third. Set against roughly 250 applications per opening1, that’s a lot of afternoons spent on jobs that were never there.

Hinge has spent years marketing itself as the dating app designed to be deleted5, which is a strange promise for a subscription business to make and an entirely coherent thing for a product to aim at. Nobody’s going to build that for job hunting, because job boards are advertising platforms whose business model runs on volume, and a feature that reliably told you which postings were worth your time works directly against the metric they’re measured on.

And while I was building mine, a founder in the States shipped Dreamwork, which ranks live roles against your profile and files applications on your behalf, put together over five months after Indeed laid off his pregnant wife7. He landed on nearly the same architecture I had, independently, on the other side of a border. I found that reassuring rather than deflating, because two people staring at the same broken thing and reaching for the same shape of fix is decent evidence that the shape is right.

The human in the loop

That meant evaluating the fit with who I am, rather than trying to be all things to all people who all happen to want a blue morpho for their collection.

The one that mattered most was making the resume the rubric. The tool reads what you’ve already written and derives its scoring criteria from that, instead of making you fill in a preferences wizard describing a version of yourself you’d have to invent on the spot. Every spreadsheet tracker I’ve ever abandoned asked me to build the system before I was allowed to use it. This one starts working the moment you hand it something to read.

It also flips the advice everybody gives you: rewrite your resume for every posting you come across. That advice only really makes sense as a coping strategy for spraying applications at volume, and it quietly puts the document on trial in front of each new job description that wanders past. Turning it around so the resume does the judging meant I stopped rewriting myself forty times a week to suit whoever happened to be hiring, which was better for the applications and considerably better for my sanity.

Mobile
9:41Pharos CRM decision surface — mobile sidebar view
Desktop
Pharos CRM decision surface — sidebar detail view
The decision surface. Everything a person needs in order to overrule the score, on one screen: the verdict in plain language, the posting facts, the reasoning broken out one dimension at a time, and the two buttons where the actual call gets made.

That screen is where a person is actually in the loop. Everything upstream of it happens without me and is meant to, and everything downstream is me pressing one of two buttons. The whole job of the interface is to get somebody to a decision they’d be willing to defend, in about forty seconds, on reasoning they can argue with rather than a number they have to take on faith. That’s why the domain score sitting at 4 while everything else sits at 5 is the most useful item on it. The machine noticed the same soft spot I would have, and it tells me which part of my background is going to have to do the heavy lifting.

Anything scoring 3/5 or below never reaches the board, which is a position taken on your behalf before you’ve finished your coffee, and all of it is still sitting there if you want to go and argue with it. The rule underneath that, and underneath everything else, is that nothing it does is allowed to be irreversible. It can surface and score and recommend as much as it likes, but every actual go or no-go stays with you, because you’re the one who remembers getting ghosted by these people last spring.

On the networking side, contacts link through to organizations so you can see the whole picture at any given company, and anything untouched for fourteen days gets flagged as stale. What usually kills networking isn’t bad outreach so much as forgetting to follow up on the good outreach because something else got in the way.

Profile & resumes

  • PDF upload, parsed on ingest
  • Multiple named variants held side by side
  • Per-variant keyword key extracted and used in scoring
  • Set an active variant; re-evaluate the profile when it changes
  • Target role, location and links stored once

Intake & scoring

  • Daily sweep across twelve-plus sources, run unattended
  • Dedupe by company and title, keeping the direct ATS link
  • Scored on five rubric dimensions, each with written reasoning
  • A resume variant recommended per posting
  • Auto-discard at 3/5 and below
  • Link verification before anything reaches the board

The board

  • Inbox, Applied and Discarded as separate states
  • Filter to 5/5 or 4–5/5; sort on any column
  • Detail modal with verdict, facts and full breakdown
  • Apply or discard in one click, both reversible
  • Prior-application and long-process flags
  • Export

Contacts

  • People linked to organizations
  • Relationship, status and next action
  • Warm-intro path recorded — who introduces you to whom
  • Running contact log per person
  • Suggested outreach, copy to clipboard
  • 14-day staleness flag on anything untouched

Organizations

  • Industry, priority, tags and a “why this org” note
  • Every person you know there, in one place
  • Every application you’ve made against them
  • Activity log and next action
  • Board or table view; export
Five surfaces. The scoring gets the attention, but the organization view is the one that changed how the search felt. It turns a pile of unrelated applications into a picture of where you actually stand at a given company.

How it got built

So Claude helped me build my own net in a few weeks, and I was left with the tricky part of choosing which moth to squash, and which butterfly to let go.

I built all of this with Claude, which in practice meant I wrote the spec (the data structures, how a posting gets parsed and where it goes on the board), Claude built it overnight, and I’d use the result the next morning and come back with whatever was wrong. Under the hood there’s nothing exotic: the daily sweep is a scheduled task that spawns its own sub-agents, the dashboards are plain HTML and JSON served by a small Python process, and the integrations run over MCP. None of it would impress an engineer, and the hard part was never the engineering anyway; it was understanding the problem well enough to know what the structure had to hold.

What I kept for myself was the judgment, and that’s where most of the time went. Making the resume the rubric instead of asking for a preferences form, letting a 3/5 vanish rather than sit on the board making you feel guilty, putting the actual call at those two buttons and nowhere else: none of these are unusual design decisions, but they took as long as design decisions always take, because a model will happily build whatever you describe and has no stake in whether your Tuesday morning goes well. Even so, the whole thing came together in a few weeks, where once it would have taken me several months just to specify it for somebody else to build.

Won’t you light my way

The whole thing illuminated what I was looking at, and stopped me from flying to any blinding light along the way.

The pipeline keeps narrowing what deserves your attention, and every place where it narrows is a decision about where judgment belongs.

50+ RAW SCRAPE — new postings per day, across all sourcesNEW DAILY POSTINGS
30 DEDUPED — one job, one entry, most direct linkDEDUPED — one job, one entry
10–15 SCORED against the rubricSCORED against rubric
Auto-discard3/5 and below never reaches the board
3–5 VERIFIED LIVEVERIFIED LIVE
1 HUMAN GATE — presented one at a time, go / no-goHUMAN GATE
Fifty-odd postings narrowing down to one decision at a time, with everything in between happening where you don’t have to watch it.

The same logic decides how much effort any one posting has earned. Links only get checked for the ones that already scored 4 or 5, because there’s no sense burning a round-trip confirming something that got thrown out three steps earlier, and the check only fans out across several agents when there are three or more links waiting. Both of those read like engineering optimizations until you notice what they’re actually doing: refusing to spend your morning on things you were never going to apply to.

It started as a single agent working down a list. That stopped being viable the moment there were ten sources to sweep, because a serial run is hostage to whichever board happens to be slowest that morning. So it became a multi-agent architecture, and that turned into its own design problem, and the question shifted from what the AI shows the user to the stranger one of how several AI actors should coordinate before anything gets shown at all.

Phase 1 — parallel

Sub-agent A — Browser
Rendered pages, JS-only boards, saved searches behind auth
Sub-agent B — Web + API
Public ATS boards, aggregators, structured job-search APIs

↓

Phase 2 — serial

Merge + dedupe
One job, one entry, most direct apply link kept

↓

Score against rubric
Five dimensions, each with written reasoning
≤ 3/5 — auto-discard
Never reaches the board

↓

Phase 3 — conditional

Verify links
3+ → parallel agents · fewer → serial

↓

Phase 4

Human gate
Presented one at a time, go / no-go
Which agents run at the same time, which ones wait their turn, and where the human sits are all product decisions well before they’re technical ones, because between them they determine what the whole thing actually feels like to use.

The split follows the judgment: collecting postings is commodity work with nothing to weigh, so it fans out across agents that never need to know about each other, while scoring and deduplication and presentation all carry judgment and come back through a single agent holding the whole picture. The human checkpoint sits at the end rather than somewhere in the middle, so you get asked to decide once against a short list instead of repeatedly against a long one.

So now what?

The hardest part of designing with agentic AI is deciding where it should stop and ask what’s next, because that’s where the decision becomes mine alone, and every delegation and every bit of trust so far gets put to the test.

I stopped applying to everything and started evaluating fit first. That sounds obvious written down, and it took a piece of software to actually make it happen. The rubric gave me something I hadn’t expected: permission to skip a posting without guilt. When the reasoning is sitting right there in front of you, it’s much harder to agonise about whether you’re being too picky. It also gets there first more often than not: on a typical morning three out of five new postings are already scored and waiting by the time LinkedIn decides to send its daily digest. And networking stopped being a permanent shapeless guilt and became a pipeline with states in it. I’d have called that a trivial change if the staleness flag hadn’t gone on to alter my behaviour more than every advice article I’ve ever read put together.

Daily
runs every morning, unattended
12+
sources swept in parallel per run
3–5
decisions surfaced from 50+ new daily postings
14d
staleness flag on every contact

The hardest part of designing for AI is the seam between the algorithm and the person standing in front of it. A score of 4/5 is an opinion, it might be wrong, and you have to hold both of those at once without concluding the whole thing is useless. It’s a narrow gap to aim at, because if you show too little of the reasoning you’ve built a black box, and if you show too much you’ve buried the decision in the middle of it.

Trust gets earned in unglamorous ways: reasoning you can actually read, overrides that take one click, and some grace about the times it gets things wrong, which it will.

I built Pharos because nothing else worked and I needed something that did. It turned out to be the most instructive design problem I’ve had my hands on in years, because the material itself — non-deterministic outputs applied to decisions that actually matter to somebody — demands a kind of thinking that no amount of making the button bigger will ever get you to.

Which is, in the end, the name. It throws light on the water (the scores, the reasoning, the postings that were never real jobs) and then stops there, because a lighthouse doesn’t steer the ship. It does, however, prevent you from smashing your boat/head/bones and organs against the jagged rocks, repeatedly.

Sources

Sources

  1. Application volume per opening is an industry-wide estimate rather than a single audited figure; commonly cited ranges run from roughly 240 to 250 per posting, with entry-level roles considerably higher. The Interview Guys, citing Business Insider data.Treat as directional. The underlying methodology is not public.
  2. Greenhouse, 2025, estimating that 18–22% of online job postings are ghost jobs. Reported in Entrepreneur.
  3. ResumeUp.AI analysis of US listings on LinkedIn, finding 27.4% likely ghost jobs. Reported in Forbes.Other studies put the figure as low as 1 in 7. The spread across sources is itself the honest finding.
  4. Office of the Texas Attorney General, 14 July 2026 — Civil Investigative Demand issued to LinkedIn over alleged “ghost jobs” and Premium subscription marketing. Fox Business · KXAN.An investigation, not a lawsuit. No formal charges have been filed and LinkedIn disputes the characterisation, stating its policies require postings to be authentic and accurately represented.
  5. Hinge, “Designed to be Deleted” — brand platform launched 2019 by Red Antler, with later iterations by Wieden+Kennedy Portland; the line still runs on Hinge’s own homepage. hinge.co · Ad Age · The Drum.
  6. Published subscription pricing for the incumbent job-search tools, as of 2026: Teal from $29/month, Huntr $40/month, Jobscan roughly $30–50/month. The AI Career Lab comparison · LoopCV on Teal.All three offer limited free tiers; the figures above are the paid plans.
  7. Dreamwork — dreamworkhq.com. Ranks live roles against a candidate profile and files tailored applications on approval, with agent integration. Founder’s account of building it after his wife’s layoff: Show HN thread.Free tier with paid upgrade. Named here as independent convergence, not as a competitor — I have no affiliation with it and found it after Pharos was already running.

Next

© 2026 Vladimir Lukić — Editorial, Experience & Product Design | Stories+Systems
linkedin.com/in/vlukic
catena.courses
Scroll down for full case study