MOTIONSMITH is pre-release. The template, the five commands and the fourteen laws work today. The asset pipeline and ship do not. Pre-release. Five commands work; the asset pipeline does not.
v0.1.0 — pre-release
Motion engine for coding agents
Motion-led sites, from one brief.
A motion engine your coding agent can drive. It writes one file. The CLI emits the site, compresses the film, and audits it at two viewports before it lets you ship.
- What you stop doing
- Scroll bugs shipped
- 0
- Motion laws enforced
- 14
- Audit passes per build
- 4
- Hand-written pin CSS
- 0
- Runtime dependencies
- 1
- Time to first film
- Day 1
Drive it from your agent
- /ms-brief
- /ms-direct
- /ms-choreograph
- /ms-copy
- /ms-art
- /ms-build
- /ms-audit
- /ms-ship
Ten commands, brief to deploy.
Astro 5 + GSAP, no UI runtime. One brief is the whole site. Fourteen laws, each paid for with a shipped bug. Findings report by law ID, not by adjective. 390 × 844 and 1440 × 900, every build. Different film, different words, identical machinery. The page still reads with the bundle gone.
Brief to deploy, in ten commands
No seam where you write glue code.
- /ms-brief 01 Interrogates the business and writes the file
- /ms-direct 02 Picks the reference and synthesises tokens
- /ms-choreograph 03 Selects set pieces and budgets the scroll
- /ms-copy 04 Writes every string to its type tier
- /ms-art 05 Directs, generates and compresses the film
- /ms-build 06 Assembles the site from the brief
- /ms-audit 07 Headless truth pass at both viewports
- /ms-critique 08 Judges the taste, not the tests
- /ms-ship 09 Deploys and verifies the deploy
- /ms-restage 10 Re-skins the whole site onto a new vertical
Agent decides — 5 CLI executes — 5
The split is the product. Everything left of it needs taste, so the CLI never touches it — it does not invent copy, choose a reference, or judge a film.
What lands in your repo
Ordinary code. No runtime, no account, no hosted dependency.
- Eleven set pieces, prop-driven
- src/components/
- One motion layer, GSAP-gated
- src/scripts/
- Design tokens, light or dark
- tokens.css
- Your brief — the only file you maintain
- motion.brief.json
- Generated data and page Overwritten by sync. Never hand-edited.
- src/data/
- Immutable cache headers and robots
- public/
- Cloudflare Pages deploy script
- package.json
- The fourteen laws, as a loadable skill
- plugin/
Astro and GSAP, one runtime dependency in the CLI, and a folder you could hand to any developer tomorrow.
motion.brief.json — the contract
One brief.The whole site.
See what it emitsThe eleven set pieces
Every one content-driven and brand-free. The previews are real builds — eight from this page, three from the worked example, which shares nothing with it.
-
hero-film
Arrival and thesis
0 vh
-
ticker
Voice and momentum
0 vh
-
Pinned manifesto
Belief and escalation
3.9 vh
-
grid
Proof and catalogue
0 vh
-
Pinned plate
The spectacle beat
2.9 vh
-
stats
Credibility
0 vh
-
Pinned rail
Cast and range
3.4 vh
-
Pinned telemetry
The review desk
3.6 vh
-
disclosure
Objection handling
0 vh
-
signoff
The close
0 vh
-
footer
Links and legal
0 vh
Scroll cost is what a pinned piece spends from the intensity budget. validate refuses a composition that goes over, and refuses two pinned pieces in a row.
The fourteen laws
Written as failure signatures rather than principles, because a principle is unactionable and a signature is a lookup. The audit reports findings by these IDs and nothing else useful.
ML-01 — One journey, one timeline
The object is correct while scrolling down, then snaps to a stale position — often one it held two sections earlier — when you scroll back up, or when you land mid-page on reload. Opacity is the usual tell: the thing is visible in a section where it should be long gone.
ML-02 — Pin with position: sticky, never ScrollTrigger.pin
Content jumps by exactly the height of the pinned section on refresh, on font load, or on rotation. Anchor links land in the wrong place. The section reads as a blank gap with JS disabled.
ML-03 — Hidden states are .js-gated
The bundle 404s, an extension blocks it, or a syntax error lands — and the page renders blank or half-empty. Worse: it looks fine to you because your cache is warm.
ML-04 — Ownership is declared
A headline is invisible on mobile or under reduced motion, but perfect on desktop. Or: a line renders 208% down instead of 108% and you cannot see where the extra came from.
ML-05 — Centre with xPercent and yPercent, never percentage margins
The object is wildly off-position — hundreds of pixels adrift — and the error scales with viewport width, not with the object.
ML-06 — Content-revealing work lives outside the GSAP layer
With reduced motion on, a decorative element renders as a permanent artifact — a solid line across the page, a stray marker — or a counter sits frozen at its initial value forever.
ML-07 — Mobile is its own choreography
The phone build is a static document with three videos on it, or — worse — it inherits a pinned sequence and every swipe fights a scrub.
ML-08 — On a phone, drive telemetry from the media's own playhead
Where desktop scrubs a video by scroll, portrait plays it and drives the overlay from timeupdate. Scroll-scrubbing a video on a phone competes with the gesture the user is already making, and seeking is expensive on mobile decoders.
ML-09 — Generate portrait paths from measured geometry
The marker lands correctly on the phone you tested and misses the target on every other aspect ratio. A viewBox authored for landscape stretches into nonsense in portrait.
ML-10 — Objects travel only through measured empty corridors
A flying object sits on top of a price, a headline, or a button. It reads as a rendering artifact, not as art direction.
ML-11 — Scroll offsets are measured, not guessed
Waypoints come from a helper that measures the document. The master timeline is padded to ScrollTrigger.maxScroll so that timeline seconds and scroll pixels stay one to one.
ML-12 — Rebuild on refresh, not only on resize
Waypoints are subtly early or late on first load and correct after a resize. Classic tell: it is right when you are debugging and wrong for the user.
ML-13 — Heavy media is fetched on approach
A megabyte of video downloads on first paint for a section three screens down that many visitors never reach. The trap: calling play() at boot forces the download regardless of preload, and the lazy attribute makes it look handled.
ML-14 — GSAP must earn its place
A JS bundle over roughly 120 KB gzipped for a marketing page, or a scroll handler doing work no one can see. Hover, press, disclosure and focus are CSS.
Build it once yourself
Not a boilerplate inventory — the things that look easy until the second breakpoint.
- Pinned scrub that survives refresh and font load
- 40
- Headless audit at two viewports, reduced-motion and no-JS
- 40
- Portrait choreography that is not desktop with the motion removed
- 32
- Reduced-motion and no-JS parity across every section
- 24
- Cross-page flight layer with measured corridors
- 24
- Design tokens that survive a dark inversion
- 20
- Scrubbed-video encode and poster pipeline
- 16
- And you still do not know it is right
- 196
Hours are recoverable. A motion bug a client finds on their own phone is not.
Who it is for
Three readers, three different numbers.
- Studios and agencies
3×
The second client site is a re-brief, not a rebuild. The cost curve bends after the first project and the quality does not.
projects on the same team
- Solo builders
Day 1
You do not need a motion specialist to ship something that moves. The agent writes the brief; the CLI refuses to ship a broken one.
to first film
- In-house teams
0
Every launch page clears the same four checks before it goes out, and the report names the law rather than an adjective.
motion bugs shipped
Waitlist — open
Tell us your
vertical
MOTIONSMITH is pre-release, and this page names the parts that are not built. The template, init, validate, sync, qa and doctor work today. The asset pipeline, ship, upgrade and the plugin's ten commands do not. Leave an address and we will write when they do.
One note when it ships. Nothing else, and no list.