essay · July 2, 2026

The first thing I built with Fable 5 was a YouTube transcriber

This morning Anthropic shipped Claude Fable 5 this week, so naturally I did what I always do with a new model: I gave it a real job before breakfast.

The job: I wanted to be able to right-click a YouTube URL anywhere on my Mac and get a clean transcript — plus the title and the link — onto my clipboard. No web service, no subscription, no uploading anything anywhere. Just a small native tool that does one thing and lives on my machine.

By 6 AM I had a working app. It's called my-youtube-transcriber, it will never see the App Store, and it might be my favorite kind of software: built for an audience of exactly one.

What it does

It's a menu bar app — no dock icon, no window. Three ways to trigger it:

  1. Select a YouTube URL anywhere in macOS, right-click, and hit "Transcribe YouTube Video" in the Services menu. (The Services menu! Old-school Mac plumbing that still works beautifully and nobody uses.)
  2. A global hotkey that grabs whatever URL is on the clipboard.
  3. A menu item, for the traditionalists.

All three funnel into the same pipeline: yt-dlp pulls the video's captions, a parser cleans up the mess YouTube auto-subs produce (rolling duplicate lines, inline timing tags, HTML entities), and the result lands on my clipboard as markdown — title as an H1, the URL, then the transcript. Ready to paste into my notes.

If a video has no captions, it falls back to downloading the audio and transcribing it entirely on-device with Apple's SpeechAnalyzer. Nothing leaves the machine.

How the build went

I riffed with Claude in chat first — form factor, the Services-menu approach, caption-first with a speech fallback, a couple of gotchas worth handling up front (the classic Process pipe-buffer deadlock, the fact that GUI apps don't inherit your shell's PATH). Then Claude wrote a detailed prompt, I handed it to a Fable 5 agent thread pointed at an empty project, and let it run.

What came back: a working app, sensibly organized, with the fiddly pure-logic pieces (URL extraction, VTT parsing) split into a testable core module — and 27 passing unit tests covering exactly the parts that deserve tests. It resolved the yt-dlp binary correctly for a Finder-launched app, drained stdout and stderr concurrently so long transcripts don't hang the process, and gated the SpeechAnalyzer path behind an availability check with a clear message for older systems. It even wrote the script that wraps the SwiftPM binary into a proper .app bundle with the Info.plist entries the Service needs, and ad-hoc signs it.

That last part is the one that impressed me. Registering an NSService is the kind of thing that fails silently for dumb reasons — plist keys, signing, the pbs cache. It worked.

The inaugural transcription

For the first real run, I picked the most thematically correct video I could think of: "The Kids Guide to the Internet," a gloriously cheesy 1997 tape where Peter and Dasha teach their friends about search engines and email. ("On your mark, get set, we're riding on the Internet!")

A video from 1997 explaining how to get online, transcribed by a 2026 native Mac app, built in a morning by describing what I wanted. The transcript faithfully reproduces every error in YouTube's auto-captions — the Wright Brothers come through as "R Brothers" — which is exactly what it should do. Garbage in, garbage faithfully preserved. That's what the on-device speech fallback is for.

Why this, why like this

I could have used any of a dozen transcription websites. But this is the point I keep coming back to with software: I'd rather own a small tool that does exactly what I want, runs locally, costs nothing per month, and will keep working until I decide otherwise — not until a vendor pivots or a pricing page changes.

What's changed is the cost of getting there. This app would have been a weekend project a few years ago, most of it spent fighting macOS plumbing. With Fable 5 it was a conversation and a coffee. The bottleneck now isn't writing the code — it's knowing what you want clearly enough to describe it.

That part's still on you. Fortunately, it's the fun part.