Encre

Press a hotkey anywhere on your desktop to fix, translate or dictate text in place, using your own AI key and speech models that run offline.

Visit the site

Go, Fyne, Rust

English is not my first language, so writing an email means writing it twice: once as it comes out, and once after a detour through a chat window to fix the grammar.

Encre removes the detour. It sits in the system tray, waits for a keyboard shortcut, takes whatever you have selected, and puts the corrected version back in place. The app you are writing in never loses focus.

Selecting a sentence, pressing the shortcut, and the corrected text replacing it in place

Four shortcuts, nothing to open

Revise the selection, revise the whole field, translate, or hold a key and speak. Translation works from a language pair you set once and picks the direction itself.

Translate and dictate ship switched off. One needs a language pair, the other a downloaded model, and a shortcut that fires before its feature can do anything is worse than one you turned on yourself.

Your key, your provider

No account, and no server of mine in between. You bring a key from OpenAI, Anthropic or Google, and your text goes there and nowhere else. Anything that speaks the OpenAI protocol works too, including a model running on your own machine.

Choosing an AI provider and model in Encre

Each action has its own rules

Revising a sentence and translating a paragraph are different jobs, so they keep separate prompts, limits, timeouts and providers. A blank prompt falls back to the built-in one, so defaults can improve without overwriting anyone's edits. Prefix a selection with @name to send that one request somewhere else.

Per-action settings showing the prompt, provider and limits for Revise

Dictation stays on the machine

Hold the shortcut, talk, release. The transcript is typed at the cursor, transcribed locally by default, so the audio never leaves the computer.

The catalogue holds seventy-odd models, which is seventy-odd ways to choose wrong. The list is ordered by what the machine in front of you can keep up with: measured speed scaled by core count, checked against memory. A model nobody has measured is marked unknown rather than guessed at.

The speech model browser, showing size, languages and expected speed per model

Losing words is the failure that matters

Some models take audio while you speak, so the text is ready the moment you release the key. If a chunk fails to feed, the transcript is quietly missing words and nothing says which. So the recorder keeps every frame as well as streaming it, and falls back to one clean pass over the audio it kept.

Replacing a selection means borrowing the clipboard. If the copy fails because the app was busy, the naive version corrects whatever was on the clipboard already and pastes it over your work. Encre empties the clipboard first and waits for something to appear; if nothing does, it says so instead of guessing. What was there goes back exactly as it was, images included.

Go for the window, Rust for the system

The interface is Go and Fyne. System-wide shortcuts, clipboard access, synthetic keystrokes and microphone capture are out of reach of a Go runtime, so they live in a Rust library behind a C interface small enough to audit.

Speech recognition is ggml built from source, which makes the release pipeline part of the problem. Builds are pinned to a fixed CPU baseline, because a compiler left alone tunes the binary to the machine that built it and crashes on an older one. Models download against a pinned revision and a published checksum.

Stack

Go and Fyne for the interface, Rust through cgo for input and audio, ggml for local transcription. GitHub Actions builds for Windows, macOS on both architectures, and Linux as .deb, AppImage and portable archive.

The source is on GitHub.