Back to projects
Live

AI Portfolio Assistant

A RAG chatbot that knows my whole career — retrieval, tool use, and streaming on the edge

Live on this site — try it bottom-right

AI Claude RAG Cloudflare Vectorize TypeScript Hono

How it works

AI portfolio assistant (this site) The chatbot in the corner of this page. Your question gets embedded, matched against a Vectorize index of my work, handed to Claude with a set of tools it can call, and streamed straight back over SSE — all on the edge, no origin server. VisitorEdgeRetrievalGeneration question 1 · embed 2 · search 3 · context tool defs rate limit 4 · streamed tokens (SSE) You ask a question Astro Worker /api/chat KV rate limit · 3/hr Workers AI embed the query Vectorize top-k passages Tool use navigate · contact Claude composes the answer
The chatbot in the corner of this page. Your question gets embedded, matched against a Vectorize index of my work, handed to Claude with a set of tools it can call, and streamed straight back over SSE — all on the edge, no origin server.

The floating assistant in the corner of this site is a project in its own right: a retrieval-augmented chatbot that can answer almost anything about my background, projects, and skills — and route real contact messages to my inbox.

What it does

  • Answers questions about my experience, projects, and stack in my own voice
  • Retrieves the most relevant facts per question (RAG) instead of stuffing everything into the prompt
  • Uses tool calling to trigger a contact form — collect a name, email, and message, then send it
  • Streams responses token-by-token for a fast, live feel
  • Rate-limited per IP so it stays cheap and abuse-resistant

Tech stack

  • Model: Anthropic Claude (tool use + streaming) via the Claude SDK
  • Retrieval: Cloudflare Vectorize for embeddings + semantic search over a hand-curated fact base
  • Edge API: Runs on Cloudflare Workers alongside the Astro site
  • Storage / limits: Cloudflare KV for rate limiting, D1 for chat session logging
  • Abuse protection: Cloudflare Turnstile on the contact path

Why I built it

A résumé is static; a good engineer’s story isn’t. I wanted recruiters and collaborators to be able to ask — “does he know SQL Server?”, “what’s the robot actually do?”, “is he available?” — and get a specific, accurate answer in seconds. It’s also the clearest possible demo of how I build with LLMs: retrieval, tools, streaming, and guardrails, all running at the edge.