- Rust 62.3%
- JavaScript 20.6%
- CSS 8.9%
- HTML 6.4%
- PowerShell 1.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| releases | ||
| scripts | ||
| src-tauri | ||
| ui | ||
| .gitignore | ||
| README.md | ||
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
- Set the new version in
src-tauri/tauri.conf.jsonandsrc-tauri/Cargo.toml. - Write the notes in
releases/<version>.md. They show in the app's update prompt. - 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\...\Runentry 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.