{
  "markdown": "<div align=\"center\">\n\n<pre align=\"center\">\n███████╗ █████╗ ██████╗ ██╗     ███████╗ ██████╗██╗   ██╗████████╗\n██╔════╝██╔══██╗██╔══██╗██║     ██╔════╝██╔════╝██║   ██║╚══██╔══╝\n█████╗  ███████║██████╔╝██║     █████╗  ██║     ██║   ██║   ██║   \n██╔══╝  ██╔══██║██╔══██╗██║     ██╔══╝  ██║     ██║   ██║   ██║   \n██║     ██║  ██║██████╔╝███████╗███████╗╚██████╗╚██████╔╝   ██║   \n╚═╝     ╚═╝  ╚═╝╚═════╝ ╚══════╝╚══════╝ ╚═════╝ ╚═════╝    ╚═╝   \n</pre>\n\n**A browser video editor that AI agents can drive.**\n\n<a href=\"https://trendshift.io/repositories/77702?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-77702\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"https://trendshift.io/api/badge/trendshift/repositories/77702/daily?language=JavaScript\" alt=\"ronak-create%2FFableCut | Trendshift\" width=\"250\" height=\"55\"/></a>\n\n[![Hacker News — front page](https://img.shields.io/badge/Hacker%20News-front%20page-ff6600?logo=ycombinator&logoColor=white)](https://news.ycombinator.com/item?id=48845422)\n[![DEV — Top 7 of the week](https://img.shields.io/badge/DEV-Top%207%20of%20the%20week-0A0A0A?logo=devdotto&logoColor=white)](https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-815)\n[![Official MCP registry](https://img.shields.io/badge/MCP%20registry-io.github.ronak--create%2Ffablecut-7b6cff?logo=modelcontextprotocol&logoColor=white)](https://registry.modelcontextprotocol.io/v0/servers?search=fablecut)\n[![Mentioned in Awesome MCP Servers](https://awesome.re/mentioned-badge.svg)](https://github.com/punkpeye/awesome-mcp-servers)\n[![Glama score](https://glama.ai/mcp/servers/ronak-create/FableCut/badges/score.svg)](https://glama.ai/mcp/servers/ronak-create/FableCut)\n[![Glama — #18 Best Browser Automation MCP Servers](https://img.shields.io/badge/Glama-%2318%20Best%20Browser%20Automation-0e1618)](https://glama.ai/mcp/best/browser-automation)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/ronak-create/FableCut)\n[![Discord](https://img.shields.io/badge/Discord-join%20the%20community-5865F2?logo=discord&logoColor=white)](https://discord.gg/WBKScy52F)\n\n**English** · [简体中文](docs/i18n/README.zh-CN.md) · [日本語](docs/i18n/README.ja.md) · [Español](docs/i18n/README.es.md) · [Português (BR)](docs/i18n/README.pt-BR.md)\n\n</div>\n\n<https://github.com/user-attachments/assets/2430b854-168b-4a9a-af2e-489e5efa7543>\n\nFableCut is a Premiere-style non-linear video editor that runs entirely in your\nbrowser — and exposes its whole timeline as one JSON document. Edit it by hand,\nfrom the UI, or let an AI agent (Claude Code, Claude Desktop, or anything that\nspeaks MCP/REST) cut your video for you while you watch the timeline update\nlive.\n\nZero npm dependencies. One `node server.js`. That's it.\n\n![FableCut editor](docs/screenshot.png)\n\n## Why it's interesting\n\nMost \"AI video\" tools hide the edit behind an API. FableCut flips that: the\n**project file is the interface**. `project.json` describes media, clips,\ntracks, effects, keyframes and transitions — any process that can write JSON\ncan edit video, and the open browser UI hot-reloads within ~150 ms via\nserver-sent events. A human and an agent can work on the same timeline at the\nsame time.\n\n## Features\n\n**Editing**\n\n- 3 video tracks + 4 audio tracks, drag/trim/split/snap, undo/redo\n- **Settings** (cog in the top bar) — optional prefs stored in this browser via\n  `localStorage`. Enable **Link timeline and Project bin selection** so picking a\n  timeline clip highlights its media in Project, and clicking a Project item\n  selects every timeline clip that uses it (off by default).\n- **Direct manipulation on the monitor** — click a clip or title on the preview to\n  move, resize (corner handles), or rotate (top handle, Shift-snap) it directly\n- **Timeline multi-select** — rubber-band marquee (drag on empty track area),\n  <kbd>Ctrl/Cmd/Shift+click</kbd> to add/remove clips, <kbd>Ctrl+A</kbd> to\n  select all, <kbd>Esc</kbd> to deselect. Drag any selected clip to move the\n  whole group; <kbd>Delete</kbd> removes all selected; <kbd>S</kbd> splits all\n  selected at the playhead. Inspector shows an \"N clips selected\" banner.\n- Beat & cue markers (tap <kbd>⇧m</kbd> on the beat during playback) with edge snapping\n- Press <kbd>Alt+t</kbd> to add an in/out transition based on the playhead position over the selected clip. The last used transition is remembered as the default. Drag the overlay triangle to adjust duration; <kbd>Delete</kbd> clears the focused transition.\n- Real decoded audio waveforms on clips\n- **Project bin folders** — tree view with expand/collapse; drag media or folders to nest; right-click the **Project** tab → New folder; drop files onto a folder to import into it\n- **Audio Hold** — timeline toolbar toggle: while paused, loops **one frame** of\n  audio at the playhead (useful when stepping frame-by-frame). Scrubbing or\n  frame-step retargets the held slice; meters stay live. **Play** / **Pause**\n  turns it off.\n- Canvas aspect presets (16:9, 9:16 reels, 4:5, 1:1) + project FPS select\n  (24 / 25 / 30 / 50 / 60; non-preset rates show as Custom) + safe-area guides\n- **Export frame / reframing** — composition canvas can be larger than the delivery\n  crop (`exportFrame` in `project.json`). Preview dims the overscan; drag the\n  **Export frame** handle to reframe (e.g. 16:9 canvas → 9:16 export). Fast export\n  crops to the frame; Realtime export is disabled while a frame is set\n- **Program Monitor zoom** — mouse-wheel over the preview zooms the composition\n  toward the cursor (fit → up to **2 screen pixels per canvas pixel**). Magnified\n  view uses **native scrollbars** so overflow stays reachable; middle-click or\n  <kbd>Alt</kbd>+drag pans. The **Fit** button (shown while zoomed) resets to the\n  fit-to-stage baseline\n- Preview playback speed — shuttle the monitor through 1×/1.5×/2×/4× with **J**/**K**/**L**\n  (from a stop <kbd>J</kbd>/<kbd>L</kbd> start playback; while playing <kbd>L</kbd> steps faster\n  and <kbd>J</kbd> slower, <kbd>K</kbd> toggles play/pause and resets to 1×); affects the\n  preview player only, never the export\n- Resizable workspace: drag the divider between monitor and timeline (double-click resets), plus S/M/L timeline track-density presets (S hides thumbnails for compact tracks)\n- **Zoom to selection** (<kbd>⇧Z</kbd>) frames all selected clips, not just one\n- **IN/OUT work area** — set markers with <kbd>i</kbd> and <kbd>o</kbd> (<kbd>⇧I</kbd> / <kbd>⇧O</kbd> to clear). Enabling **Limit** constrains playback to the marked range and maps <kbd>Home</kbd> / <kbd>End</kbd> to the IN and OUT positions rather than the full timeline. <kbd>t</kbd> splits clips at the markers; <kbd>⇧t</kbd> trims clips to the work (between marker in and marker out) area.\n- **Find & close gaps** — a gap is a stretch where every enabled track is empty (black frames). <kbd>g</kbd> jumps the playhead to the next shared gap (wraps; respects IN/OUT when both are set). <kbd>⇧G</kbd> closes the gap under the playhead by pulling later clips left on all enabled tracks.\n- **Reset a property** — <kbd>Ctrl/Cmd+click</kbd> an inspector **label** to restore that effect/prop to its default (paired fields like Crop L/R reset together). Matching keyframes for the prop are cleared too; transition labels clear the in/out transition.\n- **Replace media** — the inspector's **Source** button (any video/audio/image/svg\n  clip) swaps the underlying file while keeping position, trim, keyframes,\n  transitions and every effect. Pick another item already in the bin or\n  **Browse file…** to import and replace in one step. A video's linked L/R\n  audio companions are swapped along with it; a shorter replacement clamps the\n  trim to fit and toasts that it did so.\n- **Multi-channel video audio** — a video with more than 2 audio channels gets\n  a linked audio clip per channel, not just L/R (5.1, 7.1…). Extra audio\n  tracks (A5, A6, …, capped at 16) are created automatically as needed;\n  replacing a clip's media re-syncs the linked channel clips to the new\n  source's channel count, adding/dropping extras and new tracks as needed.\n\n**Look**\n\n- 14 one-click filter presets (cinematic, teal-orange, noir, vintage, cyberpunk, sunset, midnight…)\n- **Adjustment layers** — one clip grades everything below it, Premiere-style\n- Full grade controls: brightness/contrast/saturation/hue, **temperature & tint**,\n  blur, grayscale/sepia/invert, **vignette**, animated **film grain**\n- Blend modes (screen, multiply, overlay…), fit modes (contain/cover/stretch),\n  per-edge cropping, corner radius, flip H/V\n- **Chroma key** (green screen) with tolerance/softness + spill suppression\n- **AI background removal** (person cut-out, in-browser via MediaPipe)\n\n**Motion**\n\n- Keyframe animation on ~25 properties with easing\n- **Keyframe markers on clips** — diamonds on the clip body at each unique\n  keyframe time (tooltip lists channels; a count badge when several share a\n  time). <kbd>Ctrl/Cmd+←</kbd> / <kbd>Ctrl/Cmd+→</kbd> jumps the playhead to\n  the previous / next keyframe (selected clips first, else clips under the\n  playhead)\n- **Keyframe graphs** — toggle a property’s curve in the inspector to show an\n  interpolated value graph beside the program monitor; click the graph to seek\n- **Speed ramps** — keyframe `speed` and the engine time-remaps video *and* the\n  export audio mix (the fast-into-slow-mo reel move)\n- **Camera shake** and **RGB-split/chromatic aberration**, both animatable\n- 17 transitions: fades, slides, wipes (4 directions), zoom, iris, spin, blur,\n  whip-pan, **glitch**, **pop**\n\n**Text**\n\n- **Title styles** — one-tap cohesive looks (Impact, Elegant, Kinetic cut, Neon,\n  Handwritten, Luxury, and more); new titles vary the font, placement and animation\n  automatically instead of defaulting to one flat style\n- Kinetic captions: typewriter, word-pop, word-slide, karaoke, **letter-pop**,\n  **wave**, **bounce**, **shake**, **clip-reveal**, **zoom-in**, **font-cut**\n  (rhythmic typeface cuts), **rise-mask**\n- **Neon glow** for that TikTok caption look\n- Font editor: system fonts, drop-in custom fonts (`library/fonts/`), and **any\n  Google Font by name** — loaded automatically\n- Gradient fills, outline, background pills, letter-spacing, line-height,\n  weights, italic, uppercase, soft shadows\n- **Text layout** — horizontal Align: left / center / right / **justify**\n  (extra spaces between words). Drag a title’s corner handles to create a\n  **text box** (`boxW` / `boxH`); further corner drags resize it (opposite\n  corner stays fixed; <kbd>Ctrl/Cmd</kbd> resizes from center; <kbd>Shift</kbd>\n  locks aspect). Inside a box, text wraps at the fixed font size by default;\n  enable **Scale to fit** to shrink the font so the whole block fits. **V-align**\n  (top / middle / bottom) places the text block vertically in the box. Set Box\n  W/H to `0` to return to hug-content sizing.\n\n**Animated SVG clips**\n\n- A first-class `svg` clip kind: CSS-`@keyframes`-animated SVGs render\n  **frame-accurately** in preview and export (the compositor freezes the\n  animation at any time). Agents can author their own vector overlays —\n  lower-thirds, confetti, sparkles — as plain `.svg` files. Starters included.\n\n**Remake a reference video**\n\n- Give it a reference edit (a reel you like) and get back an **edit blueprint**:\n  shot boundaries, music beats + BPM, a loudness curve, per-shot energy, the\n  drop — plus the reference's **music track extracted** into your media, ready\n  to rebuild the same idea with your own footage. Zero extra dependencies\n  (ffmpeg does the decoding; onset/tempo detection is plain Node).\n  `node analyze.js ref.mp4`, `POST /api/analyze`, or the\n  `fablecut_analyze_reference` MCP tool.\n\n**Asset library**\n\n- `library/` folders surface as tabs in the UI: **Elements** (overlay art),\n  **Sound FX**, **SVG** — drop files in, the open editor refreshes live\n\n**Export**\n\n- Fast export: browser renders every frame + an offline audio mix; ffmpeg\n  encodes them via an **encoding profile** from `encoding-profiles.json`\n  (keeps rendering if you switch tabs). The Export dialog has a profile\n  selector; pin a project default with `encodeProfile` in `project.json`\n- Realtime MediaRecorder fallback when ffmpeg isn't available\n\n## Quick start\n\n```bash\ngit clone https://github.com/ronak-create/FableCut.git\ncd FableCut\nnode server.js        # → http://localhost:7777\n```\n\nRequirements: **Node 18+** and a Chromium-based browser. **ffmpeg on PATH** is\noptional but recommended (fast export + upload remuxing). AI background\nremoval fetches its model from a CDN on first use.\n\nThe server binds **127.0.0.1 only** (v1.3.1+). To use it from another device on\nyour LAN, opt in explicitly: `HOST=0.0.0.0 FABLECUT_ALLOWED_HOSTS=<your-ip> node server.js`.\n\nDrop media into the window (or `./media/`), drag clips onto the timeline, edit,\nexport.\n\nTo keep your work outside the checkout, set **`FABLECUT_DATA_DIR`** — it moves\n`project.json`, `media/`, `exports/`, `analysis/` and `library/` to a directory\nyou choose. Leave it unset and everything stays in the repo, exactly as before.\n\n### Or install it as a Claude Code plugin\n\n```\n/plugin marketplace add ronak-create/FableCut\n/plugin install fablecut@fablecut\n```\n\nThat registers the MCP server for you and adds two skills — `edit-video` and\n`remake-reel`. Your timeline and footage live in the plugin's own data\ndirectory, so an update never touches them. Node 18+ and (optionally) ffmpeg\nstill need to be on your machine.\n\n## Driving it with an AI agent\n\nEverything an agent needs is in **[CLAUDE.md](CLAUDE.md)** — the complete\nschema, semantics and recipes. Point any capable model at that file and it can\noperate the editor end to end.\n\n> 📖 **Browsable docs:** for a conversational, auto-generated tour of the\n> codebase — architecture, the `project.json` schema, the MCP surface — see\n> **[FableCut on DeepWiki](https://deepwiki.com/ronak-create/FableCut)**. Ask it\n> questions about the repo in natural language.\n\nThree equivalent control surfaces:\n\n1. **MCP** (best for Claude Code / Claude Desktop) — register the bundled\n   zero-dependency MCP server once:\n\n   ```bash\n   claude mcp add -s user fablecut -- node \"<path-to>/fablecut/mcp-server.js\"\n   ```\n\n   **OpenCode** can use the same stdio server from its project or global\n   `opencode.json` configuration:\n\n   ```json\n   {\n     \"$schema\": \"https://opencode.ai/config.json\",\n     \"mcp\": {\n       \"fablecut\": {\n         \"type\": \"local\",\n         \"command\": [\"node\", \"/absolute/path/to/FableCut/mcp-server.js\"],\n         \"enabled\": true\n       }\n     }\n   }\n   ```\n\n   For another MCP client, register a local stdio server with this equivalent\n   command. The exact key names vary by client, but the command and arguments\n   do not:\n\n   ```json\n   {\n     \"name\": \"fablecut\",\n     \"transport\": \"stdio\",\n     \"command\": \"node\",\n     \"args\": [\"/absolute/path/to/FableCut/mcp-server.js\"]\n   }\n   ```\n\n   The server is intentionally client-neutral. It speaks MCP over stdio and\n   does not require Claude-specific environment variables. Keep the path\n   absolute, and use Node 18 or newer.\n\n   Tools: `fablecut_status` (auto-starts the editor), `fablecut_docs`,\n   `fablecut_get_project`, `fablecut_set_project`, `fablecut_patch_project`,\n   `fablecut_import_media`, `fablecut_analyze_reference`,\n   `fablecut_encode_profiles`.\n\n   FableCut is also published on the **official MCP registry** as\n   [`io.github.ronak-create/fablecut`](https://registry.modelcontextprotocol.io/v0/servers?search=fablecut)\n   — each release ships an MCPB bundle (`fablecut.mcpb`) that MCPB-capable\n   clients can install directly.\n\n   The surface is **token-efficient by design**: agents patch the timeline with\n   small ops (`fablecut_patch_project`) instead of round-tripping the whole\n   document, read a compact one-line-per-clip summary\n   (`fablecut_get_project {compact:true}`), and fetch only the manual sections\n   they need (`fablecut_docs {section:\"props\"}`).\n2. **The file** — read `project.json`, modify, bump `revision`, write. The UI\n   live-reloads.\n3. **REST** — `GET/PUT /api/project`, `POST /api/upload`, `GET /api/library`,\n   `GET /api/export/profiles`, SSE at `/api/events`. See CLAUDE.md for the full list.\n\nExample: ask Claude Code *\"cut these six clips to the beat markers, add a\nteal-orange grade, put a word-pop caption on top and a whoosh on every cut\"* —\nand watch the timeline rebuild itself.\n\nOr hand it a reference: *\"here's a reel I like — analyze it and remake it with\nmy clips, same music\"*. The agent calls `fablecut_analyze_reference`, gets the\nblueprint (cuts, beats, BPM, energy, drop, extracted music), and rebuilds the\nstructure shot-for-shot with your footage.\n\n**Conflict-safe concurrent editing**: the UI, the MCP tools, and direct\n`project.json` writes all agree on a `revision` counter. If you edit a clip in\nthe UI while an agent is mid-task, the agent's next write is rejected (409 from\nthe REST API / a conflict error from `fablecut_set_project`) instead of\nsilently overwriting your change. The UI similarly detects when an agent write\nsupersedes a not-yet-saved local tweak and tells you with a toast instead of\ndropping it silently.\n\n## Project layout\n\n```\nserver.js        zero-dependency HTTP server: static hosting, REST API, SSE,\n                 ffmpeg export pipeline\napp.js           the editor: timeline UI, compositor, keyframes, text engine,\n                 SVG rasterizer, chroma key, exporters\nindex.html       single-page UI\nstyle.css        dark editor theme\nmcp-server.js    stdio MCP server exposing the editor to AI agents\nanalyze.js       reference-video analyzer: shots, beats/BPM, energy, drop,\n                 music extraction (module + CLI)\nCLAUDE.md        the agent manual (schema + recipes) — also served by fablecut_docs\nencoding-profiles.json\n                 Fast-export ffmpeg presets (hot-reloaded)\nproject.json     your timeline (created on first run; gitignored)\nmedia/           project footage (gitignored)\nanalysis/        cached edit blueprints from /api/analyze (gitignored)\nlibrary/         default assets: elements/ sfx/ svg/ fonts/\nexports/         finished renders (gitignored)\n```\n\n## Authoring animated SVG overlays\n\nSVGs animate with plain CSS `@keyframes`. One convention: never hardcode\n`animation-delay` — set `--d: 0.4s` instead, and the compositor drives time by\npausing all animations and rebasing their delays. Full rules + a skeleton in\n[CLAUDE.md](CLAUDE.md#authoring-animated-svgs-the-svg-clip-kind); working\nexamples in [`library/svg/`](library/svg/).\n\n## Notes\n\n- The repo ships with **20 Google Fonts** (`library/fonts/`, OFL — see\n  `LICENSES.md` there) and a set of self-authored SVG overlays and animated\n  elements (`library/elements/`, `library/svg/`, MIT like the rest of the repo).\n- `library/sfx/` is yours to fill (gitignored): sound-effect sites typically\n  don't allow redistributing their files in a public repo, so FableCut doesn't —\n  `library/sfx/README.md` lists good free sources.\n- Export runs in the browser because the compositor *is* the browser; agents\n  ask you to click Export (or render directly with ffmpeg from `media/`).\n\n## Community\n\nQuestions, ideas, showing off an edit, or want to help shape what's next? Join\nthe **[FableCut Discord](https://discord.gg/WBKScy52F)**. Bugs and feature\nrequests are still best filed as [GitHub issues](https://github.com/ronak-create/FableCut/issues).\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 19457,
  "sha": "afdc0d5500f95d0ce42bb1706d3c947eadb8624440de6ecdaf31644651b05d6d",
  "repo_slug": "ronak-create/fablecut",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_ronak_create_fablecut_689b9e3b/readme"
}