Skip to content
apex-shotPublic

Latest commit

 

History

1,247 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

ApexShot

A native Linux screenshot app for Wayland. Capture a region, annotate it, pull text or a QR code out of it, and copy or upload the result.

Screen recording and a video editor exist in the app today, but the polished "record a demo and make it look edited" workflow is still being built.

ApexShot Linux screenshot editor and annotation workflow

▶ Install in one command · GitHub Repository · Website · Releases · Report a bug

License Platform Version Status

Support ApexShot

Support ongoing development through Ko-fi or by choosing a plan on the ApexShot pricing page.

ApexShot for Linux

ApexShot is a native Linux screenshot and screen recording app, not a clone. It is designed for Linux users who want one open-source tool for screenshots, annotation, OCR, QR code scanning, browser scroll capture, screen recording, global hotkeys, and fast clipboard sharing.

People often compare ApexShot with tools like Flameshot, ShareX, Shutter, or ksnip. ApexShot keeps its own identity while focusing on the workflows many Linux users search for: fast screenshots, useful annotation, and modern Wayland support.

Workflow ApexShot support
Screen capture Full screen, area, window, and crosshair screenshots
Annotation and editing Arrows, shapes, text, blur, pixelate, crop, highlighter, and color picker
Screen recording Full-screen recording with MP4/WebM output, audio monitoring, countdown, and controls (not supported on Fedora)
Video editing Trim, convert dimensions, adjust quality, and change audio mode for MP4 recordings
Text and code extraction OCR plus automatic QR code detection from captured regions
Linux desktop integration GNOME Wayland support, portal-backed capture paths, tray, daemon mode, and global hotkeys
Open-source project GPL-3.0-or-later source code, GitHub releases, issues, and discussions at https://github.com/apex-shot/apexshot

Install

ApexShot is already usable as a daily screenshot tool on the configurations that have been personally tested: Ubuntu GNOME Wayland, Arch Linux GNOME Wayland, Hyprland Wayland, and Fedora KDE Plasma Wayland (screenshots). The recommended installer detects Ubuntu/Debian, Arch Linux, or Fedora and selects the matching install path (openSUSE is development-stage and refused until a binary ships). Video recording is not supported on Fedora:

curl -fsSL https://apexshot.org/install | sh

Works best today on:

Environment Status
Ubuntu GNOME Wayland Public beta, personally tested
Arch Linux GNOME Wayland Public beta, personally tested
Hyprland Wayland Public beta, personally tested
Ubuntu 22.04-based derivatives Their stock GTK 4.6 is below the application's GTK 4.10 requirement; the current native .deb is not compatible with that base
GNOME Shell 46 (Wayland) Supported by the extension; GNOME integration tested on Ubuntu 24.04, not an actual Zorin installation
Sway / wlroots-like compositors (Wayland) Implementation exists through GTK4 layer-shell, wlr-screencopy, and wf-recorder, but needs more manual validation
KDE Plasma 6 / Niri / other Wayland desktops ScreenCast portal + PipeWire path implemented, not yet personally tested
Fedora / RHEL (Wayland) Screenshots supported (Fedora KDE validated). Video recording is not supported — use Spectacle or Kooha for screen recording
openSUSE Tumbleweed / Leap (Wayland) Development stage: RPM spec + scripts/build-opensuse-rpm.sh exist; no published binary yet (generic installer will refuse)
NixOS (x86_64 Linux) Source package provided through the repository flake; desktop capture, recording, and hotkeys still need runtime validation
Alpine / Gentoo / Void (Wayland) Development stage: distro-family metadata only; native packaging/testing pending
SteamOS / Steam Deck (immutable Arch) Not supported. The generic installer used to treat this as Arch because pacman exists; SteamOS is a read-only image, so that path fails on sudo, pacman keys, and PGP prompts, and any successful pacman install is wiped by the next SteamOS update. The installer now refuses instead.
X11 on any distro Experimental

If ApexShot breaks on your setup, please open an issue. The issue templates ask for distro, desktop environment, and display server so triage stays fast.

Project Status

ApexShot is in public beta.

Core screenshot capture, annotation, OCR, QR detection, screen recording, tray integration, and hotkeys are implemented. It is not a prototype or library-only experiment; it ships as an installable desktop app.

Some advanced recording overlay features are still experimental because GNOME Shell restricts what normal desktop apps can draw or listen to globally. ApexShot uses a companion GNOME Shell extension for those integrations, and support is improving over time.

Features

Screenshots

  • Multiple Capture Modes — Full screen, area selection, window capture, and crosshair mode ApexShot area selection overlay
  • Image Editor — Annotate with arrows, shapes, text, blur, pixelate, highlighter, and more. Open from the tray menu or CLI (apexshot image-editor) and load any PNG/JPEG/WebP via drag-and-drop or the file chooser. The Done button saves the edited image and follows your General settings — copy to clipboard (image, file path, or both) and quick access overlay. ApexShot image editor with a screenshot marked up using an arrow, a box, text and highlights
  • OCR — Extract text from images using Tesseract and ocrs dual-engine OCR
  • QR Code Detection — Automatically detect and copy QR codes from screenshots

Screen Recording

  • Flexible Recording — Full-screen recording with MP4/WebM output ApexShot quick capture menu with recording selected
  • Audio Monitoring — Real-time mic and speaker level monitoring via PipeWire
  • Recording Controls — Pause, resume, and stop recording with on-screen controls
  • Video Editor — Trim, convert dimensions, adjust quality, and change audio mode for MP4 recordings. Open from the tray menu, CLI (apexshot video-editor), or a global hotkey. Supports drag-and-drop and file chooser for loading videos. ApexShot video editor

Recording settings. Resolution, frame rate, and quality are picked in Settings → Recording. "Maximum resolution" is a ceiling, never an upscale: a full-display 480p recording on a 16:10 screen is 768x480. The frame rate sets the container's rate; the compositor decides how much motion reaches the file (mutter discussion).

Integration

  • Daemon Mode — Background service with system tray and global hotkeys for instant capture
  • Settings — Language, start at login, shutter sounds, shortcuts, recording, screenshots, annotation, and cloud ApexShot settings window
  • History — Browse screenshots, recordings, saved Motion and video edits, and cloud uploads from one window ApexShot history window
  • Display Support — Ubuntu GNOME Wayland, Arch Linux GNOME Wayland, and Hyprland Wayland are the known-good targets. Other Wayland desktops and X11 paths are implemented but need more manual testing.
  • Browser Integration — Full-page scroll capture via Chrome/Chromium extension
  • GNOME Integration — Always-on-top previews and shell-managed recording overlays
  • Cloud Upload — Upload captures to ApexShot Cloud (device login) or self-hosted XBackBone; configure in Settings → Cloud
  • Smart Clipboard — Automatic clipboard integration for quick sharing

Tech Stack

Layer Technology
Core Rust 2021 Edition
Native Overlay C++17 / Qt5 (region selection, drawing)
GUI GTK4 + gtk4-layer-shell
Display Servers X11 (x11rb + MIT-SHM), GNOME Wayland screenshots via C++ overlay + XDG Screenshot portal, wlroots/Hyprland/Sway screenshots via wlr-screencopy + Rust GTK layer-shell, recording via wf-recorder on wlroots or ScreenCast portal + PipeWire elsewhere
Recording Native PipeWire + ffmpeg (VP9, H.264) on Wayland; GStreamer ximagesrc fallback on X11
Audio PipeWire/PulseAudio (mic/speaker capture via ffmpeg)
OCR Tesseract + ocrs/rten
System Tray ksni (KDE System Tray Integration)

Download

Quick Install — Recommended

Run the interactive installer. The production-tested paths are Ubuntu/Debian and Arch Linux; Fedora is usable for screenshots (video recording is not supported). openSUSE remains development-stage for full runtime validation:

curl -fsSL https://apexshot.org/install | sh

Tip: The installer shows a stylish progress UI with spinners, colour-coded status messages, download progress, and a summary screen when finished.

Ubuntu / Debian

The released .deb is built on Ubuntu 24.04. Distro-family detection selects an installer, not a guarantee of binary compatibility: derivatives must satisfy the package's actual library dependencies. ApexShot requires GTK 4.10 or newer; the Ubuntu 22.04 archive provides GTK 4.6. Don't force-install the package on an older base. The Nix source package provides its own locked library dependencies on x86_64 Linux, but desktop integration outside the tested environments still needs validation.

The generic installer above will select this automatically. Direct command:

curl -fsSL https://apexshot.org/install/ubuntu | bash

Quick Install — Arch Linux

The generic installer above will select this automatically. Direct command:

curl -fsSL https://apexshot.org/install/arch | bash

By default this installs the pre-built GitHub Release package. To choose a different Arch install method explicitly:

curl -fsSL https://apexshot.org/install/arch | bash -s -- --aur
curl -fsSL https://apexshot.org/install/arch | bash -s -- --source

Or install manually from the AUR PKGBUILD:

git clone https://github.com/apex-shot/apexshot.git
cd apexshot/packaging/arch
makepkg -sf
sudo pacman -U *.pkg.tar.zst

AUR publishing notes for maintainers live in docs/AUR_PUBLISHING.md.

Note: The package installs the GNOME Shell extension system-wide. Restart GNOME Shell (log out and back in on Wayland) to activate it.

Fedora Workstation / KDE Plasma / Spins

Fedora is supported for screenshots (area / screen / window), preview, settings, tray, and hotkeys. Fedora KDE Plasma Wayland has been runtime-validated for the capture path.

Video recording is not supported on Fedora.
The tray record entries, the Video item in both capture menus, and the Recording settings page are disabled there. Hotkeys and CLI apexshot record … show a desktop notification and exit without starting a session. For screen recording on Fedora, use Spectacle or Kooha. Screenshots in ApexShot continue to work normally.

The generic installer selects the Fedora path automatically when dnf is available. Direct command:

curl -fsSL https://apexshot.org/install/fedora | bash

The direct Fedora installer downloads the latest published GitHub Release RPM and installs it with dnf, after ensuring the required runtime packages are present.

A local RPM build path is available for packaging work:

git clone https://github.com/apex-shot/apexshot.git
cd apexshot
scripts/build-fedora-rpm.sh
sudo dnf install target/fedora-rpmbuild/RPMS/*/apexshot-*.rpm

For local development reinstalls on Fedora:

./scripts/fedora-reinstall.sh --start

openSUSE Tumbleweed / Leap

openSUSE support is in development. No binary openSUSE RPM is published on GitHub Releases yet — the generic installer refuses openSUSE rather than installing a Fedora RPM by mistake. Build locally for packaging work:

git clone https://github.com/apex-shot/apexshot.git
cd apexshot
scripts/build-opensuse-rpm.sh
sudo zypper install target/opensuse-rpmbuild/RPMS/*/apexshot-*.rpm

The openSUSE RPM build path is intended for Tumbleweed / Leap packaging validation and future OBS work. Runtime testing on KDE Plasma Wayland is still in progress.

NixOS

Build the native application and Qt capture helper from the pinned Nixpkgs input and Cargo lockfile:

git clone https://github.com/apex-shot/apexshot.git
cd apexshot
nix build .#apexshot
./result/bin/apexshot --help

This requires Nix's nix-command and flakes features. For declarative installation, portal/PipeWire setup, GNOME integration, browser native messaging, and updates, see the Nix package guide. The package supplies application dependencies; it doesn't configure the host's desktop services. Desktop capture and recording on NixOS are not yet runtime-validated. The generic installer points NixOS users to this package instead of selecting an unrelated package manager.

Updating

Update ApexShot from your terminal:

apexshot update

The command runs the official updater in your current terminal, detects the distribution, and asks for sudo when needed. Ubuntu/Debian, Arch, and Fedora use their existing package update paths. If the installed version is current or newer, it exits without downloading or installing a package. Flatpak installs should use flatpak update from a host terminal instead. NixOS installs should update their ApexShot flake input and rebuild their configuration; Nix profile installs should upgrade the corresponding profile entry. The generic updater does not modify Nix-managed installations.

For older ApexShot versions without this command, the generic updater still works:

curl -fsSL https://apexshot.org/update | sh

Direct Ubuntu / Debian command:

curl -fsSL https://apexshot.org/update/ubuntu | bash

Direct Arch Linux command:

curl -fsSL https://apexshot.org/update/arch | bash

Direct Fedora command:

curl -fsSL https://apexshot.org/update/fedora | bash

Direct openSUSE command (the openSUSE scripts are not proxied through apexshot.org yet, so this one still comes from GitHub):

curl -fsSL https://raw.githubusercontent.com/apex-shot/apexshot/main/scripts/opensuse-update.sh | bash

Build from Source

git clone https://github.com/apex-shot/apexshot.git
cd apexshot
cargo build --release

The C++ Qt5 overlay is automatically compiled via CMake during the Rust build.

Installation

System Dependencies (Ubuntu/Debian)

sudo apt install \
  build-essential cmake pkg-config \
  libx11-dev libxext6 libxtst-dev \
  qtbase5-dev libqt5widgets5 libqt5x11extras5-dev \
  libgstreamer1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav \
  libpipewire-0.3-dev \
  tesseract-ocr libtesseract-dev libleptonica-dev \
  libgtk-4-dev libadwaita-1-dev libgtk4-layer-shell-dev

System Dependencies (Arch Linux)

sudo pacman -S --needed \
  base-devel rust cargo git cmake clang pkgconf \
  gtk4 libadwaita gtk4-layer-shell \
  gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-libav gst-plugin-pipewire \
  pipewire pipewire-pulse libpipewire \
  tesseract tesseract-data-eng leptonica \
  qt5-base qt5-x11extras libxtst \
  wl-clipboard xclip libnotify xdg-utils ffmpeg grim \
  xdg-desktop-portal xdg-desktop-portal-hyprland xdg-desktop-portal-wlr

First-Time Setup

After installation, ApexShot will launch an onboarding wizard to help you:

  1. GNOME Extension (required on GNOME) — Install the GNOME Shell extension for full functionality
  2. Browser Extension (optional) — Set up Chrome/Chromium extension for full-page capture
  3. Cloud Upload (optional) — Configure ApexShot Cloud or self-hosted XBackBone for share links

Manual Install

The manual install command is for local builds. If a package-managed ApexShot already exists in /usr/bin, the installer refuses to place another apexshot in /usr/local/bin because that would shadow the .deb app. Use --dev for a separate test install instead.

Because binaries need root but autostart lives in your home directory, run the two parts separately:

# 1. Install binaries (requires root)
sudo apexshot install --no-autostart

# 2. Set up autostart for the CURRENT user (no sudo)
apexshot install --no-binary

For a local development build that can live beside the official package:

cargo build --release
sudo target/release/apexshot install --dev --no-autostart
apexshot-dev

Optional flags:

# Also install the browser native-messaging host (for the web-scroll extension)
sudo apexshot install --no-autostart --extension-id <chrome-extension-id>

# Force reinstall even if the same version is already present
sudo apexshot install --no-autostart --force

# Remove the separate development install
sudo apexshot-dev uninstall --dev

GNOME Extension (Recommended)

The GNOME Shell extension improves ApexShot on GNOME Wayland. Without it, preview windows may not stay on top, the recording mask will not appear, and the window picker cannot list windows.

This is a GNOME platform limitation, not a sign that the app is unfinished: normal desktop apps cannot freely draw above every window or enumerate windows on GNOME Wayland. The extension gives ApexShot the shell-side hooks it needs.

Recording itself works without the extension. Pause, stop, and restart are always available through global shortcuts, the tray icon, and the recording notification.

Supported GNOME versions: 46 and 48–50

Install from GitHub Release (Recommended)

# Download the GNOME extension (finds latest release that has the zip)
curl -fsSL -o apexshot-gnome-integration.zip \
  "$(curl -fsSL https://api.github.com/repos/apex-shot/apexshot/releases | grep -o '"browser_download_url": *"[^"]*apexshot-gnome-integration.zip"' | head -n 1 | cut -d '"' -f 4)"

# Install using gnome-extensions
gnome-extensions install apexshot-gnome-integration.zip
gnome-extensions enable apexshot-gnome-integration@apexshot.github.io

Install from Source

If you cloned the repository and want to install the development version:

cd gnome-extension
zip apexshot-gnome-integration.zip \
  extension.js metadata.json \
  cursor-classifier.js press-tracker.js shell-overlay.js window-list.js preview-stacking.js daemon-ownership.js
gnome-extensions install apexshot-gnome-integration.zip
gnome-extensions enable apexshot-gnome-integration@apexshot.github.io

Install via Extension Manager (GUI)

  1. Install Extension Manager from Flathub
  2. Click Browse and search for "ApexShot"
  3. Install and enable the extension

Note: The extension may not yet be published on extensions.gnome.org. Use the release zip or source methods above until it is available.

Verify Installation

# Check that the extension is installed and enabled
gnome-extensions list
gnome-extensions info apexshot-gnome-integration@apexshot.github.io

# Check GNOME Shell logs for ApexShot activity
journalctl /usr/bin/gnome-shell -f | grep apexshot

What the Extension Provides

  • Always-on-top preview windows — Screenshot previews and annotation editor windows stay above other applications during drag operations
  • Shell-managed recording mask — A dimmed mask highlights the selected recording area
  • Window list for the window picker — Lets ApexShot enumerate and focus windows, which Wayland clients cannot do themselves

Troubleshooting

Issue Solution
Preview windows get hidden behind other apps Verify extension is enabled: gnome-extensions list
Recording mask does not appear Check logs: `journalctl /usr/bin/gnome-shell -f
Extension fails to enable Confirm GNOME Shell version is 46 or 48–50 and matches metadata.json
D-Bus signals not working Monitor session bus: `dbus-monitor --session

Known Limitations:

  • Capture overlay is tied to the window where it was initiated. Moving to another application window will hide the overlay until you return to the original window.

Note: The onboarding wizard will automatically guide you through installing the GNOME extension on first launch.

Usage

Default Behavior (Deb Package)

The deb package installs ApexShot as a background daemon with system tray icon and global hotkeys by default. It starts automatically on login.

Manual Daemon Mode

If you built from source or want to run the daemon manually:

apexshot daemon

CLI Commands

# Screenshots
apexshot capture screen          # Full screen capture
apexshot capture area            # Area selection capture
apexshot capture crosshair       # Crosshair / precise point capture

# Recording
apexshot record screen           # Full screen recording

# OCR (requires image path)
apexshot ocr <image-path>        # Extract text from image

# Image Editor
apexshot edit <image-path>       # Open image in annotation editor
apexshot image-editor            # Open empty image editor (drag & drop or browse to load)

# Video Editor
apexshot video-editor            # Open video editor (with optional MP4 path)
apexshot video-editor <video>    # Open video editor with a specific video

# Settings and cloud
apexshot settings                # Open settings window
apexshot history                 # Open capture history window (captures, edits, cloud)
apexshot login                   # Sign in to ApexShot Cloud (device flow)
apexshot logout                  # Sign out of ApexShot Cloud

# Daemon / install helpers
apexshot daemon                  # Background tray + hotkeys
apexshot hotkeys install         # Install desktop keybindings
apexshot install                 # Local binary + autostart install
apexshot update                  # Update to the latest published release
apexshot --version               # Print version

Recording on non-GNOME systems (Hyprland, Sway, KDE, X11)

Fedora: Video recording is not supported. Recording actions show a notification and exit. Use Spectacle or Kooha for screen recording on Fedora. Screenshots still work. See the Fedora install section.

ApexShot uses a fully self-contained Rust stack for recording on systems without GNOME Shell (except Fedora, above). No Qt overlay, no shell extension — the daemon, the GTK4 overlay, and native PipeWire handle everything.

How it works:

  1. The daemon runs in the background with a system tray icon and global hotkeys.
  2. Triggering a recording action (apexshot record screen, tray click, or hotkey) opens the Rust GTK4 quick-capture menu.
  3. The menu picks what to capture and the mic/speaker toggles; format (MP4/WebM), countdown, resolution and quality come from Settings → Recording, shared with the GNOME path.
  4. Once confirmed, recording begins. On wlroots compositors (Hyprland/Sway), wf-recorder is preferred when installed for native wlr-screencopy capture. On other Wayland compositors, native PipeWire capture (src/pipewire_engine.rs) grabs frames via the XDG ScreenCast portal, and ffmpeg encodes them to the chosen format. On X11, a GStreamer ximagesrc pipeline is used as fallback.
  5. During recording, a floating GTK4 stop overlay shows pause/stop controls and elapsed time. Pause/resume/stop can also be triggered from the tray menu or global hotkeys.

What you get without GNOME:

  • Full-screen recording (MP4, WebM)
  • Mic and speaker audio capture with level monitoring
  • Countdown timer before recording starts
  • Pause/resume/restart/stop during recording
  • Post-recording video editor (trim, resize, re-encode)
  • System tray with quick-access actions
  • Global hotkeys configurable in Settings
# Start the daemon (launches tray icon + hotkey listener)
apexshot daemon

# Record directly from CLI without the daemon
apexshot record screen              # Full screen recording

# Control an active recording (requires daemon)
apexshot record stop                # Stop and save
apexshot record toggle-pause        # Pause / resume
apexshot record restart             # Restart
apexshot record discard             # Discard without saving

Keyboard Shortcuts

Configure global hotkeys in Settings > Shortcuts. The daemon supports:

  • Capture shortcuts — Full screen, area, window, last capture
  • Recording shortcuts — Start/stop/pause recording
  • Custom shortcuts — Record and assign any key combination per action

Project Structure

apexshot/
├── src/                    # Rust core (capture, editor, recording, settings, daemon)
│   ├── capture/            # Screen capture logic + annotation editor
│   ├── backend/            # Display backends (X11, Wayland, KDE ScreenShot2, wlr-screencopy)
│   ├── cloud/              # ApexShot Cloud + XBackBone upload destinations
│   ├── compositor/         # Compositor helpers (Hyprland, Sway, Niri, River, COSMIC)
│   ├── distro/             # Distro detection / packaging metadata
│   ├── recording/          # Screen recording (PipeWire + ffmpeg, X11 GStreamer fallback)
│   ├── settings/           # Settings UI
│   ├── onboarding/         # First-time setup wizard
│   ├── gnome_integration/  # GNOME Shell extension helpers
│   ├── qr/                 # QR code detection
│   ├── pipewire_engine.rs  # Native PipeWire capture engine
│   └── lib.rs              # Library exports
├── capture-overlay/        # C++ Qt5 native overlay (region selection, drawing)
├── gnome-extension/        # GNOME Shell extension (preview windows, recording mask)
├── web-scroll-extension/   # Chrome/Chromium extension (full-page scroll capture)
├── native-host/            # Native messaging host for browser integration
├── packaging/              # Desktop files, icons, deb/arch/fedora/opensuse assets
├── scripts/                # Installers, updaters, RPM helpers
├── tests/                  # Integration tests
├── docs/                   # Reference docs (+ docs/README.md index); plans/ for active plans
├── build.rs                # Build script (CMake C++ overlay + icon bundling)
└── Cargo.toml              # Rust dependencies and package metadata

Development

Building

cargo build --release

Testing

cargo test

Building Debian Package

scripts/package-deb.sh

The package will be created in target/debian/.

Running from Source

cargo run -- daemon

Code Style

  • Use cargo fmt for formatting
  • Use cargo clippy for linting
  • Follow Rust best practices and idioms

Contributing

ApexShot especially needs testers across Linux desktop environments. Helpful contributions include:

  • Testing the installer on Ubuntu/Debian and Arch-based systems
  • Testing Wayland behavior on KDE Plasma, Sway, Hyprland, and other compositors
  • Improving packaging for additional distros
  • Reporting GNOME extension issues with shell logs attached
  • Improving docs, screenshots, release notes, and troubleshooting steps

If you want to contribute code, start with an issue that includes your distro, desktop environment, display server, and the workflow you want to improve.

License

GPL-3.0-or-later — See LICENSE for details.

Releases

Packages

Contributors

Languages