# Omasnap: a Wayland screenshot editor for Omarchy and Hyprland

> Omasnap captures the focused monitor before its own overlay maps, so the editor never shows up in the shot. It is a C++ layer-shell tool for one compositor stack, not a general Wayland screenshot utility.

**omacom/omasnap** — Native Wayland screenshot and annotation editor for Omarchy and Hyprland

- Repository: https://github.com/omacom/omasnap
- Stars: 560 · Forks: 63
- Language: C++
- License: MIT
- Published: 2026-09-17 · Updated: 2026-09-17 · Language: en
- Canonical page: https://hysenlabs.com/projects/omacom-omasnap

## The capture-order problem Omasnap is built around

Most screenshot editors open a window and then grab the screen. The result is a race: the overlay can end up inside the frame it is trying to annotate. Omasnap inverts the order. The README states that it captures the focused monitor before mapping an exclusive layer-shell surface, so the editor never appears in its own screenshot. That single design decision explains most of the rest of the project.

It also explains why the tool is narrow. The renderer, layer surface, clipboard and monitor capture use Wayland protocols, but monitor and window discovery calls hyprctl, and the stated supported target is Wayland plus Hyprland with Omarchy as the primary integration. The README is explicit that generic Wayland support is not claimed by 1.0. If you are on a compositor without an equivalent discovery mechanism, this is not your tool.

The audience is correspondingly specific: Omarchy and Hyprland users who take a lot of screenshots, annotate them, and are tired of flattening those annotations into pixels the moment they save.

## How the capture, overlay and layer model fit together

The focused output is captured in-process through ext-image-copy-capture before the layer maps. Selection then displays that captured frame. The annotation editor works differently: it uses a translucent layer scrim over the live desktop and draws only the selected capture. So there are two visual stages with different sources, one frozen frame for selection and a live desktop underneath the editing surface.

Annotations are not painted into the bitmap. They are retained as movable, resizable vector layers, which is why undo and redo history works across a session and why the recents shelf can reopen a capture with its layers still editable instead of taking a new screenshot. Window capture is a crop of the focused-monitor frame, and the README says overlapping windows stay visible because there is no second clean-window recapture. That is a real trade-off: you get predictable geometry and no flicker, but you cannot produce a clean isolated window shot when something overlaps it.

Working documents live under /run/user/<UID>/omasnap/, falling back to a private /tmp/omasnap-<UID>/. The original source image plus a sidecar JSON operation log are kept there, which is what lets undo survive a crash or a --file reopen. Saving and copying write a normal flattened PNG to the clipboard or to ~/Pictures/Screenshots. The vector model is the editing format, not the output format.

## Installing Omasnap on Omarchy and binding it to PRINT

The Omarchy path is a clone and a script. The README's install section gives exactly this:

```bash
# clone the repository and run the Omarchy installer
git clone https://github.com/tobi/omasnap.git
cd omasnap
./install-omarchy
```

The installer uses Omarchy's package helper for missing dependencies, builds in ~/.cache/omasnap, and installs under ~/.local. It does not modify Hyprland configuration, so binding the tool is your job. Set OMASNAP_PREFIX before running install-omarchy if you want a prefix other than ~/.local.

For the keybinding, the README says to paste this into a Lua config loaded after require("default.hypr.omarchy"):

```lua
hl.unbind("PRINT")
hl.unbind("F12")
hl.unbind("ALT + SHIFT + 4")

o.bind("PRINT", "Screenshot", "omasnap")
o.bind("F12", "Screenshot", "omasnap")
o.bind("ALT + SHIFT + 4", "Screenshot", "omasnap")

hl.layer_rule({
  match = { namespace = "^omasnap$" },
  no_anim = true,
  animation = "none",
  no_screen_share = true,
})
```

Each binding toggles: the first press opens the overlay, the next press dismisses it. Reload and check for errors before trusting it:

```bash
hyprctl reload
hyprctl configerrors
hyprctl binds -j | jq -c \
  '[.[] | select(.description == "Screenshot") | {modmask,key,description}]'
```

The README notes that omarchy plugin add is intentionally not used, because Omarchy plugins are Quickshell QML extensions and do not install native executables or system packages. On plain Arch, the manual route installs the dependency set with pacman, then configures with CMake and Ninja into $HOME/.local, and the install step places the binary at ~/.local/bin/omasnap alongside a desktop file and three OFL font licences. Afterwards, omasnap --version and omasnap --help confirm the CLI is on PATH. Running omasnap with no arguments opens freeform region selection; --capture-region, --capture-window and --capture-fullscreen pick a starting mode, and --scroll stitches a region taller or wider than the screen after you drag and choose a direction.

## Where Omasnap gets in your way

The dependency list is the first constraint. The application calls hyprctl, wl-copy and wl-paste, tesseract, and omarchy-notification-send when it is available. Clipboard verification goes through wl-copy and wl-paste, and OCR is one-click whole-image or drag-region, with the recognized text shown beside the image and copied to the clipboard. If tesseract is missing, that feature has nothing to call. The README does note that notification failure does not invalidate output, which is the right call, but it also means you may not learn that a save happened unless you check ~/Pictures/Screenshots.

Canvas growth is the second place to be careful. Drawing, typing, resizing, or carrying a layer past the screenshot edge grows the canvas. Framed growth is the default, G cycles to tight Overflow growth, then Image, which returns to the original canvas size and clips every annotation outside it. Shift+G cycles backward without changing layer geometry, and B cycles backdrops including Off. Overflow with no backdrop leaves added pixels transparent. This is a lot of state to hold in your head, and the failure mode is quiet: annotations you drew outside the original bounds can be clipped by a mode change rather than by an explicit delete.

Window capture is the third limitation, and it is structural rather than a bug. Because it crops the focused-monitor frame instead of recapturing the window alone, anything overlapping the target window stays in the image. For documentation screenshots of a single clean window, that is the wrong tool, and no flag fixes it.

## How it differs from Flameshot and other screenshot editors

Flameshot is the obvious comparison point for anyone arriving from X11 or from a desktop where it already works. The difference is in what gets stored. Flameshot-style editors generally rasterize annotations into the exported image; what you draw is what the file contains, and reopening the file gives you pixels, not objects. Omasnap keeps annotations as vector layers with undo/redo history and a sidecar JSON operation log, so a capture can be reopened from the recents shelf with its layers still editable.

The second difference is capture timing. Omasnap captures the focused monitor before its layer surface maps, which removes the overlay-from-its-own-screenshot problem by construction rather than by hiding the window quickly. The cost is the dependency on ext-image-copy-capture and on hyprctl for discovery, which is exactly why the project scopes itself to Hyprland instead of claiming broad Wayland support.

The third difference is the annotation set. Arrows, straight lines, smoothed freehand strokes, highlighter strokes that automatically match and stay straight across screenshot text with a freehand fallback, hollow or filled rectangles optionally rounded, ellipses, numbered markers, editable text in Neucha, JetBrains Mono or Inter Display in plain, outlined or readability-pill form, and redaction with opaque or randomized non-spatial mosaic output. That is a wider drawing set than most lightweight editors, and the highlighter's text-snapping behaviour is the kind of detail that only shows up when someone actually annotates screenshots daily.

## Build, licence and maintenance cost

The last push to the repository was on 2026-09-12, and the most recent release listed is v1.20.1 on 2026-08-27, following v1.20.0 the same day and v1.19.1 on 2026-08-23. The repository is not archived. That release cadence suggests ongoing work, but the version numbers also tell you something practical: this is a young, fast-moving tool where point releases arrive close together, so pinning a commit or a tag is more sensible than tracking main if you care about reproducibility.

Building from source is the expected path. The Makefile exposes configure, build, smoke, lint, qt-lint, check, install and clean targets, with BUILD_DIR, BUILD_TYPE, PREFIX and GENERATOR as overridable variables. The smoke target builds and then runs the omasnap-smoke binary with QT_QPA_PLATFORM=offscreen, which is a useful signal that the project has a headless test path you can run without a compositor. The lint target runs clang-tidy over src/*.cpp and tests/*.cpp and skips cleanly when clang-tidy is unavailable; qt-lint does the same for clazy and qmllint. Those targets are how you verify a build without taking a screenshot.

The licence is MIT, which is permissive and imposes few obligations on how you redistribute the binary. The bundled fonts are a separate matter: the install step places Neucha-OFL.txt, JetBrainsMono-OFL.txt and Inter-OFL.txt under ~/.local/share/licenses/omasnap/, so the font licences travel with the install rather than with the project's own MIT grant. Read those files if you plan to redistribute the fonts outside the application. Nothing here is legal advice.

Upgrade cost is mostly the dependency set and the Hyprland binding. The installer does not touch Hyprland configuration, so your Lua bindings survive reinstalls, but a changed layer namespace or binding description would break the hyprctl binds check above. Re-running that check after an upgrade is cheap.

## Conclusion

Adopt Omasnap if you run Omarchy or Hyprland on Wayland and want annotations kept as editable vector layers rather than baked into a PNG. Skip it if you need a compositor-neutral tool, GNOME or KDE support, or a packaged release you can install without building from source. Before relying on it, verify that omasnap --version runs from ~/.local/bin, that PRINT is bound after hyprctl configerrors reports nothing, and that wl-copy and tesseract are present, since OCR and clipboard output depend on them.

## FAQ

### How do I install Omasnap on Omarchy?

Clone the repository, change into it, and run ./install-omarchy. The installer uses Omarchy's package helper for missing dependencies, builds in ~/.cache/omasnap, and installs under ~/.local without modifying Hyprland configuration.

### Does Omasnap work on Wayland compositors other than Hyprland?

The README states that the supported target is Wayland plus Hyprland with Omarchy as the primary integration, and that monitor and window discovery currently calls hyprctl. It says another compositor could support the application after supplying equivalent discovery, but generic Wayland support is not claimed by 1.0.

### Why is Omasnap not showing up in its own screenshots?

Because it captures the focused monitor before mapping an exclusive layer-shell surface. The README describes this ordering as the reason the editor never appears in its own screenshot.

## Sources

- [Issues](https://github.com/omacom/omasnap/issues)
- [License: MIT](https://github.com/omacom/omasnap/blob/main/LICENSE)
- [omacom/omasnap on GitHub](https://github.com/omacom/omasnap)
- [README](https://github.com/omacom/omasnap/blob/main/README.md)
- [Releases](https://github.com/omacom/omasnap/releases)

---

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