A portable project is only a useful handoff if an edit preserves the files needed to reopen it. This case changes one project setting, compares every other archive entry byte for byte, and then exercises the pinned command-line renderer. A valid metadata write, a preserved media archive and a playable export are three separate results to check.
The starting archive contains a synthetic color slate, eight seconds of diagnostic source audio, and project metadata that uses a three-second source range inside a six-second edit. For this experiment we add a plain-text client note at notes/client-note.txt. The note is not an editing asset. Its purpose is to reveal whether a metadata rewrite preserves unfamiliar ZIP entries or silently rebuilds the archive from only the fields it recognizes.
Download the exact input archive and the one-operation plan. The plan applies project.set_ratio with ratio: 9:16, based on revision zero, and names a sibling output archive. It does not replace media, change audio timing or claim to crop an image. The output ratio is project metadata; the later render uses contain fitting to place the original slate in a vertical frame.
02
Compare entries, not the outer ZIP hash
The production CLI reads all archive entries, updates project.json, and writes the saved file. The output reaches revision one with ratio 9:16. Our verifier compares each of the three non-project entries from the input with its counterpart in the edited archive.
Recorded unchanged archive entries
Entry
Bytes
Result
Synthetic PNG slate
4,559
Identical bytes and SHA-256
Original diagnostic WAV
256,044
Identical bytes and SHA-256
Client note text
70
Identical bytes and SHA-256
The full entry-level comparison includes paths and complete hashes. The project JSON correctly changes. The outer ZIP can therefore have a different hash even though every retained source asset is unchanged; archive compression and export metadata also make whole-file equality the wrong assertion for this edit.
This records a metadata-only rewrite of this fixture. It does not show how media import, replacement or cleanup behaves for every project. The note demonstrates that this CLI path carries an unknown entry forward; it is not a universal compatibility promise for other archive writers.
03
Render the supported composition and inspect the actual file
The render request specifies a 180 × 320 MP4 at 24 frames per second. The pinned CLI invokes native FFmpeg against the saved archive, then inspects the result with ffprobe. The reported file is six seconds long, has the requested dimensions and contains an audio stream. Our reproduction script additionally decodes the complete MP4 to a null output with FFmpeg; that decode exits successfully.
Download the actual CLI render. Synthetic color slate and diagnostic tones, 180 × 320, six seconds. This is the recorded native command-line output, not a browser export or a generated speech performance.
The earlier article said the command runner could not render. That was a historical capability limit and is removed in this revision. This pinned source can render its documented subset. The exported fixture makes that correction checkable rather than relying only on a feature list.
04
A second input tests what the renderer refuses to omit
We then ask the same renderer to export the captioned project from the timing-brief case. It returns UNSUPPORTED_RENDER_FEATURE with a nonzero exit code because the composition contains a visible caption. The rejected request and CLI response are published alongside the successful case.
A structural edit can therefore succeed while this export route remains unsuitable. For a captioned production job, keep the label and use a compatible render path; do not silently remove required content to fit a narrower renderer. The browser remains valuable for unsupported composition and visual review. It is no longer accurate to describe every import or render as browser-only.
Version boundary: This September 7, 2026 review uses Timeline Studio commit 68980d1. Its CLI exposes inspection, diff, project writes, prepared media import and a limited native FFmpeg renderer. That renderer supports the documented Visuals, Voiceover and Music subset; visible captions, stickers, overlays, transitions and other unsupported composition are rejected. Capabilities here describe this snapshot, not every hosted build or Agent environment.
05
Finish the handoff with the checks that the file cannot answer
The recorded checks establish retained entry bytes, the edited ratio, a decodable synthetic MP4 and one explicit rejection boundary. They do not prove that an arbitrary browser will reopen a complex project, that a font will match, or that a cut sounds right. After handing a real project back to an editor, inspect its first frame, each important boundary, required captions and audible tracks using the actual target software.
Keep the source archive, edited archive and render as separate deliverables with clear names. Their roles differ: the source establishes the prior state, the edited archive preserves continued work, and the render exposes what one export path produced. The FFmpeg build record and pinned source manifest allow a later investigation to distinguish changed source, changed tooling and changed media.
Extract the linked kit and run node reproduce.mjs in its directory with Node, FFmpeg and ffprobe installed. The kit includes the pinned production CLI, command engine, render planner, fflate and synthetic input. It requires no account, model download or package installation. The loader changes import locations only; production function bodies remain unchanged. Reproduction writes the documented sibling fixtures and results/ files inside the kit.
Yes. This case records a six-second 180 by 320 MP4 with an audio stream and a successful complete decode. The renderer supports a limited documented composition subset.
Did the metadata edit change the source media?
For this fixture, every non-project ZIP entry retained exactly the same bytes and SHA-256 hash. The project JSON and outer archive changed.
Why did the captioned project fail to render?
The pinned native renderer does not support visible captions and returned UNSUPPORTED_RENDER_FEATURE. That composition requires a compatible render path rather than deleting the required caption.
AUTHOR
Martin Delophy
Independent full-stack and algorithm engineer in China with 10 years of frontend, AI and audio/video development experience, including 5 years focused on AI. His open-source work covers browser AI, ONNX, WebGPU, Transformers, Stable Diffusion and local-first creative tools.