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

An engine, not a template

One brief. Every vertical.

MOTIONSMITH builds motion-led one-page sites for any vertical. An agent authors the brief; a CLI does the mechanical work, and refuses to call the build clean until four headless passes agree.

Set pieces
11, prop-driven
Motion laws
14, each a shipped bug
Audit passes
4 per run
Runtime dependencies
1

If a test can catch it, it lives in the CLI. If it needs taste, it lives in the plugin. Fourteen laws, each paid for with a shipped bug. Findings report by law ID, not by adjective. 390 × 844 and 1440 × 900, every run. Different film, different words, identical machinery. The page still reads with the bundle gone.

The 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.

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.

Operating doctrine

001/004

A principle is unactionable.

A signature is a lookup. Every law is written as one.

Every law was paid for.

Fourteen shipped bugs, each one now a grep signature.

Taste is not testable.

So the CLI never invents copy, and never judges the film.

Mobile is its own choreography.

Not the desktop's with the motion removed.

The engine, in numbers

Every figure below is enforced somewhere in the CLI rather than asserted here.

0
Motion laws, each written as a failure signature
0
Set pieces, content-driven and brand-free
0
Headless audit passes on every run
0
Runtime dependency in the whole CLI

Brief 001 — voltline, ev-charging

Different film.Identical machinery.

Read the operating doctrine

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.

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.

Read the fourteen laws

One note when it ships. Nothing else, and no list.