Yohoho.

Free dictation, on your own computer.

Independent project · Product design & engineering · 2026
Download Yohoho
0:00 0:00

Press a shortcut, speak, and Yohoho pastes the text into the app you’re writing in. Speech recognition runs on the computer, with a choice of models.

What makes dictation dependable in another app?

Speaking long prompts was easier than typing them. The first Windows experiment built on a patched open-source WhisperWriter. From that foundation, I developed a portable Python tool and a native Mac interface, adding model choices, recording feedback, and transcript recovery.

Colleagues wanted it on their computers, but terminal setup was a barrier. A free Mac app made it easier to get started. The harder part was making dictation dependable while someone worked elsewhere: showing that it was listening, leaving their cursor alone, and keeping the words when delivery failed.

Learn more about the first version
Project details
My role
Product design, prototyping, and AI-assisted engineering
Built with
SwiftUI, AppKit, Python, ONNX, and MLX
Build documented here
Native 1.0.3 · September 2026

Speech recognition runs locally. Model downloads and update checks use the network.

Recording feedback

The indicator must not become the destination.

A ring and chime confirm that recording has started. But showing that feedback must not move keyboard focus away from the app where the words should land.

Placing the indicator beside the text cursor proved unreliable across terminals and editors. A separate panel gave feedback a stable home. It does not activate or intercept clicks, so the writing app keeps keyboard focus.

That window constraint reached into the animation code: the native panel needed an explicit timer to keep the ring moving. Cancellation also had to reject late results, even if transcription was still running.

Appearance controls and earlier explorations
Native Appearance window with color choices, a pattern selector, visual sensitivity, and ring preview
Appearance settings, with colors, patterns, sensitivity, and an actual-size preview.
An earlier HTML study comparing speaking-to-idle transitions

Comparing the transition from speaking to idle.

History & recovery

Keeping the text when pasting fails.

A finished dictation could miss its destination when the cursor was in the wrong place. History keeps the transcript available to copy, edit, or paste again without repeating it.

History window with searchable transcripts, editable current text, and original transcription
History keeps original and edited text together. Sample transcripts shown.
Yohoho menu dropdown showing the last five transcripts, a copy action for each, and links to History and Settings
The last five transcripts are available to copy from the menu bar.

The last five transcripts are one click away in the menu bar. History keeps the longer record for searching and editing. The original transcription stays available, and an edit becomes the current text. Copying a result does not rerun recognition or create another History entry.

Saving runs separately from pasting, so storage cannot hold up delivery. A transcription failure can retry retained audio; a missed paste can recover completed text.

Model choices

Why I kept three speech models.

Native dropdown explaining Parakeet V2, V3, and Cohere Small
The native selector explains language support and download size before a model is chosen.

A model can recognize speech accurately and still make dictation feel slow. Testing narrowed the offering to three: an English default, broader language coverage, and an English option I preferred for filler handling.

Model options · September 2026
ModelWhat it offersModel files
Parakeet V2DefaultEnglish dictation with the smallest download.661 MB
Parakeet V3Upstream support for 25 European languages.670 MB
Cohere SmallMy preference for filler handling in English.1.51 GB

Parakeet V2 had the fewest errors in a small English comparison. A separate latency check ruled out Unified: it took about 14 seconds after a 9.5-second recording. Each extra option needed a useful difference, not just a place in the dropdown.

Learn more: measurements and tradeoffs
Native implementation

The menu bar could not hold the whole app.

Recent transcripts need quick access. Model downloads, recording controls, and appearance need room to be understood. Putting all of them in one menu made both jobs harder.

Native Recording settings with shortcut, Hold and Toggle, microphone selection, and input testing
Recording settings, with activation, microphone, and recent-transcript shortcuts.

Interactive demo. Downloads, permissions, and dictation are simulated.

The menu now holds recent transcripts and quick actions. A dedicated window gives configuration and History their own space. Settings controls are reused in first-run setup, so their descriptions and behavior stay consistent.

The AI-assisted native build still needed checking against that intent. One preview was smaller than the indicator it was meant to represent. I caught the mismatch and directed a correction to the preview, preserving the working recording panel.

Where it landed

What changed in daily use.

With the chime and History, I stopped worrying as much about whether it was listening or where the text had gone. That is the clearest change in my own use.

Colleagues differed in where dictation fit. Some used it with other people around; others preferred home or a private setting. Removing terminal setup made the app easier to approach, but it did not make speaking aloud comfortable everywhere.

Those are informal observations, not a retention study. They leave a useful question for the next version: when is speaking preferable to typing, and when does the setting get in the way?

What is still open

I want more people to have access to it. A collaborator is helping with Windows. Native source publication, richer context, and a simpler prepared-update experience are still ahead.

Project history

Project history.

An unreliable text-cursor position led to a separate indicator. That panel had to preserve focus, and cancelled work had to stay cancelled.

June to September 2026

One thread · 4 decisions

Keeping dictation in the writing app.

  1. 01The text cursor was unreliable.Learn more

    Feedback needed a stable place outside the text field.

  2. 02Give feedback its own panel.Learn more

    A separate panel must leave typing in the writing app.

  3. 03Preserve the destination’s focus.Learn more

    An active destination also needs protection from late results.

  4. 04Discard cancelled results.Learn more
Explore the decisions in chronological order.Start with the earliest note