LeClap
Your video from one JSON template: camera, effects, music, transitions, rendered on the device. No server, no upload.
Try it · Examples · Comparison · Docs · Showcase
🎥 Demo
Click the frame: the film plays on leclap.dev, with captions.
⏱ Try it in 30 seconds
Node 24.11 or later. FFmpeg is optional: the CLI brings ffmpeg-static along and uses it when there is no
ffmpeg on your PATH.
npx @leclap/cli init hello --no-remotion --no-mcp
cd hello && npm install && npm run render
That writes build/output.mp4: three seconds of "Hello, LeClap" on a navy card, from the
template.json next to it. Edit the JSON, render again.
If the title is missing, the ffmpeg on your PATH was built without drawtext (Homebrew's current build is
one). npx leclap diagnose lists what your FFmpeg can and can't do.
Rather not install anything? Open the same template in the web builder,
where it renders in the tab through WebAssembly. The template travels in the URL fragment, which browsers
don't send to servers. leclap studio template.json prints that link for any template.
🎞 Template in, video out
Three templates from this repo and what they render to. Click a frame to play the render.
| Template | Render | What it shows |
|---|---|---|
footage-edit.json4 KB of JSON | Five recorded clips, five edits: a portrait clip over its own blur, a keyframed pan under a LUT, a speed ramp, a freeze frame, a B-roll cutaway. | |
before-after.jsona PR review clip | The video an agent attaches to a pull request: the change named, the old behaviour, a wipe to the new one, what to check. | |
effects-tour.jsonten chapters, one template | Seven minutes of kinetic type, camera moves, transitions, captions, light effects, looks, footage edits, sound and music. |
All 50 samples, with their templates, are on the showcase. Each effect, one frame at a time, in the gallery.
🤔 Why LeClap?
Four ways to get a video out of JavaScript, and when each one is the right call. Claims about the others come from their own docs; a "—" means their docs don't say. The full comparison has the sources and the caveats, ours first.
| LeClap | Remotion | editly | fluent-ffmpeg | |
|---|---|---|---|---|
| What it is | A JSON template compiled to FFmpeg | Videos written as React components | Declarative editing, as a CLI and a Node API | A chainable Node API over the ffmpeg CLI |
| You write | JSON, validated against a schema | React (TypeScript) | A JSON5 spec or CLI flags | Chained method calls |
| Node | ✅ | ✅ also Lambda and Vercel | ✅ needs ffmpeg, ffprobe, headless GL | ✅ needs ffmpeg, ffprobe |
| Browser | ✅ WebAssembly | ✅ WebCodecs, since 4.0.491 | — | — |
| React Native, on-device | ✅ FFmpeg linked into the app | — | — | — |
| Same input, same output | ✅ per platform¹ | ✅ if animations derive from the frame number | — | — |
| Agent tooling | ✅ @leclap/mcp: schema, validate, render | ✅ a system prompt for LLMs writing React | — | — |
| Licence | MIT | Free for individuals, non-profits and for-profit companies up to 3 employees; paid above | MIT | MIT, archived in May 2025 |
| Pick it when | The render happens in an app, or a program writes the video | You think in components, render on servers, or want the ecosystem | You want a slideshow from the terminal | You already use it; its README says it's unmaintained |
¹ Per platform, not across them: Node and the browser encode with libx264, Android with libopenh264, iOS
with h264_videotoolbox, and the on-device build drops boxblur and rewrites eq to lutyuv. Same
composition, different pixels.
Remotion wins more of this than a comparison table usually admits: LeClap vs Remotion spells out where.
📦 Packages
| Package | One line |
|---|---|
ffmpeg-video-composer | The engine: compile() a JSON template on Node, in the browser or in React Native. |
@leclap/cli | The leclap command: init, render, validate, snapshot, verify, studio, diagnose. |
@leclap/mcp | The engine as tools an agent can call: read the schema, validate a template, render it. |
The rest of the monorepo is private: the creative kit (templates, fonts, media), the web builder (React, FFmpeg in WebAssembly), the Expo app (camera to render, on the phone) and the Rust engine that links FFmpeg into it. Working on the repo itself: CONTRIBUTING.md and AGENTS.md.
📚 Read next
- Descriptor reference: every section, transition, look, caption and filter, one page per topic.
- Template configuration and effects: the same reference, in the repo.
- Engine configuration:
ProjectConfig, environment variables, encoders. - Architecture and on-device compilation: how one core runs on three FFmpeg builds.
- One descriptor, three FFmpeg builds: the long version, on the blog.
- Agent-made PR videos and browser agents in the builder.
- Showcase: 50 templates with their renders.
🤝 Contributing & licence
Issues and PRs welcome: start with CONTRIBUTING.md. The code is MIT.
The LeClap name and logo are trademarks of Alexandre Mogère. Fork and reuse the code freely, but give your fork a different name and don't imply endorsement. See TRADEMARK.md.