Generated banner for URL To Motion Design
Generated logo for URL To Motion Design

URL To Motion Design

Meng ToCommunityCreated by Meng To

  • Skill
  • Workflow
  • Automation and integrations
  • MIT
  • Low risk
  • Has scripts

From the author

Turn a launch film, product video or post at a URL (an X or Twitter post, YouTube, Vimeo, a direct video link) into Fil HTML motion scenes. Captures the film's best 5 to 10 distinct motion-graphics shots as screenshots and clips, rebuilds each as an original Fil motion scene in its look with Fil's own words, polishes them with blind judges to 8/10, puts them in a section of the HTML motion scenes canvas, and shows them as a screening page and MP4s. Use when someone shares a video or a post and asks to capture its scenes, to get screenshots of its best shots, to add its scenes or style to the motion scenes library, or to make motion scenes like it, or says url to motion design, even if they only ask for the screenshots first.
— the description by Meng To

From the skill’s files

Taken from the skill’s own files (its description, section headings and stated usage). Not an AutoGineer summary, and not written by the author as one.

Turn a launch film, product video or post at a URL (an X or Twitter post, YouTube, Vimeo, a direct video link) into Fil HTML motion scenes. Captures the film's best 5 to 10 distinct motion-graphics shots as screenshots and clips, rebuilds each as an original Fil motion scene in its look with Fil's own words, polishes them with blind judges to 8/10, puts them in a section of the HTML motion scenes canvas, and shows them as a screening page and MP4s. Use when someone shares a video or a post and asks to capture its scenes, to get screenshots of its best shots, to add its scenes or style to the motion scenes library, or to make motion scenes like it, or says url to motion design, even if they only ask for the screenshots first. A film someone admires becomes new scenes in Fil's motion scenes library: same look and motion ideas, Fil's own words, no trace of the original's brand. The whole…

What it does

  • 1. Get the source
  • 2. Find every shot, pick the best 5 to 10
  • 3. Set up the run
  • 4. Build with helpers
  • 5. Judge blind, fix, repeat
  • 6. Put them on the canvas

When to use it

  • Use when someone shares a video or a post and asks to capture its scenes, to get screenshots of its best shots, to add its scenes or style to the motion scenes library, or to make motion scenes like…

Advantages

The skill’s files do not state this.

Usage examples

The skill’s files do not state this.

Install

Documentation by Meng To

URL to motion design

A film someone admires becomes new scenes in Fil's motion scenes library: same look and motion ideas, Fil's own words, no trace of the original's brand. The whole loop ran once end to end on 5 Nov 2026 (a 3-minute launch film on X → nine scenes, four at 8/10, on the canvas, as a screening page and MP4s); this skill is that loop with its traps fixed.

Paths: <skill> is this folder, <repo> is the facet-studio checkout, <run> is the run folder (<repo>/qa/<slug>/, untracked).

1. Get the source

node <skill>/scripts/fetch-source.mjs "<url>" <run>/source

X posts come through api.fxtwitter.com (the post's own video and text); YouTube and Vimeo through yt-dlp; direct links as they are. Read source.json (text, author, length) so you know what the film is about.

2. Find every shot, pick the best 5 to 10

node <skill>/scripts/shots.mjs scan <run>/source/source.mp4 <run>/scan

Read every 1-fps sheet in <run>/scan/sheets/ (tile k of 1fps_<start>.jpg is second start+k) with cuts.txt beside them. Pick:

  • Motion graphics only: animated type, diagrams, UI, data, particles, collages. Skip talking heads and plain footage.

  • No repeats (the owner: "scenes should not be repeatable"): one of each kind. Two shots on the same device (a white and a dark node map, two particle spheres, two photo collages) means keep the stronger. Same look but a different idea (a tower and a grid) can stay.

  • 5 to 10 seconds each, bounded by real cuts. Shots under 5 s go. Soft transitions hide inside long runs: when a boundary is unclear, look at 0.2 s strips (ffmpeg -ss <t> -t 2.4 -i src -vf "fps=5,scale=320:-1,tile=6x2" -frames:v 1 x.jpg).

  • The best 5 to 10, ranked by craft and by how well the idea carries to Fil. Write picks.json ([{id, name, a, b, hero, what}], ids short and prefixed per section, e.g. pg-tower), then:

node <skill>/scripts/shots.mjs pick <run>/source/source.mp4 <run>/picks.json <run>

Look at overview.jpg and every hero still: a frame mid-transition (two captions crossfading, motion blur, a word half-swapped) needs another time. Send the overview and the stills with SendUserFile.

Stop here if they asked for screenshots first. Ask before building: the build is hours of agents, not credits, but it's their call.

3. Set up the run

  • Write <run>/BRIEF.md from references/builder-brief.md: the section name (a plain look name, never the source's brand), the look in your own words, one font family for every scene, and per scene its id, length (the shot's, 5 to 8 s), message type (feature, number, statement) and a first idea that carries the shot's motion into Fil's world with true facts only.

  • Start the lab (references/lab.md): a launch.json entry for lab/server.mjs, preview_start, smoke-test scripts/render.mjs. In-app browser only.

  • Folders: <run>/scenes/, <run>/out/, <run>/keep/, <run>/judges/.

4. Build with helpers

Three general-purpose helpers in the background, 2 to 4 scenes each, grouped by ground (light data, light product, dark), each told to read <run>/BRIEF.md and everything it lists, edit only its own files and report one line per scene. While they work, keep the runner awake (lab.md): this is where the time goes if you don't.

5. Judge blind, fix, repeat

python3 <skill>/scripts/panel.py setup <run> <tag> <id,id,…>     # sheets + two anchors, shuffled
# two fresh general-purpose agents, each: read judges/<tag>/JUDGE.md, Read every sheet, write judges/<tag>/judgeN.jsonl, read nothing else
python3 <skill>/scripts/panel.py tally <run> <tag>
  • Judge a helper's scenes as soon as they report; don't wait for all. Copy every judged version to keep/<id>-<tag>.html (+ its sheet) before anything changes, and check helpers didn't edit after reporting (cmp).

  • 8, 8 passes. Save it as keep/<id>-pass-<tag>.html and tell its helper never to touch it again.

  • Below 8: send the verdicts word for word plus your own one-line read and the fix (references/seven-to-eight.md). Read the sheet yourself before blaming a layout; one round was lost to misreading a sheet's cell heights.

  • A version that scores lower is dropped: restore the better one as the base. Two rounds where the notes name the idea itself means a new idea in the same look. After about six judged versions at 7, stop and ask the owner (they chose "Leave them at 7" in round 19).

  • Panels vary about a point; the anchors tell you how strict this one was.

6. Put them on the canvas

references/publish.md: an empty section sized for all of them, one Code/motion node each with its score in its name and a full note, pages written by a cheap helper with character counts checked, the best judged version for scenes short of 8, a canvas log line. Free: never generate.

7. Show them at speed

Unasked: a screening page (scripts/screening.mjs → tested on localhost → Artifact) and real MP4s with sound (scripts/video.mjs, ~12 min for a minute of scenes). The owner asked "show me videos" twice: a live page wasn't enough the second time, the files were.

Rules that hold throughout

  • Style, not copy. Look, palette, type feel, camera and motion language only. Never the source's brand, product, logo, words, people, photos, partner logos, claims or exact layouts. Fil's cube (verbatim from public/favicon.svg) is the only logo. The source clips are reference, never published.

  • True facts about Fil only (references/scene-contract.md, Words).

  • The bar is 8 from two fresh blind judges, lower score counts, and you say honestly what's short.

  • Record evals: every verdict as a line in the lab's scores.jsonl.

  • No product change, so no version, changelog or commit in facet-studio; the skill's own changes go to ~/.claude/skills and MengTo/Skills.

Report

One table: scene, judges, on the canvas (pass, or best version and why it's short), the canvas link, the screening link, the video files. Then what's short and what would move it (usually a new idea, not polish).

Files

references/lab.md

Running the lab

The lab draws scenes exactly as Fil's video editor does: lab/server.mjs imports Fil's own sceneRuntime, scene.js (customize) and sceneFonts.js from the repo, and a runner page (lab/runner.html) in the in-app browser takes jobs, loads each scene in a sandboxed iframe with Fil's runtime, seeks it frame by frame and posts JPEGs back. Many builders share one runner; nobody launches a browser.

Start it

Add a config to the project's .claude/launch.json once (the lab needs the facet-studio repo for the runtime):

{ "name": "url-motion-lab", "runtimeExecutable": "node",
  "runtimeArgs": ["/Users/mengto/.claude/skills/url-to-motion-design/lab/server.mjs", "5212"], "port": 5212 }

then preview_start {name: "url-motion-lab"} (opens the runner tab at localhost:5212). A hidden pane gives a new tab a 0×0 viewport and no animation frames, so the first render times out: right away resize_window the runner tab to 1440×900, navigate it to http://localhost:5212/ again and take one small screenshot. Check: curl -s localhost:5212/status. Smoke test: node scripts/render.mjs <any scene.html> <tmp>/smoke. Use the in-app browser only: never Chrome, Chrome for Testing or a Playwright browser from Bash (the owner's rule).

Keep it awake (the hidden-pane trap)

When the session isn't open in a window, the pane is hidden and its page freezes every 1 to 3 minutes while you're idle: timers in the top page stop too, so nothing inside it can save itself. show_pane does nothing then. Symptoms: queued or running > 0 and no new frames. What works:

  • runner.html gives up on a frame after 45 s (load 60 s), so one stuck frame can't hold a worker forever.

  • Any javascript_tool call on the runner tab unfreezes it at once.

  • While you wait on helpers, a browser_batch of 11 × (computer wait 10 + javascript_tool "1") keeps it alive for ~4 minutes and still lets helper reports reach you between batches.

  • While you're idle, a background watchdog wakes you; when it exits, poke the tab and restart it:

while true; do s=$(curl -s -m 5 localhost:5212/status); read busy seen <<<"$(echo "$s" | python3 -c "import json,sys;d=json.load(sys.stdin);print(d['queued']+d['running'], d['runnerSeenAgo'])" 2>/dev/null || echo '1 999999')"; now=$(date +%s); newest=$(find <run>/out -name 'f*.jpg' -mmin -30 -exec stat -f %m {} + 2>/dev/null | sort -n | tail -1); age=$((now-${newest:-0})); if [ "$busy" -gt 0 ] && [ "$age" -gt 45 ] && [ "$seen" -gt 20000 ]; then echo "STALLED $(date +%T) frame age ${age}s $s"; exit 0; fi; sleep 6; done

(runnerSeenAgo alone false-alarms: three busy workers on long jobs don't call /next. Frame age alone false-alarms on a job the server is about to requeue. Use both.)

  • If a poke doesn't help, navigate the tab to the runner URL again and take a screenshot.

  • Stop the server when the run is over (preview_stop).

Render facts

  • 1280×720, ~1.5 s per frame per worker, 3 workers. A 12-frame sheet takes 20 to 60 s. The server requeues a job after 150 s, so video renders go in 40-frame chunks (scripts/video.mjs does).

  • A blank or half-laid-out frame from the hidden pane is the renderer's: render again. scripts/panel.py doesn't check; look at sheets.

  • A sandboxed cross-origin frame is throttled when hidden: the runner uses allow-scripts allow-same-origin and a Worker-driven timer shim; don't change those.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Python, Needs Node.js

Security

What our scanner noticed· Low risk

  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Meng To
Publisher
Meng To (Community)
Source
MengTo/Skills · agent-skills/media/url-to-motion-design · commit 5ea1661
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Meng To.

Get it from the source

1 of this skill’s files are not mirrored here, so there is no ZIP. Get the complete skill from its source: MengTo/Skills