Communitygithub.com

yazzang-homelab/motion-studio

Scaffold a motion-studio film project (seek(t) renderer, springs, beat grid, synthesized sound, critique tools), install it, set up the browser, run doctor. Use for 'set up the motion studio', 'new film project', 'init studio'.

O que é motion-studio?

motion-studio is a Claude Code agent skill that scaffold a motion-studio film project (seek(t) renderer, springs, beat grid, synthesized sound, critique tools), install it, set up the browser, run doctor. Use for 'set up the motion studio', 'new film project', 'init studio'.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/yazzang-homelab/motion-studio/tree/HEAD/skills/studio-init

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Studio init (course step 02)

Create a film project that can render, listen to and look at its own frames. The chat app can write an animation; only an agent with a shell can close the render, look, fix loop. That loop is the difference between a "mid" first try and a film worth posting.

Request arguments (may be empty), shown once:

1. Choose the directory and settings

  • Directory: the first argument; else . when the working directory is empty; else ask (default ./<slug-of-title>). Never scaffold into the plugin directory.
  • Settings from the request: title, duration, formats, fps, bpm, loop, brand URL. Leave the rest at the template defaults (studio.json: 12 s, 60 fps, 4 subframes, 120 BPM, 9x16 primary).

2. Scaffold

node "${CLAUDE_SKILL_DIR}/scripts/init.mjs" <dir> --title "<Title>" [--duration S] [--fps N] [--bpm N] [--formats a,b] [--loop] [--brand-url URL] [--install] [--json]
FlagEffect
<dir>target; created if missing
--title Tstudio.json title and delivery file slug
--duration S, --fps N, --bpm Ntiming
--formats a,bsubset of 9x16, 1x1, 16x9, 4x5 (or all); primaryFormat stays unless it is not listed
--loopseamless loop film (UI morphs)
--brand-url URLstores the product URL in brand.url. user:password@ and secret-looking parameters (query, ;matrix, fragment: token, key, secret, password, auth, sig, session, code ...) are removed before anything is written; stderr names what was removed and --json lists it in redacted. Still pass a plain public URL: a secret that is a bare path segment (/reset/<token>) cannot be recognized. A plain URL is stored exactly as typed
--installruns npm install in the new project (handles npm.cmd on Windows)
--forcerefresh an older project to the current template (see the table below)
--jsonone JSON result line on stdout

An existing non-empty directory is merged: only missing files are added and skipped files are listed. Report the skipped list to the user; never delete their files.

--force on an existing project (checked against init.mjs):

PathWith --force
studio.json, film/**, docs/**, assets/fonts/fonts.jsonkept and listed as kept; a missing one is still created. Flags such as --bpm still patch studio.json
package.jsonmerged, never replaced: sets type: module, adds private, engines and every template script or dependency the project lacks. A template script whose command differs is reset to the template command (init prints each as was ..., now ... and returns them in packageReset). Dependency versions are never changed, template dependencies included: an existing range stays, newer, older or pinned. Name, version, other scripts and other fields stay
.gitignoremerged: missing template lines are appended under # motion-studio, nothing is removed
everything else (CLAUDE.md, lib/**, tools/**, prompts/**, index.html, .env.example, bundled fonts)overwritten and listed as overwritten. Local edits to these files are lost: commit or copy them first
your own extra filesuntouched

Without --force, package.json and .gitignore are merged the same way, except that a differing script keeps your command. Init lists every script and dependency version that differs from the template under kept your package.json values, which differ from the template (packageKept in the --json result): those npm run names run YOUR command, and --force resets template scripts (never dependency versions). A scripts, devDependencies or optionalDependencies section that is not an object is left untouched with a warning. Because docs/** is kept, a newer template doc never reaches an existing project: compare with the plugin's template/docs/ by hand after an update.

3. Install, browser, doctor

  1. Without --install, run npm install inside the project. playwright is the only required dependency; ffmpeg-static is optional and may fail to download behind a proxy.
  2. Browser (npm run setup:browser is the same command as the npx line):
    • Windows: run npx playwright install chromium-headless-shell (about 115 MB download, 270 MB on disk). studio.json browser: "auto" starts only that bundled headless shell, never the installed Chrome or Edge. Reason: an installed Chrome or Edge started with a fresh profile (every tool run) makes Chrome test the Windows account for a blank password, which counts as a failed logon. The measured laptop locks the account after 10 failed logons in 10 minutes and logged 464 in 24 h. Do not switch browser to chrome or msedge, and do not set MOTION_CHROME_PATH to a chrome.exe or msedge.exe, unless the user asks for it and accepts the risk: it prints a warning per launch and the 4th launch in 10 minutes is refused, 3 pass (the launch guard). The shell is unsigned, so a real-time antivirus can make every tool run 15 to 25 s slower (measured): tell the user once; an antivirus exclusion for %LOCALAPPDATA%\ms-playwright is their or IT's decision.
    • macOS and Linux: auto tries the installed Chrome, then Edge, then the bundled browser, with no warning. If none is installed, run npx playwright install chromium-headless-shell (Linux: npx playwright install --with-deps chromium-headless-shell), or set MOTION_CHROME_PATH to a Chromium-family executable.
  3. npm run doctor. Fix every FAIL row before handing over, and on Windows a WARN browser row too (an installed Chrome or Edge was chosen: clear it and install the headless shell); fixes per OS are in references/troubleshooting.md. Python with librosa is optional (the JS beat engine covers it). Node 22+ is needed only for route B tools.
  4. Prove it: npm run stills, then open out/review/9x16/contact.png (a long film is paged: contact.png is page 1, then contact-2.png ..., no page taller than 1800 px; open every page) and look at it. The shipped 12 s demo must show a composed frame at 0 s and a change on every downbeat. npm run preview opens the live preview (Space play/pause, arrows step frames, F cycles formats, G safe-area guides).

4. Explain the project to the user

Summarize in a few lines, then point to the references:

  • Layout and who edits what: references/project-layout.md
  • Every command: references/commands.md
  • Every lib/ signature and default: docs/API.md in the new project (the full reference is docs/ARCHITECTURE.md in the plugin repository)
  • House rules live in the project's CLAUDE.md, which Claude Code reads on every run there.

If init printed a ★ star line (starHint in the --json result; it appears once per machine, on the first new project), end your summary with that one line as written. Never star the repository or run gh for the user.

CommandDoes
npm run previewlive preview in the browser
npm run stillsone still per beat as a contact sheet
npm run critiquecontact, strip, phone test, metrics, review-log block
npm run gatecritique gate: 3 rounds, all axes >= 8, no P0
npm run render:finalevery format, final quality (gate enforced)
npm run sfx / npm run mixsynthesize cue SFX / mix to -14 LUFS and mux
npm run deliverdelivery checks and out/deliver/ package
npm run buildscore if missing, sfx, final render, mix, deliver

5. Effort and routes

WorkEffortSet with
small fixes, re-rendersmedium/effort medium
a new filmxhigh/effort xhigh (the motion-reel skill sets it for you)
flagship first 3 seconds of a launchmax/effort max

/model also offers the effort choice when picking Opus 5.5. Route A (this engine) is the default. Use Remotion or HyperFrames only when the user names one; /motion-studio:seek-engine has the handoff, including the Remotion license gate.

6. Keys

Copy .env.example to .env only when a key is needed (voice: ELEVENLABS_API_KEY; route C images/video: FAL_KEY). Tell the user to paste the value into .env themselves. In prompts and logs refer to the variable name only. .env is already in the project .gitignore.

7. Optional companions

Mention these only when relevant. Install commands and caveats: references/companions.md.

CompanionUse forNote
claude-animation (buildwithhanif)hand-drawn, brush, storybook looksMIT; separate Node canvas renderer
HyperFrames (heygen-com)HTML + GSAP compositionsApache-2.0; Node 22+
RemotionReact series and templatescompany license for for-profit orgs over 3 employees

Next: test the engine with /motion-studio:showreel, or make a real film with /motion-studio:motion-reel.

Individual skills in this repo

This repo contains 11 individual skills — each has its own dedicated page.

yazzang-homelab/motion-studio

Make Claude watch its own frames: critique.mjs evidence, harsh 7-axis scores, timestamped P0/P1/P2 problems in docs/review_log.md, fix the 3 worst, re-check, pass the gate. Use for 'critique it', 'review the frames', 'is it good'.

yazzang-homelab/motion-studio

Plan long-form or overnight films: director's brief (PLAN FIRST or GO, budget, definition of done), ANIMATION_GUIDE + STORYBOARD, chapter subagents, gates, chunked render. Use for 'overnight film', 'music video', '2-minute film'.

yazzang-homelab/motion-studio

Make a launch video, app or product reel, explainer or motion ad from code, end to end: brand assets from a URL, beat-grid shot list, synced sound, critique loop, all formats. Default for new video requests; not footage edits.

yazzang-homelab/motion-studio

Brand-asset stage of a product film (motion-reel runs the whole film): capture real screenshots, logo, colors and fonts from a URL, never redraw UI; brand story beats; voice + mascot. Use to grab or fix a brand's assets.

yazzang-homelab/motion-studio

Turn a reference (a frame, a video or an image library) into docs/style_guide.md and a beat-grid shot list: measure cuts, palette and pace, take grammar not content, wait for OK. Use when the user supplies or names a look.

yazzang-homelab/motion-studio

Build, debug or speed up the seek(t) render engine: render contract, canvas vs page capture, workers/subframes/chunks, determinism fixes, Remotion or HyperFrames handoff. Use for 'render is slow', 'frames differ', 'use Remotion'.

yazzang-homelab/motion-studio

Ship every format from one timeline, then package it: layout() reframing (never crop), render all formats, per-format checks, deliver.mjs, a brand skill, a service offer. Use for 'export 9:16 and 16:9', 'deliver', 'make a skill'.

yazzang-homelab/motion-studio

The viral one-line 'showreel for a résumé' prompt: why it works (anatomy), the credited quote, and seeded variants that avoid look-alike reels; runs it as an engine test. Use for that prompt, its variations, or a showreel.

yazzang-homelab/motion-studio

Score a film to its beat grid: measure a track (beats.mjs) or synthesize one (score.mjs), cue SFX from the film, add voice, mix to -14 LUFS / -1 dBTP at exact length. Use for 'add music', 'sync to the beat', 'SFX', 'loudness'.

yazzang-homelab/motion-studio

Make motion feel physical with closed-form springs from lib/motion.js: presets, springFromFeel, track() for multi-target values, loopTrack loops, indicators, text swaps. Use for 'feels linear', 'add bounce', 'easing to springs'.

yazzang-homelab/motion-studio

Write a six-part XML state spec for a one-shape UI morph film (inputs, direction, structure, build, gotchas, start): states on downbeats, cursor-driven changes, seamless loop, approval gate. Use for 'UI morph', 'state list'.

Habilidades Relacionadas