A tiny macOS menu-bar app that brings the Windows Win + Shift + S snipping
experience to the Mac. Press ⇧⌥S (Shift-Option-S) anywhere, drag to select a
region, and the snip is copied to your clipboard and saved to
~/Pictures/Snipper. A floating preview fades in at the bottom-right corner —
just like macOS's own screenshots — which you can click to open or simply ignore.
Under the hood it drives macOS's native screencapture, so the selection UI is
the familiar crosshair (drag a region, or press Space to grab a whole window).
- ⇧⌥S global shortcut — works in any app.
- Native crosshair region select, or Space to capture a whole window.
- ⇧⌥T copy text — drag over an error dialog, stack trace or log and the recognized text lands on the clipboard. No file, no preview, no editor: the fastest path from something on screen to something you can paste into a prompt. On-device via Apple's Vision framework.
- ⇧⌥D screen recording — a Snipper selection overlay (macOS won't do
interactive video selection): drag a region, or press Space and click
a window — the desktop counts, so that's full screen. The selection is
recorded as a
.movwith mouse clicks shown — and system audio, so a browser video records with its sound (toggle: Record System Audio; DRM players like Netflix black out their pixels for every screen recorder — OS enforcement). Press ⇧⌥D again to stop; the menu-bar icon is a red stop button while recording. - Trim editor — click a recording's preview to open a player with QuickTime's native trim handles; a confirmed trim is exported losslessly and saved over the file.
- Auto-delete after 30 days — snips and recordings are treated as
temporary and moved to the Trash automatically at launch, on wake, and
twice a day (only Snipper's own files; configurable via
defaults write com.version2.snipper retentionDays -int <days>). - Copies to the clipboard and saves a timestamped PNG — or either on its own.
- Floating bottom-right preview: click to mark up, hover to keep, ✕ to dismiss.
- Markup editor — click the preview (or its pencil) to draw rectangles, ellipses, freehand, arrows, blur out sensitive areas, and drop numbered step badges (1, 2, 3… — perfect for "click here, then here" bug reports and AI prompts); then Copy the annotated image or Save over the PNG. Undo/redo with ⌘Z / ⇧⌘Z. Exports keep the snip's own color space, so an annotated capture matches the original.
- Copy Text (OCR) — one click in the editor extracts the snip's text (error dialogs, stack traces, logs) to the clipboard via Apple's Vision framework, fully on-device. Paste text into an AI prompt instead of pixels.
- Drag the preview anywhere — the floating thumbnail is a drag source, so you can drop the snip straight into a chat input, terminal, or Finder.
- Copy Path in the editor puts the PNG's file path on the clipboard, for
look at <path>-style CLI prompts. - Silent capture — no shutter sound.
- Menu-bar only: no Dock icon, no window clutter.
- Optional launch at login.
- macOS 13 (Ventura) or later.
- Xcode Command Line Tools with a Swift 5.9+ toolchain
(
xcode-select --install) — full Xcode not needed.
Grab the latest zip from
Releases, unzip, and move
Snipper.app to /Applications. These builds are ad-hoc signed (no Apple
Developer ID, not notarized), so macOS Gatekeeper warns on first launch — either
right-click Snipper.app → Open → Open, or run:
xattr -dr com.apple.quarantine /Applications/Snipper.appgit clone https://github.com/v2matosevic/Snipper.git
cd Snipper
./trust-cert.sh # one-time, recommended — stable signing (see below)
./build.sh
open Snipper.appBuilding from source keeps the app stably signed (no Gatekeeper warning) and is the
better path if you'll tweak it. To keep it around, drag Snipper.app into
/Applications and turn on Launch at Login from its menu.
./trust-cert.shscreencapture needs macOS Screen Recording permission, and macOS ties that
grant to the app's code signature. An ad-hoc signature changes on every build, so
the grant would be lost each time you rebuild. trust-cert.sh creates and trusts a
self-signed code-signing identity in its own throwaway keychain (your login
keychain is untouched; macOS asks for your password once). After that, build.sh
signs with it and the permission persists across rebuilds. Skip it and the build
still works ad-hoc — you'll just have to re-grant Screen Recording after each build.
The Screen Recording list has no manual "+" — an app only appears there once it actually captures. So:
- Press ⇧⌥S and drag a selection. macOS registers Snipper and prompts.
- Enable Snipper in System Settings → Privacy & Security → Screen Recording.
- Quit & reopen Snipper (a running process can't see a fresh grant). Done.
The first ⇧⌥D recording with Record System Audio on may show one more one-time consent (system audio recording) — approve it once and you're set.
- ⇧⌥S — capture a selection. Drag a box, or press Space then click a window. Esc cancels.
- ⇧⌥D — record a selection. Drag a box, or press Space then click a window (clicking the desktop records the full screen); Esc cancels. Recording starts right after the selection; ⇧⌥D (or the menu item) stops it. The preview's click opens the trim editor.
- ⇧⌥T — copy the text out of a selection. Same crosshair; the recognized text goes straight to the clipboard and nothing is saved. The menu-bar icon reports the result for a moment.
- The bottom-right preview: click to open the snip in the markup editor, hover to keep it on screen, ✕ to dismiss. It auto-dismisses after about 5 seconds.
- Menu-bar icon → pick a destination: Clipboard + Folder (default), Clipboard only, or Folder only.
- Open Save Folder reveals
~/Pictures/Snipper. - Launch at Login keeps Snipper running across reboots.
There's no preferences UI yet — rebinding means editing the constants at the top
of Sources/Snipper/AppDelegate.swift and running ./build.sh again:
private let keyCode = UInt32(kVK_ANSI_S) // snip — any kVK_ANSI_* key code
private let recordKeyCode = UInt32(kVK_ANSI_D) // record
private let textKeyCode = UInt32(kVK_ANSI_T) // copy text
private let modifiers = UInt32(shiftKey | optionKey) // Carbon modifier flags (all three)If a combo is already claimed by another app, registration fails silently apart
from a line in Console.app — check there if a shortcut does nothing.
| Symptom | Cause and fix |
|---|---|
| A shortcut does nothing | Another app holds the combo. Carbon registration fails silently apart from a line in Console.app — filter on Snipper and look for "failed to register", then rebind (above). |
| Captures come out black, or nothing is saved | Screen Recording isn't granted, or was granted while the app was running. Enable Snipper under System Settings → Privacy & Security → Screen Recording, then quit and reopen it. |
| Permission is asked for again after every rebuild | You're building without the stable signing identity. Run ./trust-cert.sh once, then ./build.sh. |
| Recorded video from Netflix and friends is black | DRM. Those players black out their pixels for every screen recorder — the OS enforces it, no app can capture them. |
| System audio isn't recorded | Check Record System Audio in the menu, and approve the one-time macOS audio-recording prompt on first use. |
| Old snips are disappearing | Working as intended: captures older than 30 days go to the Trash. defaults write com.version2.snipper retentionDays -int 90 to keep them longer, or -int 0 to disable the sweep. |
| ⇧⌥T finds no text | Vision OCR needs legible, roughly upright text. Very small or low-contrast text often fails — grab a larger region, or zoom in first. |
| File | Role |
|---|---|
HotKey.swift |
System-wide hotkeys (⇧⌥S / ⇧⌥D / ⇧⌥T) via Carbon RegisterEventHotKey — no Accessibility permission required. |
ScreenshotService.swift |
Runs screencapture -i -o -x (silent) to a temp file, then routes it to the clipboard and/or ~/Pictures/Snipper. Also drives the ⇧⌥T text grab. |
CaptureFile.swift |
Timestamped, collision-proof naming and the save-or-fail move shared by snips and recordings. |
TextRecognizer.swift |
On-device OCR (Vision) plus the PNG-first clipboard write shared by every copy path. |
SelectionOverlay.swift |
The recording selector — drag a region or Space-click a window; macOS refuses -v with -i, so this stands in for the native crosshair. |
RecordingService.swift |
Runs screencapture -v -k -R <rect> on the selected rect; SIGINT stops and finalizes the movie. |
TrimEditor.swift |
Post-recording player with QuickTime's native trim UI; lossless passthrough export over the original file. |
RetentionService.swift |
Auto-deletes Snipper's own captures older than 30 days (launch + twice daily). |
ThumbnailController.swift |
The bottom-right floating preview — a borderless NSPanel that fades in, auto-dismisses, and opens the capture on click. |
AppDelegate.swift |
Menu-bar item, destination toggles, both hotkeys, launch at login. |
Snipper captures through the screencapture tool rather than in-process, so it has
no preflight permission gate — performing a capture is what registers it with macOS
and triggers the Screen Recording prompt.
Issues and pull requests are welcome. CONTRIBUTING.md covers the build, the project layout, the conventions the code leans on, and a list of things worth picking up if you're looking for somewhere to start.
MIT — see LICENSE.
Built by Version2.