How it's built
A system that reads job postings and evaluates them against a profile. The AI model evaluates; rules in code decide; the person chooses. Here is how it works, in detail.
The journey of a posting
Sources
Public job-board APIs and company career sites (Greenhouse, Lever, Ashby), plus the alerts the person forwards by email.
No LinkedIn scraping and no automatic applications.
Normalization and deduplication
The same posting from two sources becomes a single job.
Prefilter (code, no AI)
Work mode, discipline, off-profile titles and required country. It discards cheaply before spending on AI.
AI evaluation
Reads the full posting against the profile and returns a fixed, validated structure: score, pros, cons, gaps and risks.
decide() (code)
Applies verifiable rules: required years, English, residency and a per-title ceiling. That yields the action: apply, save or discard.
The model suggests; the code decides.
The app and MCP
The person sees the reasoning and decides. It can also be queried over MCP, a protocol for connecting AI assistants.
How the AI is kept from making things up
Golden set
A set of postings with the correct answers agreed in advance. Every prompt change is measured against it, with strict and lenient metrics, before it ships.
Validated output
The model must answer in a fixed format, validated against a schema (Zod). If it doesn't, the call is retried or discarded.
Rules live in code
Years of experience, English level, country and per-title ceilings are applied after the model, with tests. The model cannot talk the system into applying, and the system never applies for you: the person decides.
Prompt injection
A posting can carry hidden instructions meant to fool the AI. The posting text is data, not instructions: the system detects when a posting tries to give orders to the evaluator, and that posting's score is capped.
Cost cap
Daily spending limits apply per person and overall, are enforced in code, and every call is logged.
Emails are parsed safely
If a forwarded email doesn't have the expected structure, it goes to manual review. Nothing is partially extracted. The HTML is shown isolated, with no scripts or navigation.
Stack
- Web
- Next.js (App Router), strict TypeScript and Tailwind.
- Data
- Postgres with Row Level Security (RLS), so each person sees only their own data, and Drizzle.
- AI
- Vercel AI SDK. The model is picked from a routing table, with a fallback.
- Quality
- Vitest, Playwright, integration tests against a real Postgres and a CI with a secret scanner.
- Infra
- Vercel and Neon, with scheduled jobs in GitHub Actions.
Live numbers
- Active postings
- 2,337
- Sources
- 6
- New in 24 h
- 226
- Updated
- 3 h ago
Counts the distinct postings we saw in the last 7 days across the sources we read.
More than 2,000 automated tests (as of October 20, 2026).
The code
The code is public. Read it on GitHub.
GitHub repository (opens in a new tab)Design principles (opens in a new tab)
Looking for a tech job?
Request access