No description
  • Rust 62.3%
  • JavaScript 20.6%
  • CSS 8.9%
  • HTML 6.4%
  • PowerShell 1.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-11-02 01:46:40 -05:00
releases Add in-app updates (0.2.0) 2026-11-02 01:40:41 -05:00
scripts release.ps1: send text, not PowerShell objects; add -PublishOnly 2026-11-02 01:46:40 -05:00
src-tauri Add in-app updates (0.2.0) 2026-11-02 01:40:41 -05:00
ui Add in-app updates (0.2.0) 2026-11-02 01:40:41 -05:00
.gitignore Initial commit: Clipy 0.1.0 2026-11-02 01:17:10 -05:00
README.md Add in-app updates (0.2.0) 2026-11-02 01:40:41 -05:00

Clipy

Lightweight instant-replay clipping for Windows. Records your screen continuously into a small on-disk ring buffer; press the hotkey (default Alt+F8) to save the last N seconds.

Build

cd src-tauri
cargo build --release

Output: src-tauri/target/release/clipy.exe. Needs ffmpeg (winget install Gyan.FFmpeg). The installer bundles src-tauri/ffmpeg/ffmpeg.exe, which isn't in the repo (it's ~220 MB): copy your ffmpeg.exe there before building the installer.

Releasing

  1. Set the new version in src-tauri/tauri.conf.json and src-tauri/Cargo.toml.
  2. Write the notes in releases/<version>.md. They show in the app's update prompt.
  3. Commit, then run powershell -ExecutionPolicy Bypass -File scripts\release.ps1.

The script builds the installer, signs it for the updater, tags and pushes, and publishes the release on git.madebydomo.com with Clipy_X.Y.Z_x64-setup.exe, its .sig and latest.json. Keep that installer name: the website's download button looks for it.

Installed copies check the latest release 30 s after starting and every 6 hours, and ask before updating. The updater only runs an installer signed with the private key in %USERPROFILE%\.tauri\clipy-updater.key (never in the repo). Back that file up: without it, installed copies can't be updated anymore.

How it stays light

Piece What it costs Why
clipy.exe (tray) ~4 MB RAM Pure Rust, no UI while the window is closed
ffmpeg recorder ~86 MB RAM, ~0% CPU ddagrab keeps frames on the GPU, NVENC encodes on its own chip
Library window ~200 MB, only while open Closing it destroys the WebView entirely; recording carries on
Replay buffer 0 RAM, ~10–40 MB disk 2-second MPEG-TS segments that ffmpeg overwrites in a ring

Saving a clip stitches the newest segments with -c copy (no re-encode), so it takes well under a second and doesn't touch game performance.

Layout

src-tauri/src/main.rs      tray, hotkey, window lifecycle, UI commands
src-tauri/src/recorder.rs  ffmpeg ring buffer, watchdog, clip saving
src-tauri/src/library.rs   clip listing, thumbnails, delete (Recycle Bin)
src-tauri/src/settings.rs  %APPDATA%\Clipy\settings.json
src-tauri/src/updater.rs   update check (Forgejo releases) and signed install
ui/                        AMOLED library + settings (plain HTML/CSS/JS, no bundler)

Clips: Videos\Clipy. Thumbnails/metadata: Videos\Clipy\.clipy.

Features

  • Hotkey (Alt+F8) or voice ("clip that") saves a clip. Voice uses the Windows speech recognizer with the phrase plus decoys, fully offline, on a mic you choose.
  • Save sound: synthesized in code (sound.rs), no asset files.
  • Start with Windows: HKCU\...\Run entry with --tray, so boot launches record silently.
  • Library: sort by date or group by app (taken from the focused window when you save), click a title to rename, frame-accurate trim (original goes to the Recycle Bin).

Sharing & library

  • Copy (Ctrl+C / right-click / player) puts the file on the clipboard like Explorer does (clipboard.rs), so Ctrl+V in Discord uploads it.
  • Export presets (export.rs): MP4, HEVC, GIF or MP3, with an optional size cap. A cap works out the bitrate from the clip's length, picks a resolution that bitrate can carry, encodes on the GPU, and retries smaller if it overshoots. Clips that already fit are copied untouched; a "smaller" export never comes out bigger than the source. Defaults cover Discord (10 MB), Nitro Basic (50 MB), Nitro (500 MB), HEVC, GIF and MP3; all editable in Settings.
  • Screenshots (Alt+F7) are PNGs in the clips folder, made by a short-lived second Desktop Duplication session (~0.4 s).
  • Favorites are stored in each clip's sidecar JSON. Filters: type, app, date range, sort, group by app.

Audio

audio.rs captures game/desktop sound (WASAPI loopback) and the mic, each fed to ffmpeg as raw 48 kHz float over a named pipe. Feeds are paced to the wall clock. Loopback stops delivering during silence, so gaps are padded rather than letting audio drift from video. Clips carry Desktop + Mic (default, what Discord/browsers play), then Desktop and Mic separately for editing.