Direct, build and render premium cinematic motion design from code — launch films, product and feature videos, looping feature animations for landing pages and social, logo stings and reveals, UI walkthroughs, app demos, kinetic type, teasers, trailers, intros and promo clips. Use this whenever the user wants any video, animation, motion graphic or animated demo made with Remotion, HyperFrames, HTML/GSAP or React, or asks to storyboard, time, score, render, polish or critique one — even if they only say "make a video about X", "animate this feature" or "we need a launch clip". It supplies concept and copy discipline, type and colour taste that defers to a supplied brand, a beat-locked timeline that drives both picture and a synthesized soundtrack, choreography and transition craft, real product UI in motion, film-grade finishing (true motion blur, no banding, BT.709, sync-checked mux) and a measured self-critique loop on contact sheets and renders.
npx skills add https://github.com/Leonxlnx/cinetic --skill cinetic
You are directing a short film, not animating a web page. Picture, copy and sound are one system driven by one timeline file, and nothing is finished until it has been rendered, measured and critiqued.
scripts/render.sh work from the skill root and also inside a film project, because scripts/new-film.sh copies every script into the project. Every script except brand-svg.ts (which brand-kit.sh calls) prints --help.references/worked-example.md walks through Tessel, a 33 s launch film at 1920×1080 and 60 fps, and shows each rule below in use, including the mistakes. Read it once before your first film.The target is a film people watch twice: one idea the product owns, told in pictures, where every frame looks chosen and nothing is there to fill space.
When you invent the look, none of these appear, ever. They are the fastest tells of generated work, and this skill exists to make films that don't look generated. lint-film.mjs checks the tokens and styles for them, and the critics check the frames.
Every word on screen earns its place.
What remains is plenty: ink and paper (light or dark, neutral or cool), one accent with a meaning from any hue family outside the banned ones (red, green, teal, blue, yellow), one sans, and motion that is ultra clean and smooth, eased, weighted, motion-blurred and free of jitter. The creativity goes into the idea, the device and the choreography, not into effects.
If the user supplies a brand that includes one of these (their serif wordmark, their orange), the brand wins, because it is their identity rather than a default. Record it in BRIEF.md so the critics don't flag it, and mark the lines that set it with // cinetic:brand-supplied <what> so the lint accepts them.
Choose a row first. It sets the length, the density and the list of files to deliver. The recipe for each format is in references/formats.md.
| Format | Length | fps | Grid (BPM) | Story beats | On-screen words | Sound | Deliverables |
|---|---|---|---|---|---|---|---|
| Launch film / teaser | 20–45 s | 60 | 120 | 8–10 per 30 s | ≤ 20–35 in total | full score + SFX | 16:9 master, 9:16 and 1:1 re-layouts, poster, brand kit if invented |
| Product / feature video | 8–30 s | 60 | 100–120 | 1 capability per 8–10 s | ≤ 15 | light bed + UI SFX | master, poster |
| Feature loop | 4–15 s, whole bars | 60 (GIF 25) | any; whole bars | 3–5 | ≤ 8, reads muted | optional | MP4, WebM, GIF, seamless seam |
| Logo sting | 3–8 s | 60 | 120 | 2–4 | name + ≤ 4 | one tuned hit + tail | MP4, ProRes 4444 alphas (held and cleared), poster, brand kit if invented |
| UI walkthrough | 20–90 s | 60 | 90–110 | 1 chapter per 2–4 bars | ≤ 6 per caption | bed + UI SFX | master, SRT captions |
Use 60 fps whenever UI, text or the camera moves. At 30 fps slow drifts visibly step and fast moves strobe, and 24 fps is never right for UI. A GIF is the one exception: export it at 25 fps (or 50) from the 60 fps master, because GIF frame delays are whole hundredths of a second and 30 fps plays 11% fast.
timeline.ts. *Why:* consistent motion *is* brand motion, and ad-hoc eases read as generated.Every step writes a file, and every gate is a check you actually run. Work inline. Subagents are for critique only (§8), because building frames in parallel costs more time than it saves.
BRIEF.md--batch renders driven by variables.BRIEF.md, plus any brand-supplied exceptions. Critics are later prompted with this file word for word, so it doubles as the QA contract.bash <skill>/scripts/new-film.sh films/<name> --fps 60 --bpm 120 --size 1920x1080 [--engine hyperframes]. Pass --link-modules <dir>/node_modules to reuse an existing install instead of running npm install.BRIEF.md has a spec line, for example 1920x1080@60, 30s, 120BPM, audio: synthesized.TREATMENT.mdRead references/concept-and-story.md now.
python3 scripts/pick.py --format <launch|feature|loop|sting|walkthrough|vertical> --energy <calm|medium|high> --seconds <length> --json out/qa/picks.json. It draws about one technique per 2.5 s of film (5 for a 12 s video, 12 for a 30 s launch) from the measured library in assets/library/techniques.json, in the order the format needs them, weighted toward proven moves and the film's energy, and prints each recipe with default timing. Choosing by hand converges on the same fade-up, push-in and end card in every film; the draw is how two films stop looking alike. Build the picks the concept can carry, retold in its objects and device; the story, product truth and one consistent UI language come first, and a film that crams in every move reads as a showreel. Reroll a pick that fights the concept at most twice (--category <cat> --exclude <id>), or drop it, with a written reason; never add a technique the draw did not give you (draw one with --category), and pass --brand-supplied <look> when the brand owns a banned look. Read a drawn entry in full with pick.py --show <id>; references/technique-library.md lists every entry (search it, don't read it whole). Measured pacing, easing and text-timing norms are in references/craft-rules.md.assets/TREATMENT.md for the concept you chose:src/brand/Read references/brand-and-color.md and the type section of references/copy-and-type.md.
// cinetic:placeholder, and lint-film.mjs reports an error until every marker is gone. Apply the user's brand, or invent one for this film, then delete the markers. A film that keeps the starter's look looks like every other film made from it.references/brand-and-color.md §2:@fontsource-variable/* and vendor it with node scripts/add-font.mjs <name> (safe with a shared node_modules); Geist is only the starter's stand-in;A calm notes app and a fast CI tool should not share a look.
src/brand/tokens.ts (python3 scripts/palette.py --accent '#…' --stage dark builds the neutrals, checks contrast and refuses a banned hue):MarkSheet still in references/brand-and-color.md §4).src/brand/Mark.tsx on a 100-unit grid, with gaps of at least 8 units so it survives being scaled down.palette.py notes it), and in a dev tool red UI tags read as errors; spend the red on the brand's own thing.#3B82F6 / #2563EB family) and flat pure greys read as "default".#000.references/brand-and-color.md §8–10 has worked palettes.Stills folder and look at them: the mark at 16 px and at full size, one statement frame, and one product frame. npm run stills renders the mark stills; add your own with npx remotion still <StillId> out/stills/<name>.png.TREATMENT.md;node scripts/lint-film.mjs src reports no placeholder and no colour or font that is not a token.src/timeline.tsRead references/timing-grid.md now.
ACT holds contiguous, bar-aligned acts;CUE holds named frames that sit on the grid;COPY holds {id, text, in, resolved, out} for every line;TOTAL includes a tail of at least 60 f.npx tsx scripts/grid-check.ts src/timeline.ts passes (npm run check runs it together with tsc and the lint). It checks that every cue is on the 16th grid (or carries an offgrid: reason), that text holds are long enough, that no gap without an event runs past 48 f, and that the word count is within budget.src/acts/Before you write motion, read references/motion-tokens.md, references/camera.md, references/transitions.md, and references/product-ui.md if the product appears. Keep references/chromium-rendering.md open while you debug.
useCurrentFrame(). Mount one <Sequence> per act in Film.tsx, and register each act as its own composition in the Acts folder so you can iterate on it alone.src/lib/anim.ts (§6). A raw bezier inside an act is a lint error, because that is how a house style decays.data.ts module with asserts on dates, weekdays, counts, plurals and sums. The data must agree with the story too: the person who paid doesn't owe, a "sorted" list is actually sorted, a stated ratio matches its numbers, and no number appears twice in one frame. That holds in every frame, in-between states included: a copy headed "owes Maya" over the whole bill's total is a wrong number on screen for as long as it shows. Frame the UI large enough to read on a phone: push in 2–5× on every interaction that carries the story, and hold a wide shot of readable UI for at most about 1.7 s. Every bar, segment, chart or bare number that carries meaning shows its value, label or unit: a row of "18 24 12 31" under M–S reads as dates, not pages. A screenshot never carries the hero shot.LANDINGS or SNAP), so the cue export can import it.<FontGate>.python3 scripts/sheet.py --comp Act2 --every 2 --out out/qa/act2.png renders the act and tiles it with frame and time labels. Use --every 2 for fast sections.bash scripts/layout-audit.sh Act2 --cues.lint-film.mjs is clean;layout-audit reports 0 safe-area or overlap violations, and no readable text faster than 20 px/f;public/audio/soundtrack.wavRead references/sound.md now.
npx tsx scripts/export-cues.ts, which writes out/cues.json. Sync points are computed from the picture code (spring contact frames, 50% pop frames, velocity peaks, 97% settles) and never typed by hand. Typed sync points landed 8–11 f off in practice.references/sound.md §5.5a first. A calm brand gets soft mallets and one gentle chord; drops onto silence and sub booms are for energetic launch films only.progress in score.json).payoff points there. The lockup is the most resolved moment, not the loudest: the music stops on a bar line or filters down as the logo forms, 0.2–0.7 s of near-silence, then one soft resolved element on the frame the wordmark becomes readable (its settleOf, never the tween's last frame or a later bar line: a sound after the motion has stopped lands on nothing) and a 0.5–2.5 s tail. A sting is all lockup: its hit is its loudest moment.audio/score.json: key, one chord per bar, sections (with a breakdown or stop about 5 LU down at 40–80% of the runtime), drops and silences. Keep "typing": "auto" unless the brand asks otherwise.python3 scripts/audio/score.py --cues out/cues.json --score audio/score.json --out public/audio/soundtrack.wav --stems out/stems --json out/qa/score.json (npm run audio). The stems let av-audit.py check each sound against its cue; the master chain lives in scripts/audio/master.py.master.lufs in audio/score.json: −14; −16 only for a sting that plays at the head of other videos, never for a social or feed cut, whatever the brand's temperament), with true peak ≤ −1.5 dBTP before encoding;score.py warns);out/film.mp4Read references/finishing.md now.
bash scripts/render.sh Film out/preview.mp4 --preview --audio public/audio/soundtrack.wav. Remotion renders the picture muted and BT.709-tagged, and ffmpeg muxes the audio. Iterate and critique on previews only.bash scripts/render.sh Film out/film.mp4 --blur: sharp render → speed measurement → FilmSub sub-frame render → float accumulation → mux → sync check. Otherwise, with no flag, render.sh renders a sharp master at CRF 14. Loops take --loop (lossless PNG intermediates, so the seam survives the encode) and, when silent, --no-audio.--budget 6 caps it.--frames A-B) and splices it, rather than re-blurring the film.--samples-from); one whose fastest motion is ≤ 12 px/f renders sharp.src/ while a render runs: render.sh renders from a bundle frozen at its start and warns if the source changed meanwhile.pkill -f pattern: on a shared machine the pattern also kills other people's renders.render.sh --blur stops before the sub-frame pass while any are left: redesign them rather than adding samples (§6), or waive a frame-filling edge you checked at full size with --accept-fast A-B. Every hard cut is an act boundary: a cut inside an act blends its two shots into one double-exposed frame, so the render also stops on one (--accept-cut A-B for a flood or flash you checked).render.sh runs both checks below and exits 1 if either fails. Run them again on any file you deliver:python3 scripts/probe.py out/film.mp4 --spec 1920x1080@60 --dur <s> passes: size, fps, duration ±1 f, yuv420p, BT.709 tags, AAC at 48 kHz;python3 scripts/check-sync.py out/film.mp4 public/audio/soundtrack.wav reports a lag of ≤ 48 samples and true peak ≤ −1 dBTP after decoding.Run §8 on previews. Launch films and walkthroughs get at least 2 rounds. For stings and loops whose scripts all pass, 1 round is enough. The blurred master then gets a check, not a round: forensics, av-audit, its fastest frames at full size (every act's, including the lockup's entrance and exit, where a sliding wordmark most often shows stepped copies; fix with measure-speed.py --floor a-b:n), and a director's glance.
bash scripts/deliver.sh out/film.mp4 with the flags your format needs: --loop --gif --webm for loops, --alpha StingAlpha,StingAlphaClear for ProRes 4444, and --variants Film9x16,Film1x1 for social versions. It writes the poster (the final frame) and, in qa/, a manifest. For a brand you invented, bash scripts/brand-kit.sh exports the mark, lockups, favicon sizes and avatar. Re-lay the social versions out from the same timeline; never crop the master (see references/formats.md).README.md: the idea, the device, the grid, how to render, and the file list.qa/ subfolder. A client opens the folder before they open the film.probe.py at its own spec.Small jobs should stay fast. The laws, the grid, the lint and one review round still apply. The rest shrinks:
TREATMENT.md: logline, device, the pick.py draw for the format, a bar table of 2–8 rows, and the copy. It replaces Steps 1–3 as separate passes. Still write timeline.ts and run grid-check.ts.forensics.py --loop checks it, and so does deliver.sh --loop); render it with render.sh --loop. Build the loop as a cycle rather than as enter, hold and exit. Frame 0 is also the poster and the first frame a visitor sees, so compose it with the product's name or chrome on screen.The full catalogue of cheap-looking tells, each with its fix, is in references/taste-and-slop.md. Search it during review.
These rules ban the tells of generated work, not personality. Two films made with this skill for different brands should not look alike. If yours looks like the starter, the Tessel example or your last film, it is not finished.
Copy (references/copy-and-type.md)
Type
@fontsource-variable/*). No serif and no italic (see Hard bans).blurIn (clear by 60% of the eased move, because Chromium steps blur radii and renders anything under ~0.75 px fully sharp). Text lands sharp and is never left readable-but-blurred for more than 6 f.Colour (references/brand-and-color.md)
0 20–40px 60–120px rgba(0,0,0,.12–.22), dark surfaces get a 1 px top hairline at 8–12% white, and gradients ship as dithered PNGs (scripts/dither-gradient.py), because CSS gradients band at 8 bits.Layout
Decoration
Product truth (references/product-ui.md): named, specific, consistent data; counters count on each visible event; the product only replans the future; no cursor once the product acts on its own; any paused frame still makes sense.
Transitions (references/transitions.md)
src/timeline.ts is the only source of timing. Picture, cue export and grid check all import it. Details and the full pattern are in references/timing-grid.md.
export const BEAT = (60 / BPM) * FPS; // 30 f at 120 BPM / 60 fps
export const BAR = BEAT * 4;
export const b = (bar: number, beat = 0, sub = 0) => // sub = 16ths
Math.round(((bar - 1) * 4 + beat) * BEAT + sub * (BEAT / 4));
const L = (abs: number) => abs - ACT.plan.from; // act-local frames, one per act
av-audit.py suggests one when a top-3 picture change has no audio onset.cue − 1, because prog() is 0 on its start frame.hitPulse).beat − delayTo(cfg, 0.5) so its pop lands on the beat.export const HOLD = {from, to} in timeline.ts). When a gate flags a quiet stretch, give it motion; loosening the threshold to pass is not a fix.A soft first second loses a muted feed.
Where a sound goes (computed by src/lib/sync.ts: peak, hit, delayTo, settleOf):
| Picture event | The sound sits on |
|---|---|
| Landing / impact | the contact frame, so the motion must arrive with velocity (spring threshold 0.92–1.0, or the contact ease) |
| Pop-in | the frame at 50% of travel |
| Tween settle | the 97% frame |
| Whoosh (camera-scale moves and logo zooms, about 2 a film) | onset 100–450 ms ahead, apex on the visual peak |
| Typing | per key up to 25 chars/s, one blip per word above ("typing": "auto") |
| Exit roll | one tick, with no detent |
| Cut, scroll, stream, progress bar, rolling counter | nothing: the music carries it; a counter's final lock gets a crisp tick |
Audio that leads the picture by more than about 45 ms reads as "sound first". Move the picture, not the sound.
The tokens live in src/lib/anim.ts (E, SPR, tw, prog, mix, lmix, hitPulse, blurIn, arrive, arriveK, stagger, inertia, rand, fd), and tested primitives for the commonest moves in src/fx/ (Words, TypeOn, Scramble, Roll, Morph, Iris, MaskRise, Cursor, RackFocus): use them before writing your own. Curves, measured values and choreography constants are in references/motion-tokens.md; camera work is in references/camera.md.
| Token | Bezier | Use |
|---|---|---|
| out | .16,1,.3,1 | arrivals, reveals |
| outSoft | .22,1,.36,1 | gentle settles |
| in | .7,0,.84,0 | implosions, a hard snap out |
| exit | .55,.055,.675,.19 | exits into a cut: about ×1.14 per frame over the last 10–24 f |
| inOut | .87,0,.13,1 | whips, lockup slides |
| smooth | .65,0,.35,1 | drifts, fades (10–14 f) |
| ui | .4,0,.2,1 | small UI changes |
| cam | .48,.1,0,.9 | camera: slow start, peak at about 27%, long settle |
| glide | .47,.2,.15,1 | 150–350 px moves |
| rest | .45,0,.1,1 | moves that end at rest; chaining after another move |
| contact | .55,0,.9,.55 | accelerating into an impact |
| whip | .6,0,.15,1 | feature-to-feature whips |
| dolly | .35,0,.65,1 | slow push through a hold |
A film uses about 3 easing characters. Linear is only for drift.
Springs (SPR, as damping/stiffness/mass): snap 18/260/0.7 (small overshoot), pop 11/180/0.6 (a landing only), soft 26/120/1 (no overshoot), heavy 30/90/1.4 (weighty).
forensics.py fails and Finish at 5 (§8).|1 − s| < 0.01.Easing.spring({damping:200}) starts at zero velocity, so it is not a replacement for expo-out.Laws of weight:
exp(mix(log a, log b, t)), which is lmix.hitPulse(t, attack = 2, tau = 5). A half-sine on a hard window leaves velocity clunks and peaks 6–8 f late.These come from real failures. Each costs minutes to respect and hours to debug.
Both engines
transition, animation or @keyframes, because they don't render deterministically.Math.random, Date.now or performance.now; use a seeded rand(seed).transform (left:0; top:0; transform-origin:0 0; transform: translate() scale()). A fractional left/top combined with a transform snaps to whole pixels.arrive(p) (and start an exit on depart(q)) instead of letting an ease-out creep its last pixels (references/chromium-rendering.md §15).will-change on a layer where filter: blur() animates. It causes nondeterministic ghost frames.src/fx/RackFocus.tsx.fd(frame) (Math.round), because motion-blur sub-frames are fractional.FontGate). A measurement taken earlier is cached with the fallback width.Remotion (references/remotion-engine.md)
interpolate extrapolates by default, so always clamp; tw() and prog() do it for you.premountFor only affects Studio preview and does nothing in a render. With layout="none" it is silently ignored in 4.0.529 (no error). Don't build on it.Interactive.* markup is an optional leaf layer, never the structure.--muted and let ffmpeg mux the audio (Remotion's AAC leaves about 2.5 f of priming). Use the ANGLE GL renderer, JPEG q95 intermediates and a 120 s delayRender timeout; the starter's remotion.config.ts sets all of these.REMOTION_BROWSER to the local headless Chromium if auto-detection misses it.HyperFrames (references/hyperframes-engine.md)
data-composition-id.fromTo, never from.repeat:-1. No <br>.<audio> has an id; one without is silently dropped from the mix.<style> and <script> go inside its <template>.@font-face.check means anything, because otherwise it reports a misleadingly clean "0 samples".bash scripts/hf-finish.sh. Films faster than about 18 px/f belong in Remotion.The full procedure, the critic prompts, the rubric anchors and the table of thresholds are in references/review-loop.md. A round goes like this:
out/qa/:python3 scripts/probe.py out/preview.mp4 --spec 1920x1080@60 --dur <s>python3 scripts/forensics.py out/preview.mp4 --cues out/cues.json --json out/qa/forensics.json. It checks pops, stalls, dead holds, ghost frames, border slivers, judder, sharpness steps, banding and compression smear on flat fields. Declare designed cuts and freezes with --cuts and --freeze-ok so they are not flagged, and add --loop for loops to check the seam.python3 scripts/av-audit.py out/preview.mp4 --cues out/cues.json --stems out/stems --json out/qa/av.json. It checks onsets against cues (per stem, so the bed cannot hide a late effect), loudness, true peak, clicks and the tail.python3 scripts/sheet.py out/preview.mp4 --chunks 4 --rate 12 --out out/qa/sheet.png, plus a legibility sheet at --width 480. Grab exact frames with bash scripts/grab.sh out/preview.mp4 <frame>….assets/critics/. Launch them as parallel subagents if the harness allows it; otherwise run them one after another, and look at the sheet *before* you open the code. On a tight usage budget, run the director and art lenses only, yourself, on the sheets, and let the scripts cover forensics and sync; never skip the lenses entirely, because they catch most of what the scripts can't.director.md): the weakest 3 s; anything cheap, templated or dead; whether each act lands in under 1 s; whether the story reads muted; the 2 s hook; the end. At most 12 changes.forensics.md): reads the script JSON and inspects the flagged frames at full size.sound-sync.md): onsets against cues, masking, key, the ending.art-copy-ui.md): type, colour discipline, strings, data truth.{issues:[{id, priority, frame, problem, fix:{file, change}}], overall, score}.verifier.md). Try to refute each P0 and P1 from frames and code. Drop an issue if it is wrong, invisible at normal speed, or if its fix would make things worse.Critic prompts say what changed, so it gets checked hardest. They also say "Do not re-report fixed issues" and "Don't propose adding text", and they batch images into sheets, because images are expensive in context. When one act stays weak after two rounds, run the design-off in review-loop.md.
Severity: P0 is visible on a key beat (hook, payoff, logo) or breaks the story; P1 is noticeable on a normal viewing; P2 is visible only when paused.
Ship gate
Read each file when its step comes up. Don't read them all at once.
| When | File | What it gives you |
|---|---|---|
| Step 0, choosing a format | references/formats.md | a recipe per format: act templates, loops, stings, walkthroughs, social re-layouts |
| Before the first film | references/worked-example.md | Tessel from idea to master, with 15 mistakes and their fixes |
| Step 1 | references/concept-and-story.md | concept lenses, ownership and deletion tests, device design, arcs, end cards |
| Step 1 | assets/TREATMENT.md | the treatment template |
| Step 1, after the draw | references/technique-library.md | every technique in the library: recipe, timing at 60 fps, when to use and avoid it |
| Steps 1, 3–4 and review | references/craft-rules.md | measured norms for pacing, smoothness, text timing, transitions, camera, UI and colour over time |
| Steps 1–2 | references/copy-and-type.md | copy budget, callback copy, loading a family, type scale, kinetic type, safe reveals |
| Step 2 | references/brand-and-color.md | personality → choices, naming, the mark sheet, lockup proportions, tokens, accent, stages |
| Step 2 and review | references/taste-and-slop.md | every cheap-looking tell, with its fix |
| Step 3 | references/timing-grid.md | BPM/fps table, the timeline.ts pattern, sync helpers, schedules, typing cadence |
| Step 4 | references/motion-tokens.md | easing and spring tables, hitPulse, anticipation, landings, staggers |
| Step 4 | references/camera.md | anchor camera, log-space zoom, breath/dip modifiers, rack focus, 3D limits |
| Step 4 | references/transitions.md | energy table and the seam catalogue, each with frames, curves and failure modes |
| Step 4 | references/product-ui.md | the smart part, data and story asserts, FLIP inserts, counters, cursor physics, typing |
| Step 4, Remotion | references/remotion-engine.md | verified API facts, config, CLI recipes, pitfalls |
| Step 4, HyperFrames | references/hyperframes-engine.md | render model, composition rules, CLI, translating cinetic to GSAP |
| Any render artifact | references/chromium-rendering.md | symptom → cause → fix → detection for rasterisation traps |
| Step 5 | references/sound.md | synthesis palette, score.json schema, placement, mix and master |
| Step 6 | references/finishing.md | motion-blur pipeline and its cost, banding, BT.709, encoding, mux, deliverables |
| Step 7 | references/review-loop.md | round procedure, rubric, severity, thresholds, design-off |
Tools you already have. Reach for these before writing a helper of your own.
| Need | Tool |
|---|---|
| a project from the starter | scripts/new-film.sh |
| a random, weighted draw of techniques for the film; one entry in full | scripts/pick.py (--show <id>, --list) |
| static bans and hard bans, a leftover placeholder brand | scripts/lint-film.mjs |
| grid, holds, gaps, word budget; text in the safe zone (feed presets: --safe feed9x16), text covered by movers, readable text faster than 20 px/f (--cues) | scripts/grid-check.ts; scripts/layout-audit.sh |
| a font family, vendored into the project without npm install | scripts/add-font.mjs (or new-film.sh --font) |
| a palette from one accent, contrast, accent coverage on a still | scripts/palette.py |
| gradients that don't band | scripts/dither-gradient.py |
| cues for the sound; score, SFX, mix, master and tail fade | scripts/export-cues.ts; scripts/audio/score.py, synth.py, master.py |
| previews, masters, motion blur, splices, chunked renders | scripts/render.sh (--preview, --blur, --frames, --budget), scripts/render-chunks.sh |
| on-screen speed, too-fast moves; float accumulation | scripts/measure-speed.py; scripts/accumulate.py |
| spec, A/V lag and true-peak gates | scripts/probe.py, scripts/check-sync.py |
| contact sheets, exact frame grabs | scripts/sheet.py, scripts/grab.sh |
| pixel QA, loop seam; audio and sync QA | scripts/forensics.py (--loop); scripts/av-audit.py |
| poster, GIF, WebM, loop seam, alpha, variants | scripts/deliver.sh |
| brand kit: SVG and PNG mark and lockups, favicons, avatar, X header; outlined lettering | scripts/brand-kit.sh; scripts/outline-text.py |
| the HyperFrames finish | scripts/hf-finish.sh |
Take leonxlnx/cinetic from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm, npx.
Without those the skill loads but fails at the first command.