May 4, 2026
No More Silent Truncation, No More Silent Gaps
A day spent ripping out arbitrary caps across voice and rich media — truncation isn't a feature, it's a bug we'd been tolerating.
Today was about a single principle: if Chalie is going to cut a corner, it has to be a corner you asked it to cut — not one it cut silently because a buffer ran out. That rule drove almost everything that shipped, from how voice responses play back to how search and news pull in images, and by the end of the day I’d deleted more limits than I added features.
The voice pipeline was the first casualty of “good enough.” It streamed TTS audio in sentence-sized chunks so playback could start before the whole message was synthesized — clever in theory, fragile in practice. On longer messages, synthesis fell behind playback, leaving a dead-air gap, and clicking play mid-gap would restart the whole message from chunk one. That’s worse than just waiting, so I ripped it out: one Kokoro call, one WAV blob, streamed back as a single NDJSON payload with an explicit done sentinel so the frontend always knows whether it got the whole thing or the connection died mid-stream. Time-to-first-audio goes up on long messages, but there are no more gaps and no more restarts — a gap-free response beats a fast broken one every time. While in there I also fixed a real bug: the voice overlay’s spacebar shortcut was eating the space key even while typing in the chat box.
The bigger sweep was rich media. Search and news had accumulated a pile of arbitrary caps — a 256KB (then 1MB) limit on how much of a page’s <head> we’d read for og:image, a 200-character cap on descriptions, a 5MB cap on image probes, a 300-character cap on search snippets. Each existed for a plausible-sounding reason, and each was silently dropping content the user never knew was cut. The 256KB head cap was a real, live bug — Google News pages bury their og:image tag around byte 575,000, so news results were quietly shipping zero images while search worked fine on smaller pages like Wikipedia. Bumping the cap to 1MB fixed news, but that’s still a truncation, just a bigger one. The real fix was to stop capping by size entirely: stream the head until you hit </head> or the request times out. The cap becomes a deadline, not a byte count — a deadline you can defend to a user (“we didn’t wait forever”), where a byte cap you can’t (“we stopped for no reason you’d understand”).
The other half of the rich-media work was quality, not plumbing. Image candidates used to run through OCR to help the model pick a relevant thumbnail, but OCR on photo thumbnails mostly produced gibberish — panorama labels, billboard fragments — that the model was already learning to ignore. I replaced it with captions derived from the image URL and the page’s og:description, both deterministic and actually meaningful. Search also got a supplement path: when the router’s confidence in its provider choice is weak, Chalie now appends DuckDuckGo results alongside whatever it already picked, instead of betting everything on an uncertain call. A separate fix closed a real hole in subagent handling — background subagent results were sometimes computed successfully and then never delivered to the user, stuck behind a dead reference to a finished conversation turn.
None of this is a feature you’ll screenshot. It’s the difference between a product that mostly works and one you can trust not to quietly shortchange you. That trust compounds — and it’s the foundation the next round of rich-media and voice work builds on.
-
Replaced chunked TTS streaming with a single synthesis call and one WAV blob — no more gaps, no more restart-from-zero bugs
-
Removed every silent truncation cap in the search/news rich-media pipeline (og:image head fetch, description length, image size probe, snippet length) in favor of natural, explainable limits like timeouts
-
Replaced unreliable OCR on image thumbnails with deterministic captions built from URL and page metadata
-
Added a DuckDuckGo supplement path for when Chalie’s search router isn’t confident in its provider choice
-
Fixed a bug where background subagent results could be computed but never delivered to the user