PrivyTranslate (macOS)
Private local-first translation from your menu bar.
Overview
PrivyTranslate is a privacy-first macOS menu bar app for translating selected text or typed input. It supports built-in local GGUF model inference, Ollama, LM Studio, and OpenAI-compatible endpoints, keeping your translation workflow private and under your control.
Features
- Menu bar app — Lives in the macOS menu bar for quick access anytime
- Global hotkey — Option-Space to translate selected text from any app
- Selection translation — Translate highlighted text via temporary copy fallback
- Floating popover — View translation results in a lightweight overlay
- Input translation window — Type or paste text for direct translation
- Built-in local model — On-device GGUF inference via bundled LlamaKit runtime
- Multiple providers — Ollama, LM Studio, OpenAI-compatible, and auto routing
- Translation history — Recent translations stored locally on your Mac
- No account required — No login, no cloud sync, no analytics
Advantages
PrivyTranslate keeps your text private. Built-in local mode processes everything on device. Remote provider modes connect only to the server URL you configure. API keys are stored in Keychain. There are no hosted analytics, tracking, or account services.
Benefits
Translate text across any app without leaving your workflow. Use the global hotkey to instantly translate selected text, or open the input window for longer passages. Keep translation history local and switch between providers as needed.
Provider Routing
PrivyTranslate supports flexible provider selection:
- Auto — Built-in local for short text, then Ollama, LM Studio, OpenAI-compatible fallback
- Built-in Local — Force the bundled GGUF model (Qwen3.5-2B-Q4_K_M by default)
- Ollama — Use your local Ollama instance
- LM Studio — Connect to LM Studio's local server
- OpenAI-compatible — Any OpenAI-compatible API endpoint
Requirements
- macOS for the native menu bar app
- Ollama / LM Studio (optional) — Required only if you choose a remote local provider instead of the built-in model.