Satty: Modern Screenshot Annotation.
Satty is a screenshot annotation tool inspired by Swappy and Flameshot.

Satty has been created to provide the following improvements over existing screenshot annotation tools:
- very simple and easy to understand toolset (like Swappy)
- fullscreen annotation mode and post shot cropping (like Flameshot)
- extremely smooth rendering thanks to HW acceleration (OpenGL)
- working on wlroots based compositors (Sway, Hyprland, River, ...)
- minimal, modern looking UI, thanks to GTK and Adwaita
- be a playground for new features (post window selection, post paint editing, ...)
Install
Thanks to our package maintainers, Satty is available for many distributions on Linux and BSD:
Specifics
| Distribution | Command | Note |
|---|---|---|
| Gentoo | emerge -av satty |
You need guru overlay (see wiki). Pending PR |
| Alpine Linux | apk add satty |
Available in Alpine Community |
Prebuilt Sources
You can download a prebuilt binary for x86-64 on the Satty Releases page.
Usage
Start by providing a filename or a screenshot via stdin and annotate using the available tools. Save to clipboard or file when finished. Tools and Interface have been kept simple.
All configuration is done either at the config file in XDG_CONFIG_DIR/.config/satty/config.toml or via the command line interface. In case both are specified, the command line options always override the configuration file.
Shortcuts
Enter: as configured (see below), default: copy-to-clipboardEsc: as configured (see below), default: exitCtrl+C: Save to clipboardCtrl+S: Save to specified output fileCtrl+Shift+S: Save using file dialogCtrl+T: Toggle toolbarsCtrl+Y: RedoCtrl+Z: Undo
Tool Selection Shortcuts (configurable)
Default single-key shortcuts:
p: Pointer toolc: Crop toolb: Brush tooli: Line toolz: Arrow toolr: Rectangle toole: Ellipse toolt: Text toolm: Numbered Marker toolu: Blur toolg: Highlight tool
Tool Modifiers and Keys
- Arrow: Hold
Shiftto make arrow snap to 15° steps - Ellipse: Hold
Altto center the ellipse around origin, holdShiftfor a circle - Highlight: Hold
Ctrlto switch between block and freehand mode (default configurable, see below), hold Shift for a square (if the default mode is block) or a straight line (if the default mode is freehand) - Line: Hold
Shiftto make line snap to 15° steps - Rectangle: Hold
Altto center the rectangle around origin, holdShiftfor a square - Text: Press
Shift+Enterto insert line break, combineCtrlwithLeftorRightfor word jump orCtrlwithBackspaceorDeletefor word delete. PressEnteror switch to another tool to accept input, pressEscapeto discard entered text.HomeandEndgo to the start/end of current line or previous/next line if already on first/last character of line (automatic wrapping is not considered for this).CtrlwithHome/Endjumps to start/end of text buffer.
Configuration File
[]
# Start Satty in fullscreen mode
= true
# Exit directly after copy/save action
= true
# Draw corners of rectangles round if the value is greater than 0 (0 disables rounded corners)
= 12
# Select the tool on startup [possible values: pointer, crop, line, arrow, rectangle, text, marker, blur, brush]
= "brush"
# Configure the command to be called on copy, for example `wl-copy`
= "wl-copy"
# Increase or decrease the size of the annotations
= 2
# Filename to use for saving action. Omit to disable saving to file. Might contain format specifiers: https://docs.rs/chrono/latest/chrono/format/strftime/index.html
= "/tmp/test-%Y-%m-%d_%H:%M:%S.png"
# After copying the screenshot, save it to a file as well
= false
# Hide toolbars by default
= false
# Experimental: whether window focus shows/hides toolbars. This does not affect initial state of toolbars, see default-hide-toolbars.
= false
# Fill shapes by default
= false
# The primary highlighter to use, the other is accessible by holding CTRL at the start of a highlight [possible values: block, freehand]
= "block"
# Disable notifications
= false
# Actions to trigger on right click (order is important)
# [possible values: save-to-clipboard, save-to-file, exit]
= []
# Actions to trigger on Enter key (order is important)
# [possible values: save-to-clipboard, save-to-file, exit]
= ["save-to-clipboard"]
# Actions to trigger on Escape key (order is important)
# [possible values: save-to-clipboard, save-to-file, exit]
= ["exit"]
# Action to perform when the Enter key is pressed [possible values: save-to-clipboard, save-to-file]
# Deprecated: use actions-on-enter instead
= "save-to-clipboard"
# Right click to copy
# Deprecated: use actions-on-right-click instead
= false
# request no window decoration. Please note that the compositor has the final say in this. At this point. requires xdg-decoration-unstable-v1.
= true
# experimental feature: adjust history size for brush input smooting (0: disabled, default: 0, try e.g. 5 or 10)
= 10
# Tool selection keyboard shortcuts
[]
= "p"
= "c"
= "b"
= "i"
= "z"
= "r"
= "e"
= "t"
= "m"
= "u"
= "g"
# Font to use for text annotations
[]
= "Roboto"
= "Regular"
# Custom colours for the colour palette
[]
# These will be shown in the toolbar for quick selection
= [
"#00ffff",
"#a52a2a",
"#dc143c",
"#ff1493",
"#ffd700",
"#008000",
]
# These will be available in the color picker as presets
# Leave empty to use GTK's default
= [
"#00ffff",
"#a52a2a",
"#dc143c",
"#ff1493",
"#ffd700",
"#008000",
]
Command Line
) ()
wlroots based compositors (Sway, Wayfire, River, ...)
You can bind a key to the following command:
grim -g "$(slurp -o -r -c '#ff0000ff')" -t ppm - | satty --filename - --fullscreen --output-filename ~/Pictures/Screenshots/satty-$(date '+%Y%m%d-%H:%M:%S').png
Hyprland users must escape the # with another #:
grim -g "$(slurp -o -r -c '##ff0000ff')" -t ppm - | satty --filename - --fullscreen --output-filename ~/Pictures/Screenshots/satty-$(date '+%Y%m%d-%H:%M:%S').png
Please note we're using ppm in both examples. Compared to png, ppm is uncompressed and this can save time.
Other examples
Image Resize
Satty does not provide a resize mechanism other than cropping. But you can pipe the result to other tools such as ImageMagick:
grim -g "0,0 3840x2160" -t ppm - | satty --filename - --output-filename - | convert -resize 50% - out.png
Sway mode
Add this to your ~/.config/sway/config.
It needs grim and slurp.
# screenshots
# inspiration: https://www.reddit.com/r/swaywm/comments/ghnlea/comment/fqnzxkx/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button
Build from source
You first need to install the native dependencies of Satty (see below) and then run:
# build release binary, located in ./target/release/satty
# optional: install to /usr/local
PREFIX=/usr/local
# optional: uninstall from /usr/local
PREFIX=/usr/local
Dependencies
Satty is based on GTK-4 and Adwaita. Dependencies, depending of each distributions are:
- glib2
- gtk4 (libgtk-4-x)
- gdk-pixbuf2
- libadwaita
- libepoxy
- fontconfig
Maintainers and Contributors
Satty wouldn't exist without the help of our contributors and maintainers. Current maintainers are @RobertMueller2 (maintainer), @fabienjuif (maintainer) and @gabm (maintainer, original author). Our contributors are:
Made with contrib.rocks.
Star History
License
The source code is released under the MPL-2.0 license.
The Font 'Roboto Regular' from Google is released under Apache-2.0 license.