llm-translator
2026Highlight text anywhere on Linux and a popup streams the translation — bring your own key, no proxy, Qt 6.
- Year
- 2026
- Stack
- Code
- GitHub ↗
A select-text popup translator (and writing improver) for modern Linux, on both Wayland and X11. Highlight text anywhere — a browser, a PDF, a chat window — and a small bar appears: Translate or Improve. Results stream into a popup next to the pointer.
Bring your own key
No proxy, no bundled key: your API key goes straight from your machine to
the provider you configured. DeepSeek by default; OpenAI, Gemini,
Anthropic, Grok, OpenRouter, MiMo, and custom OpenAI-compatible endpoints
also work. Conventional env vars (DEEPSEEK_API_KEY, OPENAI_API_KEY, …)
override stored keys and are never written to disk.
How it fits the desktop
- X11 — monitors the PRIMARY selection via
QClipboardand positions its own popup. - Wayland / GNOME 45+ — a Shell extension forwards selection + sentence context over D-Bus (background clients cannot read other apps’ selections otherwise). The action bar and panel can render inside GNOME Shell so they sit on the pointer.
- Chrome companion — exact webpage and PDF sentence context via native messaging; the extension never holds provider keys.
Build
Needs Qt 6, CMake ≥ 3.21, Ninja, a C++20 compiler, and Rust (cargo) for the backend crate.
cmake -G Ninja -B build -DCMAKE_PREFIX_PATH="$HOME/Qt/6.x/gcc_64"
cmake --build build
./build/clients/linux-qt/translator
Wayland selection bridge:
sh clients/linux-qt/extension/install.sh
# log out / in, then:
gnome-extensions enable translator@translator
Under the hood
C++20 on Qt 6 (Widgets, Network, DBus) for the Linux client; a Rust crate
owns provider traffic and streaming. Chrome + native host only pass
selected text and sentence context locally. Spec notes and packaging live
in the repo under spec/, docs/, and packaging/.