| File | Date | Author | Commit |
|---|---|---|---|
| .github | 2025-11-02 |
|
[837702] AppImage: fix PyInstaller libpython error\n- Us... |
| config | 2025-09-28 |
|
[687797] feat: Add pywal integration and dynamic theming |
| docs | 2025-11-02 |
|
[65068b] docs: improvements + snipping guide; add AppStr... |
| packaging | 2025-11-02 |
|
[85c887] packaging(appimage): stable local AppImage buil... |
| resources | 2025-11-02 |
|
[65068b] docs: improvements + snipping guide; add AppStr... |
| src | 2025-09-28 |
|
[687797] feat: Add pywal integration and dynamic theming |
| .gitignore | 2025-11-02 |
|
[85c887] packaging(appimage): stable local AppImage buil... |
| LICENSE | 2025-09-19 |
|
[c8ff32] testing installer |
| README.md | 2025-11-02 |
|
[d6c7c5] docs(README): AppImage prerequisite libfuse2 + ... |
| install.sh | 2025-10-30 |
|
[5e7aca] Installer: detect Arch derivatives (CachyOS, En... |
| requirements.txt | 2025-09-19 |
|
[c8ff32] testing installer |
None of the screen-shot tools that I've tried on Hyprland have quite been what I wanted, either multiple key-binds were needed, and/or certain functionality was just not available at all.
My solution is a Qt-based screenshot tool designed specifically for Hyprland. HyprSnipper provides 4 capture modes, with intuitive window selection, simple integration with your system, and supports editing in your prefered annotation application.
All Displays: Capture all connected displays at once
Intuitive Window Selection: Uses a window selector that recreates the window layout on the active monitor for application window selection, this is my work-around for the Wayland input capture limitations.
Flexible Output Options:
Open in external editor (swappy, gimp, etc.)
UI Features:
If you prefer a portable binary, download the latest AppImage from the GitHub Releases page:
Run it:
chmod +x HyprSnipper-*.AppImage
./HyprSnipper-*.AppImage
Note: The AppImage bundles Python and PySide6. You still need the host Wayland tools installed (grim, slurp, wl-clipboard) and Hyprland's hyprctl for window selection mode.
If it fails to launch with a libfuse error, see the AppImage note: libfuse2 required.
Prerequisite for AppImage: FUSE 2 runtime (libfuse2)
sudo pacman -S fuse2sudo apt install libfuse2t64sudo apt install libfuse2sudo dnf install fuse fuse-libssudo zypper install libfuse2appimage-run (from nixpkgs.appimage-run) or enable FUSE 2.git clone https://github.com/JWalk9000/hyprsnipper.git
cd hyprsnipper
./install.sh
Cloned directory can be deleted after install.
The installer will:
# Ubuntu/Debian
sudo apt install grim slurp wl-clipboard python3-pyside6 python3-yaml python3-configparser
```
bash
python3 src/main.pyHyprSnipper stores user configuration in ~/.config/hyprsnipper/:
settings.yaml - Main application settingspalette.ini - Color theme configuration icons/ - Custom icon overrides (optional)settings.yaml:
I have included (hopefully) clear notes in the settings file for customizing its behavior to fit your desires.
Place custom .svg or .png icons in ~/.config/hyprsnipper/icons/ to override defaults:
region.svg - Region selection modewindow.svg - Window selection modefull.svg - Full display modealldisplays.svg - All displays modeNote: HyprSnipper applies theme colors to ALL SVG icons, regardless of their original design. This works best with monochrome icons (simple single-color designs). Colorful, multi-color SVG icons will have all their colors replaced with the theme's icon_color. Support for preserving colorful icon designs may be supported in future versions if there is enough interest.
icon_color (best for monochrome SVGs)Tip: Mix formats to taste—use SVG for themeable icons and PNG for colorful ones.
HyprSnipper supports automatic theming with pywal:
Install the template:
bash
cp resources/wal/hyprsnipper.ini ~/.config/wal/templates/
This template can be customized to use different generated colors if you desire.
Update your settings to use pywal colors:
yaml
# In ~/.config/hyprsnipper/settings.yaml
PALETTE_FILE: ~/.cache/wal/hyprsnipper.ini
Generate colors with pywal:
bash
wal -i /path/to/your/wallpaper
The PALETTE_FILE setting supports both absolute paths and paths relative to ~/.config/hyprsnipper/.
HyprSnipper uses a simplified 8-color palette system for easy theming:
background - Main window background primary - Selection rectangles and accents button_bg / button_checked / button_hover - Button statescheckbox_fg - Checkbox text coloricon_color - SVG icon color (Note: All SVG colors are replaced with this color - use monochrome icons for best results)tooltip_bg / tooltip_fg - Tooltip appearanceAdd this to your hyprland.conf for so that it floats correctly.
windowrule = float, title:HyprSnipperSelector
Optional: Bind to a key for quick access
bind = $mainMod SHIFT, S, exec, hyprsnipper
hyprsnipper/
├── src/
│ ├── main.py # Application entry point
│ └── ui/
│ ├── snipper_window.py # Main UI window
│ ├── window_selector.py # Window layout overlay
│ ├── region_selector.py # Region selection handler
│ ├── full_display.py # Full display capture
│ ├── all_displays.py # Multi-display capture
│ └── palette.py # Color theme system
├── config/
│ ├── settings.yaml # Default settings
│ └── palette.ini # Default color theme
├── resources/icons/ # Default SVG icons
└── install.sh # Automated installer
Different systems have varying window animation speeds. Adjust WINDOW_ANIMATION_DELAY in settings.yaml:
0300 500+This prevents the HyprSnipper UI from appearing in screenshots.
HyprSnipper integrates with any image editor or workflow tool:
EDITOR: gimp # Open in GIMP
EDITOR: krita # Open in Krita
EDITOR: swappy # Default: swappy for quick annotation
If, for any reason, you wish to return to a default configuration you can run this to reset the config. I primarily used this for testing, but there it is if you need it.
./install.sh --reset # Restore default settings and icons
Window selector shows empty/wrong layout: Ensure main Hyprsnipper UI is opened on workspace you want to take the snip of.
Screenshots include HyprSnipper UI: Increase WINDOW_ANIMATION_DELAY in settings.yaml.
Permission errors during install: Check that you have write access to install directories.
Missing dependencies: The installer should detect and install required packages automatically, if you find something missing please let me know.
If you see dlopen(): error loading libfuse.so.2 when launching the AppImage, install the FUSE 2 runtime (libfuse2). See the AppImage prerequisite above for distro-specific commands. As a workaround, you can also run:
./HyprSnipper-*.AppImage --appimage-extract-and-run
subprocess.run(capture_output=True) - could be made 3.6+ compatible)Additional dependency for AppImage users
HyprSnipper-*.AppImage on most distributions.Currently requires Python 3.7+ due to subprocess.run(capture_output=True) usage. However, the code could easily be made compatible with Python 3.6+ by replacing a few subprocess calls.
Community testing welcome! If you test with older Python versions or have compatibility issues, please open an issue.
See LICENSE file for details.