TL;DR: wayscriber is a ZoomIt-like screen annotation tool for Wayland compositors, written in Rust. Works on compositors with the wlr-layer-shell protocol (Hyprland, Sway, river, …); building from source requires Rust 1.85+. Quick start: set it up in four steps.
📹 Demo Video (Click to expand)
demo.mp4
- Why wayscriber?
- Quick Start
- Features at a Glance
- Demo
- Installation
- Running wayscriber
- Controls Reference
- Configuration
- Troubleshooting
- Additional Information
- Project History
- Contributing & Credits
- Works across Wayland compositors (Sway, Wayfire, River, Hyprland, …) via wlr-layer-shell. Tested extensively on Hyprland and confirmed working on Niri; reports from other compositors welcome.
- Built for live presentations, classroom sessions, and screenshares - toggle with a key and annotate your screen instantly without breaking flow.
- Complements tools like Satty: Satty excels at capture → annotate → save workflows, while wayscriber stays resident as an always-available drawing layer with instant mode switching.
1. Install wayscriber
- Arch Linux (AUR): (build from source)
yay -S wayscriberparu -S wayscriber
- Arch Linux (AUR, prebuilt):
yay -S wayscriber-binparu -S wayscriber-bin.
- Other distros: see Installation, then install
wl-clipboard,grim, andslurpfor the fastest screenshot workflow.
2. Choose how to run it:
Launch wayscriber when you need it, exit when done:
wayscriber --activeOr bind to a key in ~/.config/hypr/hyprland.conf:
bind = SUPER, D, exec, wayscriber --active
Press F10 for help, F11 for configurator, Escape/Ctrl+Q to exit, and F12 to toggle the status bar.
Run wayscriber in the background and toggle it with a keybind:
Enable the service:
systemctl --user enable --now wayscriber.serviceAdd keybinding to ~/.config/hypr/hyprland.conf:
bind = SUPER, D, exec, pkill -SIGUSR1 wayscriber
Reload Hyprland:
hyprctl reloadNote: If the daemon doesn't start after a reboot, see Troubleshooting.
Alternative: Use Hyprland's exec-once instead of systemd:
exec-once = wayscriber --daemon
bind = SUPER, D, exec, pkill -SIGUSR1 wayscriber
- Drawing & editing: Freehand pen, straight lines, rectangles, ellipses, arrows, and multiline text with smoothing; undo & redo; quick line-width and color changes via hotkeys or scroll.
- Board modes: Whiteboard, blackboard, and transparent overlays, each with isolated frames and auto pen contrast; snap back to transparent with
Ctrl+Shift+T. - Capture shortcuts: Full-screen saves, active-window grabs, and region capture to file or clipboard using
grim,slurp, andwl-clipboardwhen available. - Session persistence: Opt-in per board/monitor storage that restores your canvas plus pen color & thickness; inspect with
wayscriber --session-infoor clear withwayscriber --clear-session. - Workflow helpers: Background daemon with SIGUSR1 toggle, tray icon, one-shot mode, live status bar, and in-app help overlay (
F10). - Click highlights: Presenter-style halo on mouse clicks with configurable colors, radius, and duration; follows your pen color by default, toggle the effect with
Ctrl+Shift+Hor swap to highlight-only mode withCtrl+Alt+H. - Configurator & CLI: Launch
wayscriber-configurator(or pressF11) to tweak colors, bindings, persistence, compression, and more; power users can edit the TOML or use CLI switches. - Performance & reliability: Dirty-region rendering keeps redraws fast, while session files use atomic writes, size limits, compression, and backups for safety.
Wayscriber can remember your boards between runs (per monitor and per board color) along with pen color/thickness. Persistence is opt-in. Toggle it from the configurator (F11 → Session tab) or launch the GUI directly:
wayscriber-configuratorPrefer text? Edit ~/.config/wayscriber/config.toml. Helpful commands:
wayscriber --session-info # Inspect saved sessions
wayscriber --clear-session # Remove stored boardsGrab a walk-through in docs/CONFIG.md if you want to edit the TOML by hand.
demo.mp4
See docs/SETUP.md for detailed walkthroughs.
# yay – build from source
yay -S wayscriber
# yay – prebuilt binaries
yay -S wayscriber-bin
# paru – build from source
paru -S wayscriber
# paru – prebuilt binaries
paru -S wayscriber-binThe package installs the user service at /usr/lib/systemd/user/wayscriber.service.
Upgrading from the old
hyprmarkerpackages?
Remove the legacy packages once and reinstall under the new name:sudo pacman -Rns hyprmarker hyprmarker-debug # ignore if either package is already gone yay -S wayscriber # or yay -S wayscriber-binAfter this one-time cleanup, future upgrades work exactly like any other AUR package.
Install dependencies:
# Ubuntu / Debian
sudo apt-get install libcairo2-dev libwayland-dev libpango1.0-dev
# Fedora
sudo dnf install cairo-devel wayland-devel pango-develOptional but recommended for screenshots:
sudo apt-get install wl-clipboard grim slurp # Debian/Ubuntu
sudo dnf install wl-clipboard grim slurp # FedoraBuild from source:
git clone https://github.com/devmobasa/wayscriber.git
cd wayscriber
cargo build --releaseThe binary will be at target/release/wayscriber.
cargo build --release
./tools/install.shThe installer places the binary at ~/.local/bin/wayscriber, creates ~/.config/wayscriber/, and offers to configure Hyprland.
Run wayscriber in the background and toggle with a keybind.
Enable the service:
systemctl --user enable --now wayscriber.serviceAdd keybinding to ~/.config/hypr/hyprland.conf:
bind = SUPER, D, exec, pkill -SIGUSR1 wayscriber
Reload Hyprland:
hyprctl reloadThe daemon shows a system tray icon (may be in Waybar drawer). Press Super+D to toggle overlay, right-click tray icon for options.
Service commands:
systemctl --user status wayscriber.service
systemctl --user restart wayscriber.service
journalctl --user -u wayscriber.service -fNote: If the daemon doesn't start after reboot, see Troubleshooting.
Alternative: Use Hyprland's exec-once instead of systemd:
exec-once = wayscriber --daemon
bind = SUPER, D, exec, pkill -SIGUSR1 wayscriber
Launch directly into an active overlay without the daemon:
wayscriber --active
wayscriber --active --mode whiteboard
wayscriber --active --mode blackboardBind it to keys if you prefer:
bind = $mainMod, D, exec, wayscriber --active
bind = $mainMod SHIFT, D, exec, wayscriber --active --mode whiteboard
Exit the overlay with Escape or Ctrl+Q.
wayscriber ships with keyboard shortcuts for quick captures:
Ctrl+C– copy the entire screen to the clipboard.Ctrl+S– save the entire screen as a PNG (uses your capture directory).Ctrl+Shift+C– select a region and copy it to the clipboard.Ctrl+Shift+S– select a region and save it as a PNG.Ctrl+Shift+O– capture the active window (Hyprland fast path, portal fallback).Ctrl+6/Ctrl+Shift+6– reserved for remembered-region clipboard/file captures (coming soon).
Requirements: install wl-clipboard, grim, and slurp for the fastest Hyprland workflow. If they are missing, wayscriber falls back to xdg-desktop-portal's interactive picker.
Press F10 at any time for the in-app keyboard and mouse cheat sheet.
| Action | Key/Mouse |
|---|---|
| Drawing Tools | |
| Freehand pen | Default (drag with left mouse button) |
| Straight line | Hold Shift + drag |
| Rectangle | Hold Ctrl + drag |
| Ellipse/Circle | Hold Tab + drag |
| Arrow | Hold Ctrl+Shift + drag |
| Toggle highlight-only tool | Ctrl+Alt+H |
| Text mode | Press T, click to position, type, Shift+Enter for new line, Enter to finish |
| Board Modes | |
| Toggle Whiteboard | Ctrl+W (press again to exit) |
| Toggle Blackboard | Ctrl+B (press again to exit) |
| Return to Transparent | Ctrl+Shift+T |
| Colors | |
| Red | R |
| Green | G |
| Blue | B |
| Yellow | Y |
| Orange | O |
| Pink | P |
| White | W |
| Black | K |
| Line Thickness | |
| Increase | +, =, or scroll down |
| Decrease | -, _, or scroll up |
| Font Size | |
| Increase | Ctrl+Shift++ or Shift + scroll down |
| Decrease | Ctrl+Shift+- or Shift + scroll up |
| Editing | |
| Undo last shape | Ctrl+Z |
| Redo last undo | Ctrl+Shift+Z or Ctrl+Y |
| Clear all | E |
| Cancel action | Right-click or Escape |
| Help & Exit | |
| Toggle help overlay | F10 |
| Launch configurator | F11 |
| Toggle click highlight | Ctrl+Shift+H |
| Exit overlay | Escape or Ctrl+Q |
-
Config file location:
~/.config/wayscriber/config.toml. -
Copy defaults to get started:
mkdir -p ~/.config/wayscriber cp config.example.toml ~/.config/wayscriber/config.toml
-
Key sections to tweak:
[drawing]– default color, thickness, and font settings.[performance]– buffer count and VSync.[ui]– status bar visibility and position.[board]– whiteboard/blackboard presets and auto-adjust options.
Example snippet:
[drawing]
default_color = "red"
default_thickness = 3.0
[performance]
buffer_count = 3
enable_vsync = trueSee docs/CONFIG.md for the full configuration reference.
If using systemd: User services don't start at boot by default. Enable lingering:
loginctl enable-linger $USERSimpler alternative: Use Hyprland's exec-once instead:
exec-once = wayscriber --daemon
- Check status:
systemctl --user status wayscriber.service - Tail logs:
journalctl --user -u wayscriber.service -f - Restart:
systemctl --user restart wayscriber.service
- Verify Wayland session:
echo $WAYLAND_DISPLAY - Ensure your compositor supports
wlr-layer-shell(Hyprland, Sway, river, etc.) - Run with logs for clues:
RUST_LOG=info wayscriber --active
- Confirm the file exists:
ls -la ~/.config/wayscriber/config.toml - Watch for TOML errors in logs:
RUST_LOG=info wayscriber --active
Tune [performance] in config.toml if memory or latency is a concern:
[performance]
buffer_count = 2
enable_vsync = true| Platform | Status | Notes |
|---|---|---|
| Wayland (Hyprland, Sway, etc.) | ✅ SUPPORTED | Requires wlr-layer-shell protocol |
- Triple-buffered rendering prevents flicker during fast drawing.
- Frame-synchronized updates (VSync) keep strokes smooth.
- Dirty-region updates minimize CPU/GPU overhead.
- Tested to sustain 60 FPS on 1080p–4K displays.
wayscriber/
├── src/
│ ├── main.rs # Entry point, CLI parsing
│ ├── daemon.rs # Daemon mode with signal handling
│ ├── ui.rs # Status bar and help overlay rendering
│ ├── util.rs # Utility functions
│ ├── backend/
│ │ ├── mod.rs # Backend module
│ │ └── wayland.rs # Wayland wlr-layer-shell implementation
│ ├── config/
│ │ ├── mod.rs # Configuration loader and validator
│ │ ├── types.rs # Config structure definitions
│ │ └── enums.rs # Color specs and enums
│ ├── draw/
│ │ ├── mod.rs # Drawing module
│ │ ├── color.rs # Color definitions and constants
│ │ ├── font.rs # Font descriptor for Pango
│ │ ├── frame.rs # Frame container for shapes
│ │ ├── shape.rs # Shape definitions (lines, text, etc.)
│ │ └── render.rs # Cairo/Pango rendering functions
│ └── input/
│ ├── mod.rs # Input handling module
│ ├── state.rs # Drawing state machine
│ ├── events.rs # Keyboard/mouse event types
│ ├── modifiers.rs # Modifier key tracking
│ └── tool.rs # Drawing tool enum
├── tools/ # Helper scripts (install, run, reload)
├── packaging/ # Distribution files (service, PKGBUILD)
├── docs/ # Documentation
└── config.example.toml # Example configuration
Wayscriber shipped under the name hyprmarker through the v0.4 release line. The rename in v0.5.0 reflects the broader compositor support that has been built since the original Hyprland-only prototype. Use wayscriber --migrate-config to copy existing settings, and see docs/MIGRATION.md for the full compatibility checklist.
Coming from hyprmarker? Uninstall the old package (paru -R hyprmarker, etc.) and disable the legacy user service before installing Wayscriber:
systemctl --user disable --now hyprmarker.service 2>/dev/null || trueThen install Wayscriber and enable wayscriber.service if you want the daemon on login.
- docs/SETUP.md – system setup and installation details
- docs/CONFIG.md – configuration reference
- docs/MIGRATION.md – guidance for migrating from hyprmarker
| Feature | ZoomIt (Windows) | wayscriber (Linux) |
|---|---|---|
| Freehand drawing | ✅ | ✅ |
| Straight lines | ✅ | ✅ |
| Rectangles | ✅ | ✅ |
| Ellipses | ✅ | ✅ |
| Arrows | ✅ | ✅ |
| Text annotations | ✅ | ✅ |
| Whiteboard mode | ✅ (W key) | ✅ (Ctrl+W) |
| Blackboard mode | ✅ (K key) | ✅ (Ctrl+B) |
| Multi-line text | ❌ | ✅ (Shift+Enter) |
| Custom fonts | ❌ | ✅ (Pango) |
| Color selection | ✅ | ✅ (8 colors) |
| Undo | ✅ | ✅ |
| Clear all | ✅ | ✅ |
| Help overlay | ❌ | ✅ |
| Status bar | ❌ | ✅ |
| Configuration file | ❌ | ✅ |
| Scroll wheel thickness | ❌ | ✅ |
| Zoom functionality | ✅ | ❌ (not planned) |
| Break timer | ✅ | ❌ (not planned) |
| Screen recording | ✅ | ❌ (not planned) |
- Native Wayland wlr-layer-shell implementation
- Configuration file support
- Status bar and help overlay
- Scroll wheel thickness adjustment
- Daemon mode with global hotkey toggle (Super+D)
- System tray integration
- Autostart with systemd user service
- Multi-line text support (Shift+Enter)
- Custom fonts with Pango rendering
- Whiteboard/blackboard modes with isolated frames
- Board mode configuration (colors, auto-adjust)
- CLI
--modeflag for initial board selection - Multi-monitor support with per-monitor surfaces
- Additional shapes (filled shapes, highlighter)
- Save annotations to image file
- Eraser tool
- Color picker
MIT License — see LICENSE for details.
-
Pull requests and bug reports are welcome. Priority areas include compositor compatibility testing, multi-monitor support, and new drawing tools.
-
Development basics:
cargo build cargo run -- --active cargo test cargo clippy cargo fmt- Use
./tools/fetch-all-deps.shto prefetch crates for the main binary and configurator before running frozen/offline builds.
- Use
-
Acknowledgments:
- Inspired by ZoomIt by Mark Russinovich
- Built for Hyprland by vaxry
- Similar ideas from Gromit-MPX
- Development approach inspired by DHH's Omarchy
- Uses Cairo and smithay-client-toolkit
-
This tool was developed with AI assistance:
- Initial concept & planning: ChatGPT
- Architecture review & design: Codex
- Implementation: Claude Code (Anthropic)
Created as a native Wayland implementation of ZoomIt-style annotation features for Linux desktops.