{"id":51097938,"url":"https://github.com/nicolasarnouts/clipfix","last_synced_at":"2026-06-24T08:01:38.639Z","repository":{"id":366191509,"uuid":"1251475011","full_name":"NicolasArnouts/ClipFix","owner":"NicolasArnouts","description":"Record a bug, get coding-agent context: annotated keyframes + a brief for Cursor, Claude Code \u0026 Codex. Open-source macOS app, powered by Gemini.","archived":false,"fork":false,"pushed_at":"2026-06-20T16:28:16.000Z","size":24283,"stargazers_count":3,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2026-06-20T18:17:00.906Z","etag":null,"topics":["ai","claude-code","coding-agents","cursor","developer-tools","devtools","gemini","llm","macos","open-source","productivity","rust","screen-recording","screencapturekit","tauri"],"latest_commit_sha":null,"homepage":"https://clipfix.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NicolasArnouts.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-27T16:03:18.000Z","updated_at":"2026-06-20T16:28:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/NicolasArnouts/ClipFix","commit_stats":null,"previous_names":["nicolasarnouts/clipfix"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/NicolasArnouts/ClipFix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NicolasArnouts%2FClipFix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NicolasArnouts%2FClipFix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NicolasArnouts%2FClipFix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NicolasArnouts%2FClipFix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NicolasArnouts","download_url":"https://codeload.github.com/NicolasArnouts/ClipFix/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NicolasArnouts%2FClipFix/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34722710,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","claude-code","coding-agents","cursor","developer-tools","devtools","gemini","llm","macos","open-source","productivity","rust","screen-recording","screencapturekit","tauri"],"created_at":"2026-06-24T08:01:37.450Z","updated_at":"2026-06-24T08:01:38.626Z","avatar_url":"https://github.com/NicolasArnouts.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"apps/desktop/src-tauri/icons/128x128@2x.png\" width=\"116\" alt=\"ClipFix logo\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eClipFix\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eRecord the bug. Paste the fix context.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://clipfix.dev\"\u003eWebsite\u003c/a\u003e\n  \u0026nbsp;·\u0026nbsp;\n  \u003ca href=\"https://github.com/NicolasArnouts/ClipFix/releases/latest\"\u003eDownload\u003c/a\u003e\n  \u0026nbsp;·\u0026nbsp;\n  \u003ca href=\"#install\"\u003eInstall\u003c/a\u003e\n  \u0026nbsp;·\u0026nbsp;\n  \u003ca href=\"#command-line-cli\"\u003eCLI\u003c/a\u003e\n  \u0026nbsp;·\u0026nbsp;\n  \u003ca href=\"https://github.com/NicolasArnouts/ClipFix/issues\"\u003eReport a bug\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/NicolasArnouts/ClipFix/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/NicolasArnouts/ClipFix?style=flat-square\u0026label=release\u0026color=2ea043\" alt=\"Latest release\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/NicolasArnouts/ClipFix?style=flat-square\u0026color=blue\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/NicolasArnouts/ClipFix/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/downloads/NicolasArnouts/ClipFix/total?style=flat-square\u0026color=8957e5\" alt=\"Downloads\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/macOS-15%2B-black?style=flat-square\u0026logo=apple\u0026logoColor=white\" alt=\"macOS 15+\"\u003e\n  \u003ca href=\"https://tauri.app\"\u003e\u003cimg src=\"https://img.shields.io/badge/built%20with-Tauri%20v2-24C8D8?style=flat-square\u0026logo=tauri\u0026logoColor=white\" alt=\"Built with Tauri\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/NicolasArnouts/ClipFix/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/NicolasArnouts/ClipFix?style=flat-square\u0026color=f0b72f\" alt=\"Stars\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n**ClipFix** is an open-source macOS app that turns a short screen recording into context your **coding agent** can actually read. Record a bug — or drop in a clip — and ClipFix watches it once with **Google Gemini**, then hands back annotated keyframes, a written brief, and a paste-ready prompt for Cursor, Claude Code, Codex, or any multimodal agent. Built with **Tauri** and **Rust**; your recordings and API key never leave your Mac except to call Gemini.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"examples/login-bug/context-pack.png\" width=\"620\" alt=\"A ClipFix context pack: three annotated keyframes of a login bug, stitched into one image with colored bounding boxes around the broken regions\"\u003e\n  \u003cbr\u003e\n  \u003csub\u003e\u003cb\u003eWhat your agent gets\u003c/b\u003e — annotated keyframes stitched into one image, paired with a written brief. \u003ca href=\"examples/login-bug/\"\u003e(a real, unedited run)\u003c/a\u003e\u003c/sub\u003e\n\u003c/p\u003e\n\n## Why\n\nBug reports decay between brain and keyboard. By the time you've typed \"the dropdown closes when I scroll,\" you've forgotten the three other things you noticed in the recording. Pasting raw video into an agent works, but each agent treats video differently and the signal-to-noise is poor.\n\nClipFix sits between the recording and the agent. It watches the clip once, on your behalf, and produces something paste-ready: a short written brief, the handful of frames that matter (annotated with bounding boxes around the broken regions), and a single stitched image your agent can glance at to orient itself.\n\nNo account. No telemetry. No background daemon. The output is plain files on your disk; the prompt is plain text pointing at them.\n\n## How it works\n\n```\n   record  ─or─  drop a clip\n        │\n        ▼   one Gemini 3.5 Flash call (structured output, MEDIA_RESOLUTION_MEDIUM)\n   context pack  ──►  ffmpeg pulls the chosen keyframes, boxes + captions drawn on\n        │\n        ▼\n   ~/.clipfix/sessions/\u003ctimestamp\u003e-\u003cslug\u003e/\n        │\n        ▼   a smart prompt waiting on your clipboard\n   paste into Cursor · Claude Code · Codex · anything multimodal\n```\n\n1. **Capture.** Hit record (⌃⌘R or the tray), reproduce the bug, stop. ClipFix hides its own window and records the screen with ScreenCaptureKit. Or just drag a `.mov`/`.mp4` onto the window.\n2. **Analyze.** One Gemini pass picks the load-bearing frames, writes a brief, and marks the broken regions with bounding boxes. An optional second pass tightens those boxes.\n3. **Review.** Walk the keyframes with timestamps and captions, scrub the source recording, read the brief.\n4. **Hand off.** Click **Copy prompt** — a structured, paste-ready prompt (pointing at the keyframes and brief) is on your clipboard for your coding agent.\n\n## Screenshots\n\n\u003cdiv align=\"center\"\u003e\n\u003ctable\u003e\n\u003ctr\u003e\n  \u003ctd align=\"center\" width=\"33%\"\u003e\n    \u003cimg src=\"assets/screenshots/01-drop.png\" alt=\"ClipFix start screen — drop a screen recording, or record one, to begin\"\u003e\n    \u003cbr\u003e\u003csub\u003e\u003cb\u003eDrop a clip — or record one\u003c/b\u003e\u003c/sub\u003e\n  \u003c/td\u003e\n  \u003ctd align=\"center\" width=\"33%\"\u003e\n    \u003cimg src=\"assets/screenshots/02-analyze.png\" alt=\"ClipFix analyzing a recording — a live progress stepper from compressing to saving the session\"\u003e\n    \u003cbr\u003e\u003csub\u003e\u003cb\u003eWatch it read the recording\u003c/b\u003e\u003c/sub\u003e\n  \u003c/td\u003e\n  \u003ctd align=\"center\" width=\"33%\"\u003e\n    \u003cimg src=\"assets/screenshots/03-keyframes.png\" alt=\"ClipFix keyframe walkthrough — captured frames annotated with orange bounding boxes and captions\"\u003e\n    \u003cbr\u003e\u003csub\u003e\u003cb\u003eKeyframes, annotated with the fix\u003c/b\u003e\u003c/sub\u003e\n  \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n  \u003ctd align=\"center\" width=\"33%\"\u003e\n    \u003cimg src=\"assets/screenshots/04-pack.png\" alt=\"ClipFix context pack — the keyframes stitched into one image to paste into a coding agent\"\u003e\n    \u003cbr\u003e\u003csub\u003e\u003cb\u003eOne stitched image for your agent\u003c/b\u003e\u003c/sub\u003e\n  \u003c/td\u003e\n  \u003ctd align=\"center\" width=\"33%\"\u003e\n    \u003cimg src=\"assets/screenshots/05-result.png\" alt=\"ClipFix result view — replay the source recording, Copy prompt, and Reveal in Finder\"\u003e\n    \u003cbr\u003e\u003csub\u003e\u003cb\u003eReplay, copy, hand off\u003c/b\u003e\u003c/sub\u003e\n  \u003c/td\u003e\n  \u003ctd align=\"center\" width=\"33%\"\u003e\n    \u003cimg src=\"assets/screenshots/06-record.png\" alt=\"ClipFix recording indicator — a floating pill with a record dot, mic-level meter, timer, and stop button\"\u003e\n    \u003cbr\u003e\u003csub\u003e\u003cb\u003eRecord from the menu bar\u003c/b\u003e\u003c/sub\u003e\n  \u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n## Install\n\n### Desktop app (macOS)\n\n\u003e **Requirements:** macOS 15 (Sequoia) or later · a free [Gemini API key](#set-up-your-gemini-api-key). ffmpeg is **bundled** — nothing else to install.\n\n**Homebrew (recommended)**\n\n```sh\nbrew install --cask nicolasarnouts/clipfix/clipfix\n```\n\n**Direct download**\n\nGrab the latest `.dmg` from the [**Releases** page](https://github.com/NicolasArnouts/ClipFix/releases/latest), open it, and drag **ClipFix** into `/Applications`.\n\n| Your Mac | Download |\n|---|---|\n| Apple Silicon (M1–M4) | `ClipFix_0.1.0_aarch64.dmg` |\n| Intel | `ClipFix_0.1.0_x64.dmg` |\n\n\u003e Not sure which? → Apple menu → **About This Mac**: \"Apple M…\" is Apple Silicon, \"Intel\" is x64.\n\nThe app is **signed and notarized**, so it opens straight away — no Gatekeeper warning. It also **auto-updates in the background**, so you install once. *(If an older macOS ever blocks it, right-click the app → **Open** → **Open**; only needed once.)*\n\n### Set up your Gemini API key\n\nClipFix runs one Gemini Flash call per clip, with your own key.\n\n1. Get a **free** key at [aistudio.google.com/apikey](https://aistudio.google.com/apikey).\n2. Open ClipFix → **Settings → API key** → paste it → **Save**.\n\nYour key is stored in a private, owner-only file on your Mac and only ever leaves your machine to call the Gemini API directly. The free tier covers typical daily use; see [Google's pricing](https://ai.google.dev/pricing) if you hit a limit. No ClipFix account, ever.\n\n### Command-line (CLI)\n\nPrefer the terminal? The same engine ships as a self-contained `clipfix` binary.\n\n```sh\ngit clone https://github.com/NicolasArnouts/ClipFix.git\ncd ClipFix\ncargo install --path crates/clipfix-cli\n```\n\n```sh\nexport GEMINI_API_KEY=your_key_here\nclipfix analyze recording.mp4          # smart prompt lands on your clipboard\nclipfix analyze recording.mp4 --refine-boxes   # second pass to tighten boxes\nclipfix verify-key                     # check your key is valid\n```\n\n\u003e The CLI uses the `ffmpeg`/`ffprobe` on your `PATH` (`brew install ffmpeg`). It writes to a project-local `.clipfix/` — add `.clipfix/` to your global gitignore: `echo '.clipfix/' \u003e\u003e ~/.config/git/ignore`.\n\n## Features\n\n| | |\n|---|---|\n| 🎬 **Record in-app** | Capture the screen with ScreenCaptureKit; ClipFix hides its own window first. Global hotkey **⌃⌘R**, menu-bar tray, live timer + mic meter, auto-stop safety cap. |\n| 📥 **Or drag a clip in** | Drop `.mp4` / `.mov` / `.webm` / `.mkv` / `.m4v` / `.avi` — same pipeline. |\n| 🧠 **One smart pass** | A single Gemini 3.5 Flash call picks the keyframes, writes the brief, and boxes the broken regions. Optional refine pass sharpens the boxes. |\n| ✂️ **Review \u0026amp; trim** | Preview every clip before analysis — trim, re-record, or discard. Long clips are gated automatically. |\n| 🗂️ **One library** | Every capture is kept under `~/.clipfix/`, with **Copy prompt** and **Reveal in Finder** on each. |\n| 🔁 **Auto-updates** | Signed, notarized, and self-updating via a minisign-verified release feed. |\n| 🔒 **Private by default** | No account, no telemetry, no daemon. Key stored locally on your Mac; only the clip you analyze is sent to Gemini. |\n| ⌨️ **CLI too** | The same Rust engine as a scriptable `clipfix analyze … --json` binary. |\n\n## What's in a pack\n\nEvery run writes a session directory under `~/.clipfix/sessions/` and points `~/.clipfix/latest` at the newest one:\n\n- **`prompt.md`** — the written brief: what's happening, what's likely wrong, what to look at.\n- **`keyframes/`** — the frames Gemini chose, each annotated with bounding boxes and a one-line caption (`keyframes-clean/` holds the box-only versions).\n- **`context-pack.png`** — all the keyframes stitched into one image, for agents that prefer a single attachment.\n- **`manifest.json`** — provenance: video SHA-256, model id, prompt version, latency, cost, validation status.\n\nThe **smart prompt** is the glue — it tells the receiving agent where to look:\n\n\u003e Please fix the UI issue described in `.clipfix/latest/prompt.md`. Inspect the keyframes in `.clipfix/latest/keyframes/` for the visual context, and look at `.clipfix/latest/context-pack.png` for a stitched overview. Use that context to identify and implement the smallest correct fix.\n\n## See a real run\n\n[`examples/`](examples/) holds two unedited, committed ClipFix runs — frozen output you can browse without installing anything.\n\n- [**`examples/login-bug/`**](examples/login-bug/) — a login form rejects the correct password; the keyframes catch a hardcoded `value` on the password `\u003cinput\u003e` in DevTools. *(`$0.018`, ~105 s, `gemini-3.5-flash`.)*\n- [**`examples/connection-bug/`**](examples/connection-bug/) — multiple terminal shells stall on \"Connecting…\"; the frames show the partial-connection state.\n\n## Privacy\n\nClipFix is built to be boring about your data, on purpose.\n\n- **No account, no sign-up, no telemetry.** Nothing phones home.\n- **Your recordings stay on your Mac** — plain files under `~/.clipfix/`.\n- **Only the clip you analyze is sent to Gemini**, over a direct call with *your* key. ClipFix has no server in the middle.\n- **Your API key is stored in a private, owner-only file on your Mac** (`~/Library/Application Support/com.clipfix.desktop/`) — never synced, never sent anywhere except Gemini.\n\n## Under the hood\n\nClipFix is one Rust analysis engine with thin front ends:\n\n- **Tauri v2** desktop app (Rust backend + a vanilla TypeScript/Vite frontend) that calls the engine **in-process** — no subprocess, no PATH lookup.\n- **`clipfix-core`** — the engine: transcode → one **Gemini 3.5 Flash** call with structured JSON output → frame extraction → bounding-box annotation (rendered with `image`/`imageproc`, EB Garamond) → bundle.\n- **ffmpeg + ffprobe** ship as **signed sidecar binaries** inside the app, resolved by absolute path at runtime — users never install them.\n- **API key** in a `0600` file under the app-data dir; recording via **ScreenCaptureKit** (`SCRecordingOutput`, direct-to-MP4).\n\n## Project layout\n\n- **`apps/desktop`** — the macOS app (Tauri). The flagship.\n- **`crates/clipfix-core`** — the analysis engine; the single source of truth.\n- **`crates/clipfix-cli`** — the `clipfix` CLI, a thin wrapper over the core.\n- **`python/clipfix`** — a prompt/quality experimentation lab. *Not* the shipped product.\n\n## Roadmap\n\n- **Windows** — recording + a signed installer are designed and parked behind a build/verify environment ([#87](https://github.com/NicolasArnouts/ClipFix/issues/87)).\n- **LGPL ffmpeg** — swap the bundled GPL ffmpeg for an LGPL build ([#132](https://github.com/NicolasArnouts/ClipFix/issues/132)).\n- **Eval harness** — v0 ships at gut-feel quality; metrics come next.\n\n## Contributing\n\nIssues and PRs welcome. PRs target the **`develop`** branch. If a pack reads well, the design is working — if it doesn't, please [open an issue](https://github.com/NicolasArnouts/ClipFix/issues).\n\n## License\n\n[MIT](LICENSE) © 2026 Nicolas Arnouts.\n\nClipFix bundles **ffmpeg/ffprobe** (GPL-2.0-or-later) as separate binaries — see [THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md) for the full notices and corresponding-source links.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnicolasarnouts%2Fclipfix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnicolasarnouts%2Fclipfix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnicolasarnouts%2Fclipfix/lists"}