This example demonstrates how to use a Keyframe Labs powered avatar with an ElevenLabs voice agent and an infinite architecture canvas to practice system design interviews in real time.
- Lifelike interviewer avatar powered by Keyframe Labs' human foundation models
- Real-time voice conversation powered by an ElevenLabs agent
- Infinite architecture canvas for services, databases, tables, text, and connections — shared with the interviewer as live context
- Built with React and FastAPI
Prerequisites: Python 3.12+, uv, Node.js, and pnpm 11.9.0.
-
Create a Keyframe Labs API key and an ElevenLabs agent. Require authentication for the agent and scope its API key to the access needed to generate signed conversation URLs.
-
Configure the provider credentials:
cp .env.example .env
KEYFRAME_API_KEY=... ELEVENLABS_API_KEY=... ELEVENLABS_AGENT_ID=...
-
Install and start the app:
uv sync pnpm install pnpm dev
Open http://localhost:5174. The API runs on http://localhost:8788 by default.
Configure the shared agent once in the ElevenLabs dashboard. The application does not modify persistent agent settings at startup or while users are interviewing.
-
Set the first message to
Hi, I'm Lyra. Have you done a system design interview in the past?and disable first-message interruptions. -
Set turn timeout to 15 seconds and turn eagerness to normal.
-
Add the
interview_packetdynamic variable with a safe placeholder such asNo interview packet was provided. Do not begin an interview. -
Set the system prompt to:
# Selected interview packet The complete interview packet for this conversation appears inside `<interview_packet>`. Follow that packet as the authoritative interview instructions. Never mention dynamic variables or the packet wrapper to the candidate. <interview_packet> {{interview_packet}} </interview_packet>
Each session passes its selected packet as a conversation-scoped dynamic variable, so concurrent users do not overwrite one another's prompt.
- Add or edit interview packets in
server/app/interviews/prompts/; follow the prompt authoring guide. - Change the avatar with
KEYFRAME_PERSONA_SLUGin.env. - Change colors and typography in
frontend/src/index.css, or shared controls infrontend/src/components/ui/. - Override the API port with
PORT=9000 pnpm dev; setCLIENT_ORIGINin.envif the frontend origin changes.