Menu-bar screenshot tool for macOS: capture, annotate, copy/save.
| Language | File |
|---|---|
| English | docs/README.en.md |
| Tiếng Việt | docs/README.vi.md |
| 简体中文 | docs/README.zh-CN.md |
| 日本語 | docs/README.ja.md |
| Area | What you get |
|---|---|
| Capture | Region, fullscreen, active window, last region, scrolling stitch |
| Editor | Arrow, text, steps, rect, freehand, crop, pixelate blur, undo/redo |
| Export | Clipboard (⌃C / ⌘C), save PNG/JPEG, file path on pasteboard, pin-to-screen |
| OCR | Vision text recognition (EN / VI / JP), history search by OCR |
| Workflow | After-capture Show / Copy / Save, Esc actions, recordable global hotkeys |
| i18n | English + Tiếng Việt UI strings |
Bundle ID: com.ctdoshot.app · Menu-bar app (LSUIElement)
Add product shots under
docs/images/when available.
| Capture overlay | Editor | Preferences |
|---|---|---|
| Coming soon | Coming soon | Coming soon |
- macOS 13 or later
- Screen Recording permission (System Settings → Privacy & Security)
- Xcode 15+ (or full Xcode app) to build and run tests
- Swift 5.9+
swift buildmay work with Command Line Tools alone.swift testrequires full Xcode (xcode-selectmust point at an Xcode.app).
sudo xcode-select -s /Applications/Xcode.app/Contents/Developergit clone https://github.com/TIPC1110/ctdoshot.git
cd ctdoshot
# Once per machine: stable code-signing cert (keeps Screen Recording across rebuilds)
./scripts/ensure-signing-identity.sh
# Release .app
./scripts/package-app.sh
open build/ctdoshot.app
# Optional: install to /Applications so the path never changes
# CTDOSHOT_INSTALL=1 ./scripts/package-app.sh && open -a ctdoshot- Open System Settings → Privacy & Security → Screen Recording
- Enable ctdoshot
- Quit fully (⌘Q) and open the same
.appagain
Always use the packaged .app (or /Applications/ctdoshot.app).
swift run / raw .build/ binaries are different identities and re-prompt.
Why rebuild used to re-ask: ad-hoc signing (codesign -s -) changes the binary hash every build, so macOS treats each package as a new app.
ensure-signing-identity.sh creates a named cert (ctdoshot Developer); package-app.sh signs with it so TCC can stick.
If permission is still sticky after switching from ad-hoc → cert:
tccutil reset ScreenCapture com.ctdoshot.app
./scripts/package-app.sh
open build/ctdoshot.app
# grant once, quit, reopenctdoshot lives in the menu bar (camera / viewfinder icon).
| Action | Default hotkey |
|---|---|
| Capture area | ⇧⌘S |
| Capture screen | ⇧⌘3 |
| Capture active window | ⇧⌘W |
| Capture last region | ⇧⌘L |
| Scrolling capture | ⌥⇧⌘X |
| OCR quick (region → clipboard text) | ⌃⌥⌘O |
| History | ⇧⌘H |
Hotkeys are rebindable in Preferences → Hotkeys (click a row, press a new chord).
After capture (when “Show” is enabled):
- Draw: arrow, rectangle, pencil, step numbers, text
- Crop and blur / mosaic (pixelate)
- ⌃C / ⌘C — copy annotated image (editor stays open)
- ⌘S / Save & Copy — save file (+ path on clipboard when copy is on)
- ⌘Z / ⇧⌘Z — undo / redo
- Esc — optional copy/save then close (Preferences → Advanced)
- Language (System / English / Tiếng Việt)
- Save folder, format (PNG / Auto JPEG), downscale Retina
- After screenshot: Show / Copy / Save
- OCR language, strip line breaks
- Launch at login
- Global hotkey recorder
Sources/
ctdoshotApp/ # @main entry
ctdoshotCore/ # App logic (capture, editor, OCR, hotkeys, UI)
Tests/ctdoshotTests/ # XCTest
packaging/ # Info.plist, entitlements
scripts/package-app.sh # release .app + ad-hoc codesign
swift build # debug
swift build -c release # release binary → .build/release/ctdoshot
./scripts/package-app.sh # → build/ctdoshot.app (native architecture)
# Build Universal Binary (arm64 + x86_64) without Xcode GUI:
./scripts/package-app.sh --universal
# Cross-compile for Mac Intel (x86_64) directly from Apple Silicon Terminal:
./scripts/package-app.sh --intelswift test
# or explicitly:
DEVELOPER_DIR="$(xcode-select -p)" swift test- Capture: ScreenCaptureKit (in-process; no
screencaptureCLI) + region overlay - Annotation: vector tools, image-space coordinates, CG bake on export
- OCR: Vision
VNRecognizeTextRequest - Hotkeys: Carbon
RegisterEventHotKey+HotkeyStorepersistence
Planned / partial (see design docs):
- Richer scrolling stitch reliability
- Window capture background styles (wallpaper / shadow trim)
- Video / GIF recording
- Upload destinations (optional plugins)
- Notarized release builds
Contributions welcome — open an issue first for large features.
- Fork the repo and create a branch (
feature/…orfix/…) - Keep changes focused; run
swift testbefore pushing - Prefer packaged-app testing for anything involving Screen Recording
- Open a Pull Request against
mainwith a clear description
Bug reports: include macOS version, how you launched the app (.app vs swift run), and whether Screen Recording is enabled for ctdoshot.
ctdoshot runs locally. Screenshots and OCR stay on your Mac unless you copy, save, or share them yourself. Screen Recording is used only to capture displays/windows you request.
- Built for everyday capture workflows on macOS
MIT © ctdoteam
Copyright (c) ctdoteam
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
- Repository: https://github.com/TIPC1110/ctdoshot
- Issues: https://github.com/TIPC1110/ctdoshot/issues
- Team: ctdoteam
ctdoshot by ctdoteam
Hoang Sa and Truong Sa are Vietnamese territories.