OpenChatCut
A local-first video editor whose editing surface is a conversation: the built-in agent and external Codex or Claude Code sessions call the same editing tools the interface itself uses, so every change lands on a real multi-track timeline as a clip, transition, caption, effect or audio item that can still be dragged, undone and exported. Projects and media stay on the machine, and preview and final render both come out of Remotion.

What it is
An open-source, local-first video editor whose editing surface is a chat. An agent reads the project and changes it through the same command layer the interface uses, so every edit lands on a professional multi-track timeline as a clip, transition, caption, effect or audio item that stays draggable, undoable, versioned and exportable. The built-in agent runs on API keys you supply, or on a ChatGPT, Claude, Copilot or Grok subscription through that vendor’s own command-line tool; external Codex, Claude Code, Qoder and Qwen Work clients reach the same tools over a local Streamable HTTP MCP endpoint, through draft sessions that are reviewed before they touch the live timeline. Projects, chat history, versions and media live in a store under the user data directory, with an optional Cloudflare R2 bucket for cloud-only media. Preview and headless render both run through Remotion, FFmpeg and a WebGL effect pipeline sit behind export, and local H.264 encoding prefers VideoToolbox on macOS and NVENC on Windows before falling back to software. TypeScript, React, Electron, AGPL.
Who built itWritten almost entirely by one account: 827 of the repository’s 1,029 commits, with the second-largest contributor at 73 and twenty-four more people carrying a handful each. 103 commits carry a co-author trailer, and the largest group among them — forty-five — names Claude Opus 5.5; Cursor and Copilot appear seven times each.
How it is put together
The parts · 6A React editor and an agent runtime sharing one command layer, in three processes that may or may not be the same process. The timeline is immutable state plus a command layer, kept independent of both the interface and any model; the agent assembles tools over those commands, so the built-in agent, external MCP clients and the command line all perform the same operations, and a proposal that is rejected can be dropped without having touched the live project. Local-first is taken literally: projects, chat, versions and media live in a store under the user data directory, IndexedDB is a browser-side cache with a migration path, the media directory is a setting, and the only cloud storage in the default architecture is optional. Preview and the headless render are the same Remotion compositions, which is why so much of the export work is about making a browser engine, a local renderer and the FFmpeg encoders show the same frames. Verification is part of the architecture rather than a stage after it: 640 of the 2,772 files are checks, a script runs only the ones a change affects, and pull-request verification was wired in after the project had already shipped fourteen versions.
- src/agent/
- The largest area of the code, at 503 files and about 3.2 MB: assembly, tool definitions, skills, progress and settings. Thirty skill directories under
src/agent/skills/hold 85 files, from a 62 KB talking-head guide down to short routing skills, and the generated tool catalogue atassets/agent/openchatcut-tool-schemas.jsonis 266 KB on its own. - src/editor/
- 124 files holding the timeline the README describes as independent of UI and LLMs: the command builder at 23 KB, the clip, track, project and transcript reducers, keyframes, slip, ripple, snapping, sequence graphs, multicam switching and timecode. Every one of the operations an agent can ask for exists here first.
- server/plugins/, server/agent-runs/ and server/external-agent/
- The service side, 183, 42 and 56 files: generation, transcription, media probing, export planning and storage; the server-owned model loop with its run store, event window and tool policy; and the MCP bridge, edit-session ownership and the offline runtime that lets an external agent work while the app is closed.
- remotion/, src/export/ and src/gl/
- The render and look pipeline, 15, 71 and 164 files. The Remotion side holds the render entry point, a render contract, two video decoders and the export concurrency benchmarks; the export side plans media, checks quality and recovers jobs; the GL side carries effects and transitions, each shader shipped as a
.fragfile beside a generated module. - desktop/, cli/ and config/
- The packaging and automation layer, 88, 13 and 5 files: the Electron main process with its embedded services and native inference workers, the
occcommand line built with esbuild, and the Vite and electron-builder configuration that produce web, AppImage, NSIS and two macOS targets. - assets/ and src/i18n/
- The weight that is not code: 115 font files at 21 MB, 236 thumbnail images, 39 sound effects, 35 voice samples, two LUTs and 13 MB of bundled model files. Four interface languages sit beside it, the Russian dictionary alone being a single 246 KB module.
Choices, and what they beat
One editing command layer for the editor, the built-in agent and every external client over separate agent-facing project formats or a second editing API
Stated in the README: external agents invoke the same internal editing tools and
EditorCorecommands as the editor itself, there are no separate project formats that can drift apart, and the live timeline is not changed while an external draft is being prepared. The same boundary is what makes an agent edit undoable and reviewable at all.Remotion compositions for both the preview and the final render over one renderer for what you see and another for what you get
The README lists Remotion as the core foundation for preview, composition and server-side rendering, and the project pays for the choice by testing the two decoders against each other: a macOS job asserts that both server video decoders show the frames the player shows. When Chrome’s decoder misbehaved on Windows, the answer was to move that platform onto Remotion’s FFmpeg compositor rather than to patch a third path.
The server owns the agent loop while the editor keeps the timeline over giving the server authority to modify the project itself
Server-side execution shipped opt-in in 0.2.1 and became the only path in 0.2.2, which is a fast reversal, and the reason it could be made safely is the boundary kept in place: the editor still applies every change as a normal undoable command, external sessions are bound to project and editor revisions, and only draft-safe tools are exposed because a rejected proposal could not roll back a generation or an export.
Grow the project schema additively instead of breaking it over bumping the format and migrating everything forward
The content-addressed media identity added in 0.2.0 was kept inside the public v3 schema so that v0.1.9 can still read a project a newer build saved, and the surrounding stores were changed to preserve records they cannot parse rather than discard them on the next write.
No ceiling on tool turns, with named protections instead over a fixed tool-call limit per turn
The changelog says the loop no longer caps tool turns and the model decides when the task is done, replacing the ceiling with retries, parallel reads behind an exclusive barrier for writes, pressure-driven compaction, recovery closers and a rolling event window. Issue #186 confirms the old ceiling was real and badly surfaced: a turn stopped at exactly 100 accepted tool requests and reported a 404 rather than a limit.
Read fromREADME.md (31,696 characters) with its architecture and directory tables and its technical-foundations list, CHANGELOG.md (951 lines, 149 KB) read from 0.1.0 through 0.2.15, package.json, .github/workflows/ci.yml, src/agent/skills/NOTICE.md, skills/openchatcut/SKILL.md, and the recon report’s directory summary and complete 2,772-file tree with sizes.
Build log
6 stages- 01
Ten weeks, a thousand commits and twenty-six versions
The repository was created on 2026-07-15 and its first commit is dated 2026-07-20; the thousand-and-twenty-ninth arrives on 2026-09-30. 1,029 commits, 676 of them in August alone and 229 in September, against 124 in the ten days of July that were left. The bilingual changelog documents twenty-six versions, from
0.1.0on 2026-07-20 to0.2.15on 2026-09-28, and the published release list shows twenty of them,v0.1.6throughv0.2.15, including five in the three days around 2026-08-17. It is a large program for ten weeks: 2,772 files across 156 directories, about 119 MB, of which 640 files are named after checks rather than features. Around it sit 2,061 stars, 314 forks, eight watchers and sixteen open issues. Twenty-six contributors are listed, and although 1,016 of the commits resolve to a linked account, the shape is still one person: 827 commits from the owner, 73 from the next contributor, twenty-four others with a handful each. 103 commits carry a co-author trailer, the largest group of forty-five naming Claude Opus 5.5, with Cursor and Copilot seven each. - 02
The render path: two engines shipped, and the bill for that
Export is where the hard choices were made, and they were made by shipping both sides. Version 0.1.2 added WebCodecs-accelerated browser export with progress and cancellation that falls back automatically to the server renderer, plus hardware-aware local H.264 that probes FFmpeg for VideoToolbox on macOS and NVENC on Windows and falls back to software. The same release made Remotion concurrency aware of CPU and memory, queued heavy exports globally, and normalized variable-frame-rate media before playback. On Windows the local renderer now decodes with Remotion’s FFmpeg compositor instead of Chrome’s WebCodecs, whose D3D11 hardware decoder could stop producing frames without an error and leave an export at about 10% until it timed out; macOS and Linux keep theirs, and
CC_RENDER_VIDEO_DECODER=webcodecs|offthreadpicks one by hand. GLSL transitions exported frames from several frames earlier, because each input was drawn before its video had finished seeking; both now come from the export’s own decoder. Browser fast export had inherited Remotion’s thirty-second per-frame default while the local renderer allowed far more, so one project could fail on one engine and render on the other; both now share a ten-minute per-frame budget. Automatic 4K hardware bitrate was capped at 30 Mbps while the dialog promised 60, and now resolves to 40 Mbps at 4K30 and 60 at 4K60. - 03
Timeline geometry as one pass, and a format that refuses to strand older builds
The timeline is the other place where the architecture had to be decided rather than grown. Version 0.1.8 unified it around playback-rate-aware source-time and source-window helpers, with one transition-reconciliation pass shared by move, retime, split, trim, ripple and overwrite, which is why the same release could add slip and rate-stretch modes, insert and overwrite placement, nested sequences, source timecode and sync-lock groups together. Version 0.2.0 added content-addressed media identity, a streaming SHA-256 carried through the browser, multipart, agent and desktop import paths, and deliberately kept the new metadata inside the public v3 project schema so that v0.1.9 can still read projects saved by a newer build. The code keeps that promise the other way too: version history, export history, templates and the job registry preserve records the running build cannot parse instead of dropping them on the next write, a project this build could not read is no longer overwritten by the next save, and media referenced only by a snapshot in a newer format is protected from cleanup. The defects are the same story read backwards: slip editing resolved a source duration by URL even when the clip carried an explicit asset id, so with two pool entries at one URL a 600-frame source was clamped using the first 300-frame entry and an in-point of 540 came out as 240.
- 04
Moving the agent loop to the server, and what the editor kept
Version 0.2.1 made server-side execution of the agent loop opt-in; version 0.2.2, published the same day, made it the only path and removed the browser-side model loop, with chat, drafts, settlements and proposals persisted server-side through a single-writer ledger that survives page refreshes and local service restarts. That is a split-authority problem by construction, and the code answers it by refusing to hand the server the timeline: the server owns the model loop, the editor still executes every change through the same validated, undoable
EditorCorecommands a human edit uses, and external MCP sessions are bound to project and editor revisions so a stale draft cannot win. The same release removed the cap on tool turns and let the model decide when it is done, protecting long runs with retries on transient provider errors, parallel execution of read-only tools behind an exclusive barrier for mutating ones, pressure-driven context compaction, recovery closers for interrupted tool calls and a rolling event window. Issue #186 shows what a fixed ceiling costs: a long turn accumulated exactly 100 accepted tool requests, 84 allowed and 16 denied, and died with a misleading HTTP 404 instead of a limit message; the fix removed the cap and lifted two further ceilings a long turn would have reached next. - 05
The issue tracker used as a development diary
The tracker reads like a log because the maintainer answers in it. One reporter running the Linux source deployment filed six numbered issues on 2026-09-28: a locked
onnxruntime-nodeCUDA postinstall that breaksnpm ci, a blank editor over plain HTTP withcrypto.randomUUID is not a function, a media-pool duration that changes with the active sequence frame rate, local media browsing that is desktop-only, and the tool-call ceiling. The replies name the cause and the fix status: the 404 one was answered the next day, because the store-level reproduction made it quick to pin down; the browsing one was kept open, with the reason stated, that enabling it for the web editor needs an explicit server-root allowlist since an emptyAGENT_IMPORT_ROOTSmeans unrestricted access, and that it is not in v0.2.15. A newcomer whose provider streamed an empty tool-call type got a fix onmainthe same day, derived from the pasted response body, with the issue left open until the release ships. Beyond bug reports, contributors brought integrations: GitHub Copilot and Claude Code as agent backends, Requesty, OFox and Fal.ai as providers, three montage workflows, and one-click MCP setup for Qoder. One provider pull request was declined for a commercial reason: adding a vendor gateway as a built-in preset is a business placement, and those are handled as partnerships. - 06
What the author wrote down about what did not work
The reason this repository is worth reading is how much of the failure is on the record. The continuous integration file carries its own history in a comment: pull requests were not covered until 2026-08-31, and it showed, because a pull request sat open failing the build with nothing to tell its author — so the comment now says that a pull request which cannot build must say so on the pull request. A later pull request body admits that the full local build was blocked during native Whisper preparation by the local compiler and SDK combination, and defers the complete build to CI. A benchmarking pull request reports that four workers rendered two short 4K60 tests about 26–28% faster than the warm automatic thirteen-worker baseline on a 16-core M4 Max, changes no runtime default, and states plainly that further testing is needed on longer timelines, more complex compositions and other Macs before an automatic policy change could be recommended. The 0.2.13 notes record a Windows-only crash that escaped testing precisely because the recovery was gated to Windows, where it had been written; the 0.2.12 notes say that Windows local transcription had never actually run, because packaging had moved the executable away from its libraries, so every model tier died on a bare exit code.
Adjacent records
All records →No. 061
Reticle
An MCP server and a dev-only SDK that let a coding agent read and drive a running web or desktop app from the inside, then answer with a verdict and the file and line to fix instead of a screenshot.
No. 077
Lody
A workspace where a team shares the coding agents it already runs: connect a machine, bring Claude Code, Codex, Kimi or any other agent that speaks the protocol, and dispatch work from desktop, phone, web or terminal while sessions delegate to each other and the code stays on the machine its owner connected.
No. 073
Zeron
A Rust desktop app that runs the coding agents you already use — Claude Code, Codex, Cursor, Devin, Grok, Hermes, Pi and Antigravity — on your own machine, with no account required, and syncs the sessions to your other devices only if you sign in.