← All Projects

AskJustin

A public AI agent trained on my real work stories, so hiring managers can ask questions a resume cannot answer.

Try it at ask.justinschaeffer.com →

The Problem

A resume gives you the outline of a career. It does not tell you how someone thinks, handles ambiguity, or actually builds. I have been in a job search since September 2025, and the resume-shaped conversation always felt lossy: skimmed by recruiters, pattern-matched by hiring managers, actual signal about how I think rarely making it through.

I built AskJustin to make some of that signal available before the first conversation. It also gives me a real portfolio case study to walk through in interviews, which turns out to matter as much as the tool itself.

What It Is

AskJustin is a public web page where hiring managers ask interview-style questions and get first-person answers grounded in specific projects, decisions, and philosophies from my career. Ask it anything you would ask in a first-round conversation: "Tell me about a time you had to make a decision with incomplete data." "How do you prioritize competing requests?" "What is the hardest product problem you have solved?"

If the corpus has relevant context, you get a grounded answer with specific details. If it does not, the agent says so honestly and suggests contacting me directly. No hallucination, no filler.

How It Works

AskJustin is a Retrieval-Augmented Generation (RAG) system. I wrote roughly 60 short stories about specific projects, decisions, and philosophies from my career. Each story is embedded into a vector using Voyage AI. When a question arrives, it is embedded the same way, and cosine similarity selects the six most relevant chunks. Those chunks plus a system prompt with strict grounding rules go to Claude Haiku 4.5, which drafts a first-person response streamed to the browser.

The guardrails do the heavy lifting. The system prompt bans general-knowledge fallback, invented details, and fabricated negatives. The agent can only speak from what I actually wrote.

At Build Time

60 work stories → Voyage AI embeddings → JSON bundle shipped with app

At Query Time

Question → embed → cosine similarity (top 6 chunks) → system prompt + chunks → Claude Haiku 4.5 → streamed response

Guardrails

No general-knowledge fallback. No invented details. No fabricated negatives. Redirect to Justin when context is insufficient.

Tech Decisions and Trade-offs

  • Claude Haiku 4.5 over Sonnet. The task is retrieval and synthesis from a small corpus with a strong system prompt, not open-ended reasoning. Haiku is faster, cheaper, and quality-sufficient for this use case.
  • Flat-file cosine similarity over a vector database. At 60 chunks, loading embeddings from a JSON file at build time is simpler, cheaper, and eliminates cold-start latency. A vector DB adds operational cost without adding value until the corpus grows past several hundred chunks.
  • Voyage AI embeddings (voyage-3.5-lite). Best performance-per-dollar for semantic similarity at this scale. Separate embedding model from generation model lets each do what it does best.
  • Streaming from day one. Waiting 3-5 seconds for a full response before showing anything kills perceived performance. Streaming was non-negotiable.
  • Multi-tier rate limiting from day one. A public endpoint backed by a paid LLM API is a cost attack surface. Global daily cap, per-IP cap, and per-session turn cap protect against abuse without degrading legitimate use.
  • Prompt caching. The static system prompt caches via Anthropic's ephemeral cache. Roughly 90% cost reduction on repeated queries. Under $1/month at 20 queries per day.

Stack

Framework

Next.js 16

LLM

Claude Haiku 4.5

Embeddings

Voyage AI

Hosting

Vercel

Rate Limiting

Upstash Redis

Query Logging

Supabase

By the Numbers

~60

Work stories in the corpus

<$1

Monthly cost at 20 queries/day

90%

Cost reduction via prompt caching

6-8 wk

Build timeline (Phase 1)

~5 hr

Per week investment

Solo

Built by a PM, not an engineer

What is Next

Phase 2 adds a formal evaluation framework: automated testing of retrieval quality, response grounding, and edge-case behavior. Right now quality assurance is manual review. A proper eval suite makes the system trustworthy at scale and gives me a repeatable methodology to discuss in interviews.

What This Demonstrates

  • End-to-end AI product ownership: Architecture, retrieval design, prompt engineering, deployment, security, cost modeling
  • Technical judgment: Every decision is documented and defensible, with alternatives considered
  • Cost discipline: Under $1/month through intentional model selection, prompt caching, and right-sized infrastructure
  • Security thinking: Rate limiting and abuse defense designed in from day one, not bolted on
  • Honest limits: The agent says "I do not know" rather than hallucinating. That restraint is a product decision.

I am a product manager, not a career engineer. Building an AI product end-to-end as a PM is itself a demonstration of the skills I claim to bring. The product demonstrates the product-management skills it is claiming to show.

Get in Touch

If something in the agent's response surprises you, or if it sends you to my inbox, I would like to hear from you.