Pawshot is a native macOS screenshot utility written in pure AppKit — a background app with no Dock icon that lives in the menu bar and waits for a hotkey. Hit ⌘⇧2, drag a region, and the shot lands in a preview window, ready to be annotated, copied, and pasted wherever you need it.
One line: a screenshot tool that lets you capture, edit and paste in seconds — without paying a subscription for the privilege.
Capture with ⌘⇧2, blur what shouldn't be public, scribble on the rest, hit ⌘C — the window is gone
and the image is on your clipboard. Full-resolution recording: docs/demo.mp4.
I'm genuinely fed up with the fact that Apple, over the last six or seven years, still hasn't managed to ship a decent screenshot tool — one where a single hotkey drops you straight into editing the damn screenshot, and ⌘C / ⌘V just work so you can paste it wherever you actually need it. That's the whole reason this project was born. I also tried the alternatives — Shottr, CleanShot X and friends — and not one of them fully did the job for me; the ones that came close were paid. Come on. People are expected to pay five, ten, twenty dollars for this? When you can just build a tool that is simply convenient and be done with it. So that's what Pawshot is: the tool I wanted, and it's honestly comfortable to use. If you want in — jump on board, let's build the best screenshot tool out there together. I'd only be happy about it. Thanks for your attention.
Capture
- Global ⇧⌘2 hotkey — screen dims, cursor turns into a crosshair.
- A live HUD follows the cursor with the current origin and size.
- Drag out a region, release, and the capture opens straight in the editor.
- Space switches to window mode, the way ⇧⌘4 does in the system tool: the cursor becomes a camera, the window under it lights up, one click takes it whole. Space again goes back.
- ⇧⌘1 grabs the whole screen straight into the editor — no overlay, no selection.
Escor right click cancels the selection.- Missed by a few pixels? Drag the editor window by its edge — the shot grows into the
neighbouring pixels of the screen, or crops when you drag inwards. Nothing is captured a second
time: the whole display is frozen the moment you hit the hotkey and stays in memory while the
window is open, so the extra strip is from that same instant.
⌘Zundoes a whole drag.
Editor — every tool has a single-key shortcut, because reaching for the toolbar with a mouse is exactly what makes the built-in Markup tedious.
| Key | Tool | Key | Action |
|---|---|---|---|
V |
select and move | ⌘Z / ⌘⇧Z |
undo / redo |
A |
arrow | ⌫ |
delete selection |
R |
rectangle | [ / ] |
thinner / thicker |
D |
pencil | 1…6 |
colour (6th toggles black/white) |
T |
text | F |
toggle fill |
B |
blur | C |
wipe every annotation |
N |
step counter | drag a window edge | grow or crop the shot |
Annotations are objects, not pixels: drag a selected one by anywhere inside its frame, recolour it after the fact, delete a single one — all of it undoable. Pressing a tool key drops the selection so you can draw on top of what you just drew.
Export
⌘C— the flattened image goes to the clipboard and the window closes instantly.⌘S— PNG on the Desktop, namedpawshot-<date>-<time>-<uuid tail>.png, window closes too.- Both export at the full pixel resolution of the capture, Retina included.
Escclears the selection first, closes the window second — the app stays in the menu bar.
The app itself
- Runs as a background agent (
LSUIElement): a menu bar icon, no Dock icon, no ⌘Tab entry. - Settings (
⌘,or the menu bar): both shortcuts are yours to change — click the field, press the keys. Launch at login lives there too. - macOS keeps ⇧⌘3…⇧⌘6 for its own screenshots, so a shortcut set to one of those never reaches Pawshot. Settings says so and offers a button straight to Keyboard Shortcuts.
- Menu bar menu: capture a region or the full screen, open the hint window, settings, toggle launch at login, quit.
- Launch at login goes through
SMAppService; the toggle stays disabled until the app lives in/Applications, because macOS pins the exact bundle path and would otherwise keep starting a stale copy from your build folder. - About panel carries the version, build number and a link back here.
- Closing a window never quits the app — it keeps waiting for the hotkey.
Requirements: macOS 15+, Xcode 26+, and mise — it pulls the pinned
Tuist and SwiftFormat from mise.toml, so you don't install those by hand.
git clone https://github.com/CaramelHeaven/Pawshot.git
cd Pawshot
make install
That builds a Release copy, drops it into /Applications and launches it. From there Pawshot shows
up in Spotlight like any other app, and lives in the menu bar — there is no Dock icon by design.
Two system prompts on first use, both expected:
- Screen Recording — asked on the first ⌘⇧2. Without it macOS hands out an empty screen and nothing can be captured.
- Desktop folder access — asked on the first ⌘S, since that's where the PNG goes.
Want it running after every reboot? Menu bar icon → Launch at Login.
The item is only available once the app sits in /Applications: macOS remembers the exact bundle
path, so enabling it from a build folder would keep launching that stale copy. You can verify and
revoke it any time in System Settings → General → Login Items.
Remove it with make uninstall.
Shipping a double-clickable download means an Apple Developer ID certificate and notarisation,
which cost $99/year — this project has neither yet. And since September 2026 Homebrew drops
casks that aren't signed and notarised, and removes the --no-quarantine escape hatch, so a cask
pointing at an unsigned build would be dead on arrival.
Building locally sidesteps all of it: software you compile yourself never gets the quarantine
flag, so Gatekeeper simply doesn't get involved. make install isn't a workaround — it's the
clean path.
Pawshot is generated by Tuist — Project.swift is the source of truth, the
.xcodeproj is a build artifact. make is the entry point for everything:
make # list every target
make generate # generate the Xcode project without opening it
make build # debug build
make test # run PawshotTests
make lint # SwiftFormat check, changes nothing
make format # apply SwiftFormat
make icon # redraw the app icon from Tools/GenerateAppIcon.swift
make run # build and launch the debug copy
make install # Release build → /Applications
make uninstall # remove it from /Applications
make clean # wipe build artifacts and the generated project
A few things worth knowing before you send a patch:
- The app icon is drawn in code, not stored as a design file —
Tools/GenerateAppIcon.swift, regenerate withmake icon. Edit the geometry there, not the PNGs. - Formatting is not a matter of taste here: SwiftFormat runs as a build phase, and
make linthas to be clean. - Coordinate math lives in dedicated pure functions (
SelectionGeometry,CanvasInteraction) and is covered by tests. Flipping between AppKit's bottom-left origin and CoreGraphics' top-left one is where the nastiest bugs in this codebase came from — screenshots of the wrong, mirror-image region that build perfectly fine.
Honest list, so nobody opens an issue for something already known:
- No resize handles — a drawn shape can be moved, not stretched.
- No drag-and-drop of the result out of the window.
- Only region capture: no full-screen, window, delayed or scrolling capture yet.
- No signed and notarised build, therefore no
.dmgand no Homebrew cask (see above). - No auto-update: to get a new version you pull and run
make installagain.
Issues and pull requests are welcome. The project is macOS-only, AppKit-only (no SwiftUI), and the
house rules live in AGENTS.md — read them before sending a patch.
