Loading…
Loading…
Resume RAG Chatbot is a production-focused software project built by Sadam Hussain using Next.js, React, TypeScript, and related technologies.
The AI assistant running on this portfolio: ask about Sadam's experience in the chat widget and get answers grounded in his resume, generated by Gemini 2.5 Flash and streamed through the Vercel AI SDK. No vector store, no embeddings: the full resume ships as context with every question. Outcome: the portfolio demonstrates the AI skill it advertises.
Tech Stack

Status
Production Ready
Type
AI portfolio assistant
Built a portfolio-native AI assistant that turns a static resume into an interactive experience, allowing visitors to ask natural-language questions about experience, projects, technical depth, and delivery strengths directly from the site.
Designed a full-context grounding approach that loads `resume.mdx` server-side and injects it into the system prompt for every request, keeping answers tied to documented experience without a vector store or embeddings pipeline.
Streams answers from Gemini 2.5 Flash with SDK retries disabled and per-IP rate limiting, so quota failures surface once instead of repeating provider calls.
Integrated a typed AI SDK chat route that validates `UIMessage[]`, bounds conversation history and text size, converts validated messages to model messages, and streams responses back to the client in real time.
Added response guardrails so answers remain grounded in the resume while still explaining what Sadam has done and how that experience can help teams and products.
Built a floating chat widget with starter questions, contextual follow-ups, streaming UI states, markdown rendering, and error handling to make the assistant feel like a product feature rather than a demo.
Introduced in-memory caching of the resume context with graceful fallback behavior so the assistant degrades safely when context loading fails, instead of collapsing the entire chat experience.
Structured the implementation for maintainability with clear separation between context loading, API orchestration, and UI rendering.
The AI assistant running on this portfolio. Try it on this site: open the chat widget on any page and ask about my experience. Every answer is grounded in my resume, not guesswork.
This portfolio answers questions about itself. The full resume ships as context for Gemini 2.5 Flash with every request, and answers stream back through the Vercel AI SDK. No vector store, no embeddings, just grounded answers. It is the smallest version of the AI features I build for clients.
A traditional portfolio asks visitors to do too much interpretation work. Recruiters, hiring managers, founders, and collaborators often have very specific questions:
When those answers are buried across a resume page, project pages, and blog posts, the portfolio becomes a discovery problem. The chatbot solves that by acting as a guided interface over the most important experience content.
The core product problem: Static portfolio content is informative, but not queryable. Visitors need a faster way to map Sadam's experience to their own team or product needs.
What success looks like:
public/resume/resume.mdx) as the knowledge source instead of introducing a second content system.UIMessage[] contract, validating incoming chat history before converting messages for model execution.The chatbot is not just "an LLM on top of a prompt." The full resume ships with every request and anchors the response in documented experience. That design choice matters because it improves both accuracy and usefulness:
Rather than creating a separate admin panel or knowledge base interface, the implementation reuses the existing resume MDX as the canonical source. That keeps the content workflow simple: update the resume and the assistant reflects the latest experience narrative on the next request, with no reindexing step.
The architecture is intentionally compact:
This keeps the system easy to understand and maintain while still showcasing applied AI engineering in a real product environment.
The request lifecycle is straightforward but purposeful:
UIMessage[] payload after validation.The important product insight is that the chatbot is not only answering factual questions. It is also helping visitors interpret relevance. A static resume says what happened. This assistant helps explain why it matters.
Challenge: Static portfolio content is difficult to query conversationally. Approach: Built a grounded assistant over resume content so visitors can ask direct questions in natural language. Why: This reduces the cognitive load of navigating a portfolio and increases the chances that the right strengths are discovered quickly.
Challenge: LLM answers can become generic or drift beyond the source material. Approach: Ship the whole resume as context and add strict prompt instructions to stay grounded in documented experience. Why: A portfolio assistant needs credibility more than creativity. Grounding matters more than flourish.
Challenge: Chat UI quality often breaks the illusion of product polish. Approach: Added streaming states, starter prompts, markdown rendering, contained scrolling, and tighter panel behavior. Why: If the assistant feels clunky, users treat it like a demo. If it feels polished, they use it as part of the portfolio experience.
Challenge: AI integrations can introduce unnecessary infrastructure complexity. Approach: Used full-context injection over the existing resume MDX rather than adding a vector database and embeddings pipeline. Why: The goal was to demonstrate product-quality AI integration, not accumulate avoidable system overhead. The resume fits comfortably in Flash context, so retrieval would add cost and staleness without benefit.
This project reinforced a useful product principle: AI features are most convincing when they sit directly inside a real workflow. A standalone demo is easy to dismiss. An assistant embedded in a portfolio that improves discovery, interpretation, and engagement is much more compelling.
Patterns I'd reuse:
What I'd improve next:
Trade-offs acknowledged: