What is SceneForge?
SceneForge is a local-first, JSON-driven video builder for repeatable branded short-form marketing videos. You describe a video in a single readable file, video.json, and SceneForge handles the rendering with Remotion, so you never have to learn a timeline editor or understand video internals.
npm install -g sceneforge # or: npx sceneforge <command>
sceneforge validate ./video.json
sceneforge preview ./video.json
sceneforge render ./video.json out.mp4
The whole tool is organized around one contract: video.json. That single decision is what makes SceneForge usable by both agents and humans without compromise.
Built for agents
SceneForge is designed so an agent can pick it up cold, with no static docs required, and safely generate or repair a video:
- Self-describing. A workflow can bootstrap the entire tool from two commands:
sceneforge capabilities --jsonreports every command, flag, env var, and whether it’s agent-safe;sceneforge schema --jsonreturns the fullvideo.jsondata contract. - Documented at the field level. Every schema field carries a Zod
.describe(), and CI fails if a description is missing, soschema --jsonis always complete. - Machine-readable output.
validate,render, andttsall accept--json, emitting a single clean object to stdout while human logs and Remotion’s render noise go to stderr. - Errors agents can act on. Validation failures include the JSON path that failed, so a generating agent can correct the exact field and retry.
- Source-control friendly. Assets are local and relative to
video.json, so generated projects commit cleanly.
Built for humans, too
- You edit a readable JSON file, not a binary project or a timeline.
- You run simple commands:
validate,preview,render. - The schema keeps options constrained: enums, percentages, colors, and local paths instead of arbitrary CSS, so it’s hard to make an unrenderable mess.
- Examples cover common patterns: no-AI videos, product launches, overlays, captions, and themes, and each one doubles as a smoke test.
- Remotion does the hard rendering work behind the scenes.
The core idea: agents can safely generate and repair video.json, while humans can still read, tweak, preview, and render it. Neither side has to learn the other’s tooling.
How it stays honest
Ongoing development is kept disciplined by treating the schema as the product contract. packages/schema/src/index.ts is the single source of truth. New capabilities go into Zod first, with a description on every field; JSON Schema is generated, not hand-written; and capabilities --json is updated whenever commands, flags, or env vars change.
The maintenance rule that prevents drift: if an agent can’t discover it from schema --json or capabilities --json, it isn’t a real supported feature yet.
Optional voiceover
Voiceover generation uses ElevenLabs (ELEVENLABS_API_KEY, ELEVENLABS_DEFAULT_VOICE_ID), with generated audio cached locally. For headless or credential-free renders, SCENEFORGE_SKIP_TTS=1 lets you render without TTS.
Why I built it
SceneForge came out of building Naprej. The coding was never the hard part. The hard part was producing the marketing content around the product. I wrote about that realization, and why I went looking for something I could drive agentically, in a blog post.
SceneForge is open source under the MIT License. Note: Remotion, used for rendering, is source-available under its own license and may require a paid Remotion Company License for larger companies.