Skip to content
TODD BROWN
« Writing

Two bugs that weren’t mine: a 30-year-old Windows quirk and an upstream voice bug

Cadence is the desktop app I built because I'm dyslexic. It turns Markdown files into narration that highlights each paragraph as it's read, so I can proofread by ear instead of by eye. It runs entirely on my laptop — no account, no subscription, no cloud upload — and it's shipped to an audience of one. It has never left my machine.

It broke silently on a Windows file-attribute quirk that's existed for three decades, and the open-source speech model at its core corrupted every custom voice I tried to train. Neither bug was mine, but I had to fix them both anyway.

What I was expecting

I asked a coding agent to get an open-source speech model running, expecting it to work out of the box. The opening prompt was 1,105 lines, and its ninth line forbade the agent from writing any code. I wanted a repo audit, a product spec, architecture decisions, a phased roadmap, design requirements, and a handoff prompt for a separate design agent first. All six deliverables exist.

I ended up designing all of the features I was expecting the tool to ship with, before I understood what I was actually working with. The resulting design went through a 19-entry reconciliation ledger grading each feature Essential, Beneficial, or Decorative. Roughly half were rejected.

The core is Electron with a Python/FastAPI sidecar. Documents parse into content-addressed blocks so highlighting, notes, change detection and audio caching all line up on the same units. When a manuscript is revised, only changed paragraphs re-render and notes follow the text that moved, flagged for review rather than silently reattached when a match is uncertain.

The roadmap was built across three consecutive days in July, with two later single days adding project management and a notes export.

The upstream voice bug

The speech model at Cadence's core ships with three default voices. You can train custom voices by uploading reference audio. I tried.

Every custom voice I trained came out corrupted — garbled, robotic, or completely unintelligible. The same input files, different runs, same result. The default voices worked fine. The training interface accepted my files without error. The output was unusable.

I didn't build the speech model. I don't maintain it. But if Cadence was going to work, I needed custom voices to work, so I had to figure out what was breaking.

The bug was upstream. The model's voice-training pipeline had a hard-coded assumption about the reference audio's sample rate that it never validated or documented. Feed it anything else and it would silently produce garbage. The fix was a preprocessing step that resampled the input before it hit the broken pipeline.

I built Cadence on top of someone else's code. When that code breaks, I debug it anyway.

The Windows quirk

A few weeks later, Cadence broke again, in a different way.

I had a 63,000-word manuscript loaded. Every chapter showed as stale and refused to regenerate. The JSON writes kept succeeding, so the app looked fine. The audio never updated. The worker couldn't log the failure either.

The entire project folder had been marked with the Windows hidden file attribute. That attribute has existed since at least the mid-1990s. When it's set on a folder, certain write operations inside that folder fail silently — the API reports success, the file doesn't change, and there's no error to log.

The fix was a check at startup: if the project folder is hidden, unhide it and warn the user. The second fix was to make the worker's file operations fail loudly when the write doesn't stick.

Both fixes are shipped. Cadence now has 368 backend tests — 305 test functions expanded by parametrization — and it has rendered 2,995 segments across two real projects with zero failures.

What it meant

Building on other people's code means debugging it too. The speech model's voice-training bug wasn't in my repo. The Windows hidden-folder quirk predates my career. Neither was my fault, but both were my problem the moment they broke something I was trying to ship.

The receipts are simple. Cadence has produced 6.94 hours of narration from that 63,000-word manuscript in 98.2 minutes of GPU time, across 1,869 segments, with zero failures. It has narrated all 51 of Adroit's company knowledge-base documents, 2.51 hours of audio. The diff-and-reconcile engine that worried me most — the riskiest component — was attacked first: three confirmed bugs, each fixed with a regression test, before I declared it safe to build on.

I built Cadence because I needed it. It works because I fixed the bugs that weren't mine.