Priyanshu OS / AI Voice Portfolio
A portfolio you talk to. An AI agent grounded in structured profile data that can answer, navigate and reason about fit.
Case study · In progress: you are using it
The idea
Replace the static resume with an agent that answers questions about Priyanshu's background, navigates this site, surfaces relevant work, and analyses a pasted job description against his actual experience.
Why I wanted to build it
Resumes flatten a non-linear path into bullet points. Recruiters and hiring managers have specific questions, and a static page cannot answer them or admit what it does not know.
Product philosophy
- Grounded, not generative
- Every answer derives from /data/*.json. The agent is instructed to say when something is not in the data rather than fill the gap.
- Gaps are a feature
- The relevance mode reports missing experience explicitly. A match list without gaps is not trustworthy.
- Actions over prose
- The agent can navigate the page and highlight dimensions through tool calls, so an answer is also a demonstration.
Fig. 1Technical architecture
- Next.js (App Router) + TypeScript
- Tailwind CSS
- Provider-agnostic LLM layer (OpenAI-compatible chat format, default Gemini free tier; works with OpenCode Zen, Groq, OpenRouter, Ollama)
- Structured JSON output for UI actions (navigate, highlight dimensions, open project)
- Web Speech API for voice input and output (MVP)
- d3-force for the knowledge graph
- 1
/data/*.jsonSingle source of truth: profile, education, experience, projects, interests, knowledge graph.
- 2
/api/chatBuilds a grounded system prompt from the dataset, runs a tool-use loop, returns text plus UI actions.
- 3
/api/relevanceStructured JSON output: strong matches, transferable experience, gaps, relevant projects, interview questions. Each match cites a dataset id.
- 4
Agent UIChat panel with suggested prompts, voice toggle, and action execution against the page.
- 1The dataset is small enough to fit in context, so retrieval is full-context injection today; the layer is isolated so it can move to embeddings if the corpus grows.
- 2Pasted job descriptions are untrusted input: they are wrapped as data and the system prompt forbids following instructions inside them.
- 3Tool results are validated against known section and project ids before the UI acts on them.
- 4No vendor SDK: one fetch-based client, so the model can be swapped by changing an env var. Free-tier rate limits are handled with clear fallback messages.
Where AI fits
Central. This is a tool-using agent with grounding, structured outputs and explicit gap reporting. Its limits are also documented: no persistent memory, browser-native voice quality, and dependence on free-tier model rate limits.