# Satty: Screenshot Annotation for Sway and Hyprland

> Satty is a GTK4 screenshot annotation tool for wlroots compositors, with OpenGL rendering and a Swappy-style toolset. It installs from distro packages or cargo, and its CLI overrides the config file.

**Satty-org/Satty** — Satty - Modern Screenshot Annotation.

- Repository: https://github.com/Satty-org/Satty
- Stars: 2,424 · Forks: 103
- Language: Rust
- License: MPL-2.0
- Published: 2026-09-28 · Updated: 2026-09-28 · Language: en
- Canonical page: https://hysenlabs.com/projects/satty-org-satty

## What Satty solves, and who it is for

Satty takes a screenshot, opens it in a fullscreen annotation window, and lets you mark it up before saving to a file or the clipboard. The README places it in the lineage of Swappy and Flameshot and lists the ground it wants to cover: a simple toolset like Swappy, fullscreen annotation with post-shot cropping like Flameshot, OpenGL-accelerated rendering, and support for wlroots based compositors such as Sway, Hyprland and River.

The audience is narrow by design. If you run a wlroots compositor and your current annotation tool either renders slowly or does not run at all, Satty is aimed at you. The README also frames the project as a playground for features such as post window selection and post paint editing, which tells you the feature set is expected to move. That is a reasonable stance for a tool whose whole surface is a canvas and a toolbar, but it means the configuration format and shortcuts are worth re-reading at each release.

## How the annotation window is built

The architecture is visible in Cargo.toml. The UI is relm4 0.11 with the libadwaita and gnome_42 features, so the window is GTK4 with Adwaita styling. Rendering goes through femtovg 0.27, with glow 0.18 for OpenGL and libloading to load it. That combination is what the README means by hardware-accelerated rendering: the canvas is drawn by femtovg on top of GL rather than by GTK widgets.

Text and colour emoji come from fontconfig for font loading and the resource crate for font embedding; the image crate is pulled in with only the png and webp decoders enabled, and the comment in Cargo.toml explains why: png for colour emoji in femtovg, webp for formats gdk-pixbuf has no loader for. Input handling uses keycode, and the CLI is a separate workspace member, satty_cli, which the build script also uses to generate completions and a man page. The result is a single binary with no daemon and no server component: input arrives as a file path or on stdin, and the process exits when you save or quit.

## Installing Satty on Arch, Ubuntu, Fedora or from cargo

The README points at the repology packaging table for the full distribution list and gives two entries explicitly. On Gentoo the command needs the guru overlay, and on Alpine the package is in Community:

```bash
emerge -av satty
apk add satty
```

If your distribution is not covered, or you want a version newer than the packaged one, cargo works. The README notes that the cargo route installs no manpage, LICENSE file or .Desktop file, but that you can print them with the --man and --license arguments:

```bash
cargo install satty
satty --man
satty --license
```

Both cargo install and cargo binstall place the binary in $HOME/.cargo/bin; the README states that whether that directory is on your PATH depends on your shell, distribution and desktop environment, and that the application cannot anticipate every combination. A prebuilt x86-64 binary is also offered on the releases page.

For a first run, hand it a file and press Enter to copy the result to the clipboard, or Ctrl+S to write the output file. The README's usage line is short: provide a filename or a screenshot via stdin, annotate, then save to clipboard or file. Configuration lives in config.toml under XDG_CONFIG_DIR, and command line options always override the file when both specify the same setting.

To build and install from a checkout instead of a package, the Makefile does the work. It defaults PREFIX to /usr/local and installs the release binary, the desktop file, the icon, the shell completions and the man page:

```bash
make build-release
make install
```

The install target copies the binary into $(PREFIX)/bin, places satty.desktop under share/applications, the icon under share/icons/hicolor/scalable/apps, and the completions for bash, zsh, fish, elvish, nushell and fig into their respective share directories. The uninstall target removes the binary and the desktop entry again.

## The toolset, and where the shortcuts stop being obvious

Every tool has a default single-key binding: p for pointer, c for crop, b for brush, i for line, z for arrow, r for rectangle, e for ellipse, t for text, m for numbered marker, u for blur, x for the fringe inpaint plus pixelate tool, and g for highlight. The image tool, bound to o, is marked NEXTRELEASE in the README, as is the pointer tool's ability to select and restyle existing annotations. Colour selection uses the number row, and if you press a digit beyond the palette the README says it falls back to a custom colour.

The size field is where the design gets fiddly. The minimum is 0.1 and the maximum 99.99. The wheel and up/down keys step by 0.1, Shift switches to 0.01, Ctrl to 1.0, the middle button and page up/page down step by 1.0, and the right button jumps to the minimum or maximum. That is five modifier behaviours on one control, and it is the kind of thing that is fast once learned and opaque until then. The pointer tool adds more: Alt-click cycles overlapping annotations, Delete removes the selected one, the wheel changes the annotation's layer, and horizontal resizing on a marker changes its number while vertical resizing changes the extra ring. None of this is discoverable from the toolbar alone.

## Where Satty is the wrong choice

The README scopes the project to wlroots based compositors, naming Sway, Hyprland and River. If you are on GNOME's or KDE's Wayland session, that support is not claimed, and neither is X11. The dependency list reinforces the point: the window is GTK4 with libadwaita, so a desktop that does not ship the matching GTK and Adwaita stack is a poor fit even if the compositor problem were solved.

There is a second boundary. Satty annotates an image it is given; the README describes taking a filename or a screenshot via stdin, not capturing the screen itself. Whatever produces the pixels, whether that is grim, slurp, or a compositor's own screenshot binding, is outside the tool. If you want one program that captures and annotates in a single step, Satty will not be that program, and you will be writing the pipeline yourself.

The release notes also carry weight here. Several capabilities are tagged NEXTRELEASE in the README, including the image tool and parts of the pointer tool's resize behaviour, so anyone reading the documentation against an older package should expect the installed binary to lack them.

## How Satty differs from Flameshot and Swappy

The README names both as inspirations and states what it takes from each: the simple toolset from Swappy, fullscreen annotation with post-shot cropping from Flameshot. The difference is in the rendering path and the platform scope. Flameshot is a cross-platform capture-and-annotate application, while Satty is a single-purpose GTK4 binary that expects to be handed an image and renders its canvas through OpenGL via femtovg. Swappy is the closer comparison in shape, since it also annotates an input image, but Satty adds the fullscreen mode and cropping step and uses GTK4 with libadwaita for the interface rather than a custom toolkit.

Choosing between them is mostly a question of what your compositor already supports and how much of the capture pipeline you want to own. Satty's answer is to own as little as possible: it does not capture, it does not run in the background, and it does not ship a tray icon. That makes it easy to slot into an existing keybinding and hard to use as a standalone screenshot application.

## Licence and the cost of keeping up

Satty is licensed under MPL-2.0, stated in the workspace package metadata in Cargo.toml and shipped as LICENSE in the repository root. MPL-2.0 is a file-level copyleft licence: modifications to files already under it stay under it, while larger works that combine it with other code can be licensed differently. That matters if you are packaging or embedding the binary; it is not legal advice, and the LICENSE file is the authority.

Upgrade cost is low but not zero. The last push was on 2026-09-22, and the most recent release, v0.22.0, is dated 2026-08-03, with v0.21.1 and v0.21.0 before it in June 2026. Releases arrive every month or two, and the README marks features with version tags such as 0.20.0, 0.20.1, 0.21.0 and 0.22.0. If you rely on a NEXTRELEASE feature, you are tracking main rather than a package. The Makefile builds with cargo build --release --features ci-release and the release target wraps that, so a source build always carries the ci-release feature. Nothing in the README suggests a config migration step between releases, which is either good news or an untested assumption depending on how much you have customised config.toml.

## Conclusion

Adopt Satty if you capture screenshots on a wlroots compositor such as Sway, Hyprland or River and want to annotate them without leaving the keyboard. Do not adopt it if you are on a non-wlroots Wayland compositor, because the README states the tool works on wlroots based compositors. Before wiring it into a keybinding, verify that your distribution package exists in the repology table, or run cargo install satty and check that $HOME/.cargo/bin is on your PATH.

## FAQ

### What is Satty?

Satty is a screenshot annotation tool inspired by Swappy and Flameshot, written in Rust with a GTK4 and libadwaita interface. It renders its canvas through OpenGL using femtovg and targets wlroots based compositors such as Sway, Hyprland and River.

### What is Satty on Linux?

On Linux, Satty is a screenshot annotation application distributed by package maintainers across many distributions and BSD systems, per the README's repology table. It can also be installed with cargo install satty or cargo binstall satty, which places the binary in $HOME/.cargo/bin.

### What does the name Satty mean?

The README and the repository files do not explain the origin of the name, so there is nothing in the project material to confirm a meaning. The README only describes the tool and its lineage from Swappy and Flameshot.

### Is there an alternative to Satty for screenshot annotation?

The README names Swappy and Flameshot as the projects Satty was inspired by and improves on. Swappy supplies the simple toolset model, while Flameshot supplies fullscreen annotation with post-shot cropping, and Satty adds OpenGL rendering and wlroots compositor support.

## Sources

- [Issues](https://github.com/Satty-org/Satty/issues)
- [License: MPL-2.0](https://github.com/Satty-org/Satty/blob/main/LICENSE)
- [README](https://github.com/Satty-org/Satty/blob/main/README.md)
- [Releases](https://github.com/Satty-org/Satty/releases)
- [Satty-org/Satty on GitHub](https://github.com/Satty-org/Satty)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/satty-org-satty
