Skip to content

Repository files navigation

Snipper

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).

Features

  • ⇧⌥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 .mov with 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.

Requirements

  • macOS 13 (Ventura) or later.
  • Xcode Command Line Tools with a Swift 5.9+ toolchain (xcode-select --install) — full Xcode not needed.

Install

Download a build

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.app

Build from source

git clone https://github.com/v2matosevic/Snipper.git
cd Snipper
./trust-cert.sh   # one-time, recommended — stable signing (see below)
./build.sh
open Snipper.app

Building 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.

Stable signing — run once (recommended)

./trust-cert.sh

screencapture 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.

First run — grant Screen Recording

The Screen Recording list has no manual "+" — an app only appears there once it actually captures. So:

  1. Press ⇧⌥S and drag a selection. macOS registers Snipper and prompts.
  2. Enable Snipper in System Settings → Privacy & Security → Screen Recording.
  3. 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.

Usage

  • ⇧⌥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.

Rebind the shortcuts

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.

Troubleshooting

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.

How it works

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.

Contributing

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.

License

MIT — see LICENSE.


Built by Version2.

About

macOS menu-bar app for Windows-style ⇧⌥S region screenshots — copies to clipboard, saves a PNG, and shows a native corner preview.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages