Shotate documentation
Shotate documentation
Install Shotate on macOS, Windows or Linux, capture and annotate screenshots, configure shortcuts and the config file, automate it with URLs or command-line flags, and set up permissions.
Install
macOS
Requires macOS 13 Ventura or later on Apple silicon or Intel. In Terminal:
curl -fsSL https://raw.githubusercontent.com/baney75/shotate/main/install.sh | bashThe installer builds Shotate from source with Apple's free command line tools and copies it to ~/Applications. If the tools are missing, macOS opens a dialog to install them; run the command again when it finishes. Because it is built on your Mac, there is no "unidentified developer" warning. A welcome window then asks for Screen Recording, the only permission Shotate needs on a Mac.
Stable releases are macOS only for now, because the Mac app is the one each release is tested on. Windows and Linux get preview builds: the nightly, made every day from the newest code. They have the same tools and update themselves the same way, but may have rough edges.
Windows (preview)
Requires Windows 10 or 11 on x64. In PowerShell:
irm https://raw.githubusercontent.com/baney75/shotate/main/install.ps1 | iexIt installs for your account only, with no administrator prompt. You can also run the _x64-setup.exe from the nightly release. Shotate is not code-signed on Windows yet, so SmartScreen may ask you to confirm the first time.
Linux (preview)
Works on x64 and arm64, under X11 or Wayland:
curl -fsSL https://raw.githubusercontent.com/baney75/shotate/main/install.sh | bashThe same command installs the .deb on Debian and Ubuntu, the .rpm on Fedora and openSUSE, and the AppImage anywhere else. The packages are also on the nightly release.
On Wayland, the desktop keeps global shortcuts to itself. Add a shortcut in your desktop's keyboard settings that runs:
shotate --captureUpdate
Shotate checks GitHub once a day. When an update is ready, Update to Shotate x.y.z… appears at the top of its menu; click it and Shotate installs the update and restarts. Check for Updates… in the same menu checks right away. Your settings, shortcuts and permissions stay as they are.
On a Mac, pick a channel in Settings › General › Updates (Windows and Linux follow Nightly):
- Stable (the default): tested releases.
- Nightly: built every day from the newest code. It gets fixes first and may have rough edges. Switch back to Stable any time.
On a Mac the update is built on your Mac from the release's source, the same way the install command works, so macOS keeps the Screen Recording permission. On Windows and Linux the installer is checked against its SHA-256 before it runs. The check downloads one small file from GitHub and sends nothing about you. Turn off Check for updates automatically, or set "checkForUpdates": false in the config file, and Shotate makes no network request at all.
To install or update from a terminal instead, run the install command again. On a Mac, add -s -- --nightly after bash for the nightly channel.
Take your first capture
- Press Shift-Command-S on a Mac, or Ctrl+Shift+S on Windows and Linux.
- Drag over the area you want. Press Space to pick a whole window instead.
- Add marks with the toolbar or the keys below.
- Press Return. The image is on your clipboard and saved to your Pictures/Screenshots folder.
Captures are saved and copied before the editor opens, so closing the editor never loses the capture.
Annotate
| Key | Tool | Notes |
|---|---|---|
| V | Select | Move a mark; drag its handles to resize. |
| A | Arrow | Shift snaps to 45°. |
| R | Box | Shift makes a square. |
| O | Ellipse | Shift makes a circle. |
| H | Highlight | Translucent fill. |
| T | Text label | Double-click a label to edit it. |
| B | Redact | A solid bar, not a reversible blur. |
| N | Numbered step | Counts up automatically. |
| C | Crop | Drag the area to keep. |
Drawing past the edge of the screenshot grows the canvas. The new space continues the screenshot's outermost row or column of pixels, and the corners take its border color.
Editing keys
On Windows and Linux, press Ctrl wherever this table says Command.
| Key | Action |
|---|---|
| Return | Copy and close |
| Esc | Back to Select, then deselect, then copy and close |
| Delete | Delete the selected mark |
| Command-D | Duplicate the selected mark |
| Arrow keys | Nudge the selection (Shift: 10 points) |
| Command-] and Command-[ | Bring to front, send to back |
| Command-Z and Shift-Command-Z | Undo and redo (Ctrl+Y also redoes on Windows and Linux) |
| 1–6, [ and ] | Color, smaller and larger |
| Shift-Command-C | Copy the file path instead of the image |
| Command-S | Save a copy elsewhere |
| Command-Delete | Move the capture to the Trash (Ctrl+Backspace on Windows and Linux) |
Right-click a mark for Delete, Duplicate, Bring to Front and Send to Back.
Configure
Every setting lives in one plain file with the same format on every platform:
| Platform | Config file |
|---|---|
| macOS and Linux | ~/.config/shotate/config.json |
| Windows | %APPDATA%\shotate\config.json |
Settings from Snapmark, the app's old name, are copied over the first time Shotate starts.
Change it in Settings…, edit the file yourself, or let a script or AI agent edit it. Shotate reloads the file as soon as it is saved. Any key you leave out keeps its default. If the JSON has an error, Shotate reports it and does not overwrite the file.
{
"saveFolder": "~/Pictures/Screenshots",
"copyOnCapture": true,
"showMenuBarIcon": true,
"updateChannel": "stable",
"checkForUpdates": true,
"shortcuts": {
"captureArea": "cmd+shift+s",
"captureWindow": "ctrl+shift+2",
"captureScreen": ""
},
"commands": { "cmd+shift+a": "open -a Terminal" },
"toolKeys": { "arrow": "a", "box": "r" }
}| Key | Type | Meaning |
|---|---|---|
saveFolder | path | Where captures are saved. ~ is expanded. Settings offers Pictures › Screenshots, Desktop, Downloads or any folder. |
copyOnCapture | boolean | Copy every capture as soon as it is taken. |
showMenuBarIcon | boolean | Show the menu bar or tray icon. Shortcuts work either way. |
shortcuts | object | captureArea, captureWindow, captureScreen. An empty string turns one off. |
commands | object | Extra global shortcuts that run a shell command. |
updateChannel | string | stable or nightly. Leave it out to follow the build you installed. |
checkForUpdates | boolean | Check GitHub for updates once a day. false means no network request at all. |
toolKeys | object | One letter per editor tool. A letter another tool already uses is ignored. |
Shortcuts are modifiers plus one key: cmd, shift, option (or alt), ctrl, and a letter, digit, space, return, tab, escape or f1 to f12. On Windows and Linux, cmd means Ctrl, so a file written on a Mac works unchanged; super (the Windows key) and a bare printscreen also work there. The default capture shortcut is Shift-Command-S on macOS and Ctrl+Shift+S elsewhere.
Automate
Windows and Linux
The actions are command-line flags. A second launch hands them to the running copy, which makes them easy to bind to keys, including on Wayland.
shotate --capture # area
shotate --capture-window
shotate --capture-screen
shotate --open ~/Desktop/shot.png
shotate --settingsmacOS
open shotate://capture
open shotate://capture/window
open shotate://capture/screen
open "shotate://open?path=$HOME/Desktop/shot.png"
open shotate://settings
open shotate://config
open shotate://reloadPermissions
Windows and Linux on X11 need no permissions.
Linux on Wayland captures through your desktop's screenshot portal, which may ask once. If your desktop has no portal backend, Shotate uses grim, gnome-screenshot or spectacle instead.
macOS needs only Screen Recording. Its global shortcuts use RegisterEventHotKey, which needs no Accessibility or Input Monitoring permission. macOS ties the permission to the app's code signature, so the installer creates a self-signed certificate in its own keychain under ~/Library/Application Support/Snapmark/Signing (the folder keeps the app's old name). The signature stays the same across updates and macOS remembers your choice. The certificate is never added to your login keychain.
If the switch in System Settings is on but captures still fail on a Mac, open the menu bar icon and choose Allow Screen Recording…, then Allow…. Shotate clears its own stale entry and asks again. Then choose Relaunch.
Uninstall
macOS and Linux:
curl -fsSL https://raw.githubusercontent.com/baney75/shotate/main/uninstall.sh | bashWindows: uninstall Shotate from Settings › Apps, or in PowerShell:
irm https://raw.githubusercontent.com/baney75/shotate/main/uninstall.ps1 | iexThis removes the app and its settings (on macOS, also its signing keychain). Your screenshots stay where they are.
Build from source
git clone https://github.com/baney75/shotate.git && cd shotatemacOS app (macos/, Swift and AppKit):
cd macos
make install # build, sign, copy to ~/Applications, launch
make test # drawing model and renderer tests
make selftest # renders every annotation onto a sample imageWindows and Linux app (desktop/, Tauri with Rust and a TypeScript canvas editor):
cd desktop
npm ci
npm test # editor model tests
cargo test --manifest-path src-tauri/Cargo.toml
npx tauri dev # run it
npx tauri build # installers in src-tauri/target/release/bundleLinux builds need the WebKitGTK and capture libraries; the exact apt-get line is in the repository's .github/workflows/ci.yml.
How it works
Both apps keep the drawing model separate from the windows, so it is unit-tested, and both draw the live editor and the exported PNG with the same renderer, so what you see is what gets copied. The two editors follow the same rules for tools, keys, Esc steps, canvas growth and tool-key resolution, and their tests check the same cases.
Screenshots stay on your computer. The only network request is the update check described in Update.
Something unclear or out of date? Open an issue on GitHub.