Files
clipbin-desktop/SPEC.md
T

134 lines
12 KiB
Markdown

# Clipbin recorder v1 specification
This document defines the v1 product requirements agreed on 2026-10-08. See [README.md](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
- OBS Game Capture availability and modes: https://obsproject.com/kb/game-capture-source
- OBS Window Capture sources: https://obsproject.com/kb/window-capture-sources
- Official X11 source registration: https://github.com/obsproject/obs-studio/blob/master/plugins/linux-capture/linux-capture.c
- Official PipeWire/portal implementation and restoration: https://github.com/obsproject/obs-studio/blob/master/plugins/linux-pipewire/screencast-portal.c
- Portal persistence and restoration limits: https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.ScreenCast.html
- OBS signed capture-hook compatibility: https://obsproject.com/kb/capture-hook-certificate-update
- Rust OBS bindings, platform notes, API stability: https://github.com/libobs-rs/libobs-rs