How the agent works.
The box on the homepage is the most honest thing I can show you: a small production AI feature with the same trade-offs I'd make at work. Here are the decisions behind it.
- 01Knowledge
One source of truth, no vector DB.
Every fact on this site lives in one typed content file. The page renders from it, and the agent reads all of it as context. The whole corpus fits comfortably in the window, so retrieval would add latency and failure modes without improving answers. If the corpus grows past that, retrieval earns its place.
- 02Grounding
Every claim cites an id.
Each role, project, metric and belief has a stable id. The model has to cite them inline, and the UI turns those citations into links. Unfilled placeholders are labeled, and the model is told never to present them as fact.
- 03Model
Claude, at low effort.
Recruiter questions are short and factual, so a low reasoning-effort setting gives fast first tokens without hurting accuracy. The model is one env var away from a swap. Refusals fall back server-side to another model instead of dead-ending.
- 04Cost
Cached prompt, capped spend.
The system prompt is byte-stable (no timestamps or ids), so after the first question it's served from the prompt cache. Output is capped, history is trimmed, and every IP is rate-limited with a sliding window.
- 05Safety
Scoped and injection-aware.
The agent only talks about my work, won't speculate on private topics, and ignores instructions to change its rules. Pasting a job description is a supported use: it maps my experience to the role and names the gaps too.
- 06Evals
Tested like a product.
A small eval suite asks the questions recruiters actually ask and checks for required facts, valid citations, and no hallucinated employers or numbers. It runs before every content or prompt change.
Stack: Next.js · TypeScript · Tailwind · Claude API · Upstash · Vercel