✂ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
███████╗███╗ ██╗██╗██████╗ ███████╗███╗ ██╗ █████╗ ██████╗
██╔════╝████╗ ██║██║██╔══██╗██╔════╝████╗ ██║██╔══██╗██╔══██╗
███████╗██╔██╗ ██║██║██████╔╝███████╗██╔██╗ ██║███████║██████╔╝
╚════██║██║╚██╗██║██║██╔═══╝ ╚════██║██║╚██╗██║██╔══██║██╔═══╝
███████║██║ ╚████║██║██║ ███████║██║ ╚████║██║ ██║██║
╚══════╝╚═╝ ╚═══╝╚═╝╚═╝ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝
Screen capture that stays out of your way.
Native macOS. No subscriptions. No bloat.
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ✂
A screen capture and annotation tool for macOS that actually stays out of your way. Built entirely in Swift, it lives in your menu bar and gives you professional-grade capture and editing tools without the subscription tax.
Because it's free and native.
What makes it different:
- Native: Built with AppKit and ScreenCaptureKit.
- Smart capture workflow: Your screenshots land in a persistent strip that hugs the edge of your screen. One click to edit, drag to rearrange, or present them in sequence. No hunting through Finder.
- Baked-in overlays: Recording a demo? SnipSnap can burn click animations and keystroke HUDs directly into your video as you record. No post-processing needed.
- OCR that works offline: Screenshots get indexed automatically. Search for text in any capture without sending your data to someone's cloud.
- Free. No trials, no paywalls, no "upgrade to unlock." ... just free.
- Region, window, or full screen — Pick what you want to capture with familiar macOS selection tools
- Click and keystroke overlays — Visualize interactions as colored rings and floating keystroke bubbles
- Audio capture — System audio, microphone, or both
- GIF export — Convert recordings to GIFs without FFmpeg nonsense
- Video trimming — Cut the beginning or end right from the strip context menu
- Instant capture — ⌘⇧4 for region, ⌘⇧5 for window (customizable)
- Delayed capture — 3, 5, or 10 second countdown for context menus and hover states
- Window detection — Automatically finds and highlights windows as you hover
- Shapes & arrows — Rectangles, lines, arrows with adjustable thickness and colors
- Text & callouts — Add labels with speech bubbles that actually look good
- Numbered steps — Auto-incrementing step markers for tutorials
- Blur & pixelate — Hide sensitive info with gaussian blur or mosaic
- Spotlight — Dim everything except what matters
- Freehand marker — Sketch with your trackpad (surprisingly usable)
- Measurement tool — Pixel-perfect dimensions between elements, with edge snapping
- Device frames — Wrap screenshots in MacBook, iPhone, or iPad mockups
- Custom backgrounds — Solid colors or gradients instead of boring transparency
- Emoji stamps — Sometimes ✨ says it better than words
- Dockable strip — Thumbnails snap to any screen edge (top/bottom/left/right)
- Session management — Captures are grouped by session; clear them or keep them forever
- OCR indexing — Full-text search across all your screenshots (runs locally, not in the cloud)
- iCloud sync — Mirror captures to iCloud Drive as a backup (optional)
- Presentation mode — Full-screen slideshow through your captures with arrow keys
- Smart redaction — Automatically detects 10+ types of PII (emails, phone numbers, SSNs, credit cards with Luhn validation, API keys, AWS keys, IP addresses, street addresses, dates of birth, account numbers, private keys) and suggests blur overlays. You can accept/dismiss individual suggestions or batch process. See PII_REDACTION.md for details.
- Annotation templates — Save frequently-used shapes/text as reusable templates
- Metadata preservation — Keeps creation dates, OCR data, and edit history
curl -fsSL https://raw.githubusercontent.com/portablesheep/snipsnap/master/scripts/install.sh | bashThis downloads the latest release and drops it in your Applications folder.
Download the latest .dmg or .zip from the Releases page, drag to Applications, and launch.
SnipSnap is signed and notarized by Apple, so it launches without Gatekeeper warnings.
macOS will ask for two permissions:
- Screen Recording — Required for captures
- Accessibility — Needed for global hotkeys and overlay event capture
Grant both and you're set. The app lives in your menu bar as a scissors icon.
- Hit ⌘⇧4 to grab a region or ⌘⇧5 for a window
- Your capture appears in the strip (⌘⇧S to show/hide)
- Click a thumbnail to open the editor
- Annotate, export, or just leave it there for later
- Click the menu bar icon → Start Recording, or press ⌘⇧6
- Choose full screen, region, or specific window
- Enable click/keystroke overlays if you want them
- Do your thing
- ⌘⇧6 again to stop
- Video lands in the strip, ready to trim or export as GIF
| Action | Default Shortcut |
|---|---|
| Start/stop recording | ⌘⇧6 |
| Capture region | ⌘⇧4 |
| Capture window | ⌘⇧5 |
| Show/hide strip | ⌘⇧S |
| Present session | ⌘⇧P |
You'll need:
- Xcode 15+ (macOS 13 SDK)
- XcodeGen
brew install xcodegen
git clone https://github.com/portablesheep/snipsnap.git
cd snipsnap
xcodegen generate
open SnipSnap.xcodeprojHit ⌘R to build and run.
macOS ties Screen Recording permission to your app's code signature. If you use ad-hoc signing (the default for local builds), the permission resets every time you rebuild. Annoying.
Fix: Create a self-signed certificate once:
- Open Keychain Access → Certificate Assistant → Create a Certificate
- Name:
SnipSnap Local Dev - Type: Self Signed Root
- Certificate Type: Code Signing
- Double-click the cert → Trust → Always Trust
- Regenerate the Xcode project:
xcodegen generate
The project's project.yml already expects this certificate name. Change SNIPSNAP_CODE_SIGN_IDENTITY if you used something else.
Now rebuilds won't wipe your Screen Recording permission.
./scripts/build-and-install.sh --release --launchThis builds, installs to ~/Applications, and launches the app. Use --release to avoid debug dylib signing issues with self-signed certs.
SnipSnap uses a hub-and-spoke design with AppDelegate coordinating everything. The interesting bit is the XPC service isolation:
Recording runs in a separate XPC service (CaptureServiceXPC) instead of the main app. Why?
- Stable code signature — The XPC service binary doesn't change between builds, so its Screen Recording permission persists
- Privilege separation — The main app handles UI and hotkeys; the XPC service owns ScreenCaptureKit
- Clean process isolation — If the main app crashes, recordings continue; if recording crashes, the main app stays alive
Event forwarding is clever: the main app (which has Accessibility permission) captures clicks and keystrokes, then sends them to the XPC service every 33ms to bake into the video overlay. Bidirectional XPC with callbacks.
Sources/
App/ Main app, menu bar, coordination
Editor/ Annotation canvas and tools
Strip/ Thumbnail strip window
Recording/ ScreenCaptureKit wrapper
Pro/ GIF export, OCR, cloud sync
Hotkeys/ Global hotkey registration
Preferences/ Settings UI
Permissions/ Permission checks and prompts
CaptureServiceXPC/ Isolated capture service
- Combine-based:
@Publishedproperties with UserDefaults persistence - Actor isolation: Everything UI touches is
@MainActor - Async/await: XPC callbacks bridged via
withCheckedThrowingContinuation
Captures live in ~/Library/Application Support/SnipSnap/captures/ with sidecar JSON for metadata (OCR text, redaction hints, etc).
- Swift 5 — Pure Swift, no Objective-C bridging
- AppKit — Native UI, no SwiftUI for windows (SwiftUI for views only)
- ScreenCaptureKit — Modern capture API (macOS 13+)
- AVFoundation — Video encoding/decoding
- Vision — OCR text recognition
- CoreGraphics — Low-level canvas rendering
- Sparkle 2 — Secure auto-updates with EdDSA signature verification
XcodeGen generates the Xcode project from project.yml so it's not checked into Git.
SnipSnap is completely free. No trials, no feature limits, no nag screens.
If you find it useful and want to support development:
- One-time: Stripe payment
- Monthly: GitHub Sponsors
Pull requests are welcome. For major changes, open an issue first so we can discuss what you're trying to do.
If you're fixing a bug:
- Fork and create a branch
- Make your change with a clear commit message
- Add a test if applicable (we don't have many, but we should)
- Open a PR
If you're adding a feature:
- Open an issue first to discuss scope
- Same process as above
Things I'm considering (no promises):
- Multi-monitor recording with separate audio sources
- Annotation presets (save colors/thickness as named styles)
- Pasteboard monitoring (auto-capture screenshots from other apps)
- Scripting support (AppleScript/JavaScript for Automation)
- Video annotation (draw on videos, not just images)
Got ideas? Open an issue.
MIT. See LICENSE for details.
Built by PortableSheep.
Inspired by CleanShot, Skitch, and Droplr—but cheaper and less annoying.
Q: Does this work on macOS Monterey or earlier?
A: No. SnipSnap requires macOS 13 (Ventura) for ScreenCaptureKit.
Q: Why not just use the built-in screenshot tool?
A: You should! It's great for basic captures. SnipSnap is for people who need annotations, session management, and recording features.
Q: Can I use this commercially?
A: Yes. MIT license means do whatever you want, including commercial use.
Q: Does SnipSnap send my screenshots anywhere?
A: Nope. OCR runs locally via the Vision framework. Cloud sync is optional and just mirrors to your own iCloud Drive.
Q: Why did you make this?
A: I was paying for CleanShot but only used 20% of its features. Built SnipSnap to have exactly what I wanted, nothing more. Then figured others might want it too.
Q: Can I disable the strip?
A: Yes, but why would you? It's the best part. (⌘⇧S to toggle visibility)
Q: Will you add Windows/Linux support?
A: No. This is intentionally macOS-only to stay native and fast.