Josh Estrada
Back to work
Personal · Solo Designer, Developer & Operator

AI resume scoring engine that processes up to 500 untrusted resumes and outputs a ranked shortlist with per-requirement reasoning. $299 per posting, no subscription.

Next.js TypeScript Supabase Stripe Claude Sonnet Prisma Tailwind shadcn/ui Vercel
Product walkthrough

From job posting to ranked shortlist

Paste requirements, drop resumes, get a ranked list with scores and reasoning. No setup. No subscription.

Two-tier output format

Unqualified candidates get a lightweight assessment. Qualified candidates get full detailed scoring with strengths, weaknesses, and per-requirement scores. The split reduces token usage by roughly 60%.

Prompt injection defense

Resumes are untrusted input. Regex pre-flight scanning flags suspicious patterns before content reaches the model. XML delimiters isolate resume text, and the system prompt enforces data-only treatment.

Pay-per-job, not subscription

$299 per posting matches how small businesses actually hire (2-3x/year). They resent recurring costs for intermittent needs. ~99% gross margin ($299 revenue vs ~$2 AI cost per batch).

$299 per posting

One-time cost, no subscription. ~99% gross margin — $299 revenue vs ~$2 AI cost per batch of up to 500 resumes

500 resumes per batch

Batch evaluation scores up to 500 candidates per posting. Prompt caching and two-tier output keep per-batch AI cost around $2.

Production-ready

Auth, Stripe payments, E2E tests (Playwright), data retention policies, and automated cold email outreach

System Architecture

Designing the scoring engine

The scoring engine is where the design work lives. Two-tier evaluation and token optimization determine how 500 untrusted resumes become a ranked shortlist.

Raw Resumes
500
500 resumes per batch
+1 job description
untrusted input — injection risk
Unstructured volume,
no signal, no ranking
evaluates
Scoring Engine — the designer's artifact
Two-Tier Output
qualified
unqualified
detailed vs. lightweight — cut token cost
Token Optimization
"requirements"
"rq"
abbreviated keys — prompt caching
Injection Defense
regex pre-flight scan
<
xml delimiter wrapping
data-only treatment
surfaces
Ranked Candidates
1 2 3
1
92
2
84
3
78
4
61
0-100 scores with reasoning,
strengths, and per-requirement evidence
Component anatomy

Three screens, one workflow

The whole point is getting a hiring manager from "I have 500 resumes" to "here are my top 10" without making them think about how.

Requirements
Job title
Senior Frontend Engineer
Must-have
React TypeScript 3+ years
Nice-to-have
Next.js Testing
"What does this role actually need?"
REQUIREMENTS
Structured input so scoring is consistent

The manager pastes a job description and the system pulls out requirements: must-haves vs. nice-to-haves, weighted by importance. That structure is the reason per-requirement scoring works at all. Without it, the AI scores holistically and you can't see why someone ranked where they did.

Design trade-off Auto-extraction can misread what the manager actually cares about. So the UI shows extracted requirements as editable tags. They can fix things before scoring starts. One extra click beats hundreds of wrong scores.
Ranked Results
1 Sarah Chen
92
2 James Park
85
3 Maria Santos
78
4 Alex Kim
52
"Who should I interview first?"
RESULTS TABLE
Scannable ranking, detail on demand

This table answers one question: who's worth talking to? Candidates are sorted by score with bars for quick comparison. Click a row to see per-requirement breakdowns, strengths, weaknesses, and the AI's actual reasoning. Managers can check the work before scheduling anyone.

Design trade-off 500 rows of full detail would be unreadable. So the table shows scores first, detail on click. That matches how hiring managers actually work: skim the list, then dig into the top 10 or 15.
Candidate Detail
Sarah Chen 92/100
React
TypeScript
3+ years
"Why did this person score a 92?"
DETAIL VIEW
Per-requirement evidence and reasoning

Every score shows its work. The detail view breaks the composite into per-requirement scores with confidence levels and plain-language reasoning. Strengths and weaknesses are separate so managers can weigh them. The number is a starting point, not the final answer.

Design trade-off Just a number and people don't trust it. The reasoning is verbose, but without it managers second-guess the rankings and stop using the tool.