A native macOS capture tool — screenshots, recordings, annotation, pins, and on-device OCR — built to cost nothing while it waits in the menu bar.
一个原生 macOS 截图工具:截图、录屏、标注、贴图和端侧 OCR,常驻菜单栏时几乎不耗电。
English | 简体中文
Why OhMyShot · Features · Power budget · Getting started · Contributing · Changelog
Note
Not released yet. There are no builds or version tags; build it from source for now, and ⭐ star or watch the repository to hear about the first release. It is developed and tested on macOS 27 beta on Apple silicon (a 6K ultrawide beside a built-in XDR display). It builds for macOS 26 but has not been run there.
| In the menu bar it runs no timers, polls nothing, and holds no capture streams or event taps: 0 wakeups and 26 MB after launch. Every number is measured and published, misses included. | Copy the text from any part of the screen, search your capture history by it (Chinese included), translate it in place, and read tables, formulas, and charts with optional on-device model packs. |
| Everything is read on your Mac. There is no OhMyShot server: uploads go only to storage you own, and a cloud OCR model runs only with your own API key, when you turn it on. | Swift 6, SwiftUI, and AppKit, following macOS conventions down to permissions and VoiceOver. GPL-3.0, with no subscription and no paid upgrades. |
| Feature | What it does | |
|---|---|---|
| 📸 | Screenshots | Area, window (with or without its shadow, on a background), full display, the previous area, and a self-timer. Areas can cross displays, and the screen freezes while you choose. All-In-One sets up any of them from one bar. |
| 🗂️ | Quick Access and Capture History | A card for each capture to copy, save, mark up, pin, upload, or drag out, and a history you can search by the text in the pictures. |
| ✏️ | Annotation | An editor, or drawing straight on the frozen selection: arrows, shapes, text, a highlighter that snaps to text, counters, blur and pixelation (with redaction suggestions from the text it reads), crops, backgrounds, combined images, and project files you can open again. |
| 🔤 | Text from pixels | Capture Text copies the text in an area; the Recognized Text window shows it beside the picture with tables, links, and codes, and translates it, also over the original. Optional model packs read Chinese a second time, formulas as LaTeX, and tables and charts. |
| 📌 | Pins, color, and measuring | Always-on-top pictures, text, and colors; a screen color picker and a pixel ruler that snaps to edges. |
| 🎬 | Recording and Studio | Screen, window, or area to MP4 or GIF, with system audio, microphone, camera, clicks, and keys. Studio edits a recording afterwards, with automatic zooms that follow the cursor. On macOS 27, with Replay on, the last 15 seconds can be saved at any time. |
| 📜 | Scrolling capture | Scroll by hand or let Auto-scroll do it, into one long picture. |
| ☁️ | Sharing | Uploads to your own S3-compatible, WebDAV, or custom HTTP storage; printing, email, and the Share menu. |
| ⚙️ | Automation | CleanShot X–compatible URL commands under ohmyshot://, actions in Shortcuts and Spotlight, and a Raycast extension. |
| 🌐 | Languages | English, Simplified and Traditional Chinese, Japanese, Spanish, and French. |
OhMyShot also appears in other apps' Share menu (to mark up or pin a picture; switch it on in System Settings › General › Login Items & Extensions › Sharing) and in Finder's Open With for images.
Every milestone is gated on measured numbers. The latest, on the Mac above with Debug builds:
| Metric | Target | Measured |
|---|---|---|
| Idle CPU after launch (60 s average) | 0.0% | 0.06–0.09%, from macOS updating the menu bar; no timers of the app's own |
| Idle wakeups | < 1 per second | 0 ✅ |
| Memory after launch | < 30 MB | 26 MB ✅ |
| Memory after use, idle | < 60 MB | 57 MB after recording ✅; 68 MB after reading formulas and tables ❌ |
| Shortcut → selection overlay | p95 < 50 ms | p95 9.8 ms ✅ |
| Shortcut → frozen picture | p95 < 150 ms | p95 47.7 ms ✅ |
| Text from a 1000 × 600 px area | < 300 ms | p50 187 ms ✅, p95 370 ms ❌ |
| Recording 1080p at 60 fps | < 15% CPU | 15.7% ❌ |
| App size, without model packs | < 30 MB | 37 MB (14 MB zipped) ❌ |
Model packs run in a helper process that exits when it is done, so they cost the app's own memory nothing. The full
log, with methods, dates, and caveats, is in Docs/perf.md; measure your own Mac with
Scripts/power-sample.sh and Scripts/latency.sh.
- macOS 26 or later on Apple silicon
- Xcode 26 or later, with its Metal Toolchain (the VLM pack's MLX kernels need it):
xcodebuild -downloadComponent MetalToolchain - XcodeGen:
brew install xcodegen
git clone https://github.com/MMFoundation/OhMyShot.git
cd OhMyShot
Scripts/bootstrap.sh # generate OhMyShot.xcodeproj from project.yml
Scripts/run.sh # build the Debug app ("OhMyShot Dev") and launch it
Scripts/test.sh # run both packages' unit tests (OhMyShotKit, OhMyShotVLM)build.sh and run.sh regenerate the project when project.yml changes. Debug builds use their own bundle
identifier (….ohmyshot.dev), URL scheme (ohmyshot-dev://), and default shortcuts (⌃⌥⌘ plus a digit), so they
can run next to a release build without fighting over permissions or shortcuts.
macOS ties the Screen Recording permission to the app's code signature, so an ad-hoc signed build looks like a new
app after every rebuild and loses it. To keep it, copy Config/Signing.local.xcconfig.example to
Config/Signing.local.xcconfig and fill in your Apple Development team (a free personal team works).
Tip
After you grant Screen Recording, relaunch the app: macOS applies the permission only to new processes.
Scripts/reset-tcc.sh clears the Debug build's permissions when you want to start over.
Release builds check for updates with Sparkle about once a day (Settings › General › Updates), using signed appcasts attached to this repository's GitHub releases; Debug builds never check. How releases are made, signed, and notarized is in Docs/release.md.
| Document | What it covers |
|---|---|
| Docs/automation.md | URL commands, Shortcuts, Spotlight, and the Raycast extension |
| Docs/ocr.md | How text recognition is layered, and its benchmark |
| Docs/capture-picker.md | The magnifier at the pointer while you choose an area |
| Docs/measurement-snapping.md | The pixel ruler's edge snapping |
| Docs/localization.md | Adding or improving a translation |
| Docs/perf.md | Every performance and power measurement |
| Docs/release.md | Building, signing, and notarizing a release |
| PRODUCT.md and DESIGN.md | What OhMyShot is for, and how it should look and feel |
Contributions are welcome, whether code, translations, bug reports, or measurements from a Mac other than ours.
- Report a bug or ask for a feature in Issues. Include your macOS version, your displays, and the steps that lead to the problem.
- Translate. You don't need Xcode: Docs/localization.md explains how.
- Send a pull request. Run
Scripts/test.shbefore you push, and write commit messages as Conventional Commits (feat(ocr): …,fix(studio): …). Changes that could affect idle cost or latency should come with numbers fromScripts/power-sample.shorScripts/latency.sh. Read PRODUCT.md and DESIGN.md before larger changes.
OhMyShot is built with Sparkle, KeyboardShortcuts, MLX Swift, and Swift Numerics. Their notices are in App/Acknowledgments.md.
OhMyShot is free software, licensed under the GNU General Public License v3.0. Copyright © 2026 OhMyShot contributors.