← Back
● Experiment

v0.5.0: the pill got a personality

Pushed v0.5.0 tonight. A lot changed.

The biggest thing is the floating pill — that little Dynamic Island-style widget that floats on your screen while Transcripted is running. I rebuilt it from scratch. The old version had this aurora fog effect that honestly looked cool in screenshots but in practice just felt like noise. You couldn’t tell what state the app was in.

New version is much cleaner. While recording you get two LED dots — coral for mic, teal for system audio — and they pulse reactively with actual audio levels. You can see at a glance if both inputs are capturing. During processing it’s just a progress bar and status text. No drama.

The part I’m most happy about is the saved state. When a recording finishes and gets processed, the pill expands into a small notification card that shows the title, how long the meeting was, and how many speakers were detected. Two buttons: Copy and Open. Then it dismisses itself after 10 seconds. It’s the kind of thing that makes the app feel finished rather than functional.

Deleted about a thousand lines of dead code in the process. PillIdleView, PillRecordingView, PillProcessingView, CelebrationViews, WaveformViews — gone. I’d been carrying that around since 0.1.0.

On the onboarding side, two things changed that I think will actually matter for real users:

Model downloads now show download speed and an estimated time remaining. Before, you’d start the download and just… wait. No feedback, no idea if it was working or close to done. A minute of silence on a first-run experience is brutal. Now it shows MB/s and a countdown. Small thing but it changes the feeling completely.

Errors are also structured now. Instead of surfacing a raw NSError string (which tells a normal user literally nothing), errors get classified — network failure, TLS issue, disk space, timeout — and each one shows a specific icon and tells you what to actually do. I also added a confirmation dialog if you try to close the window during an active download, because that was causing silent failures where people thought the install worked and it didn’t.

There’s also a HuggingFace mirror fallback now. If the primary CDN is unreachable — which happens, especially in certain regions — downloads retry with exponential backoff and then switch to hf-mirror.com automatically. And before any download starts, the app checks that you have network connectivity and enough disk space and fails fast with a clear message if you don’t.

One more onboarding change: there’s a preview step now that shows a realistic multi-speaker transcript before asking for microphone permission. We had a 38% drop-off at the permissions step. Turns out if people haven’t seen what they’re getting yet, they hesitate. Now you see the output before you’re asked for anything.

The other thing worth noting: the nightly automated security audit found two real issues. SQL injection risk in the speaker database — the table name was being interpolated into a query string instead of using a parameterized approach. And a path traversal vulnerability in how HuggingFace API responses were handled — filenames from the API were being used directly in file paths without sanitization. Both fixed. Both things I probably would have missed doing a manual review.

That’s the part that keeps surprising me about building this way. The agents catch things that I’m too close to the code to see.

v0.5.0 is out now. Free, local, macOS only, no cloud.