Repository navigation
This version teaches cinetic what top-tier launch films measurably do. Their pictures and soundtracks were measured frame by frame, and the results became a technique library the agent draws from at random, a reference of craft norms, a recalibrated sound engine and a set of tested motion primitives in the starter.
Two snapshots of this version went through judged rounds against the same agent working without cinetic but with the official Remotion agent skills, and, new in these rounds, against the films 0.5.0 made for the same briefs. In round 7 the cinetic films met 54 of 56 of the written expectations against 41 of 56, won 2 of 4 blind comparisons with the neutral judge, 4 of 4 with the house-style judge and 3 of 4 against the 0.5.0 films. The fixes from round 7's findings are in this release but were not judged again; see docs/evaluation.md.
Highlights
- A technique library, drawn at random.
assets/library/techniques.jsonholds 273 techniques in 14 categories (opening hooks, transitions, camera, typography, UI choreography, data, product demo, end cards, colour and light, texture, layout, pacing, micro-interactions, depth). Each has a build recipe in the starter's tokens and helpers, default timing at 60 fps, when to use and avoid it, the formats and energy it suits, and a ban-safe variant where the original look touches a hard ban.scripts/pick.pydraws about one technique per 2.5 s of film, in the order the film's format needs them and weighted toward proven workhorses and its energy, so films stop converging on the same fade-up, push-in and end card.references/technique-library.mdis generated from the JSON. - Craft rules from measurement.
references/craft-rules.mdgives measured norms for pacing, smoothness, text timing, transitions, camera, UI in motion, colour over time and layout, plus what separates the top tier from good films. - Sound that stops sounding stock. Keys are a short, dark modal tock instead of band-passed noise; typing defaults to
auto(soft per-key typing over a 10 dB music duck up to 25 characters a second, one tuned blip per word above); the UI click is one bright, very short press-and-release voice per film; effects go on discrete state changes, about 5 per 10 s, and most cuts are carried by the music; the ending subtracts instead of slamming.sound.mdgains measured norms and a sound-slop table. - Tested motion primitives. The Remotion starter ships
TypeOn,Scramble,Roll,Morph,IrisandMaskRisenext toWords,CursorandRackFocus, plusE.type,E.exit,stagger,inertia,arriveK,zoomSpeedandzoomHandoff, each rendered frame by frame at 60 and 30 fps and at blur sub-frames.
Added
scripts/pick.py: weighted random draws from the technique library (--format,--energy,--seconds,--category,--n,--seed,--exclude,--avoid,--brand-supplied,--json),--list,--show <id>,--validateand--markdown. A plan prints its seed so it can be reproduced and recorded in the treatment.assets/library/techniques.jsonand the generatedreferences/technique-library.md.references/craft-rules.md.- The treatment template gains a "Drawn techniques" section and a gate line for it.
- Starter primitives in
src/fx/and helpers insrc/lib/anim.tsandsrc/lib/camera.ts(see Highlights);references/motion-tokens.mdlists them with their defaults. score.py: typing stylesauto(default),soft,mechanical,pitched,muted,wordandoff; a music duck under per-key typing (mix.typing_duck_db); levelling of keys, clicks, crisp ticks and word blips against the music; acrisptick variant; a typing block, effect levels and the loudest moment's position in the report.synth.py:key_clickstyles and kinds with a secondary transient,word_blip,crisp_tick, a newui_click, and a small room for tiny sounds.render.sh --looprenders lossless PNG intermediates, so a loop's seam survives the encode, anddeliver.sh --loopencodes the WebM at CRF 26.render.sh --blurstops before the sub-frame pass while a move is faster than clean blur allows (80 px/f), or on an unexplained full-frame change away from an act boundary, which would be a cut its sub-frames blend into a double exposure.--accept-fast A-Band--accept-cut A-Bwaive a range you checked at full size (a frame-filling wipe, a flood, a flash, a zoom-through).av-audit.pywarns when a landing sound (land, pop, tock, bell, snap, hit, drop) comes after the picture has already stopped moving.forensics.pygates a still opening, measured on the film's own scale (a warning when the first visible change comes after 1.0 s, a failure after 2.5 s), and runs the hook check on films of 6 s or less with 1 s windows.brand-svg.tswrites aLockupSvgexported fromsrc/brand/Mark.tsxas is, for marks that are part of the word, sobrand-kit.shno longer assumes a mark beside a typed name.sheet.py --imagestiles stills or frames you already have, labelled by file name.grid-check.tsaccepts one declared designed hold (export const HOLD = {from, to}, at most 96 f at 60 fps).- Tests for
pick.py(scripts/test/pick.test.py), run in CI, including a check that the generated library page matches the JSON.
Changed
- SKILL.md Step 1 draws the film's techniques with
pick.pybefore the beat sheet. The agent builds the picks the concept can carry and rerolls (at most twice) or drops the rest with a written reason; it never adds an undrawn technique. - Measured norms replace several defaults: one designed near-still hold of 60–96 f per film; an end card that assembles over 60–80 f and then holds 36–80 f still or creeping ≤ 6%; exits into a cut on
E.exitand entrances decaying ×0.89–0.94 per frame; text being read at most about 3 px/f; entry blur 6–8 px or none (Wordsdefaults to 8); standalone hero words up to 5× the statement size; frame-filling edges allowed 150–300 px/f for a few frames; secondary moves starting at 55–75% of the leading move; continuous takes up to 560 f; one lull of 1–4 s at 55–85% of the runtime and the biggest peak at 75–90%; large centred product windows; 12–20 f cursor travel with a 60 f dwell; time-boxed prompts. - Sound rules: the drop on the hero reveal is the loudest moment, and the lockup is the most resolved one; effects sit within ±0.15 pan except whooshes and risers; whooshes (about 2 a film) only on camera-scale moves and logo zooms; risers end on a hard stop, a filter drop or a gap.
av-audit.pysuggests a sound only for the 3 biggest picture changes, instead of warning on every strong change without one.- Product UI: push in 2–5× on every interaction that carries the story, hold a wide shot of readable UI at most about 1.7 s, and label every bar or chart that carries meaning. A text reveal never shows part of a glyph.
taste-and-slop.mdnames haze behind the hero and the stock tech palette.- Sound goes on the frame an arrival becomes readable (its
settleOf), never on the tween's last frame or a later bar line; every arrival of the lockup is sounded where it happens. Frame-0 sound assumes a moving frame 0. - Anything posted to a feed masters at −14 LUFS whatever the brand's temperament; −16 is only for a sting that plays at the head of other videos.
brand-and-color.mdadds the word test for a mark that is a letter of the name, and how to export such a lockup.- A loop's frame 0 is its poster and names the product; numbers stay true in every in-between state; every number on screen carries its label or unit.
- The 9:16 feed zone keeps the bottom 420 px clear (was 384), matching current overlays.
- The static end tail
forensics.pyallows is 2 s at the film's frame rate instead of a fixed 120 frames. finishing.md: run long renders in the background and read the log.- The hook names the product on screen by about a quarter of the runtime. The oversize opening line (
oh-oversize-fly-then-small) travels every frame and hands straight to the small one, and becomes a signature move.
Fixed
av-audit.pypicks onsets in numpy. librosa's cached numba peak picker could segfault the whole process.- A key event on frame 0 could start before the film and lose its attack.
mixColoraccepts thergb()strings it returns, so nested mixes no longer fall back to black.- A loop rendered from JPEG intermediates failed its seam gate even when its frames matched.
pick.pyfailed inside a film project:new-film.shnow copies the library toscripts/library/, andpick.pyfinds it there. When a category has run out for the format, it says so instead of blaming--energy.lint-film.mjsflagged a build number such as "#2187" as a purple hex; an all-digit #NNN(N) in running text is now a number label.- A sub boom dropped onto true silence, and a silence opening again, clicked; both now ramp over a few milliseconds.
- A hard cut inside an act blurred into one double-exposed frame:
measure-speed.pynow renders every hard cut it measures with one sample.
Install with the skills CLI: npx skills add Leonxlnx/cinetic
Or download cinetic.skill below: a zip of the skill folder with cinetic/SKILL.md at its root.