⭐ If you find Zipline useful, please consider giving it a star on Github! ⭐
Guides

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 compositorScreenshotsRecordings
GNOMEFlameshot through the desktop portal, or GNOME's screenshot toolGNOME's screen recorder
KDE PlasmaSpectacle or FlameshotSpectacle
HyprlandHyprshot, or Grim with Slurpwf-recorder where supported
Sway and compatible compositorsGrim with Slurp; add Satty for annotationwf-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:

~/.local/bin/zipline-upload
#!/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-upload

Run it with any saved screenshot or recording. It prints the URL and copies it to your clipboard:

~/.local/bin/zipline-upload ~/Pictures/screenshot.png

Your 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-copy

Satty + 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.