<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Writing on Nick Lackman — Distributed Systems &amp; AI</title><link>https://nicklackman.com/writing/</link><description>Recent content in Writing on Nick Lackman — Distributed Systems &amp; AI</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Thu, 08 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://nicklackman.com/writing/index.xml" rel="self" type="application/rss+xml"/><item><title>Your Voice Agent Passed Every Eval. The Caller Hung Up.</title><link>https://nicklackman.com/writing/evaluating-voice-agents/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://nicklackman.com/writing/evaluating-voice-agents/</guid><description>&lt;p&gt;Your voice agent passed every eval you have. The transcript looks perfect. The tool calls all fired. And the caller hung up on it.&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve spent two years building production voice AI, and this is the failure that took me longest to get a handle on — not because it&amp;rsquo;s rare, but because our entire evaluation stack was structurally incapable of seeing it.&lt;/p&gt;&#10;&lt;p&gt;The transcript said the agent handled the call. What actually happened was four seconds of dead air, a robotic monotone, and the agent talking over the caller mid-sentence. None of that is in the transcript. None of it could be.&lt;/p&gt;</description></item><item><title>The Audio Gateway: The Production Pattern for Real-Time Voice AI</title><link>https://nicklackman.com/writing/the-audio-gateway/</link><pubDate>Thu, 16 Jul 2026 22:30:48 +0000</pubDate><guid>https://nicklackman.com/writing/the-audio-gateway/</guid><description>&lt;p&gt;If your voice agent stutters under load, talks over callers, or freezes mid-sentence while a tool call runs — the fix probably isn&amp;rsquo;t a better model. It&amp;rsquo;s an architectural split.&lt;/p&gt;&#10;&lt;p&gt;In my last post, &lt;a href="https://nicklackman.com/writing/python-is-lying-to-you/"&gt;Python Is Lying to You&lt;/a&gt;, I walked through every way Python&amp;rsquo;s async model quietly sabotages a real-time audio pipeline: the async-looking guardrail that froze the event loop, the logger doing blocking I/O on every frame, GIL contention that looks exactly like network jitter. The fixes worked. But they are all &lt;em&gt;defensive&lt;/em&gt;. Move this off the hot path. Offload that to a thread. Audit every innocent-looking call. You&amp;rsquo;re playing whack-a-mole against your own process.&lt;/p&gt;</description></item><item><title>Python Is Lying to You: Async Pitfalls in Real-Time Audio Pipelines</title><link>https://nicklackman.com/writing/python-is-lying-to-you/</link><pubDate>Fri, 12 Jun 2026 04:14:07 +0000</pubDate><guid>https://nicklackman.com/writing/python-is-lying-to-you/</guid><description>&lt;p&gt;If you&amp;rsquo;re building voice AI with async Python, your audio quality is probably worse than it needs to be — and the bottleneck isn&amp;rsquo;t where you think it is.&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve spent the last two years building production voice AI systems — real-time pipelines handling thousands of calls per day over PSTN telephony. The stack is what you&amp;rsquo;d expect: STT, LLM reasoning, TTS, Speech-to-Speech, guardrails, tool calls, all wired together with async Python and streaming over websockets.&lt;/p&gt;</description></item><item><title>Voice AI: Fast and Dumb or Slow and Smart — Why Not Fast and Smart?</title><link>https://nicklackman.com/writing/responder-thinker/</link><pubDate>Mon, 06 Apr 2026 23:26:29 +0000</pubDate><guid>https://nicklackman.com/writing/responder-thinker/</guid><description>&lt;p&gt;Many voice AI demos connect the browser directly to a real-time audio model API and lets the server decide when you&amp;rsquo;ve stopped talking. That&amp;rsquo;s a demo architecture with a built-in latency tax that quickly breaks down in production. Here&amp;rsquo;s the production alternative: a backend-mediated, multi-thinker voice system with local voice activity detection that owns the entire audio pipeline end-to-end.&lt;/p&gt;&#10;&lt;p&gt;I spent the last year and half building production voice AI systems that handle thousands of calls per day. This post covers the architecture I wish someone had documented when I started: how to make your voice AI product fast and smart, what the Responder-Thinker pattern is, why single-thinker breaks, how to build multi-thinker with your backend in the middle, and why local VAD is the key to making it feel instant.&lt;/p&gt;</description></item><item><title>Cutting 600ms from Every Voice AI Turn with Local VAD</title><link>https://nicklackman.com/writing/local-vad/</link><pubDate>Sat, 21 Mar 2026 02:45:02 +0000</pubDate><guid>https://nicklackman.com/writing/local-vad/</guid><description>&lt;p&gt;If you&amp;rsquo;re building voice AI on OpenAI&amp;rsquo;s Realtime API, your agent is slower than it needs to be — the main bottleneck is certainly inference but there&amp;rsquo;s additional overhead to cut.&lt;/p&gt;&#10;&lt;p&gt;I spent the past week instrumenting a production telephony voice pipeline, measuring where latency actually lives, and testing whether local voice activity detection (VAD) could meaningfully reduce response time. The answer is yes — by &lt;strong&gt;689ms per turn on substantive responses&lt;/strong&gt; — and the methodology is cleaner than I expected.&lt;/p&gt;</description></item><item><title>I Tested Our WebSocket Audio Pipeline with WebRTC. Here's Why I Switched It Back.</title><link>https://nicklackman.com/writing/websockets-vs-webrtc/</link><pubDate>Wed, 11 Mar 2026 04:01:01 +0000</pubDate><guid>https://nicklackman.com/writing/websockets-vs-webrtc/</guid><description>&lt;p&gt;There&amp;rsquo;s a prevailing assumption in the voice AI space that WebRTC is inherently better than WebSockets for real-time audio. Better latency, better quality, better everything. I built a full proof-of-concept to test that assumption on an enterprise scale production AI voice system.&lt;/p&gt;&#10;&lt;p&gt;I found a few things surprising.&lt;/p&gt;&#10;&lt;h2 id="the-setup"&gt;The Setup&lt;/h2&gt;&#10;&lt;p&gt;Our system takes inbound phone calls, pipes the audio through an AI agent (OpenAI Realtime API), and sends the response back to the caller. The current architecture uses Twilio Programmable Voice with WebSocket media streams — G.711 μ-law audio at 8kHz using WebSocket protocol.&lt;/p&gt;</description></item></channel></rss>