Inspiration
LeetCode practice usually tells you whether your final answer is accepted, but real technical interviews evaluate much more than that. They look at how clearly you explain your thinking, how you handle uncertainty, how you respond to hints, and whether you can reason about trade-offs before jumping into code.
I wanted to build something that makes solo LeetCode practice feel closer to a real interview. Shadow Interview was inspired by the gap between “I solved the problem” and “I communicated like an interview-ready engineer.”
What it does
Shadow Interview is an AI-powered interview layer for LeetCode.
It runs as a Chrome extension on LeetCode problem pages and adds a floating interview companion. When the candidate starts an interview, Shadow Interview detects the current problem, listens to the candidate’s spoken reasoning, observes meaningful code changes, and responds with interviewer-style follow-up questions.
The interviewer does not reveal full solutions. Instead, it asks Socratic questions, challenges assumptions, tracks the candidate’s progress through interview stages, and encourages clearer reasoning.
At the end of the session, Shadow Interview opens a React evaluation dashboard with:
- overall interview score
- interview readiness percentage
- strengths and weaknesses
- key observations
- timeline replay
- interviewer questions covered
- recommended LeetCode patterns
- suggested next problems
- personalized 4-week growth roadmap
How we built it
Shadow Interview has three main parts:
- Chrome Extension
The extension is built with Manifest V3, HTML, CSS, and vanilla JavaScript. It injects a floating launcher only on LeetCode problem pages. The extension detects the problem title, difficulty, and URL, captures code snapshots from the editor with debounce, records candidate speech, and displays interviewer responses directly inside LeetCode.
- FastAPI Interview Engine
The backend is a FastAPI service designed as an interview engine rather than a CRUD API. It manages in-memory interview sessions, tracks interview stages, records timeline events, analyzes reasoning signals, builds compact context, and orchestrates interviewer responses.
The backend includes:
- Session Manager
- Event Engine
- Interview State Machine
- Context Builder
- Interview Orchestrator
- Reasoning Analyzer
- Evaluation Pipeline
- Report Generator
- React Evaluation Workspace
The frontend is built with React, Vite, TailwindCSS, and React Router. It provides the interview workspace and final evaluation dashboard. The dashboard visualizes scores, recommendations, timeline replay, and the personalized learning roadmap.
For AI infrastructure, OpenAI GPT-5.6 is the intended primary interviewer model. I also added Groq as a fallback provider and Groq Whisper for higher-accuracy speech transcription. A local mock interviewer mode keeps the project demoable when API quota or provider access is unavailable.
Challenges we ran into
The hardest challenge was making the product feel like a live interview instead of a normal chatbot.
A real interviewer does not wait for perfectly typed messages. They listen, react to partial reasoning, notice code changes, and guide the candidate one question at a time. To support that, I had to build an event-driven interview loop with voice turns, code snapshots, timeline events, and interview stages.
Voice was another challenge. Browser speech recognition was not always accurate for technical terms like HashMap, DFS, BFS, memoization, and O(n). To improve this, I added Groq Whisper transcription while keeping browser speech and manual input as fallbacks.
API reliability was also a challenge. During the hackathon, OpenAI API quota was not always available, so I designed the AI provider layer to support OpenAI, Groq, and local mock fallback mode without changing the rest of the architecture.
Another challenge was keeping the Chrome extension lightweight. It had to run inside LeetCode without using React, without interfering with the page, and without sending too many updates after every keystroke.
Accomplishments that we're proud of
I’m proud that Shadow Interview now supports a full local interview loop:
LeetCode problem
→ Chrome extension
→ voice transcription
→ code observation
→ interview engine
→ AI-style interviewer response
→ spoken feedback
→ final evaluation dashboard
Log in or sign up for Devpost to join the conversation.