Interview Coach — real-time, voice-based AI mock coding interviews

Inspiration

After 12 years at one startup, I went back on the interview market — and bombed my first few interviews, blowing real opportunities. Things improved over time, and I eventually understood what had been missing: not coding ability, but practice — coding while thinking out loud and carrying the interviewer along with me. That's a performance skill, and there was nowhere good to rehearse it.

I tried human mock interviews. They cost hundreds of dollars per session, and the interviewers were so focused on leaving me feeling positive that I never got honest feedback. And there was no way to track whether I was actually improving, short of interviewing, failing, and pestering a recruiter for one line of feedback.

Interview Coach was built to fix all three: honest, on-demand practice of the whole interview — voice, code, and time pressure — with structured feedback and progress tracking, at software cost instead of consultant cost.

What it does

A candidate joins a browser interview room and talks through a problem with an AI interviewer in natural spoken conversation while writing code in an embedded editor. The AI watches the code as it's typed, asks follow-ups, and releases a measured hint only when warranted — it won't let you silently grind, because real interviews won't either. When the session ends, it generates a three-perspective feedback report (candidate coaching, hiring-manager assessment, and a calibrated 1–5 rubric across 12 dimensions — including whether you can explain why your solution is $O(n \log n)$ rather than $O(n^2)$), then synthesizes progress trends across sessions. It's live in production at interviewcoach.dev, with a subscription + top-up model.

How I built it

The core technical bet: instead of stitching together STT → LLM → TTS (three vendors, three points of latency and failure), the entire voice pipeline is one Gemini Live API native-audio session (gemini-live-2.5-flash-native-audio), proxied through a single FastAPI service on Cloud Run. Code analysis, feedback, and progress synthesis run on gemini-2.5-flash via Vertex AI; state lives in Firestore; auth is Firebase Anonymous Auth, upgraded in place on sign-up so a guest never loses their history. Code executes in a separate nsjail-sandboxed Cloud Run service across six languages.

Making a 45-minute interview survive on serverless infrastructure took three layered mechanisms: context-window compression (removes the native-audio session cap), session resumption (transparent reconnect when Gemini refreshes the connection), and reconnect-tolerant clients behind a 3600s Cloud Run timeout.

Going public also meant treating prompt injection as inevitable, on two fronts. The first is leakage: a candidate who can talk the interviewer into revealing the answer destroys the product's value, so the optimal solution is never in the live model's context, hints release only through a server-controlled, ordered, rate-limited tool, and Firestore stores only public problem fields — there's nothing to extract. The second is abuse: code input is scrubbed before analysis, Model Armor screens for injection and jailbreak attempts, output transcripts pass a DLP gate before they're spoken, input is monitored asynchronously with session termination on repeated abuse, and the interviewer wires no general tools — so it can't be talked into doing unrelated work. App Check plus per-user quotas and a global cost cap bound the bill.

Challenges I ran into

Getting AI to act human is hard. Prompting the interviewer to hold a neutral-but-slightly-encouraging tone while behaving like a real interviewer — one who doesn't jump in at the drop of a hat, lets silences breathe, and paces the candidate instead of lecturing — was the trickiest prompt engineering in the project. It's still a work in progress.

Legal and compliance. Shipping a product that processes live voice meant a tight Terms of Service and Privacy Notice without blowing the bank on counsel. Voice pushed this further than expected: I built a BIPA §15(b)-style informed-consent gate before the microphone ever opens, published a retention and destruction schedule, cut transcript retention to 7 days, and enforced a US-only geo gate to keep the compliance surface manageable.

Payment processor setup. A verification issue with my first Merchant of Record forced a launch delay and a last-minute switch from Polar to Paddle. The saving grace was architecture: billing sits behind a provider-agnostic port, so the migration was one adapter rewrite, not a rework of entitlements and paywall logic.

What I learned

Start legal, compliance, and payments work early — as soon as you know roughly what the solution looks like. Both of my launch delays came from the non-code side of the business, and neither could be fixed by writing code faster. On the technical side: paying a small upfront cost for clean seams (every external dependency behind a small interface) turned a would-be crisis — swapping payment providers days before launch — into a routine change. And prompting a model to behave like a person, with restraint and timing, is much harder than prompting it to know things.

What's next for Interview Coach

Distribution first: launching on the public forums where job seekers already are — relevant subreddits, Product Hunt, and Hacker News. On the product side, the next interview types beyond coding: system design interviews, with an Excalidraw integration so the candidate can whiteboard while talking through their architecture, and behavioral/leadership interviews, where the same honest-feedback loop applies to storytelling and structure. And finally, expanding beyond the US — today's US-only launch was a deliberate compliance choice, and opening additional regions is a legal-review exercise, not a rebuild.

Built With

Share this project:

Updates