System-wide AI translation & inline rewrite for macOS & Windows
🌐 Website · 📝 Read the intro · English · 简体中文
TypeTide lives in your menu bar (macOS) or system tray (Windows) and works in any app. Two things, one shortcut each:
- Read — select foreign text, hit a shortcut, and a translation pops up next to it.
- Write — type in your own language, hit a shortcut, and it’s rewritten in place into the target language, ready to send.
Translation runs through a local model (Ollama) for full privacy, or any OpenAI-compatible endpoint for speed. No browser tab, no copy-paste into a translation site — your selection stays where it is, and (with Ollama) never leaves your machine.
The TypeTide transition · a particle tide carries the original text into its streamed translation.
Write · type in your language, press ⌥R, and it’s rewritten in place.
Read · select text and the translation streams into a popup — Copy or Replace.
Optional floating icon appears right next to your selection.
- Read · translate — select text anywhere → popup with the translation. Trigger by shortcut, a floating icon next to the selection, or auto-translate on select.
- Write · rewrite in place — write in your native language, press the rewrite shortcut, and the input field is replaced with the translation. Replace immediately or preview first.
- Works in every app — uses the Accessibility API (macOS) / UI Automation (Windows) to read the selection, with a clipboard-copy fallback for Electron/web apps, so it works even where text APIs don’t. The original clipboard is always restored.
- Undo-safe replacement — replacements are pasted, preserving each app’s native undo stack.
- Local or cloud — pluggable backends: Ollama (offline, private) or any OpenAI-compatible API (
/chat/completions, streaming). Switch in Settings. - Model picker — Settings lists your installed Ollama models; if the configured model isn't installed, TypeTide auto-selects one so it works out of the box. Thinking models (qwen3 family, …) are handled — hidden reasoning is disabled so translations stay instant.
- Styles — Faithful, Formal, Casual, or Polished, independently for read and rewrite.
- Menu-bar / tray only — no Dock or taskbar clutter. Global shortcuts, launch at login, per-app skip list.
- Native on both platforms — SwiftUI on macOS, Win32 C++ on Windows. No Electron, no runtime.
| TypeTide | Browser translate sites | OS built-in translate | |
|---|---|---|---|
| Works in any app (mail, chat, IDE, terminal) | ✅ | ❌ (paste in/out) | |
| Rewrite in place for replies | ✅ | ❌ | ❌ |
| Runs 100% offline / private | ✅ (Ollama) | ❌ | |
| Bring your own model / endpoint | ✅ | ❌ | ❌ |
| Streaming output | ✅ | ❌ |
Detection and translation cover the 10 most-spoken languages: English, Chinese, Hindi, Spanish, French, Arabic, Bengali, Russian, Portuguese, Indonesian. Pick your native and foreign language in Settings → Language. Each shortcut (⌥D / ⌥R) has its own direction: auto detects the selected text's language and translates the other way, or pin a fixed direction for mixed-language text.
1. Pick a backend
Local (private, offline) — install Ollama, then:
# macOS: brew install ollama · Windows: winget install Ollama.Ollama
ollama pull qwen3.5:4b # or any compact chat model that fits your hardware
ollama serve # usually already running as a service…or cloud: in Settings → Backend, choose Cloud API. Windows includes presets for OpenAI, OpenRouter, and DeepSeek plus a custom OpenAI-compatible endpoint; API keys are kept in Windows Credential Manager rather than the settings JSON.
TypeTide lists your installed models in Settings → Backend and auto-picks an installed one if the configured model is missing — pulling any chat model is enough to get going.
2. Install TypeTide
macOS — with Homebrew (recommended):
brew install --cask everettjf/typetide/typetide…or download the latest .dmg from Releases, drag it to Applications, and launch it. The build is signed and notarized by Apple.
Windows — download and run the latest TypeTide-Setup-x.y.z.exe installer from Releases (per-user, no admin needed; a portable TypeTide-Windows-x.y.z.zip is also available). If SmartScreen warns about an unrecognized app, choose More info → Run anyway.
3. First run
macOS: allow TypeTide under System Settings → Privacy & Security → Accessibility (required to read selections and replace text). Windows needs no special permission. Then:
- Select text → ⌥D (macOS) / Alt+D (Windows) → see the translation.
- Type in your language → ⌥R / Alt+R → it’s rewritten in place.
Shortcuts, triggers, styles, and languages are all configurable in Settings.
| Action | macOS | Windows |
|---|---|---|
| Translate selection (read) | ⌥D | AltD |
| Rewrite & replace (write) | ⌥R | AltR |
Select / type ─► Shortcut · floating icon · auto
│
Capture (AX / UI Automation selection ─► clipboard fallback)
│
Translate (Ollama / OpenAI-compatible, streaming)
│
Read: popup · Write: paste in place (undo-safe)
TypeTide can read and replace selected text across applications, so macOS requires Accessibility permission; Windows uses UI Automation without a separate permission prompt. Capture happens only after a configured shortcut, floating-icon click, or auto-translate selection event. Apps containing sensitive text can be disabled in Settings → Excluded apps; use shortcut only mode when you do not want passive selection monitoring.
- With Ollama, captured text is sent only to the Ollama service on
127.0.0.1. TypeTide has no hosted relay or telemetry service. - With an OpenAI-compatible backend, captured text is sent to the configured base URL when translation is triggered. That provider's retention and privacy policy applies; do not use a cloud backend for secrets or sensitive text.
- Some apps do not expose their selection through accessibility APIs. TypeTide then briefly copies the selection, reads it, and restores the previous clipboard contents. Clipboard managers may still record that temporary copy.
- API keys are stored in Keychain on macOS and Windows Credential Manager on Windows.
macos/ # SwiftUI app (Xcode project)
├── TypeTide/
│ ├── Core/ # SelectionCapture, TextReplacer, TriggerController,
│ │ # SelectionMonitor, PopupPositioner, LaunchAtLogin, …
│ ├── Translation/ # TranslationProvider, Ollama / OpenAI providers,
│ │ # TranslationService, cache, model resolver
│ ├── UI/ # Translation popup + floating selection icon
│ ├── Config/ # AppSettings, LanguageConfig
│ ├── Services/ # GlobalShortcutCenter, UpdateChecker, system service
│ └── Views/ # Menu bar + Settings
└── scripts/ # Release / notarization scripts
windows/ # Native Win32 C++20 app (CMake)
├── src/ # Tray, hotkeys, UIA capture, popup, providers,
│ # settings window, replacer, language detection
└── assets/ # Icon
docs/ # GitHub Pages site + blog + screenshots
macOS:
cd macos
open TypeTide.xcodeproj # ⌘R to run
# Signed release + notarized DMG (export APPLE_ID, APPLE_SPECIFIC_PASSWORD, APPLE_TEAM_ID first)
./scripts/build-release.sh # → build/TypeTide-x.y.z.dmgRequirements: macOS 26+, Xcode 15+. The app is not sandboxed (it needs Accessibility + synthetic key events). For local dev builds, sign with your Apple Development team so the Accessibility grant persists across rebuilds.
Windows:
cd windows
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build # → build/TypeTide.exeRequirements: Windows 10+, Visual Studio 2022+ (MSVC, CMake, Ninja). No third-party dependencies — pure Win32 + WinHTTP + UI Automation. See windows/README.md for architecture and the test harness.
Releasing — both platforms share one version (root VERSION file) and attach to the same GitHub release tag, in either order:
./scripts/bump-version.sh # patch +1, syncs pbxproj / CMake / rc / manifest
# commit, then on each platform:
./scripts/release-windows.ps1 # Windows: builds installer + zip, creates/updates release
./scripts/release-macos.sh # macOS: builds notarized DMG, creates/updates releaseWhichever platform releases first creates the vX.Y.Z tag; the other uploads its asset to the same release later. Requires gh auth login once.
- Shortcut does nothing → macOS: confirm Accessibility is granted (Settings → General shows Granted) and TypeTide is enabled in the menu bar. Windows: another app may own the hotkey — pick a different one in Settings → Shortcuts.
- No translation → Ollama: is
ollama serverunning and the model installed? (TypeTide auto-picks an installed model if your configured one is missing.) OpenAI: check base URL / key / model. - Translation is very slow on a qwen3-class model → TypeTide disables hidden “thinking”, preloads the selected model, and keeps it warm for 10 minutes. If it still crawls, the model may be too big for your hardware — try a smaller one from Settings → Backend.
- Misaligned popup in some apps → those apps don’t expose text bounds; the popup falls back to the cursor position.
- “Can’t be opened on this Mac” on Sequoia or earlier → TypeTide requires macOS 26+. It’s built against the current SwiftUI menu-bar and Settings APIs, and keeping a single modern baseline is what lets a small project stay reliable. Support for older macOS isn’t planned right now.
- Which language goes where? → In Settings → Language, pick your native and foreign language (there is no “source/target” pair to get backwards). Each shortcut has its own direction; auto detects the selected text and translates the other way.
Issues and PRs welcome. Join the Discord.
MIT · Made with ❤️ for macOS & Windows. If TypeTide helps you, a ⭐️ is appreciated!