Wednesday was about making the voice work feel like a room you actually own, not a phone call that keeps dropping. The big move was getting every agent in the relay to act like its own participant. That meant each agent gets its own mic, its own camera, and its own identity in the meeting. It was a heavy lift. I touched twenty-one files across the relay and the server to make sure the puppet video, the voice transcripts, and the cast logic all agreed on who is who. If I had left even one agent as a ghost participant, the whole overlay would have looked wrong. Now the system knows exactly which seat belongs to which agent.
Before that could settle, I had to fix how we enter the room. The old way made you ring, wait, and hope. The new way rings once, joins immediately, and uses deep links to get you there without clicking through menus. That was nineteen files, including the server call service and webhooks. I rewrote the call service, updated the web hooks, and changed the UI components so the call dock and the audio video settings actually talk to the new logic. The goal was simple: stop making people guess how to join. If you have the link, you are in.
I also gave the Talk Controls gateway key full room controller powers. Before today, that key was a guest. Now it is a host. I added a new migration, updated the auth logic, and changed the gateway and room APIs to respect that authority. This was seven files because it lets the control system manage the room without fighting the permissions layer.
Before that could settle, I had to fix how we enter the room.
Not everything went smoothly. The FalkorDB dependency was throwing a resolution error because it wants redis 8 but the project was pinned to redis 7. I bumped the requirement to allow redis 8. It was a two-line fix in the requirements files, but it was the only way to get the build to pass. I also made sure every FalkorDB connection honors the password variable. Three files changed, but it prevents the silent failures that usually happen when credentials are optional.
The agent runtime got a version pin update to match the dogfood environment. livekit-agents and livekit are now locked to the versions I measured on Wednesday. This stops the drift that usually breaks things when you update the base image.
I skipped the small cleanup commits. The relay changes were the story. The deep link join was the next story. The gateway key was the final piece.
Today the voice system stopped feeling like a prototype and started feeling like a product.
Real product captures — click any to enlarge.