Inspiration
We've all been through those awkward technical interviews where the interviewer just stares at you while you code in silence. Or the ones where you get a generic LeetCode problem and zero feedback on how you actually approached it. We kept thinking — why can't this feel more like a real conversation? That's where SynthInterview came from. We wanted to build something that actually listens to you think out loud, responds in real-time, and evaluates you like a senior engineer would — not just by whether your code passes tests.
What it does
SynthInterview is an AI-powered technical interview platform that conducts full DSA interviews over voice. You get a coding problem, you talk through your approach, you write code in the browser, and the AI interviewer asks you follow-up questions — things like "what's the time complexity here?" or "can you optimize this?". It also handles interruptions naturally, so it doesn't feel like talking to a bot. On the backend it's watching for cheat attempts silently (screen, webcam, tab switches) and at the end generates a full scorecard with feedback across 6 dimensions, which gets emailed to both the candidate and recruiter.
How we built it
The core of it is Gemini Live API handling all the real-time audio — bidirectional streaming so the candidate can interrupt mid-sentence and the agent picks it up. We built a FastAPI backend in Python with a WebSocket layer that sits between the browser and Gemini. The interview flow is managed by a finite state machine (GREETING → WARMUP → PROBLEM → CODING → DEBRIEFING) and Gemini itself calls an advance_phase() function to move between states based on how the conversation is going. For proctoring we used Gemini Vision on screen and webcam frames every few seconds. Scoring after the interview is handled by a separate Gemini Flash call that evaluates the full session. Everything is hosted on Google Cloud Run, with Firestore storing session state and GCS storing violation screenshots.
Challenges we ran into
Getting the audio latency low enough that it actually feels like a conversation was probably the hardest part. There's a lot of moving pieces — mic capture, WebSocket forwarding, Gemini processing, audio response back to the browser — and any one of them adds delay. We also spent a lot of time on the dual async queue architecture so audio and text messages don't block each other. Cheat detection was tricky too because you don't want false positives stressing out honest candidates, so calibrating the confidence thresholds took a while.
Accomplishments that we're proud of
Honestly just the fact that you can have a full back-and-forth technical conversation with it and it doesn't feel robotic. When it interrupts you to ask about edge cases mid-explanation, that's the moment we were going for. The barge-in detection working smoothly was a big win for us.
What we learned
A lot about WebSockets and how to keep long-lived connections stable. Gemini's Live API is genuinely impressive for real-time use cases but it takes some work to build the right abstraction layer around it. Also learned a fair bit about deploying WebSocket-based apps on Cloud Run which has some quirks.
What's next for SynthInterview
We want to add more detailed post-interview analytics — like a replay of the session with timestamps showing when the candidate struggled or sped through. Also want to integrate with platforms like LeetCode and HackerRank so recruiters can pull from a much bigger question bank. Long term the goal is to make this a tool recruiters can actually trust for first-round screening.
Built With
- bun
- docker
- fastapi
- firebase
- framer-motion
- gemini-api
- google-cloud-provider
- google-genai
- javascript
- monorepo
- next
- pydantic
- python
- react
- socket.io
- tailwindcss
- typescript
- uvicorn
- zustand
Log in or sign up for Devpost to join the conversation.