Inspiration
I was recently interviewed and in hindsight, I realized what the interview was asking and that I failed to give reasonable answers, or failed to grasp what they were asking. I wanted a tool to practice with: something in between: an interviewer that adapts to your JD, asks real follow-ups, sounds like an actual person, and grades you against a rubric instead of just handing you a transcript and walking away.
What it does
Paste a job description, pick an interviewer persona (each one is HEXACO-parameterized, not just a vibe — a "Rigorous Technical Lead" and a "Supportive Coach" are backed by different personality-trait vectors that shape tone and follow-up style), and run a full mock interview either by voice (ElevenLabs, one continuous session that paces itself through the question list) or text. At the end the whole transcript gets scored against a rubric (Fireworks structured output) with the trace logged to Braintrust for eval tracking.
How we built it
Next.js + CopilotKit as the app shell, with four sponsor APIs each proven independently via standalone POC scripts before touching app code — Fireworks (LLM, OpenAI-compatible endpoint), ElevenLabs (voice), Daytona (sandboxed code execution), Braintrust (scoring/eval logging). Structured-output calls (question generation, scoring) go through Zod schemas so the LLM output is typed and validated, not just prompted-and-hoped-for.
Challenges we ran into
- Voice pacing: my first design opened a new ElevenLabs session per question, which looked like the connection was flaking constantly — it was actually just repeatedly redoing the WebRTC handshake.
- ElevenLabs' free tier is 15 min/month, which is tight for both dev testing and a live demo — added a text-mode interview path so practice runs don't burn voice minutes as I ran out of credits.
Accomplishments that we're proud of
Getting all four sponsor APIs actually wired together in one flow, not just four isolated POCs — JD in, spoken interview with adaptive personas out, scored transcript at the end. And building interviewer personas on a real psychometric model (HEXACO) instead of a free-text prompt, so persona behavior is structured and reproducible.
What we learned
That the failure modes in an LLM-and-voice pipeline are rarely the "hard" AI parts — they're build-time env var scoping, SDK field-name mismatches, and session-lifecycle assumptions (like re-handshaking WebRTC per question) that look like a much scarier bug than they are. Isolating each sponsor API in its own POC before integration paid for itself immediately.
What's next for Interview Coach
Live scoring feedback during the interview instead of only at the end, more interviewer personas, support for uploading/parsing a resume alongside the JD to personalize questions further, and moving past the ElevenLabs free tier for longer sessions.
Built With
- braintrust
- copilotkit
- daytona
- elevenlabs
- fireworks-ai
- hexaco
- llm
- next.js
- openai-sdk
- react
- sandboxed-code-execution
- typescript
- voice-ai
- webrtc
- zod
Log in or sign up for Devpost to join the conversation.