A fast, cross-platform screenshot, annotation, and screen-capture utility for macOS and Windows. Capture a region, a window, or a whole display; mark it up in a built-in editor; and copy it to the clipboard or save it to disk — all from a small tray app driven by global shortcuts.
Built with Tauri 2 (Rust) and Svelte 5.
- Capture modes — region select, window pick (click the window you want), full screen, pick-a-display, and a screen color picker.
- Annotation editor — arrows, shapes, freehand pen, text, highlighter, blur, crop, and cut, with undo/redo, pan, and zoom.
- Global shortcuts — trigger any capture mode from anywhere without focusing the app; shortcuts are configurable in Settings.
- Clipboard & file export — copy the result straight to the clipboard or save it, with a Recent captures list for quick re-export.
- Lives in the tray — stays out of your way and can start hidden at login.
- Native capture backends — uses the OS compositor for correct, crisp captures of GPU-composited windows on both platforms.
Download the latest installer from the Releases page:
- macOS:
ScreenPick_<version>_universal.dmg(one file, runs on Apple Silicon and Intel) - Windows:
ScreenPick_<version>_x64-setup.exe
From 26.7.6 onward the macOS build is signed with an Apple Developer ID and notarized by Apple, so there is nothing to bypass:
- Open the
.dmgand drag ScreenPick into Applications. - Double-click ScreenPick. It opens normally.
- Grant Screen Recording permission. On first capture, macOS asks for it (or open System Settings → Privacy & Security → Screen Recording and enable ScreenPick). Relaunch the app afterwards — without this permission, captures come out black.
Installing 26.7.5 or earlier? Those builds are unsigned and need a Gatekeeper bypass.
Older releases were not signed, so macOS blocks them on first launch. The app is
fine — macOS just cannot verify the publisher. After the .dmg step above:
Option A — Terminal (most reliable). Removes the download quarantine flag:
xattr -dr com.apple.quarantine /Applications/ScreenPick.app
open /Applications/ScreenPick.appOption B — no Terminal. Double-click ScreenPick. When macOS refuses, go to System Settings → Privacy & Security, scroll to the message about ScreenPick being blocked, and click Open Anyway. Confirm once more when prompted.
If you see "ScreenPick is damaged and can't be opened", the app is not actually damaged — that is the quarantine message for unsigned apps. Use Option A to clear it.
SmartScreen shows a "Windows protected your PC" dialog for unsigned apps. Click More info → Run anyway to install.
From 26.7.6 onward ScreenPick updates itself. It checks for a new version shortly after launch, and offers it in a banner with an Install and restart button. You can also check on demand from Settings → Check for updates or the tray menu.
Every update is cryptographically signed, and ScreenPick verifies that signature before installing — so an update can only come from this project. That signature is separate from Apple code signing: it protects the update payload itself, on both platforms.
- Turn it off: Settings → Check for updates at startup. Manual checks still work. The automatic check contacts GitHub, which is the only network request ScreenPick makes.
- Installed a version before 26.7.6? Those builds have no updater. Install the latest release manually once; updates are automatic after that.
- Windows portable
.exe: cannot self-update — download a new one, or use the installer. - macOS Screen Recording permission across updates: signed builds keep it. Unsigned builds did not — macOS treated every update as a different app and silently dropped the grant. Updating to 26.7.6 breaks it one last time, because the app's signing identity itself changes; from then on it survives. If captures come out black after that update, go to System Settings → Privacy & Security → Screen & System Audio Recording, remove ScreenPick from the list and add it again — the switch often still looks enabled. ScreenPick shows a banner explaining this when it detects the situation.
Prerequisites: Node.js 24+ (with npm) and the
Rust toolchain via rustup, plus your
platform's Tauri prerequisites.
npm install # install JS dependencies
npm run tauri dev # run the desktop app in dev mode
npm run tauri build # produce installers for the current platformFrontend-only and check/test commands:
npm run dev # run the frontend only in a browser at http://localhost:1420
npm run build # build the frontend bundle
npm run check # type and Svelte checks
npm run test # frontend checks, unit tests, and Rust testsSee BUILD.md for the full build, test-gate, and release procedure.
ScreenPick writes a diagnostic log (failures and key lifecycle events) to the OS log directory. Attach it when reporting a bug:
- Windows:
%LOCALAPPDATA%\com.tstone1.screenpick\logs\ - macOS:
~/Library/Logs/com.tstone1.screenpick/
If your saved preferences ever reset on their own, the log (and a startup
notification) will say why, and the previous settings file is preserved next to
the current one as capture-settings.invalid-*.json.
- Tauri 2 desktop shell (Rust,
src-tauri/). - Svelte 5 + SvelteKit + TypeScript frontend (
src/). - Vite for bundling, Vitest for frontend unit tests,
cargo testfor Rust. - Typed IPC between Rust and the frontend via
tauri-specta(Rust is the source of truth for command and event shapes).
VS Code with the Svelte, Tauri, and rust-analyzer extensions.
MIT © Timo Stein