sCapture is a macOS menu bar agent that captures a screenshot of a profiled window, at a fixed size and scale, into the active case folder, and shows the step count. It does no editing (sNotate does) and no viewing (sView does); it is the first link of that chain.
Shottr, CleanShot X and the macOS screenshot keys are fast, but they save to one folder at whatever scale the display has. Documenting a procedure step by step needs three things they do not do:
- The destination is the active case folder, switched from the menu, with the step count in the menu bar; a capture never has to be moved afterwards.
- Geometry is a profile: the window is placed at a fixed position and size and captured at a fixed scale, so every capture of a case has the same pixel size, on a Retina display or not.
- Names sort in capture order (
scap-2026-10-30-093435.png, a second capture in the same second getsb), or are final at once (poc-demo-vm-stop-07.png).
sSuite is a small family of macOS tools that turn work done on screen into step-by-step evidence and guides, one job per tool, published under the uSuite organization. The organization page explains why the family exists.
| Tool | Job |
|---|---|
| sCapture (this one) | captures a window at a fixed size and scale into the active case folder |
| sView | views images and walks case folders from the keyboard |
| sNotate | annotates a case folder as one story and exports one image per step |
| sWalk | planned: renders a notated case as an animated step-by-step clip |
| scommon | the Swift package the tools share: folders, sorting, config and keymap |
sCapture is the first link: every capture of a procedure lands in its case folder at the same pixel size, named in capture order, so sView can flip through it and sNotate can annotate it as one story without resizing or moving a file.
Requires macOS 26 or newer, on Apple silicon or Intel. Download sCapture-<version>.zip from the latest release, open it, and move sCapture.app to Applications. sCapture lives in the menu bar; choose Launch at Login in its menu to keep it running.
The release is signed ad hoc, not with a paid Apple Developer ID, so Apple has not notarised it. The first time you open a downloaded copy, macOS stops it with "Apple could not verify sCapture is free of malware". Choose Done, then allow it once, either way:
- System Settings > Privacy & Security, scroll down to Security, and next to the line saying sCapture was blocked to protect your Mac, choose Open Anyway, confirm with your password or Touch ID, then Open.
- Or in Terminal, remove the download flag macOS checks:
xattr -dr com.apple.quarantine /Applications/sCapture.app
From then on that copy opens like any app; each new version you download asks once more. A copy you build yourself never carries the download flag.
sCapture needs Screen Recording to capture (macOS asks on first launch) and Accessibility to place windows (asked the first time a profile places one; without it the window is captured where it is). Both are in System Settings > Privacy & Security; the menu has a row for each one that is missing, and Settings… shows both with a button to each pane.
macOS ties both grants to the app's signature and keeps one entry per app for each. An ad hoc signed update is a new signature, and the list can still show sCapture switched on while its entry belongs to the old version. So after every update, quit sCapture and clear both entries in Terminal:
tccutil reset ScreenCapture io.github.usuite.scapture
tccutil reset Accessibility io.github.usuite.scaptureThen open sCapture and allow both again when macOS asks, or from Settings…. Removing sCapture from the lists and adding it again in System Settings looks the same, but it does not always replace the old entry. This goes away once releases are notarised.
sCapture captures the window a profile names, when you press a capture key, and writes nothing until you do. It has no network code: nothing is collected, sent or uploaded.
~/.config/scapture/(or$XDG_CONFIG_HOME/scapture/), created on first launch:config,keymapandprofiles, plain text you can edit;state.json, the active case and profile, safe to delete;log, one line per capture.- The capture root,
~/Pictures/scaptureby default (rootinconfig): New Case… creates a folder there, and each capture is a PNG in the active case. - Screen Recording to capture and Accessibility to place windows, as above.
This release is not sandboxed yet, which is why macOS does not ask before sCapture writes these folders. The next minor version moves sCapture into the App Sandbox: it will ask once before it uses ~/Pictures/scapture or the root you choose, and its own files will live in its container, with your current ones moved there on first launch.
- Make a case: menu > New Case…, a lower-case id such as
poc-demo-vm-stop. Cases are the folders under the root (~/Pictures/scaptureby default); the menu lists them, newest first, and picks one as active. - Pick a profile in the menu, or with
ctrl-alt-1toctrl-alt-9.front-windowcaptures whatever window is in front at 2x;console-chromeplaces Chrome and leaves out its title bar, tabs and address bar. Edit Profiles… opens the Profiles window to change them or make your own. - Press
ctrl-shift-5. The window snaps to the profile's frame, the captured rect flashes, and a toast shows the thumbnail, the step number and the pixel size; click it to open the capture in sNotate or sView.ctrl-shift-rcaptures the same window again.
The menu bar shows <case> <count> <profile>. The full key list is in docs/keys.md; every capture is a line in ~/.config/scapture/log.
Settings… in the menu (cmd-,) sets the options, shows the two permissions and lists any problems in the files. Underneath, everything is plain text in ~/.config/scapture/, written with comments on first run and reloaded when it changes: config (root folder, name timestamp or case-step, auto_position, settle_ms, flash, toast), keymap (the global keys) and profiles. A profile is a block:
profile console-chrome
app com.google.Chrome
origin 200 50
size 1520 980
inset 87 1 1 1
scale 2
app is a bundle id, an app name or frontmost; window (optional) is part of the window title. origin and size place the window, in points from the top-left of the main display; without them the window is captured where and as it is. inset cuts points off the top, left, bottom and right. The output is always (size - inset) x scale pixels, here 3036 x 1784, whatever the display. Problems in any file are listed in the menu.
Edit Profiles… in the menu opens the same profiles as a list and a form. A change is written into that profile's block when you press Return or leave the field, and the rest of the file, comments included, stays as it was. To try a profile before you use it: Use Current Window takes the origin and size from where its window is now, Place moves the window there (Accessibility), and Test Capture shows what the capture key would take, at its pixel size, without saving it (Screen Recording).
make test, make app, make run, make smoke (needs Screen Recording for the built app). Swift 6.2 and macOS 26 or newer, Apple frameworks only, shared code from scommon. The design lives in docs/02-tech-stack.md, the backlog in docs/01-backlog.md, the plan in docs/03-roadmap.md and the decisions in docs/DECISIONS.md. scripts/poc.sh is the shell proof of concept the app grew from.
A copy you build has the same app id as an installed one, so the two share those permission entries and only one of them holds the grants at a time. While a copy is in Applications, System Settings gives the grants to that copy, even when the request comes from the one you built; to test a built copy with its own grants, quit the installed one, move it out of Applications, run both tccutil reset lines above, then open the built copy and allow both. make app signs with your Apple Development certificate when you have one, so rebuilding keeps the grants.
MIT, see LICENSE.
