Skip to content

Repository files navigation

Pawshot

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.

Demo

Pawshot: capture a region, blur something, scribble on it, copy

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.

Why this exists

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.

What works today

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.
  • Esc or 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. ⌘Z undoes 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 16 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, named pawshot-<date>-<time>-<uuid tail>.png, window closes too.
  • Both export at the full pixel resolution of the capture, Retina included.
  • Esc clears 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.

Install

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.

Why there's no .dmg or brew install --cask

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.

Building

Pawshot is generated by TuistProject.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 with make icon. Edit the geometry there, not the PNGs.
  • Formatting is not a matter of taste here: SwiftFormat runs as a build phase, and make lint has 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.

Not there yet

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 .dmg and no Homebrew cask (see above).
  • No auto-update: to get a new version you pull and run make install again.

Contributing

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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages