I set out to build a fully automated AI-powered voice interview platform. Recruiters create interviews with custom topics and questions, share links with candidates, and review results. The core technical challenge was real-time voice conversation, video recording, speech-to-text, AI evaluation, and proctoring. I wanted to get this working without overcomplicating the stack from the start.
My first commit got the basic structure in place. I then moved straight to voice functionality. Two commits, both labeled "VOICE", show I iterated there. I was trying to get real-time audio streaming working, and it took multiple passes.
I had started with LiveKit. It seemed like the obvious choice for WebRTC infrastructure, handling the signaling, media routing, and room management. I got it integrated, but then removed it entirely in commit 4e735bd. The reason was straightforward: LiveKit added operational complexity and cost that didn't match where the product actually was. I was running infrastructure for a real-time media server when the core interview logic and AI evaluation weren't even solid yet. The dependency was heavy, the self-hosted path was non-trivial, and the managed pricing would have kicked in immediately with any usage. I pulled it out before it became load-bearing.
After removing LiveKit, I kept building. A third commit shows continued work, though by then the voice approach had shifted. I don't have the final voice architecture recorded in these commits, whether I moved to a lighter WebRTC setup, server-sent events with chunked audio, or something else. What I do know is that keeping LiveKit would have meant maintaining infrastructure instead of focusing on the actual interview experience and AI evaluation pipeline.
The unrecorded problems are where the real time went. Getting voice to work in a browser is never clean. Microphone permissions, echo cancellation, handling network drops, buffering audio for transcription, synchronizing that with video recording. I don't know which specific issue burned time because it isn't in the commit log. That itself is a lesson: the commits show decisions, not the hours lost to a silent audio track or a transcription that lagged 15 seconds behind.
What shifted for me was the sequencing. I thought voice was the hard part to prove first. It wasn't. The hard part is the evaluation loop: capturing response quality, structuring it for an LLM, and returning meaningful scoring fast enough that the interview feels real. Voice is a channel. I was optimizing the channel before the content was reliable. Removing LiveKit forced that realization. I stopped treating real-time as the default requirement and started asking what latency actually mattered for this use case.