Independent visual research / Public editionReviewed 05 Sep 2026
Motion fieldnotesOpenAI film study
About this study

Worked example / original assets

A map, a push, four badges.

Adapt CameraPush and MotifMontage into a new silent sequence. Their recipe pages retain the inspected source moments and limitations.

Download the tested 26-file project ↓ · Download the 13-second MP4

The examples/trail/ directory is a complete 13-second adaptation of CameraPush and MotifMontage. A fresh-context agent built the original map and badge from the guide and project, then rendered them together. This packaged example makes the asset replacement and sequence wiring explicit; it does not change any of the fourteen default compositions.

Run the complete example

From the project root, after npm ci and npx remotion browser ensure:

npm run typecheck
npm test
npx remotion studio examples/trail/index.tsx
npx remotion render examples/trail/index.tsx TrailSequence out/trail-sequence.mp4 --codec=h264 --pixel-format=yuv420p --muted

The example has its own entry point. npm run render is intentionally not used here because that script fixes the default entry to src/index.ts. Expected output: 390 frames, 13 seconds, 1280 × 720, 30 fps, silent H.264 MP4. The root remotion.config.ts supplies the same PNG/BT.709 settings as the primary studies. No private browser path, API key or asset service is required.

Follow the files, in order

File Complete responsibility
examples/trail/assets.tsx Draws the fictional trail map, landmark coordinates and four materially different ridge-badge treatments as original inline SVG.
examples/trail/model.ts Defines shared content, the camera target and each recipe's local frame boundaries; derives cumulative offsets and shot durations.
examples/trail/Sequence.tsx Applies the existing camera and stage primitives to the new graphics, adds frame-space masks, replaces badge variants and sequences the two shots.
examples/trail/index.tsx Loads both bundled fonts through a render gate, validates the phase props, registers TrailSequence and derives its total duration from the layout.
examples/trail/test.mjs Checks the exact seam, total duration, target coordinates and protected final hold. Included in npm test.

The example keeps its assets and composition separate instead of replacing Artwork globally. Choose this scoped pattern when the other study examples must remain unchanged. Replace a shared component only when every use should receive the new artwork. No hidden patch or omitted external design package is needed: every source file is in the download and source viewer.

Geometry and timing decisions

The first shot lasts 180 frames. It establishes the map for 30 frames, travels during frames 30–66, then leaves 18 settled frames before the annotation appears at 84. The complete target holds until frame 180. Landmark (790,355) is in the full 1280 × 720 design frame, so its normalized focus is (790/1280,355/720). At the chosen scale 1.65, the shared camera formula centers that landmark.

The map, badge and target annotation are camera children. The 1280-pixel-wide header and footer masks, title and footer are camera siblings. A first-pass footer leak was caught during the fresh-context frame review and fixed with those full-width masks. Merely placing opaque text boxes behind the captions did not mask the whole traveling map.

The second shot begins at outer frame 180; its child clock starts at zero. It lasts 210 frames and cuts among four badge treatments at local frames 0, 30, 60 and 90. The final treatment remains visible through local frame 209. The declared protected final hold starts at 120. This custom four-treatment example differs deliberately from the base study's three palette variants; its text, cut count and tests agree with its own four treatments.

The two half-open intervals are [0,180) and [180,390). Sequence supplies local frame clocks, and cumulative durations determine the cut at six seconds. Changing a shot duration changes the next offset through trailLayout; there is no second manually maintained outer start time.

Substitute your own permitted asset

Change TrailMap or RouteBadge while retaining the identity needed across the edit. These are actual new SVG assets, not just string/color overrides. For a licensed bitmap, use Img and staticFile with explicit dimensions and objectFit; put the file under public/ and retain its license. Keep that image inside the camera only if it should move with the workspace. The complete font gate in index.tsx is required by the bundled typography and must not be removed just because a preview happened to load quickly.

After replacement, update the target from the real asset's design coordinates, check the mask extents at maximum scale, and inspect the last frame before and first frame after every cut. Play the export at 640 × 360 as well as full size. Keep enough hold for the new content; a longer label does not inherit a valid reading budget from the shorter example.

Host preflight and a failure observed in the test

Check the project separately from its browser host:

node --version
node -e "require('node:os').networkInterfaces(); console.log('Interface enumeration OK')"
npx remotion browser ensure
npm run typecheck
npm test

One restricted executor failed in Node's os.networkInterfaces() with uv_interface_addresses errno 97 before Remotion evaluated any composition. That is distinct from missing Linux Chrome libraries or a missing image/font. Use a supported host where Node can enumerate interfaces and Chrome can run; then rerun the ordinary commands. Do not modify your footage or dependency source to hide a host error. The acceptance experiment separately disclosed an opt-in, process-only loopback fallback; it is not required by the scenes and is not silently installed or shipped as a default project setting.

The fresh test's original unassisted failure and assisted render are reported separately. Successful assisted rendering does not mean that the host restriction vanished. No recording synchronization or final presentation approval is implied by this silent, fictional research example.

Fresh-context asset adaptation

On September 5, 2026, a separate agent received only the downloadable project and its guide, without repository or private product context. It replaced the fixtures in CameraPush and MotifMontage with an original fictional trail map and four distinct route-badge treatments, then rendered a new 13-second sequence. The map is an illustration, not geographic or navigation data.

The trial exposed three gaps: a concrete asset-replacement example; complete two-recipe registration, font loading and local clocks; and diagnosis of a restricted-host failure. The project now includes ASSET_ADAPTATION.md and five complete files under examples/trail/. The example has a separate entry point and does not change the fourteen default compositions.

A fresh extraction of the revised 26-file ZIP passed npm ci, typechecking and all tests. The agent rendered the documented TrailSequence entry without editing any archived source file. Its final export has 390 frames, 13 seconds, 1280 × 720, 30 fps, H.264/yuv420p/BT.709 and no audio; full decoding completed without errors. The original thirteen recipe exports and 50-second sequence retain their previously inspected source and rendered bytes.

Host-qualified rendering result

On the restricted test executor, the documented Node interface-enumeration preflight and unassisted render both failed with os.networkInterfaces() / errno 97 before evaluating a composition. The successful retest used an explicitly disclosed, external process-only loopback-interface adapter. No project or Remotion dependency was patched; the adapter is not included in the download. This is not an unassisted render success on that host. The guide distinguishes that restriction from missing Chrome libraries and directs users to a supported host. The earlier default-project clean render and browser-install checks remain separate evidence.

Rendered comparison

The first adaptation exposed a map layer leaking behind a fixed footer during the push. Full-width frame-space masks fixed it before acceptance. The complete corrected sequence was played at 1×; the final packaged-example render was then compared with that accepted export across all 390 decoded frames and 21 selected boundary, motion and hold frames.

All 210 montage frames match exactly. The camera shot has small raster differences: whole-sequence SSIM is 0.999557 and frame 84's mean absolute channel difference is 0.2824 on a 0–255 scale. Side-by-side and amplified differences show no material timing, geometry, text, mask or continuity regression in the inspected frames. The precise cause of the raster differences was not established. The exports are not pixel-identical. The failed strict-equality check is retained in the local evidence; it is not reported as a pass.

These checks resolve the three guidance gaps. They do not prove that arbitrary replacement assets will fit, that every host can render, or that an actual talking-head recording has been synchronized. The separate-video workflow, real-recording timing and storyboard approval boundary still apply.

Verification data / JSON · Verification / Markdown

Twenty-one decoded frames show the map push, fixed masks, four badge treatments and final hold
Decoded boundary, travel and hold frames from the final export. Inspect full-size for small labels.

Reference frame

Enlarged reference frame

Watch this moment on the official channel ↗