Table 2, all projects

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

Explore PriyanshuArchitecture

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

Stack
  • 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. 1
    /data/*.json

    Single source of truth: profile, education, experience, projects, interests, knowledge graph.

  2. 2
    /api/chat

    Builds a grounded system prompt from the dataset, runs a tool-use loop, returns text plus UI actions.

  3. 3
    /api/relevance

    Structured JSON output: strong matches, transferable experience, gaps, relevant projects, interview questions. Each match cites a dataset id.

  4. 4
    Agent UI

    Chat panel with suggested prompts, voice toggle, and action execution against the page.

Design ideas worth noticing
  1. 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.
  2. 2Pasted job descriptions are untrusted input: they are wrapped as data and the system prompt forbids following instructions inside them.
  3. 3Tool results are validated against known section and project ids before the UI acts on them.
  4. 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.