Files
clipbin-desktop/SPEC.md
T

12 KiB

Clipbin recorder v1 specification

This document defines the v1 product requirements agreed on 2026-10-08. See README.md for the current implementation status.

Build an open-source desktop game recorder inspired by Plays.tv, using Rust, GPUI, and libobs through libobs-rs. The core experience is automatic recording, browsing a session while it is still active, saving recent clips, and protecting bookmarked moments.

Platforms and distribution

  • Target Windows and Linux, covering Wayland and X11. Wayland is the user's available Linux test environment; X11 and Windows need their own validation before release.
  • Initial Linux validation setup: CachyOS, Hyprland, AMD Radeon RX 9070 XT, recording at 1440p60.
  • Steam is the v1 game-discovery/launcher integration. The recording core must not depend on Steam-specific data structures so other integrations can be added later.
  • Use official OBS capture components only. Existing community capture plugins, including obs-vkcapture, and custom game hooks are excluded.
  • Windows: upstream OBS Game Capture with original signed hook binaries; official OBS Window Capture is also available.
  • Linux X11: upstream OBS Xcomposite Window Capture.
  • Native Linux Wayland: upstream OBS PipeWire capture using the XDG desktop portal. Offer both window and monitor capture, selected by the user.
  • Restore portal permissions/source selection where supported. If restoration fails, show a recording-needs-attention notification with a select-source action. Automatic recording is conditional on a usable, permitted capture source.
  • Monitor capture includes whatever is displayed on that monitor during alt-tab. Switching from window to monitor capture requires the user's selection; do not silently broaden the capture target.
  • Bundle a pinned, compatible OBS runtime and required official components. Users should not need a separate OBS installation. Graphics drivers remain system-provided.
  • Pin Rust OBS bindings, OBS runtime, and plugins as a tested version set. Exact versions and platform package formats are implementation decisions.

Automatic recording and reliability

  • Start on login by default, with a setting to disable it.
  • Detect recognised Steam games and start recording immediately, without per-game approval or routine manual start/stop.
  • Keep recording when the user alt-tabs, browses footage, edits a range, or exports a clip.
  • Stop/finalise the session when its game exits.
  • Closing the main window leaves background recording active. Provide an explicit Quit action.
  • Normal recording is silent: no routine start/stop notifications or recording overlay.
  • Show honest recording state in the application: waiting for capture, starting, recording, or failed.
  • Report recording only when capture is usable and footage is successfully being written. A detected process, permission grant, or accepted start command alone is insufficient.
  • Source loss, permission failure, encoder failure, output failure, and insufficient physical disk space must clear the recording state and produce a persistent, actionable failure alert.
  • Recover temporary failures automatically with bounded retries. Keep the unavailable/error state until recording actually resumes.
  • Missing footage is represented clearly in the session timeline. Recovery must not imply that the interrupted period was captured.
  • Anti-cheat risk is a primary concern. Use the original official capture foundation, preserve Windows hook signatures, and avoid changing anti-cheat/trust protections to enable capture. Successful capture alone is not evidence of a blanket anti-cheat approval.

Recording defaults and audio

  • Default video: 1080p at 60 FPS.
  • Resolution and frame rate are configurable, including the user's intended 1440p60 configuration.
  • Hardware video codec choices: H.264, HEVC, and AV1. H.264 is the default.
  • Offer a codec as usable only when the runtime/device supports its hardware encoder. Failure to obtain a working encoder follows the honest-status and failure-alert rules.
  • Keep system audio enabled by default.
  • Microphone recording is opt-in.
  • Preserve system and microphone audio on separate tracks, retaining their appropriate channel layouts.
  • Export a combined system/microphone playback track by default, with an option to preserve separate tracks for editing.
  • How quality presets map to individual encoder settings, and any hardware-codec fallback policy, must be chosen during implementation without hiding a recording failure.

Sessions, timeline, and editor

  • Keep complete recorded sessions browsable after gameplay until cleanup removes eligible footage.
  • Provide a session library and a continuous timeline/VOD for each session.
  • Active sessions can be browsed and clipped while their recording continues.
  • The newest footage may appear two to five seconds behind recording while its segment finalises.
  • Do not provide a live recording preview. Decode/play video when the user browses it.
  • Editor controls: play/pause, seeking, thumbnails, bookmark navigation, draggable start/end handles, and audio controls.
  • Clip selection/export uses keyframe-aligned boundaries. Frame-exact cuts are not required.
  • Preserve all selected footage when extending a selection to suitable keyframe boundaries, and show the actual export range.
  • Show unavailable or removed parts of a session honestly. Protect footage currently being edited or exported from cleanup.
  • A clip must remain playable across retained recording segment boundaries.

Clip hotkey and bookmarks

  • Provide independently configurable clip and bookmark actions/hotkeys.
  • The clip hotkey requests the last X time from the moment it is pressed; default X is two minutes.
  • Export the requested range in the background without stopping recording.
  • If the current segment must finish before export, retain the original request timestamp instead of shifting the range to when the job runs.
  • For a shorter newly started session, use the available footage and show its actual duration.
  • Protect source segments until export succeeds. Surface export failures; do not report successful saving before the exported file is complete.
  • The separate bookmark action places a timeline marker and protects a configurable interval.
  • Bookmark defaults: two minutes before and 30 seconds after the marker, independently configurable from the clip duration.
  • Protection for the post-bookmark period applies as that footage is recorded, ending at the actual session end if gameplay exits sooner.
  • Protected bookmarks remain available until the user releases/removes their protection.

Storage and exports

  • Default storage budget: 50 GB, configurable.
  • The budget counts only UNPROTECTED session footage.
  • Protected bookmarked footage and exported clips do not count toward the session budget. Total app storage may therefore exceed the configured budget.
  • Cleanup is storage-based only; there is no age-based expiry.
  • Remove the oldest eligible footage from completed sessions first, then old unprotected footage from the active session when needed.
  • Retain protected bookmark, editing, and export ranges even when neighbouring footage is removed.
  • Exported clips never expire automatically; users can delete them explicitly.
  • Distinguish budget-counted session usage from protected/saved usage in storage information.
  • Physical disk exhaustion remains a hard failure: stop/finalise safely, report that recording is unavailable, and offer corrective actions without silently deleting protected footage.
  • V1 exports local files only, with quick actions to open a clip or its folder.
  • Export MP4 while preserving the recorded video codec.
  • Use remuxing for compatible, keyframe-aligned clips without video re-encoding.
  • Keep capture running independently of export work.

Recording architecture and lightweight operation

  • Preferred architecture: one hardware-encoded video stream written into short, independently usable, keyframe-aligned disk segments.
  • Present those segments as one session timeline. Keep timestamps, segment availability, bookmarks, and retention/protection metadata consistent.
  • Keep recording independent of UI work. UI browsing, thumbnail generation, and export must not block the capture path.
  • Avoid unnecessary CPU frame copies where supported by the official capture path.
  • Generate/cache thumbnails in the background. Decode playback video on demand and keep work/queues bounded.
  • Prioritise recording over background thumbnails and exports.
  • Best-effort lightweight operation is the v1 performance goal.
  • No numerical FPS/frametime overhead promise, performance-monitoring feature, or formal benchmark programme is required in v1. Recording health checks remain required to support honest status.

Acceptance checks for implementation

  1. A recognised Steam game starts a recording session automatically with a usable permitted source; exiting the game finalises it.
  2. Alt-tab, closing the main window, playback, range selection, and export leave recording active.
  3. Portal cancellation/revocation, source loss, encoder failure, and disk-write failure never leave a false recording status or a false successful-export status.
  4. Recovery preserves a visible timeline gap for footage that was not captured.
  5. The clip hotkey saves the default last two minutes using its request timestamp, including a range crossing segment boundaries.
  6. Bookmark protection covers its configured pre/post interval and survives cleanup of adjacent footage.
  7. The 50 GB default budget evicts only unprotected session footage; bookmarks and exported clips remain outside it.
  8. MP4 exports preserve the chosen recorded codec and provide the agreed default/optional audio tracks.
  9. The GPUI editor plays and seeks retained footage across segment boundaries, including active sessions within the agreed availability delay.
  10. Packaged builds use a verified compatible OBS/bindings/plugin set on Windows, Wayland, and X11.

Implementation validation before building out the UI

  • Prove the pinned official OBS capture/runtime path on CachyOS/Hyprland/RX 9070 XT, including permission restoration and capture-health failure detection.
  • Verify hardware encoder availability for H.264, HEVC, and AV1 on each supported platform/device combination.
  • Verify short keyframe-aligned segment rollover with one continuous encoder, export across boundaries, and the two-to-five-second availability window. Do not assume the Rust convenience wrapper exposes every required OBS output option.
  • Prototype GPUI playback, seeking, and the agreed audio handling for all offered codecs.
  • Establish the global hotkey integration for Windows, Wayland, and X11 using supported OS/desktop mechanisms.
  • Establish game/process/session identity rules, including startup discovery, launchers spawning child processes, and ambiguous simultaneous games.
  • Establish recovery of session metadata/completed segments after an unexpected process exit.
  • Confirm distribution/licensing requirements for the pinned components. Exact playback backend, packaging formats, default hotkey bindings, and retry intervals can be selected during implementation.

Primary sources checked during the interview