Motion os skill

motion-os — Demo/output image published by the author (repo README): Motion OS player: video on the left with the selected element boxed, scene timeline below, editable fields on the right, Send to Claude butt

Illustration · not a resultFrom the jasonlee-breadcrumb/motion-os README — shows the whole collection, not only this skill.source ↗

Build motion graphics and launch videos in code, then open them in Motion OS, a local scene-by-scene review player where the user edits copy, pins notes on the frame, and sends one prompt back.

by jasonlee-breadcrumb·MIT license·★ 61 Stars on the repo·GitHub ↗

Use now

Files of Motion os

jasonlee-breadcrumb/main1 file
SKILL.md
Show the full text111 lines

Motion OS

Motion OS is a workflow plus a local player. You build the video in code, render it, describe it in reel.json, and open the player. The user reviews it scene by scene, edits copy, pins notes on the frame, clicks Send to Claude, and pastes the prompt back to you. You apply it, re-render, bump the version, and the player reloads itself.

SKILL_DIR below means the folder this file is in (the player is at SKILL_DIR/player/).

1. Set up the project

<project>/
  reel.json     what the player reads: scenes, elements, copy, timings, assets
  video.mp4     the latest render ("src" in reel.json)
  assets/       images, footage, logos, music the user gives you
  src/          your motion code

Only ask for what's missing: what the video is for, length, aspect ratio, brand (colors, fonts, logo), assets, and a reference video if they have one. Defaults: 1920x1080, 30 fps, 20 to 45 seconds. If the user has no assets, recreate the reference's look so they can swap things in later.

2. Build it

  • Recommended: Remotion (React). Keep every on-screen text, image path, color and timing in reel.json and import it in the composition, so most feedback is "edit reel.json, re-render".
  • Any tool works if it outputs a video file (Hyperframes, HTML canvas, After Effects export).
  • Never run npm install inside a cloud-synced folder (Google Drive, iCloud, Dropbox). Build in a temp folder and copy the source back.
  • Remotion is free for individuals and companies of 3 or fewer people; larger companies need a license.

3. Render and check it yourself

npx remotion render src/index.ts Main video.mp4 --codec=h264 --crf=18
ffmpeg -v error -y -i video.mp4 -vf "fps=1,scale=320:-1,tile=6x6" -frames:v 1 sheet.jpg

Read the contact sheet before showing anything. Check text is readable, nothing overlaps faces or important UI, and audio levels are sane. Fix obvious problems first.

4. Write reel.json

See examples/qbot-tag/reel.json for a full example.

{
  "id": "acme-launch",            // stable, used to store the user's edits
  "title": "Acme launch",
  "version": 1,                   // bump on every render; the player reloads when it changes
  "path": "/abs/path/to/project", // shown in the prompt so you know where to work
  "src": "video.mp4",
  "w": 1920, "h": 1080, "fps": 30, "duration": 32.0,
  "reference": "Linear launch video",
  "brand": {
    "colors": [{"id": "accent", "name": "Accent", "v": "#5B5BF7"}],
    "fonts": [{"id": "head", "name": "Headlines", "v": "Inter Tight"}],
    "logo": "assets/logo.svg"
  },
  "audio": {"music": null, "bpm": 120, "drop": 4.0, "musicVol": 0.6, "sfxVol": 0.8},
  "assets": [{"id": "assets/logo.svg", "name": "logo.svg", "type": "image", "from": "User"}],
  "scenes": [
    {"id": "S1", "name": "Hook", "t": [0, 4.5], "els": [
      {"id": "headline", "label": "Headline", "t": [0.3, 4.3], "box": [20, 38, 60, 24], "src": "src/Hook.tsx:12",
       "props": {
         "text":   {"type": "text",   "label": "Text", "v": "Meet Acme"},
         "color":  {"type": "color",  "label": "Color", "v": "brand.accent"},
         "motion": {"type": "motion", "label": "Motion", "v": "Words blur in one by one"}
       }}
    ]}
  ],
  "notes": []
}

Rules:

  • One scene per story beat. Scene t values come from the actual render and cover 0 to duration with no gaps.
  • An element is anything a viewer might want to change. t is when it's visible. box is [x, y, w, h] in percent of the frame (use null for voiceover or audio). src is the file or file:line that draws it.
  • Control types: text, longtext, number, color (a value like brand.accent links it to the palette), media (an asset id), list (with cols), choice (with options), and motion (free text, only you can change it).
  • Keep scene and element ids stable between versions. The player matches the user's edits by id.
Live projects (instant edits + Export MP4)

For Remotion projects, give the player a live renderer so Edit mode changes show for real and the user can export without you:

  • Wrap each element with a box in a small Ed component that reads boxes[id] = [x, y, w, h, nx, ny, nw, nh] (reel.json box, then the edited box, % of frame) from a boxes prop and applies translate(nx-x %, ny-y %) scale(nw/w) with transform-origin: x% y%. No edit means render children untouched.
  • Add an entry that mounts @remotion/player and sets window.MotionOSLive = el => ({ref, setBoxes, setRate}). Bundle it with esbuild into the project folder and set "live": "motionos-live.js" in reel.json.
  • Add "export": {"cwd": "<folder with node_modules>", "props": {...}, "cmd": "..."}. The command gets $PROPS (JSON with the edits), $RAW, $OUT (exports/<id>-<time>.mp4, never overwritten) and $PROJECT. Example: npx remotion render src/index.tsx Main "$OUT" --props="$PROPS".
  • staticFile() paths are served from the project's public/ folder.
  • Elements with a box must be wrapped, or set box to null, otherwise dragging them does nothing.

5. Open the player

Run this in the background (it keeps serving while you work):

node "$SKILL_DIR/player/serve.mjs" "<project>"

It prints the URL (port 4321, or the next free one) and opens the browser. If a server for this project is already running, keep it; it serves new files live.

Then tell the user, in two or three lines: Preview plays it; Edit (E) pauses so they can click anything, drag to move, drag a corner to resize, press N to pin a note, the Script tab has every word, and when they're done, click Send to Claude, copy the prompt and paste it here.

6. Apply feedback

When the user pastes a prompt starting with "Motion OS feedback for":

  • Edits (before -> after): apply exactly, in reel.json and the code.
  • Size and position edits come as [x, y, w, h] in % of the frame plus a scale. Move and scale that element in the code to match, then update its box in reel.json.
  • Notes: each has a timestamp, scene, x/y position, and the element and source file it sits on. Grab that frame (ffmpeg -ss 12.4 -i video.mp4 -frames:v 1 f.jpg) and look at it before deciding what the note means.
  • Links: download them into assets/. Ask first if it isn't clearly the user's own file.
  • Leave scenes marked "approved" untouched.
  • Re-render, check the contact sheet, update reel.json (timings, copy) and set version to the number the prompt asks for. The player notices within about 3 seconds and reloads.
  • Reply with a short list of what changed and anything you couldn't do.
1---
2name: motion-os
3description: Build motion graphics and launch videos in code, then open them in Motion OS, a local scene-by-scene review player where the user edits copy, pins notes on the frame, and sends one prompt back. Use when the user asks for a motion graphic, launch video, explainer, product video or animated ad, says "motion os", or pastes feedback that starts with "Motion OS feedback for".
4---
5 
6# Motion OS
7 
8Motion OS is a workflow plus a local player. You build the video in code, render it, describe it in `reel.json`, and open the player. The user reviews it scene by scene, edits copy, pins notes on the frame, clicks **Send to Claude**, and pastes the prompt back to you. You apply it, re-render, bump the version, and the player reloads itself.
9 
10`SKILL_DIR` below means the folder this file is in (the player is at `SKILL_DIR/player/`).
11 
12## 1. Set up the project
13 
14```
15<project>/
16 reel.json what the player reads: scenes, elements, copy, timings, assets
17 video.mp4 the latest render ("src" in reel.json)
18 assets/ images, footage, logos, music the user gives you
19 src/ your motion code
20```
21 
22Only ask for what's missing: what the video is for, length, aspect ratio, brand (colors, fonts, logo), assets, and a reference video if they have one. Defaults: 1920x1080, 30 fps, 20 to 45 seconds. If the user has no assets, recreate the reference's look so they can swap things in later.
23 
24## 2. Build it
25 
26- Recommended: [Remotion](https://www.remotion.dev) (React). Keep every on-screen text, image path, color and timing in `reel.json` and import it in the composition, so most feedback is "edit reel.json, re-render".
27- Any tool works if it outputs a video file (Hyperframes, HTML canvas, After Effects export).
28- Never run `npm install` inside a cloud-synced folder (Google Drive, iCloud, Dropbox). Build in a temp folder and copy the source back.
29- Remotion is free for individuals and companies of 3 or fewer people; larger companies need a license.
30 
31## 3. Render and check it yourself
32 
33```bash
34npx remotion render src/index.ts Main video.mp4 --codec=h264 --crf=18
35ffmpeg -v error -y -i video.mp4 -vf "fps=1,scale=320:-1,tile=6x6" -frames:v 1 sheet.jpg
36```
37 
38Read the contact sheet before showing anything. Check text is readable, nothing overlaps faces or important UI, and audio levels are sane. Fix obvious problems first.
39 
40## 4. Write reel.json
41 
42See `examples/qbot-tag/reel.json` for a full example.
43 
44```jsonc
45{
46 "id": "acme-launch", // stable, used to store the user's edits
47 "title": "Acme launch",
48 "version": 1, // bump on every render; the player reloads when it changes
49 "path": "/abs/path/to/project", // shown in the prompt so you know where to work
50 "src": "video.mp4",
51 "w": 1920, "h": 1080, "fps": 30, "duration": 32.0,
52 "reference": "Linear launch video",
53 "brand": {
54 "colors": [{"id": "accent", "name": "Accent", "v": "#5B5BF7"}],
55 "fonts": [{"id": "head", "name": "Headlines", "v": "Inter Tight"}],
56 "logo": "assets/logo.svg"
57 },
58 "audio": {"music": null, "bpm": 120, "drop": 4.0, "musicVol": 0.6, "sfxVol": 0.8},
59 "assets": [{"id": "assets/logo.svg", "name": "logo.svg", "type": "image", "from": "User"}],
60 "scenes": [
61 {"id": "S1", "name": "Hook", "t": [0, 4.5], "els": [
62 {"id": "headline", "label": "Headline", "t": [0.3, 4.3], "box": [20, 38, 60, 24], "src": "src/Hook.tsx:12",
63 "props": {
64 "text": {"type": "text", "label": "Text", "v": "Meet Acme"},
65 "color": {"type": "color", "label": "Color", "v": "brand.accent"},
66 "motion": {"type": "motion", "label": "Motion", "v": "Words blur in one by one"}
67 }}
68 ]}
69 ],
70 "notes": []
71}
72```
73 
74Rules:
75- One scene per story beat. Scene `t` values come from the actual render and cover 0 to `duration` with no gaps.
76- An element is anything a viewer might want to change. `t` is when it's visible. `box` is `[x, y, w, h]` in percent of the frame (use `null` for voiceover or audio). `src` is the file or `file:line` that draws it.
77- Control types: `text`, `longtext`, `number`, `color` (a value like `brand.accent` links it to the palette), `media` (an asset id), `list` (with `cols`), `choice` (with `options`), and `motion` (free text, only you can change it).
78- Keep scene and element ids stable between versions. The player matches the user's edits by id.
79 
80### Live projects (instant edits + Export MP4)
81 
82For Remotion projects, give the player a live renderer so Edit mode changes show for real and the user can export without you:
83- Wrap each element with a `box` in a small `Ed` component that reads `boxes[id] = [x, y, w, h, nx, ny, nw, nh]` (reel.json box, then the edited box, % of frame) from a `boxes` prop and applies `translate(nx-x %, ny-y %) scale(nw/w)` with `transform-origin: x% y%`. No edit means render children untouched.
84- Add an entry that mounts `@remotion/player` and sets `window.MotionOSLive = el => ({ref, setBoxes, setRate})`. Bundle it with esbuild into the project folder and set `"live": "motionos-live.js"` in reel.json.
85- Add `"export": {"cwd": "<folder with node_modules>", "props": {...}, "cmd": "..."}`. The command gets `$PROPS` (JSON with the edits), `$RAW`, `$OUT` (`exports/<id>-<time>.mp4`, never overwritten) and `$PROJECT`. Example: `npx remotion render src/index.tsx Main "$OUT" --props="$PROPS"`.
86- `staticFile()` paths are served from the project's `public/` folder.
87- Elements with a `box` must be wrapped, or set `box` to null, otherwise dragging them does nothing.
88 
89## 5. Open the player
90 
91Run this in the background (it keeps serving while you work):
92 
93```bash
94node "$SKILL_DIR/player/serve.mjs" "<project>"
95```
96 
97It prints the URL (port 4321, or the next free one) and opens the browser. If a server for this project is already running, keep it; it serves new files live.
98 
99Then tell the user, in two or three lines: Preview plays it; Edit (E) pauses so they can click anything, drag to move, drag a corner to resize, press N to pin a note, the Script tab has every word, and when they're done, click **Send to Claude**, copy the prompt and paste it here.
100 
101## 6. Apply feedback
102 
103When the user pastes a prompt starting with "Motion OS feedback for":
104- **Edits** (before -> after): apply exactly, in `reel.json` and the code.
105- **Size and position** edits come as `[x, y, w, h]` in % of the frame plus a scale. Move and scale that element in the code to match, then update its `box` in `reel.json`.
106- **Notes**: each has a timestamp, scene, x/y position, and the element and source file it sits on. Grab that frame (`ffmpeg -ss 12.4 -i video.mp4 -frames:v 1 f.jpg`) and look at it before deciding what the note means.
107- **Links**: download them into `assets/`. Ask first if it isn't clearly the user's own file.
108- Leave scenes marked "approved" untouched.
109- Re-render, check the contact sheet, update `reel.json` (timings, copy) and set `version` to the number the prompt asks for. The player notices within about 3 seconds and reloads.
110- Reply with a short list of what changed and anything you couldn't do.
111 

Discussion

Alternatives

/bragTurn the current project website into a short, polished, shareable launch video using Hyperframes. Use when someone says "/brag", "let's brag about this", "make a launch video", "turn this into a video", or wants to share what they built. Reads the project code directly — no live URL or screenshots needed.Business & ops · MIT/brag-slimTurn a project directory or a website URL into a short, shareable launch video with music, motion, and share copy. One file, no bundled assets — built entirely by the model with the tools already on the machine. Use when someone says "/brag-slim", "let's /brag about this", "brag about <url>", "make a launch video", or wants to show off what they built. If the /brag skill is also installed, let /brag handle those phrases; it hands off here on Opus 5.5.Business & ops · MITBusiness motion filmPlan, build and quality-check a premium short commercial for a real business (roofing, property, ecommerce, B2B software) using AI-generated footage, code-built motion (HTML/GSAP), selective Three.js and an independent-critic "Gauntlet" loop. Use when asked to make a launch-style / SaaS-style video, business ad, explainer, sample reel or pitch video, or to review and improve one. Encodes motion principles distilled from 28 professional launch films, a quality bar, audio rules and a business-offer playbook.Business & ops · MITAI Product Launch PlaybookLaunch your AI product to global attention — the playbook behind Manus, Devin, and AFFiNE's breakout launches. Covers AI-specific GTM strategy, hype cycle management, waitlist tactics, and multi-market rollout for maximum day-one impact.Business & ops · MIT