HireLens

Open source · MIT · self-hostable

AI screening that shows
its work.

HireLens scores candidates against a rubric you control, quotes the exact resume text behind every point, logs every decision to a tamper-evident chain, and audits itself for adverse impact. No black box. No hidden weights — for recruiters or the candidates they screen.

Works with Google Gemini · Anthropic · Groq · OpenRouter · Ollama (local)

hirelens · Senior Backend Engineer — Payments

Review queue

9 candidates · scored by gemini-2.5-flash · rubric v1

Run complete
#CandidateScoreStage
1Olivia Brown43shortlisted
2Ethan Patel30rejected
3Emily Chen26shortlisted
4David Okafor21advanced
5Priya Sharma19shortlisted

4 more candidates →

Why HireLens

A hiring AI with a paper trail.

Screeners that can't explain themselves are a liability — to candidates, to recruiters, and under NYC LL144 and the EU AI Act. HireLens is built around one contract: every score must link to the exact evidence that produced it.

Evidence-linked scoring

Every criterion score quotes the exact resume text that produced it — at its character offset. Click a score and the resume highlights the line. No naked numbers, ever.

hirelens · Olivia Brown — evidence

Resume

Olivia Brown — Site Reliability Engineer
FintechScale · 2020–present
Owned reliability for a payments API serving 200M requests/day. Wrote SLOs and error budgets; drove MTTR down 60%. Built chaos experiments on Kafka and PostgreSQL failover paths.

Rubric breakdown

  • Reliability & incident response“Owned reliability for a payments API serving 200M requests/day”5/5
  • Event-driven & queue architecture“Built chaos experiments on Kafka and PostgreSQL failover paths”4/5
  • Fintech / payments context“Wrote SLOs and error budgets; drove MTTR down 60%”4/5
Overall43/100

Rubrics you control

The LLM proposes criteria from your JD; six anchored levels each, weights normalized. Fork, edit, version, import — the rubric is a JSON artifact you own.

Blind review built in

One toggle masks names, contacts, schools — with character alignment preserved so evidence spans still land exactly.

Adverse-impact auditing

One click computes selection rates by group, applies the EEOC four-fifths rule, and exports the report. Non-reporters are bucketed — silence is itself a finding.

hirelens · bias audit — gender

Adverse-impact report

Dimension: gender · four-fifths rule · 12 considered

FLAGGED
GroupConsideredSelectedRateRatio4/5
Women5360%0.60flag
Men6117%0.17flag
Undisclosed11100%1.00pass

Statistical screen for further inquiry — not proof of discrimination. Exported JSON is written to the hash-chained audit log.

Tamper-evident audit trail

Every decision, override, and report is appended to a hash chain. Tampering breaks the chain visibly.

Your model, your data

Bring a key for Gemini, Claude, Groq, or OpenRouter — or run fully local with Ollama. Resumes never have to leave your machine.

Terminal-grade CLI

score <jobId> ./resumes — the full pipeline from a terminal, with ranked output and JSON for automation. Zero runtime dependencies.

Talent-pool rediscovery (v1.4)

One org-wide search across every candidate from every job — by skill, stage, or rubric-weighted score. Shortlisting a rediscovered person records a regular, audited decision, not a sticky note.

Public parser API (v1.4)

POST /api/public/parse turns a resume into a JSON-Resume-compatible profile: Bearer-token gated, stateless, rate-limited — and nothing stored anywhere.

ATS format check (v1.4)

Every upload gets a deterministic parse simulation — scanned pages, multi-column layouts, mojibake — surfaced as pass/warn/fail with findings, before a scoring run is spent on a mangled resume.

How it works

JD in. Audited shortlist out.

  1. 01

    Paste the JD

    The job description is the contract. Nothing else configures the ranking.

  2. 02

    Derive the rubric

    5–8 weighted criteria with anchored 0–5 levels. Review and edit before anything scores.

  3. 03

    Drop in resumes

    PDF, DOCX, TXT, or a ZIP. Parsed, hashed, deduped, and format-checked — locally.

  4. 04

    Score with evidence

    Per-criterion 0–5 with the exact quoted line behind every point.

  5. 05

    Decide & audit

    Advance or reject with a required reason. One-click adverse-impact report.

Accuracy

An evaluated ranker, not a promise.

Every PR runs a seeded benchmark through the same engine the product uses. The numbers ship in the repo — and on this page. Currently the plumbing run against the offline mock model; regenerate live with your key.

Read the harness source →

47%

Direction accuracy

agreement with expected strong/weak per criterion

0σ

Self-consistency (σ)

σ (sigma) = score wobble across identical reruns — 0 means the same resume always gets the same score

τ 1

Order fairness (τ)

τ (tau) = rank agreement when resume order is shuffled — 1.0 means order never changes the ranking

The honest comparison

FeatureHireLensBlack-box AI screenersLegacy ATS
Why this score?Quoted evidence at exact offsetsOpaque—
Rubric controlVersioned JSON you ownHidden weights—
Bias auditingFour-fifths rule, one clickMarketing page only—
Decision trailHash-chained, tamper-evidentNoneBasic logs
Self-hostdocker compose upSaaS onlyVaries
LicenseMITProprietaryOpen core

Self-host

Resumes never have to leave your machine.

One command stands up the full stack — web, API, Postgres — with migrations applied on boot. Point the LLM at Ollama and your candidate data never touches a third party. Everything lives in your own database, as plain JSON you can query.

Self-hosting guide →
terminal
$ git clone https://github.com/abhay-yemekar/hirelens
$ cd hirelens && cp .env.example .env
$ docker compose up --build -d

✔ web :3000 · api :4000 · postgres :5433
✔ migrations applied · ready in 40s

Questions, answered honestly

Is this another black-box AI screener?

The opposite. HireLens refuses to output a score it cannot justify: every criterion score carries the quoted resume text and its character offset. If the model can't ground a score in the document, the score doesn't ship.

Which LLMs does it support?

Google Gemini, Anthropic, Groq, and OpenRouter with your own API key — or fully local inference with Ollama, in which case no resume ever leaves your machine. Providers that can't express complex rubric schemas natively (like Gemini's nested-array limits) are handled by an automatic validated fallback.

How does the bias audit work?

Candidates may self-report demographics, per dimension, opt-in only. The audit computes selection rates per group, applies the EEOC four-fifths (80%) rule with exact integer math (so 0.8 passes), and reports demographic parity difference. People who didn't report are bucketed as 'undisclosed' — because not knowing who you rejected is itself an audit finding. It's a statistical screen for further inquiry, not proof of discrimination.

Does HireLens make hiring decisions?

Never. It ranks, explains, and audits. Humans make every decision, and every decision requires a stated reason that lands in the tamper-evident audit log. An AI score is a screening aid, not a hiring decision.

Can I self-host it?

Yes — one command: docker compose up --build -d brings up the web app, API, and Postgres with migrations applied automatically. Point it at Ollama and nothing leaves your network.

Can it fit into the tools I already use?

Three doors: a public parser API (POST /api/public/parse — Bearer-token, stateless, rate-limited), an inbound ATS webhook that screens a candidate on an event, and the zero-dependency CLI. Whatever your stack looks like, the evidence trail stays in HireLens.

What's the license?

MIT. Fork it, extend it, run it commercially — the rubrics, evidence, and audit logs are all plain JSON in your own Postgres.

See the evidence before you trust the score.

The live demo scores real synthetic resumes with the actual engine — evidence highlights included. No signup, no email, no drip campaign.

Try the live demo

v1.4.0 is live — talent-pool rediscovery, a public parser API, and the ATS format check. See the roadmap.