Hyprland's portal sometimes creates the session and never answers source selection, before any picker appears. Recording now fails if the portal has not reached its picker within 10 s; time in the picker is not limited. The motion check uses the segment with the most motion, since capture can start late.
Clipbin Desktop
An open-source game recorder for Windows and Linux, inspired by Plays.tv. Rust and GPUI provide the desktop interface; the recording engine uses libobs and official OBS capture components.
SPEC.md defines the agreed v1 product requirements.
Current state
The recording foundation is being validated (see docs/validation.md). clipbin-obs records official OBS capture sources through one hardware encoder into keyframe-aligned segments and reports honest status; clipbin-probe exercises it. It passes the Linux headless rig; hardware sign-off on Hyprland and all Windows validation are still to do.
The desktop app is still the initial shell: it opens a GPUI window, displays the agreed recording defaults, and always reports Not recording. Steam detection, the recorder in the app, playback, clipping, bookmarks, persistence, global hotkeys, autostart, and background recording are not implemented yet.
Windows is a first-class target. Every change must keep the Windows code paths building (cargo clippy --target x86_64-pc-windows-msvc) and list what still needs validating on Windows.
Layout
crates/
clipbin-core/ Settings and recorder state; independent of GPUI and native OBS.
clipbin-obs/ Recording engine over the pinned libobs runtime; all unsafe code is in src/ffi.rs.
clipbin-probe/ Validation probe for capture, encoders, segments and status.
clipbin-desktop/ GPUI application and initial session-library view.
scripts/obs/ Assemble the pinned OBS runtime for Linux (built from source) and Windows (official release).
scripts/rig/ Headless Wayland/X11 desktop for capture tests on machines without a display.
scripts/validate/ Validation suites: Linux rig, Linux hardware, Windows.
docs/validation.md Validation status and findings.
.gitea/workflows/ Formatting, lint, test and Windows cross-checks.
SPEC.md Product requirements and acceptance checks.
The core has no external dependencies. Keep capture and session operations out of the UI thread.
Development
Use Rust 1.98.0, as pinned in rust-toolchain.toml. GPUI is pinned to 0.2.2, with Wayland and X11 enabled. Cargo.lock pins transitive dependencies.
Keep the lockfile checked in and use --locked. It currently pins libc to 0.2.186 because GPUI’s transitive xattr 0.2.3 dependency fails to compile against 0.2.190 on Linux.
On Arch/CachyOS, install the native build dependencies:
sudo pacman -S --needed base-devel pkgconf fontconfig freetype2 wayland libxcb libxkbcommon libxkbcommon-x11 openssl clang
OBS runtime
Clipbin bundles a pinned OBS 32.0.4 runtime (scripts/obs/versions.env) with only the official plugins it uses. The libobs crate's headers match that version; the engine refuses to start against any other.
-
Linux:
scripts/obs/build-linux.shbuilds libobs and the plugins from source intotarget/obs-runtime/linux-x86_64. Arch/CachyOS build dependencies:sudo pacman -S --needed cmake ninja extra-cmake-modules ffmpeg x264 pipewire libpulse libdrm libva jansson curl libxcomposite libxinerama libxrandr wayland-protocols simde uthash nlohmann-json mbedtls3 pciutils srt librist ffnvcodec-headers amf-headers -
Windows:
scripts/obs/assemble-windows.sh(Git Bash) verifies and unpacks the official release zip intotarget/obs-runtime/windows-x86_64, copying files byte-for-byte so the Game Capture hook keeps its signature.
Development builds find the runtime through .cargo/config.toml; clipbin-probe's build script places obs-ffmpeg-mux (and on Windows the OBS DLLs) next to the executable, where OBS looks for them.
On Debian/Ubuntu:
sudo apt-get update
sudo apt-get install build-essential pkg-config libfontconfig1-dev libfreetype6-dev libwayland-dev libxcb1-dev libxkbcommon-dev libxkbcommon-x11-dev libssl-dev
For Windows, use the MSVC Rust toolchain and Visual Studio Build Tools with the Desktop development with C++ workload. Windows support needs validation on a Windows machine; see docs/validation.md.
Run the desktop shell from an active graphical session:
cargo run --locked -p clipbin-desktop
The desktop app needs a working Wayland or X11 session on Linux, or a Windows desktop. It does not start a web server. On this remote development machine, bind any future development server to its tailnet IP.
Use the Quit button or Ctrl+Q to quit.
Checks:
cargo fmt --all -- --check
cargo clippy --locked --workspace --all-targets -- -D warnings
cargo test --locked --workspace
# Windows code paths, from any platform (rustup target add x86_64-pc-windows-msvc):
cargo clippy --locked --target x86_64-pc-windows-msvc -p clipbin-core -p clipbin-obs -p clipbin-probe --all-targets -- -D warnings
Recording validation on Linux, headless: scripts/validate/linux-rig.sh.
The core can also be checked without native UI dependencies:
cargo check --locked -p clipbin-core
First recording milestone
- Validate official OBS capture and recording-health signals on CachyOS, Hyprland and the RX 9070 XT at 1440p60. Rig validated; hardware sign-off pending.
- Select and pin a tested OBS runtime, Rust bindings, and official plugin set together. Preserve the original signed Windows capture-hook binaries. Pinned to OBS 32.0.4 and libobs crate 5.0.1; Windows runtime unvalidated.
- Prove one continuous hardware encoder can produce short keyframe-aligned segments and remux clips across their boundaries while recording continues. Proven in the rig with VA-API H.264 and HEVC.
- Integrate the recorder without blocking GPUI, then add native playback and seeking.
The capture integration uses official OBS components only: Windows Game Capture/Window Capture, X11 Xcomposite, and Wayland PipeWire/desktop-portal capture. Third-party game hooks are excluded.
License
GPL-3.0-only. See LICENSE.