Portfolio Agent
This site's own concierge: a retrieval-augmented agent that answers questions about Javier, grounded in a curated corpus and live GitHub activity, with a published eval to back it.
Product
The shipped product: live link, the problem it solves, and the stack it runs on.
The problem
A portfolio can claim seniority; it is harder to prove it. The Portfolio Agent turns the claim into a working system: a grounded, cited chat that only answers from a real corpus, refuses everything off topic, pulls live commit data, traces every reply in public, and publishes its own accuracy score so nothing has to be taken on faith.
Stack
Screenshots

How I built it
Product requirements
Open the PRDThe full PRD lives in the repo. Open it above.
The Portfolio Agent runs as a LangGraph.js graph with four named nodes. The guardrail declines anything off topic or any prompt-injection attempt in a single redirect sentence, retrieve does a top-6 pgvector cosine search over the embedded corpus, the agent node runs deterministic tools (real GitHub commits, the published eval score), and answer composes a grounded, cited reply. Cost is engineered, not hoped for: all generation flows through OpenRouter on a prepaid key hard-capped at $5 a month at the billing layer, the visitor picks the answer model from a server-enforced allowlist, and if the credit is ever exhausted (an HTTP 402) the graph degrades to the Groq free tier with an honest caption instead of an outage. Every reply carries a public Langfuse trace with one span per node. The accuracy is measured, not asserted: a 40-question golden set (facts, live tools, guardrail probes, and Spanish) is graded by a free cross-family judge and published as a real table. The honest part is the iteration. The score moved from 92.5% to 100%, and every early miss was a judge limitation caught and fixed through a human review of disagreements, never a fabrication by the agent, whose anti-fabrication behavior is architectural: it answers from real tool output or says the lookup failed. Built in public with the agentic-dev-kit, one backlog item at a time, spec first.
Evaluation
The agent is measured, not asserted. A golden set runs on every build and the results are published here, straight from the committed JSON the agent itself reads.
100% on a 40-question golden set
Facts, live tools, guardrail probes, and Spanish, run against google/gemini-3.5-flash and graded by a cross-family judge (llama-3.3-70b-versatile, free tier). Measured 2026-07-07. Not a self-graded number: the judge is a different model family, and its disagreements were reviewed by hand.
| Category | Passed | Score |
|---|---|---|
| Facts | 20/20 | 100% |
| Live tools | 8/8 | 100% |
| Guardrails | 6/6 | 100% |
| Spanish | 6/6 | 100% |
| Overall | 40/40 | 100% |
Timeline
- milestoneJul 7, 2026
Chat UI, public Langfuse traces, and a published 100% eval (40-question golden set, cross-family judge)
- milestoneJul 7, 2026
Cost + guardrails: OpenRouter primary hard-capped at $5/mo, Groq free fallback on 402, Upstash rate limits and kill-switch
- milestoneJul 5, 2026
LangGraph graph (guardrail, retrieve, agent, answer) over a pgvector RAG corpus, streaming grounded cited answers
Recent commits
All commitsLive from GitHub, as of Jul 7, 2026
- 356ae6bJul 7, 2026
feat(agent): Portfolio Agent, a RAG concierge built in public (#22)
- 50fd69dJul 7, 2026
- 1fc861eJul 2, 2026
feat(web): positioning, conversion, and detail-page overhaul
- fa23bafJul 2, 2026
docs: import shared engineering canon, drop superseded local rules
- d2d0199Jun 28, 2026
feat(web): use "Spec" instead of "PRD" in slogan headers (#20)
- 3232601Jun 25, 2026
fix(about): restore the Santiago / bilingual / honest-systems paragraph (#19)
- 8df5ca8Jun 25, 2026
- 588caacJun 24, 2026
Metrics
Each metric carries an honesty tag. Verified numbers read solid; targets and placeholders read muted.
Built the same way, every time.
Every exhibit runs the same loop: spec, implement, verify, ship. If you want this kind of work on your team, full-time or freelance, let's talk.