Portfolio assistant — Gemini streaming Q&A grounded in site data; origin check and rate limits
Link Health — Bedrock chat (Leo) beside enrollment; personal Leo ownership not claimed here
How AI shows up in the work
Applied AI
Three implementations at different depths — an owned RAG platform, this site's grounded assistant, and AI inside a live civic product. Each has a case study or live surface you can inspect.
Owned · eval-first RAG platform
ContextIQ
Open-source RAG I designed and shipped end to end — not a notebook demo. Hybrid retrieval, cited answers, explicit refusal, trace and eval dashboards, and a GitHub Actions gate so chunking or retrieval changes cannot merge without measured proof.
A production LLM feature embedded in this portfolio: streaming answers grounded in the same profile and case-study data visitors can read on the site — plus the API route and abuse controls around it.
Vercel AI SDK + Gemini 2.5 Flash over POST /api/chat with streamed responses.
System prompt built from live profile and public projects — not a generic persona.
Fails closed: origin check, per-IP rate limit, Zod validation, token and history clamps.
Not an agent product — no tool calling; hiring facts should still go through email.
Vercel AI SDK
Gemini 2.5 Flash
Streaming SSE
POST /api/chat
Production safeguards
Origin check on browser POSTs
Per-IP rate limit
Message count and character clamps
Output token cap (700)
Zod request validation
Unavailable-provider fallback → email CTA
Generic API errors — no stack traces to clients
Accessible dialog, Escape to close
On-page disclaimer: answers may be imperfect
Client platform · AI in production
Link Health
Massachusetts benefits enrollment at scale: applicants and Patient Navigators share one domain for SNAP, WIC, Lifeline, MSP, and related programs. AI shows up as Bedrock chat (Leo) beside forms, OCR, eligibility logic, and a staff CRM — applied inside a real civic platform.
Public chat and case management on one AWS-backed model — not a standalone widget.
Stack includes React, Hono, Aurora PostgreSQL, DynamoDB, S3, Textract, and Bedrock.
Document processing and eligibility workflows share the same persistence layer as staff tools.
Live at link-health.org; full architecture and tradeoffs are in the case study.
AWS Bedrock
React
Hono
Aurora
DynamoDB
OCR
Bedrock/Leo is in the deployed product. My exact ownership of prompts, knowledge bases, guardrails, and evaluation is unconfirmed — that scope is not claimed on this site.
Shared patterns across ContextIQ and this site's assistant — validation before inference, explicit limits, and honest failure modes. Details vary by product; nothing here is claimed without implementation.
Model selection
Gemini 2.5 Flash for short, grounded Q&A — latency and cost over a larger chat model.
Prompt / context
System prompt is built from the live profile and public case studies, not a free-form persona.
Validation
Request body is schema-checked. Invalid JSON and oversized histories are rejected before a model call.
Abuse prevention
Trusted origin, sliding-window rate limit, clamped parts, and prompt instructions that ignore jailbreaks.
Cost control
Flash model, 24-message window, 2,000-character parts, max 700 output tokens.
Fallback
If the Gemini key is missing, /api/status reports chat offline and the UI points to email instead of failing silently.
Error handling
Provider, timeout, rate-limit, empty, and network failures map to short visitor-facing copy. Server logs stay on the server.
Privacy
Conversation is not written to a database in this app. It lives in the browser session and the request to the model.
Human oversight
Hiring and facts that matter should go through email. The assistant is a convenience layer, not a source of record.
Client work
Selected Projects
8 case studies — civic tech, enterprise, e-commerce, and automation. Some work stays NDA or off the public web.