← Back to work

Xelsus product · In development

When the keyword score says 97 and the evidence says 54: job matching that tells candidates the truth

Job Hunter collects roles from public job boards and from the alerts a candidate already receives, filters them cheaply, and spends AI judgment only on the shortlist. Instead of a match percentage, it returns strengths, gaps and dealbreakers against the candidate’s real experience.

See Job Hunter ↗
Product
Xelsus.ai, in development
Scope
Collection, deduplication, two-stage ranking, profiles
Timeline
2026
Role
Product and engineering

97 → 54

A real posting: the fast score matched the title, the evidence-based reading found the actual work did not fit

7

Public sources merged into one deduplicated pool, plus the job alerts already in the candidate’s inbox

2 stages

A free deterministic filter decides what deserves an AI read; only the AI verdict can recommend applying

0

Invented match percentages. Every verdict lists strengths, gaps and dealbreakers instead

01

The problem

Job openings now receive hundreds of applications each, and candidates answer by sending more. Most tools make it worse: they count keywords, show a match percentage and say nothing about why a role fits or what would disqualify the candidate before a person ever reads the application.

The same role also shows up on several boards and in several alert emails under slightly different names. Candidates lose hours sorting duplicates and still apply to roles that share a title with their experience but not the actual work.

02

Why it was hard

  • The same role appears on several boards and in several alert emails, with different titles and company names.
  • Keyword matching rewards the right words, not the right experience.
  • Reading every posting with an LLM is slow and expensive, and a single percentage hides the reasoning.
  • A candidate’s mailbox is sensitive: access has to be read-only and limited to job-alert senders.
  • Profiles change, and scores computed against an old profile must never mix with new ones.

03

What we built

A local-first application with one shared pool of postings and private profiles, scores and decisions for each person. Collection and the fast score are deterministic; the considered score is an AI reading with a strict output format. The same scoring contract can be filled by an API call or by an AI agent working through a command-line interface.

Public job boards and APIs
Job-alert emails, read-only and limited to alert senders
One pool: the same role from several sources becomes one entry
Fast score: title, skills, domain, seniority, recency, with penalties for knockouts
Shortlist only: AI reads the full posting against the profile → strengths, gaps, dealbreakers, location eligibility
Versioned profile, private decisions, the candidate’s funnel against market benchmarks

04

Where the innovation is

01

Cheap filter, expensive judgment

A deterministic first stage scores every posting for free. Only postings above a threshold, capped per run, get an AI reading, and only that reading can recommend applying. The expensive judgment goes where it can change a decision.

02

A verdict, not a percentage

The AI must answer in a strict format: an overall score and sub-scores, location eligibility, strengths, gaps, dealbreakers, the keywords worth tailoring for, and a short summary. A candidate sees why, not just how much.

03

Software an AI agent can operate

Every core action is a command that takes and returns JSON, and a skill in the repository teaches an AI coding agent the judging rules. In early phases the agent does the reading without a per-call API bill; later the same contract is filled by an API call. Judgment is separated from plumbing.

04

Evidence only

The rules are explicit: years of experience do not prove a specific technique, location and work-authorization knockouts are checked first, and a failed knockout keeps the score low no matter how good the rest looks. No hidden text and no keyword stuffing, ever.

05

Scores pinned to a profile version

Every saved profile is a version. Scores remember which version they were computed against, so a profile change triggers rescoring instead of quietly mixing old and new verdicts.

06

Private by construction

Mailbox access is read-only and the sender list is fixed in the code. Message bodies are parsed for the posting details and then discarded. Data lives in a file on the user’s own machine, and the profile goes to an AI provider only when the user turns that on, under their own account.

05

What the first runs showed

The first crawl gathered 218 unique postings after merging duplicates. The most useful result was not a number. It was a disagreement between the two stages, and the reason written next to it.

One real posting, read twice

A management role in analytics engineering. The company is withheld.

Fast score vs. considered score

97 → 54 · skip

Fast score
97
Considered score
54
Title
Matched
Actual work
Did not match

Why it matters

  • The title and the keywords looked right
  • The day-to-day work was something else
  • The reason is written down, not hidden in a percentage

06

Results

  • Working today: collection from seven public sources and from job-alert emails, deduplication, fast and considered scoring, versioned profiles, and a shared pool with private decisions.
  • 218 unique postings on the first crawl, after merging duplicates across sources.
  • A move from one user to several kept every posting and every score intact, with a backup taken first.
  • The candidate’s own funnel shown next to published market benchmarks, to tell a weak CV from a brutal market.
  • Next: knockout checks before applying, requirement-by-requirement coverage against the CV, and a CV per target role from the same facts.

07

What we learned along the way

The disagreement is the feature

When the fast score and the considered score disagree, that gap is exactly what a candidate needs to see. Showing both, with the reason, is more useful than any single number.

Separate judgment from plumbing

Letting an AI agent fill the same scoring contract as the API meant the product could be built and tested on real postings before paying for a single inference call.

No invented scores

Popular concepts like a universal résumé score do not hold up under scrutiny. The product checks what can actually be verified, like whether a CV survives parsing, and says plainly what it cannot know.

Stack

  • Next.js
  • React
  • TypeScript
  • Drizzle ORM
  • SQLite
  • Zod
  • Claude API (structured outputs, prompt caching)
  • Gmail API (read-only)
  • Tailwind CSS
  • Claude Code skills

Looking for your next role?

Job Hunter is being built in the open. See what already works, what comes next, and how your data is handled.

Visit Job Hunter ↗

Job Hunter is a Xelsus.ai product in development. The posting in the example is real; the company is withheld. No personal data is shown.