MoePeek: a small Swift 6 selection translator that keeps translation on the Mac
A lightweight macOS selection translator built with pure Swift 6, featuring on-device Apple Translate for privacy, only 5MB install size and stable ~50MB memory usage. 一款轻量级 macOS 划词翻译工具,纯 Swift 6 开发,设备端 Apple 翻译保护隐私,安装体积仅 5MB,后台运行内存稳定约 50MB
At a glance
- What is it?
- MoePeek is a menu bar app for macOS that translates selected text through the Accessibility API, AppleScript or the clipboard, with on-device Apple Translation among a long list of engine options. It weighs about 7 MB, keeps background memory near 50 MB, and is described by its own author as a vibe-coded side project rather than a finished product.
- Who is it for?
- MoePeek fits a Mac user who translates selected text often enough to want a dedicated shortcut, who prefers a native app over an Electron one, and who wants Apple Translation to run on the device. It does not fit a user who needs text selection to work reliably in every application, because the project itself says edge cases in selection and window handling are the first thing to go wrong.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly Swift, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Five ways to trigger a translation
MoePeek is a native macOS menu bar translator whose basic loop is: select text, get a translation. Five modes sit on top of that loop, and the default shortcuts are shown in a table in the documentation.
Smart Translation uses the selected content first, falls back to the clipboard snapshot captured at the moment it was invoked, and opens manual input when both are empty. Translate Selection takes text from any application and shows the result in a floating panel. OCR Screenshot captures a region of the screen and translates the recognised text. Clipboard Translation works on whatever is on the clipboard. Manual Input is a plain type-or-paste box.
The default bindings are Option D for Translate Selection, Option S for OCR Screenshot, Option A for Manual Input and Option V for Clipboard Translation, with Smart Translation deliberately left unassigned. All of them are configurable under Settings, General, and the documentation notes that Smart Translation is opt-in and never changes existing shortcut bindings.
Two design choices matter for how it feels in use. The floating panels are non-activating, so they never steal focus from the application you were working in, and the result can be spoken aloud through Apple's built-in speech synthesis, which is the feature that turns it into a reading tool rather than only a translation tool.
Three tiers of text grabbing, in order of preference
Getting the selected text is the hard part of a selection translator, and MoePeek handles it with three tiers listed as Accessibility API, then AppleScript, then a clipboard fallback. The order matters because each tier is more invasive or less reliable than the one before it.
The Accessibility API is the proper route and it is why the app asks for the Accessibility permission on first launch. AppleScript is the fallback for applications where the Accessibility path returns nothing useful. The clipboard tier is the last resort and it is the reason the documentation describes the clipboard snapshot as being captured when the translator is invoked, so that the app reads what was on the clipboard at the moment you triggered it rather than whatever is there later.
That third tier explains a design decision worth understanding. If the clipboard fallback simply pasted the selection to read it, it would clobber whatever you had copied. Capturing a snapshot at invocation time avoids that surprise, at the cost of needing the permission and of being wrong if the selection was never a copy in the first place.
The onboarding flow walks through the two permissions the app needs: Accessibility for grabbing selected text through the Accessibility API, and Screen Recording for OCR screenshot translation. Neither is optional in the sense that the corresponding features simply will not work without them, so a user who declines gets a much smaller app than the feature list suggests.
A service list that mixes free APIs, paid APIs, LLMs and local models
The translation engine table is the most useful part of the documentation for anyone deciding whether to use this. Four categories are listed. The free column covers Google Translate, Bing Translate and Youdao Translate. The API column covers DeepL, Baidu, NiuTrans, Caiyun and DeepLX. The LLM column covers OpenAI, Anthropic, DeepSeek, OpenRouter, Requesty, Zhipu GLM, plus Ollama and LM Studio for local models. The system column covers Apple Translation, which is marked as on-device and available on macOS 15 and later.
Two details stand out. Local inference is supported through both Ollama and LM Studio, so a user who does not want to send text to a server can keep everything on the machine. And on-device Apple Translation is the privacy option, since it runs entirely on the device rather than uploading anything.
LLM results get Markdown rendering, and there is an optional rich text capture mode that keeps formatting and images from applications such as Word, which is the difference between translating a wall of plain text and translating the document you actually copied.
Language detection is automatic across 14 languages and the translation direction flips on its own, so there is no source and target picker to set by hand. The two extension integrations, OpenClip and PopClip, send a selection into MoePeek from another tool, which is how you get the same behaviour without a custom shortcut.
Install, permissions and the quarantine problem
Installation is a download and a drag: take the latest .dmg or .zip from the GitHub releases page and drag MoePeek.app into /Applications. There is no package manager path documented and no build-from-source section in the visible documentation, although the repository carries a Package.swift, a Tuist.swift, a Project.swift and Package.resolved, which is the Tuist based project layout that would let you build it yourself.
The first launch shows an onboarding flow that asks for the Accessibility and Screen Recording permissions. After that the app lives in the menu bar and the shortcuts do the work.
There is one obstacle that has its own FAQ entry. The app is not notarized with Apple, so macOS Gatekeeper may block it and report that it is damaged and cannot be opened. The documentation is careful to say this does not mean the file is corrupted, and the fix is a Terminal command:
sudo xattr -r -d com.apple.quarantine /Applications/MoePeek.appThe PopClip extension has the same problem and the same answer, with the path pointing at the extension bundle:
xattr -dr com.apple.quarantine /path/to/MoePeek.popclipextAnd if the onboarding screen does not appear, or you want to see it again, the preferences are reset with:
defaults delete com.nahida.MoePeekThe bundle identifier in that command, com.nahida.MoePeek, is worth noting because it differs from the repository name, which can be confusing when you are looking for the app in a preferences pane.
Small footprint, few dependencies, and where that comes from
The project makes three resource claims and explains the first one in terms of architecture. The app size is about 7 MB, achieved with pure Swift 6 and only four dependencies, with no Electron and no WebView. The background memory is about 50 MB, and the documentation attributes that to systematic memory leak prevention for long-running sessions. The third claim is that Apple Translation runs entirely on the device.
The dependency list in the acknowledgements confirms the shape. KeyboardShortcuts and Defaults come from Sindre Sorhus, Sparkle provides the built-in auto-updater, and Textual is listed in the acknowledgements. Four listed dependencies, all from known sources and well known, is a defensible footprint for an app that is supposed to sit in the menu bar all day.
The build tooling is Tuist based, with a.mise.toml for toolchain versions and a.tuist-version file, plus Configurations, Entitlements, Sources, Tests and separate OpenClipExtension and PopClipExtension directories. Entitlements in particular matter for an app that asks for Accessibility and Screen Recording, since those permissions are granted per signed application and change if the signature changes.
The licence is AGPL-3.0, and the contribution guidance spells out the consequence: derivative works must also be open source. The author also says they work a day job, batch-process issues and pull requests at weekends, and they describe the project as a personal, AI vibe-coded side project that works well for their own use cases but is not designed to be a polished, production-grade tool.
Where MoePeek is the wrong choice
The limitation section in the documentation is the most important part of the project for an evaluator, and it is unusually blunt. The author says there are plenty of edge cases in text selection and window handling that commercial tools have spent years ironing out, and that MoePeek likely misses many of them. That is a direct statement from the person who wrote it.
The consequences follow from that. Selection behaviour is the classic failure point for this class of app, and the three-tier fallback exists precisely because the Accessibility API does not work uniformly across applications. If you work in an application that the Accessibility API handles poorly, you will feel that gap immediately, and the documented alternatives are the ones to look at instead.
The two named alternatives are worth reading the author's own descriptions of. Clicknow is presented as a feature-rich, actively maintained selection translator. PopClip is described as the gold standard for macOS text selection actions, with a rich extension ecosystem. The interesting part is that MoePeek ships extensions for both, which means it positions itself as a translation engine that plugs into other selection workflows rather than trying to replace them.
The AGPL-3.0 licence is the other constraint for anyone planning to build on this. A personal tool on your own Mac is unaffected, but a fork that ships as a product would have to stay open source, and the Swift 6 and Tuist setup plus the app bundle and extension signing work make it a project for someone willing to maintain a Mac app rather than a script.
One more practical point. Apple Translation is the on-device option, and it is marked as requiring macOS 15 or later, while the app itself targets macOS 15 and above as well. Anyone on an older Mac is left with the network services, including the free ones, which changes the privacy story completely.
Editorial conclusion
MoePeek fits a Mac user who translates selected text often enough to want a dedicated shortcut, who prefers a native app over an Electron one, and who wants Apple Translation to run on the device. It does not fit a user who needs text selection to work reliably in every application, because the project itself says edge cases in selection and window handling are the first thing to go wrong. Before installing it, plan for the two permissions it asks for, Accessibility and Screen Recording, and expect to clear the quarantine attribute with the xattr command in the documentation because the app is not notarized. If you fork it, remember the AGPL-3.0 licence requires derivative works to stay open source.
Frequently asked questions
How do I install MoePeek on macOS?
Download the latest .dmg or .zip from the GitHub releases page and drag MoePeek.app into /Applications. The app targets macOS 15 and later and is built with Swift 6. Because it is not notarized with Apple, you may need to clear the quarantine attribute with the xattr command documented in the FAQ.
How does MoePeek read the text I selected?
It uses a three-tier approach: the Accessibility API first, then AppleScript, and finally a clipboard fallback. That is why the app asks for Accessibility permission on first launch, and why the clipboard snapshot is taken at the moment the translator is invoked rather than read later.
Which translation services does MoePeek support?
The service table covers free options such as Google Translate, Bing Translate and Youdao Translate, paid APIs including DeepL, Baidu, NiuTrans, Caiyun and DeepLX, LLMs including OpenAI, Anthropic, DeepSeek, OpenRouter, Requesty and Zhipu GLM, plus Ollama and LM Studio for local models, and Apple Translation running on device on macOS 15 and later.
Why does macOS say MoePeek is damaged and cannot be opened?
The app is not notarized with Apple, so Gatekeeper may block it, which does not mean the file is corrupt. The documented fix is to run `sudo xattr -r -d com.apple.quarantine /Applications/MoePeek.app` in Terminal and then launch it as usual.
Can I use MoePeek with PopClip or OpenClip?
Yes. Both extensions are downloadable from the latest release. For PopClip you unzip the extension, remove the quarantine attribute so macOS allows it to load, and double-click it so PopClip installs it, then select text and click the MoePeek icon in the PopClip bar. The OpenClip extension works by choosing MoePeek from the OpenClip menu.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/coszone-moepeek)Was this useful?