Wayland Guide
Capture screenshots and recordings on Wayland and upload them to Zipline
Choose a capture tool that supports your desktop or compositor, then upload the saved file to Zipline.
| Desktop or compositor | Screenshots | Recordings |
|---|---|---|
| GNOME | Flameshot through the desktop portal, or GNOME's screenshot tool | GNOME's screen recorder |
| KDE Plasma | Spectacle or Flameshot | Spectacle |
| Hyprland | Hyprshot, or Grim with Slurp | wf-recorder where supported |
| Sway and compatible compositors | Grim with Slurp; add Satty for annotation | wf-recorder |
Install current packages from your distribution. Capture support depends on the compositor and its protocols; Grim and wf-recorder aren't universal Wayland capture tools.
Upload a captured file
The examples below share one upload script. It needs curl, jq, and wl-clipboard (which provides wl-copy). Get your API token, then save this as ~/.local/bin/zipline-upload, creating the directory if needed:
#!/usr/bin/env bash
set -euo pipefail
TOKEN="YOUR_API_TOKEN"
URL="https://zipline.example.com/api/upload"
file=${1:?Usage: zipline-upload /path/to/file}
response=$(curl --fail-with-body --silent --show-error \
-H "Authorization: $TOKEN" \
-F "file=@$file" \
"$URL")
url=$(jq -er '.files[0].url' <<< "$response")
printf '%s' "$url" | wl-copy
printf '%s\n' "$url"Replace the token and domain, then make the script executable:
chmod +x ~/.local/bin/zipline-uploadRun it with any saved screenshot or recording. It prints the URL and copies it to your clipboard:
~/.local/bin/zipline-upload ~/Pictures/screenshot.pngYour HTTP client sets the multipart content type automatically. Don't add a Content-Type header manually.
Screenshots
Flameshot
Use Zipline's Flameshot uploader generator, or capture a file and pass it to the shared script:
capture_dir=$(mktemp -d)
flameshot gui --raw > "$capture_dir/screenshot.png" &&
~/.local/bin/zipline-upload "$capture_dir/screenshot.png"Flameshot's Wayland troubleshooting guide recommends xdg-desktop-portal with the backend for your desktop:
- GNOME:
xdg-desktop-portal-gnome - KDE:
xdg-desktop-portal-kde - Hyprland:
xdg-desktop-portal-hyprland
GNOME may ask you to approve screen sharing. If capture fails, check the portal setup first. The old XDG_CURRENT_DESKTOP=sway workaround isn't a general requirement; use upstream's troubleshooting steps for your desktop.
Grim + Slurp
On a compositor supported by Grim, use Slurp to select a region:
capture_dir=$(mktemp -d)
grim -g "$(slurp)" "$capture_dir/screenshot.png" &&
~/.local/bin/zipline-upload "$capture_dir/screenshot.png"To copy the image itself instead of uploading it:
grim -g "$(slurp)" - | wl-copySatty + Grim + Slurp
Satty adds annotation to a captured image:
capture_dir=$(mktemp -d)
grim -g "$(slurp)" "$capture_dir/screenshot.png" &&
satty --filename "$capture_dir/screenshot.png" \
--output-filename "$capture_dir/annotated.png"Annotate the image, press Ctrl+S to save to the output path, then close Satty. Upload the saved result:
test -s "$capture_dir/annotated.png" &&
~/.local/bin/zipline-upload "$capture_dir/annotated.png"Hyprshot
Hyprshot captures regions, windows, and monitors on Hyprland:
capture_dir=$(mktemp -d)
hyprshot -m region --raw > "$capture_dir/screenshot.png" &&
~/.local/bin/zipline-upload "$capture_dir/screenshot.png"Add --freeze to freeze the screen during selection; this requires hyprpicker.
Spectacle (KDE)
Use Spectacle's background mode to capture a region and exit:
capture_dir=$(mktemp -d)
spectacle --region --background --nonotify \
--output "$capture_dir/screenshot.png" &&
~/.local/bin/zipline-upload "$capture_dir/screenshot.png"--nonotify suppresses the capture notification. See Spectacle's documentation and spectacle --help for your installed version's options.
Screen recording
wf-recorder
wf-recorder captures video on compositors supporting wlr-screencopy. Record a region selected with Slurp:
capture_dir=$(mktemp -d)
wf-recorder -g "$(slurp)" -f "$capture_dir/recording.mp4"Omit -g "$(slurp)" to record an entire output. Add --audio to include audio.
Stop with Ctrl+C, or send SIGINT to the recorder process. Wait for it to finish writing the file, then upload:
~/.local/bin/zipline-upload "$capture_dir/recording.mp4"Spectacle (KDE)
Record a region with Spectacle:
capture_dir=$(mktemp -d)
spectacle --record region --background --nonotify \
--output "$capture_dir/recording.webm"Stop the recording through Spectacle and wait for the file to finish saving, then upload it:
~/.local/bin/zipline-upload "$capture_dir/recording.webm"Keyboard shortcuts
Bind a working capture-and-upload script to a shortcut in your desktop or compositor settings. Test it in a terminal first so you can see capture, portal, or upload errors.
The examples leave captures in a temporary directory. Remove those files when you no longer need them.