Home / Work / tellmebaby
PRODUCT BUILD · SHIPPING

Three AI models.
Zero network calls.

tellmebaby is a Windows desktop companion you talk to. Press a key, speak, and text lands at your cursor; select text and it reads aloud; give it an instruction and it rewrites the selection in place. Speech recognition, the language model and the neural voice all run on the user's own machine. There is no cloud call, no telemetry, no account, and no API key — the privacy promise is the product.

Type
Product build — desktop application
Platform
Windows · Tauri 2 + Rust
Speech
4 ASR backends, all INT8, on-device
Language model
Embedded local sidecar — no external endpoint
Voice
Neural TTS · 31 languages · streaming
Network
Model downloads only. Nothing else.
0
Cloud inference calls
3
AI models running locally
31
TTS languages
0
Telemetry endpoints
/ 01
The Problem

Dictation is the most privacy-sensitive input method there is. People dictate medical notes, legal drafts, salary discussions, and things they would never type into a web form. Every mainstream option streams that audio to someone else's server.

Running the models locally solves the privacy problem and creates three new ones. Quality: on-device models have historically been noticeably worse. Friction: local AI stacks typically demand that the user understands model names, quantisation and thread counts. Build hell: the usual C++ inference dependencies mean multi-minute source compiles and toolchain breakage that makes shipping a consumer installer miserable.

/ 02
The Approach

The rule was maximum-quality models, zero build friction. Every AI dependency was chosen for shipping precompiled binaries: the speech engine links statically with no CMake step, the TTS runtime loads its ONNX graphs dynamically, and the language model runs as a prebuilt llama.cpp server sidecar. First build is fast, and CI does not depend on a C++ toolchain behaving.

The embedded brain is the interesting part. Rather than linking an inference library into the app, tellmebaby runs the model as a contained local sidecar: pinned artefacts verified on download, reachable only from the machine itself, and tied to the application's own lifetime so it can never be left running. Three runtimes sit behind one async streaming interface, so the embedded engine, an optional local alternative and a pass-through no-op are interchangeable.

Speech recognition uses a resilient decode ladder rather than a single model call. Long recordings decode as silence-bounded windows. A blank decode retries by dropping hotwords, then by recursive silence-splitting, then by falling back to a model of a different architecture entirely. Users get text instead of an empty box.

The settings philosophy is aggressive: the user chooses the languages they speak. Model, hardware provider, thread count, sample rate and audio device are all decided by the system. Technical model names never appear in the main interface.

/ 03
The Hard Parts
  1. A global hotkey that is actually reliable Windows global hotkeys are notoriously racy. This uses a native low-level keyboard hook with explicit modifier tracking rather than polling key state — sidestepping a race that leaves chords "stuck". Modifier state resets on session unlock and resume, with a watchdog for stale chords.
  2. Getting text into an app that resists pasting Injection is clipboard write plus a synthesised paste — except in terminals, vim and remote desktop sessions, which handle clipboards unpredictably. Those get direct typing instead, selected by inspecting the focused application. The transcript deliberately stays on the clipboard for recovery, and is tracked so the next dictation's context never feeds on the app's own output.
  3. Crash-safe audio Audio is written to disk per chunk as it is captured, so a crash mid-sentence loses nothing. Capture is persist-before-decode: the recording exists before any model touches it.
  4. Deleting a feature that tested badly Voice activity detection was built, shipped, and then removed — auto-stop was cutting users off during natural pauses. Recording is now fully manual. Knowing which clever feature to delete is harder than adding one.
  5. Resumable multi-gigabyte downloads Model artefacts run to gigabytes. Downloads stream, verify, resume after interruption and only become live once complete — because a failed download at 90% on a hotel wifi is otherwise a lost user.
/ 04
The Outcome

A shipping Windows application where speech-to-text, language-model rewriting and neural speech synthesis all happen on the user's own hardware. The only network traffic is the one-time, hash-verified model download.

That makes it deployable in exactly the environments where cloud dictation is prohibited — legal, medical, financial, defence-adjacent — without a data processing agreement, a regional hosting question, or a security review of a third-party API.

The architecture generalises. The same pattern — pinned local models, a sidecar contained by the OS, a streaming runtime trait with swappable backends — is how we build any AI feature that cannot send its input off the machine.

The pipeline — every stage runs on the user's machine
LOCAL MACHINE — NOTHING CROSSES THIS BOUNDARY Capture cpal · WASAPI crash-safe WAV Resample rubato sinc → 16 kHz mono ASR 4 backends · INT8 resilient decode ladder LLM sidecar llama-server · pinned local only · contained Inject at cursor paste, or type where the app resists paste ▸ dictionary hotword biasing · voice macros · snippets applied inline · history to local SQLite Outbound network: one-time model download (SHA256-pinned, Range-resumable) Everything else: none — no telemetry, no analytics, no update beacons, no account
Stack Rust Tauri 2 React 19 Tailwind 4 sherpa-onnx llama.cpp ONNX Runtime cpal / WASAPI Native input hooks Process containment Local storage Framer Motion

The strongest privacy guarantee is
not having the data.

AI THAT CAN'T LEAVE THE BUILDING

If compliance blocks your AI roadmap,
run the models where the data already is.

Contact Us →