Model or dataset
ronak-create/FableCut avatar
ronak-create/FableCut

FableCut: a browser NLE where project.json is the editing API

Zero-dependency browser video editor that AI agents can drive — JSON timeline, MCP + REST, live-reloading UI

670 stars68 forksJavaScriptMIT

At a glance

What is it?
FableCut is a zero-dependency, MIT-licensed video editor that runs in the browser and keeps its entire timeline in one JSON document, so an MCP or REST client can cut while a human watches the UI hot-reload. The judgement: the JSON-as-interface bet is the whole product, and it also sets the ceiling.
Who is it for?
Adopt FableCut if you want an agent to write timeline JSON and a human to supervise the same project in a browser tab, and if you can accept a single Node process plus a ./media/ directory as the deployment shape. Do not adopt it if you need render-farm throughput, headless batch export, or a hosted multi-user service; the README describes a local editor, not a pipeline.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly JavaScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem FableCut targets: edits that only a process can make

The README frames the project against tools that hide the edit behind an API. FableCut takes the opposite position: the project file is the interface. A project.json document describes media, clips, tracks, effects, keyframes and transitions, and anything that can write JSON can therefore edit video. The audience is narrow and identifiable. It is engineers who already drive Claude Code, Claude Desktop or another MCP or REST client and want that client to assemble a cut, plus editors willing to sit in the same browser session and correct it. The README states that a human and an agent can work on the same timeline at the same time, with the open UI updating over server-sent events. The stated figure is roughly 150 ms for a hot reload. That number is the project's own, not a measurement I made.

One JSON document as the shared state between agent and editor

The architecture that follows from the README is a single source of truth with three writers. project.json holds media references, clips, tracks, effects, keyframes and transitions. The browser UI reads and writes it. The MCP and REST surfaces read and write it. A server-sent events channel pushes changes back to any open browser tab, which is why an agent's edit appears without a manual refresh. Two details in the README show how seriously the JSON-as-interface claim is taken. First, an export frame can be declared in project.json so the composition canvas is larger than the delivery crop, which is how a 16:9 canvas becomes a 9:16 export. Second, imported URLs are deliberately not written to media.src, because the README says a remote src would taint the canvas and break export. That is a constraint the data model enforces rather than a preference. The consequence is that media must land in ./media/ and be served same-origin before it can be composited.

Running it: node server.js and no install step

The README gives the setup in one line: zero npm dependencies, one node server.js. There is no package install phase to audit and no lockfile to drift. Media lives in ./media/. Import from URL is exposed in the UI as a + URL button, which the README says downloads an HTTPS video, audio or image into ./media/ so it is same-origin after import. Agents reach the same capability through fablecut_import_media with an https:// path. Remote SVG is refused. Preferences are optional and stored in this browser via localStorage, reachable from the cog in the top bar; one named setting, Link timeline and Project bin selection, is off by default and makes timeline and Project bin selection mirror each other. Track counts start at three video and four audio lanes, extendable with +V and +A in the track header up to 16 each, and removable by right-clicking an empty header. Dropping a video with more audio channels than there are A-tracks adds the missing lanes automatically, up to 16, with a toast reporting how many were added; each channel becomes a linked stem on its own audio track.

Where the browser-only design pushes back

The README is explicit about one export limitation: WebCodecs and Realtime export are disabled while an export frame is set, and fast export crops to the frame instead. If your delivery needs the WebCodecs path, reframing and that path are mutually exclusive in the current release. The import rule is a second hard edge. Because a remote URL is never kept as media.src, every asset has to be pulled into ./media/ first, so an agent working from a list of remote links must call the import tool per asset rather than pointing the timeline at a URL. There is also an operational shape worth naming: the README describes a local editor started with node server.js, and nothing in the supplied material describes authentication, multi-tenant hosting or a headless render mode. Treat it as a single-operator tool on a machine you control. The README does not state what happens under concurrent writes from an agent and a human to the same clip, so I cannot say how conflicts resolve; that is an open question, not a documented guarantee.

FableCut against a scripted FFmpeg pipeline

The obvious alternative for agent-driven editing is a generated FFmpeg command line, and the difference is where the state lives. An FFmpeg invocation is a one-shot transformation: the agent composes filters, runs the process, and inspects the output file. There is no persistent timeline to inspect mid-edit, and a human collaborator has nothing to look at until the render finishes. FableCut keeps the intermediate state as a document that a browser renders continuously, which is what makes the ~150 ms hot reload meaningful. The trade is that FFmpeg runs without a browser, without a canvas, and without a Node server holding the project, while FableCut requires all three. If your job is a batch of fixed transformations, the FFmpeg route has fewer moving parts. If your job is iterative cutting where someone wants to see the result and adjust it, the JSON timeline is the part that FFmpeg does not give you.

Maintenance surface and the MIT licence

The release cadence visible in the supplied material is regular but not frantic: v1.5.0 and v1.6.0 both landed on 2026-07-13, and v1.7.0 followed on 2026-08-24 with linked audio tracks, monitor zoom and project folders. The last push to the default branch is 2026-09-10. Each release note names concrete editor features rather than infrastructure, which suggests the upgrade cost sits in the UI and project schema rather than in a dependency tree. That is the payoff of zero npm dependencies: there is no transitive package to patch, and the upgrade is pulling the repository. The cost is that everything the editor needs, it implements itself. FableCut is MIT licensed, which permits commercial use and modification; the licence text itself is the authority on terms, and I am not giving legal advice. One practical note from the README: preferences live in localStorage, so they are per-browser and do not travel with project.json.

Who should adopt FableCut, and what to check first

Adopt it when the bottleneck is not rendering but the edit decision itself, and when an agent writing JSON is faster than a person dragging clips. The monitor-side workflow supports that: direct manipulation lets you click a clip or title on the preview to move, resize or rotate it, and timeline multi-select with rubber-band marquee, Ctrl/Cmd/Shift+click and Ctrl+A lets a human clean up what an agent produced. Skip it if you need a render farm, a hosted service, or exports that depend on WebCodecs while an export frame is active. Before you commit, run node server.js against a real project and confirm the SSE reload reaches your browser, import one remote asset through fablecut_import_media and confirm it lands in ./media/ as same-origin, and set an export frame to see whether the disabled WebCodecs path is a problem for your delivery format. Those three checks map to the three places the README itself flags limits.

Editorial conclusion

Adopt FableCut if you want an agent to write timeline JSON and a human to supervise the same project in a browser tab, and if you can accept a single Node process plus a ./media/ directory as the deployment shape. Do not adopt it if you need render-farm throughput, headless batch export, or a hosted multi-user service; the README describes a local editor, not a pipeline. Verify three things before committing: that your Node version runs server.js without npm install, that WebCodecs export works in your target browser (the README notes export is disabled while an export frame is set), and that your agent's MCP client can reach the fablecut_import_media tool for remote assets, since remote SVG is refused and imported URLs are not stored as media.src.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. ronak-create/FableCut on GitHub
Community notes

Community notes