atst

May 28, 2026 · View on GitHub

atst

atst

a(i)-text-select-translate — a tiny menu-bar translator for macOS

a(i) · text · select · translate

macOS 14+ Version License

Hit a hotkey, get a translation. Works out of the box with built-in Google + Microsoft adapters, and unlocks AI-grade dictionary / explanation when you bring your own model.

简体中文 · Install · Usage · Features


Highlights

  • One-hotkey translation — press ⌥D on any selected text, anywhere in macOS, and a tooltip appears in ~200ms
  • 🖼️ Screenshot translation — press ⌥S, drag a region, get the translation. On-device Vision OCR by default (fast + private + free); falls back to AI vision if you've configured one
  • 🔀 Multi-source side-by-side — Google and Microsoft results stack above your AI result, so you can cross-check at a glance
  • 🧠 AI dictionary mode — for single words, AI providers can return multiple meanings, IPA phonetics, and a short usage explanation
  • 📌 Pin as note — freeze a translation into a floating sticky note for later reference
  • 💾 Local cache — repeat lookups hit a JSON cache, scoped per provider; configurable TTL and size cap
  • 🫧 Native Liquid Glass — translation tooltips and pinned notes use Liquid Glass on macOS 26+ when available, with an automatic fallback on older systems
  • 🪶 Tiny footprint — ~2 MB DMG, ~4 MB installed. Pure Swift/AppKit, no Electron, no Web view
  • 🌐 Bilingual UI — auto English / Chinese based on system language, with a manual override
  • 🆓 Zero-config friendly — works on a fresh install with no API keys (Google + Microsoft adapters); add an OpenAI-compatible endpoint when you want richer output

Screenshots

Click to expand

Tooltip

Tooltip

Settings


Install

Download the latest release

  1. Grab the latest atst.dmg from the Releases page
  2. Open the DMG and drag atst into your Applications folder
  3. Launch atst — a small atst label appears in your menu bar (top-right of the screen)
  4. macOS will prompt for Accessibility permission the first time you press a hotkey — grant it in System Settings → Privacy & Security → Accessibility

Heads up: because atst is a self-signed app (no Apple Developer ID yet), the first launch may show "atst can't be opened because it is from an unidentified developer". Right-click the app → OpenOpen anyway, or run xattr -d com.apple.quarantine /Applications/atst.app once.

Build from source

Requires macOS 14+ and Swift 5.9+ (Xcode 15 / Command Line Tools).

git clone https://github.com/itaober/atst.git
cd atst

# Quick dev build
swift run atst

# Build a packaged .app bundle (with icon + Info.plist + codesign)
bash Scripts/build-app.sh
open .build/atst.app

# Build a DMG installer
bash Scripts/build-dmg.sh
open .build/atst.dmg

Usage

Hotkeys

HotkeyAction
⌥DTranslate the currently selected text
⌥SScreenshot a region and translate the text it contains

Both hotkeys are reconfigurable in Settings → Hotkeys.

The translation tooltip

When a translation appears, you'll see one or two sections:

  • Top — API results (Google, Microsoft): fast and free, no API key required
  • Bottom — AI result (if enabled): richer output with multiple meanings, IPA phonetics, and explanations for technical terms

Each row has its own copy button. The whole tooltip is draggable from its header if you want to move it out of the way; click outside to dismiss. Click the pin (📌) in the header to freeze it into a sticky note.

Translator settings

Click the atst label in your menu bar to open the settings panel.

The General page has two toggles:

  • ☑️ API Translation (on by default) — Google + Microsoft. Zero config.
  • AI Translation (off by default) — OpenAI-compatible endpoint. Configure base URL + key + model in the AI subpage.

AI configuration (optional)

Inside AI Translation subpage:

  • Base URL — any OpenAI-compatible endpoint, e.g. https://api.openai.com/v1, http://localhost:11434/v1 (Ollama), https://generativelanguage.googleapis.com/v1beta/openai/ (Gemini OpenAI-compat)
  • API Key — kept locally in ~/Library/Preferences/dev.local.atst.plist
  • Translation Model — model name to use for selection translation (e.g. gpt-4o-mini, qwen2.5:7b)
  • Screenshot Model — vision-capable model used when Vision OCR is OFF (e.g. gpt-4o, claude-3.5-sonnet)
  • Phonetic — append IPA to single-word lookups
  • Smart Explanation — add a dictionary-style explanation block (idioms, proper-noun definitions, etc.)
  • Translation Prompts — fully editable system + smart-explanation prompts

Screenshot OCR settings

The Screenshot section in the General page controls how ⌥S works:

  • ☑️ Use Vision OCR (on by default) — recognise text on-device with macOS Vision (no AI needed!), then translate via the selected providers
  • Use Vision OCR OFF — send the screenshot directly to your AI vision model

Add or remove recognition languages from the chip row below. Default: Simplified Chinese + English + Japanese.


Features

Translation providers

ProviderKey requiredFreeStreamingMulti-meaningPhoneticExplanation
Google (built-in)
Microsoft (built-in)
OpenAI-compatibledepends

Other goodies

  • Smart tooltip placement — Web-style flip algorithm; tooltip never gets pushed off-screen or covers your selection
  • Adaptive glass surface — native Liquid Glass on macOS 26+ with Swift 6.2+ builds; older macOS versions keep the AppKit NSVisualEffectView tooltip material
  • Cache stats — see how many entries are cached and how much disk they're using, with a one-click clear button
  • Untranslatable detection — proper nouns / brands / misspellings get a 🔘 marker and skip the cache
  • Theme — Auto / Light / Dark, applied app-wide

Requirements

  • macOS 14.0 (Sonoma) or later
  • A handful of MB of disk for the local cache
  • For AI features: any OpenAI-compatible endpoint (paid or local-LLM)

Privacy

  • atst is a local app. No telemetry, no analytics, no crash reporters.
  • API providers (Google, Microsoft, your AI endpoint) receive only the text you trigger a translation for.
  • Cache lives at ~/Library/Caches/dev.local.atst/translations.json. Settings live at ~/Library/Preferences/dev.local.atst.plist. Delete either at any time.

Roadmap

Things on the radar (open an issue if you'd like to vote one up):

  • Custom HTTP translation providers (template-driven; bring your own DeepL / Lingva / Libretranslate)
  • Drag-to-reorder API providers
  • Translation history with full-text search
  • Streaming token-by-token rendering for AI providers that support it
  • Apple Notarization + proper code signing (no more right-click → Open)

License

Apache 2.0 — see LICENSE for details.

Acknowledgments

  • macOS Vision framework for the OCR engine
  • The OpenAI Chat Completions protocol — adopted by virtually every modern LLM endpoint
  • Built with Claude Code in collaboration with the author