+Live transcription straight from the browser
Candidate audio streams as 16 kHz mono PCM directly from the browser to AssemblyAI. Django only mints a short-lived token per question, so the vendor key never leaves the server and audio never passes through the app servers.
+Adaptive interview flow
After every answer an LLM summarises it and a phase machine (warm-up, technical, wrap-up) decides whether to ask one follow-up or move on. Question quotas per phase come from defaults or from questions prepared for that role.
+Real-time question delivery
Answers are accepted immediately (202) and processed off the request path. The next question is pushed to the candidate over WebSocket through the Redis channel layer.
+Recording that survives bad networks
MediaRecorder uploads 30-second chunks in parallel with the interview. Failed uploads are buffered in IndexedDB and retried every 15 seconds, with a grace window after the session ends.
+Post-session assessment pipeline
Background jobs finalise the recording, produce a full-session Whisper transcript and generate the assessment, with retries and a manual-review fallback when generation keeps failing.