Changelog
What actually shipped.
This page renders the repo's real CHANGELOG.md directly, not a rewritten copy.
Changelog
All notable changes to openvidstudio are documented here.
Format based on Keep a Changelog. Versioning follows Semantic Versioning.
[Unreleased]
Added
-
@openvidstudio/capture, a package of its own. Zoom compensated browser capture, interaction replay, and the desktop, mobile and terminal backends, with no dependency on Remotion, React, or@openvidstudio/core. The hard, defensible part of this project is getting a true frame out of a running product, and it was welded to a video pipeline, so a team that wanted reliable capture and no video had to take everything or rebuild the hard part.@openvidstudio/mcp-servernow consumes it. -
Per-beat render caching.
render_videogainsincremental: every beat renders to its own segment underoutput/segments/<video>/, and the segments are joined with ffmpeg's concat demuxer under stream copy, so a reused segment's bytes reach the final file untouched. A segment is reused only when the beat's JSON, its scene source, every artifact it references, its narration, and the project-wide inputs (brand tokens, the generated composition, the music bed) all hash identical. This is what makesdiff_beatsactionable: editing one caption in a ten beat video re-renders one beat. -
visual_regression: each beat's midpoint frame against a stored baseline, with a per-beat verdict, a diff image, and markdown ready to post on a pull request. The first run writes the baseline instead of failing.templates/defaultships the workflow and the script, rendering in draft and incremental mode. -
docs_drift: re-captures the pages a video's beats came from and reports which clips have gone stale. Bindings are inferred from the manifest, since a browser screenshot beat already records its url and interactions. -
release_diff: given two refs and a running instance of each, works out which routes changed, captures both sides, drops the routes that did not actually change on screen, and drafts a before/after manifest. The filtering is the point: a what's-new clip showing four identical pages is worse than no clip. -
export_rendition: a README GIF through a real two-pass palette, a docs screenshot set with an index built from each beat's own narration, or App Store and Play Store frames at the exact dimensions each store demands. All three read the finished render, so the docs images cannot drift from the video. -
reformat_vertical: a 9:16 cut with the crop chosen per beat from the manifest. A terminal beat crops left, because a terminal is text pinned to the left margin and centring it cuts the command in half; a mobile recording is fitted and padded rather than cropped. Overridable per beat withvertical.focusorvertical.crop, both validated. Active speaker tracking is deliberately out of scope. -
plan_shots: ranks what a demo should show from the repository's own emphasis, with the evidence for every entry: README order, the newest changelog section, which routes exist and how often the docs link them, whether the package ships a command, and where the recent commits went. It feedsPLANNING.md's intake rather than replacing it. -
Multilingual narration.
generate_narrationtakeslanguages, reading translated lines from each beat'svoTranslationsand writing every non-base language topublic/audio/vo/<lang>/<beatId>.mp3.stitch_compositionemits one composition per language over a single shared scene tree, withrequireNarrationenforced per language. Theomnivoiceengine covers 600+ languages zero-shot and, given a reference clip, uses one cloned voice across all of them. Translations are not drafted here: a translation is content and goes through the same approval the original script did. -
Wayland capture.
capture_desktopreadsXDG_SESSION_TYPEand routes a Wayland session through ffmpeg'spipewiregrab, checking the local ffmpeg actually has the filter first. Wayland has no window-title selector, sowindowis refused there rather than silently capturing the whole screen, and the portal consent prompt is documented rather than engineered around. -
A real pty for
capture_terminal, when the optionalnode-ptymodule is installed, so a program keeps its colour and cursor addressing. Falls back to pipes otherwise, and reports which mode produced the cast. -
A programmatic export surface on
@openvidstudio/mcp-server, for callers with no agent in the loop (CI, cron). Deliberately short: the tools that draft or write a manifest need an agent's judgement and a human's approval. -
Capture without a browser. Three new tools remove the assumption that filmable software has a URL, which previously forced every beat about a desktop app, a phone, or a CLI to degrade into a hand-authored
dom-demopanel:capture_desktoprecords a window, a region, or a whole display through ffmpeg, using the right device per platform (gdigrab on Windows, avfoundation on macOS, x11grab or pipewiregrab on Linux depending on the session type). Output is forced to even dimensions, since h264/yuv420p cannot encode an odd-width region and a hand-picked rectangle very often is one.capture_mobilerecords an Android device via adb screenrecord, or an iOS Simulator viaxcrun simctl, remuxing both so Remotion can seek them. Refuses Android recordings over 180 seconds rather than returning the silently truncated filescreenrecordwould produce.capture_terminalrecords a real command run as timed text rather than pixels, writing a JSON cast topublic/terminal/<beatId>.jsonthat replays throughTerminalReplay, so one capture stays sharp at any resolution and picks up the brand palette. It uses a real pty whennode-ptyis installed and pipes stdout/stderr otherwise, reporting which.
-
sourceon a recording beat:"browser"(default, so every existingbeats.jsonis unchanged),"desktop","mobile", or"terminal", each with its own validated required fields. SeePLANNING.md§4.6. -
existing-assetcaptureMethod, for real screenshots a project already publishes.attributionis required: an unattributed borrowed frame reads as a real capture, which is the exact dishonesty the rest of the pipeline is built to avoid. -
Brand-lock gate:
render_videonow refuses to run unlesssrc/brand.tsexists (written byextract_brand), so a video never ships wearing openvidstudio's own default navy/Inter look by accident. PassskipBrandLock: truewhen a project deliberately has no brand to extract. Result now also reportsbrandLocked. -
PRESETS.md: fixed recipes over the existing tool chain for five common video shapes. gif-demo (single-beat, no narration/music, capped under 15s, real capture only, GIF output via the CLI's extension-based codec inference), screenrec-only (one continuouscapture_screen_recordingspanning the whole flow, one beat, no per-beat choreography, light captions), remotion-only (no capture step at all, puredom-demo/higgsfieldmotion graphics), 2min-demo (fixed 6-beat structure capped at 2:00, narration+captions mandatory), 5min-demo (extends the real six-chapter structureEA/launch_plans/TODO.mdproved out for the project's own launch video into a fixed ~5:00 beat arc for any project). A sixth candidate, vertical reformat with active-speaker tracking, is flagged as real and validated (r/reactjs feedback) but only half scoped: the manifest-driven crop shipped asreformat_vertical, and active-speaker tracking stays out, because it needs real face and audio analysis rather than a recipe over the existing tools. -
diff_beats: compares an editedbeats.jsondraft against the version already on disk and returns a per-beat rerun plan (added/removed/unchanged/changed, which fields changed, whether capture orscaffold_sceneneed to rerun for that beat, whether its output files exist on disk). Read-only, writes nothing. Makes editing one beat in an already-built video a targeted rerun instead of redoing the whole pipeline. Superseded in part byrender_video'sincrementalmode above: the whole-videorerenderNeededflag is now something that can actually be acted on per beat rather than only reported. -
Two optional per-beat
beats.jsonfields,transition("cut"|"whip"|"fade","cut"assumed if omitted) andartifacts(screenshotPath/recordingPath/voPathoverrides of the convention output paths), both validated byvalidate_beats. First step of hardening the manifest into a fully reviewable product boundary: a dev can now readbeats.jsonalone and know the transition and asset path for every beat, without opening capture.ts or relying on the path convention from memory. SeePLANNING.md§4.5. Every existingbeats.jsonstays valid unchanged, both fields are additive. -
templates/defaultnow ships the official Remotion agent-skills bundle (remotion-best-practices,remotion-markup,remotion-captions,remotion-render,remotion-saas,remotion-multimedia,remotion-interactivity,remotion-maps,remotion-studio,remotion-upgrade,remotion-create,remotion-docs) for Claude Code, Cursor, Windsurf, OpenCode, and GitHub Copilot, so a coding agent writing scenes in a scaffolded project has the same Remotion knowledge base an agent working directly in a hand-built Remotion project would. -
public/imported_audios/: a scaffolded project's own folder for sound effects or music dropped in by hand or fetched viaplan_sound_effects, kept separate from the synthesized, rights-free pack inpublic/sfx/so it's always clear which sounds carry licence terms. Documented inNARRATION.mdandPIPELINE.md.
Changed
render_video,contact_sheet, andqc_extract_framesnow write tooutput/by default instead ofout/, a more discoverable name for the folder a finished render, contact sheet, or QC stills get picked up or uploaded from.output/ships with its own README and stays gitignored (renders are build output, not source).plan_sound_effectsnow saves and checks imported sounds inpublic/imported_audios/instead of alongside the built-in pack inpublic/sfx/; itssfxDirresult field is renamedimportedAudiosDir.
[1.0.0] - 2026-09-02
Initial public release: the pnpm monorepo, the MCP server, and the public site, built end to end.
Added
- pnpm monorepo scaffold, with
@openvidstudio/coreextracted from the original private vidstudio pipeline and atemplates/defaultproject shell. @openvidstudio/mcp-server: the MCP server itself, exposinginit_project,validate_beats,write_beats_file,scaffold_scene,stitch_composition,render_video, andqc_extract_frames.capture_screenshotandcapture_screen_recordingtools, with zoom-desync compensation so a capture comes out pixel-accurate regardless of a Playwright profile's per-origin zoom level.import_higgsfield_clip, gated behind a project's ownhasHiggsfieldconfig flag, plusHIGGSFIELD.mddocumenting that tier's scope and prerequisites.apps/site: the public Next.js site, built directly frompackages/docs/*.mdrather than a hand-copied duplicate./docs, rendering all seven pipeline docs from their real source files./gallery, with a real sample video built end to end by the pipeline itself (init_projectthroughrender_video), not hand-edited.- Landing page: hero, feature tiers, and quickstart, with a composition pass tying every section to the rest of the site.
Fixed
- Windows
npx.cmdspawnEINVALinrender_video. templates/default's tsconfiglibmismatched againstpackages/core;@openvidstudio/core's package.jsontypefield.@openvidstudio/corenow vendored (not monorepo-relative) so a scaffolded project actually installs standalone, outside this repo.beats.json'sInteractionschema unified across tools; a failing worked example inPLANNING.mdcorrected.- An undisclosed second hero gradient removed from the landing page.
/docs' doc list now derived from a real directory read instead of a hardcoded list, so it can't silently go stale againstpackages/docs/.- Final-review findings across
apps/siteand themcp-servertest suite.
Changed
- Root workspace
workspacesfield corrected; em dashes stripped from@openvidstudio/core's comments. - Asset conventions (screenshot, recording, VO, music-bed paths)
documented directly in
PIPELINE.md;BrowserFrame's provenance claim corrected to match what it actually renders. - vidstudio's original private protocol docs ported into
packages/docs/and generalized for a public, multi-project audience.
Docs
- Review findings addressed across the doc set; the Motion.so comparison note restored; minor cross-reference fixes.
Tests
- Real
render_videoinvocation tests added to the mcp-server test suite.