← All guides

AI web design · Higgsfield · 12 July 2026

Scroll World, taken apart. And the restrained way to use it.

A deep dive into the scroll-world skill (the one from the "Web Design MONSTERS" video), what the hardened fork in the ElmsPark GitHub actually does, and the recipe distilled from it: the restrained one-generation hero, and the full continuous scroll film built live on The Motor: the whole storyboard as one seamless canvas-scrubbed journey.

Demo live Full film · 9 chained generations Match-cut seams + optical-flow tweens Canvas frames, no video element

The short version

Five facts and a link. Everything else in this guide is detail.

Open the live Motor hero demo →

Where things stand: the demo and this guide are live on the guides hub. The d=72 scoring board itself is untouched; the Phase 2 motion pass has since been RUN on Kenn's green light (12 July, evening): the full 30-second cut lives in the storyboard project folder. This build spent 90 Higgsfield credits (ledger-verified; two unrelated task-reward cashbacks landed alongside it).

Inside the repo

What ElmsPark/scroll-world contains and why the fork exists.

The lineage

oso95/scroll-world is the original open-source skill (GitHub user oso95, "cyw"; the YouTube summary credits a "Peter Wang", a name the repo itself never uses). cth9191/scroll-world is the hardened fork the video demonstrates, and the copy in the ElmsPark GitHub mirrors that fork. Upstream builds the same page; the fork hardens the four things that cost real money and real visitors: credit spend, automated verification, mobile, and SEO. Engine configs stay backward compatible.

What is actually in it

FileWhat it is
SKILL.mdThe procedure: interview → budget tier → anchor-gated stills → camera architecture → connectors → encode → assemble → QA. The one make-or-break rule lives here.
references/prompts.mdIntake checklist plus every prompt template (scene still, dive, connector) with a shared style preamble that keeps the world cohesive.
references/pipeline.mdCopy-paste bash scripts for the whole run. Idempotent: every step skips finished outputs, so a crash or re-roll never repays for done work.
references/scrub-engine.jsA 500-line vanilla-JS engine: blob-loaded video scrubbing, lazy prefetch, seam crossfades, device-class clip tiering, iOS fallbacks, an SEO copy block.
references/index-template.htmlA minimal standalone page that mounts the engine, including the crawlable data-sw-seo copy block.
references/gotchas.mdSymptom → cause → fix for every production failure seen so far, plus the canvas frame-sequence upgrade path (which the Motor demo uses).
references/knockout.pyBackground knockout for floating diorama scenes.

The one rule that makes or breaks it

Seams must be frame-identical. Every AI generation renders the "same" scene slightly differently, so a connector clip must start and end on the actual rendered frames of its neighbour clips, extracted with ffmpeg, never on the original stills. The fork machine-enforces this with an SSIM check on every seam: ≥0.90 pass, 0.75–0.90 warn, below 0.75 means someone used a still as an endpoint and the clip is a redo, not a QA note.

Camera architecture: the biggest quality lever

The spend controls (the fork's big addition)

Mobile and SEO hardening

The restrained recipe

The same pipeline at one-tenth the spend: one scroll-scrubbed hero, a still page below it.

When to use which

SituationRight tool
Luxury brand, product launch, portfolio, campaign micrositeFull scroll-world (lean or standard tier)
Business site where visitors come to find, book, buy or askRestrained hero: one scrubbed moment, still page below
Content site, docs, anything task-firstNo scrub at all; a good still image and fast copy

The thesis: heavy scroll animation on a task-driven site raises load times, hurts accessibility and usually costs conversions. But one cinematic moment at the top, with everything after it calm, borrows all of the premium feel and none of the cost. The stillness below is what makes the hero land.

Why canvas frames instead of video scrubbing

The skill's engine scrubs video.currentTime over a blob. That works, but it drags along a tail of video-element quirks: hosts without byte-range support, iOS blank-until-played priming, Low Power Mode killing playback, seek latency piling up on fast flicks. For a single hero clip there is a cleaner primitive, and it is the one Apple actually ships on its scroll pages: extract the frames once, draw them to a canvas.

The build, step by step

  1. Pick the story arc, not a wow effect. The scrub should mean something read in either direction. The Motor: closed machine becomes working website as you scroll down; website folds back into the machine as you scroll up.
  2. Bridge two approved stills. Generate one video with start_image = the "before" still and end_image = the "after" still (Seedance 2.0, 10 s, 1080p, audio off). If the brand already has approved art, this costs exactly one generation and inherits the locked style for free.
  3. Extract and encode the frames. ffmpeg -i clip.mp4 -vf fps=12,scale=1600:-2 f-%03d.png, then cwebp each at q≈68. Do a 960 px sibling set for phone-class screens. About 12 fps of extraction (121 frames from a 10-second clip) is a comfortable scrub density. Eyeball the extracted frames before shipping: Seedance can bake a hard CUT into one clip when the start and end images have irreconcilable backgrounds; bridge it with a short ffmpeg xfade dissolve band (this build used 12 tween frames) rather than re-rolling.
  4. Map scroll to frame index. A sticky viewport inside a tall section (300–350 vh); progress = scroll into the section ÷ its run; lerp the current frame toward the target each rAF for weight; draw cover-cropped.
  5. Sync the copy to the arc. Two or three copy phases crossfaded at fixed progress bands: greet, mid-transform, payoff with the CTA. The payoff line should land exactly as the animation settles.
  6. Honour the visitor first. prefers-reduced-motion and data-saver get a static hero (the final frame plus the payoff copy; the poster is a <picture> whose reduce-motion source serves the final frame even before JS runs). No JS gets the same calm layout via <noscript>, with the opening still. All copy is real server-rendered markup, so SEO needs no special block.
  7. Keep everything below still. Editorial sections with existing stills, a fade-and-12px-rise reveal at most, and one CTA at the end. If the page below the hero moves, the hero stops being special.

Cost comparison

BuildGenerationsCredits (approx.)
Showcase scroll-world, 6 scenes, architecture B~17 plus re-rolls~800
Lean scroll-world, 4 scenes, architecture A~8~350–450
Restrained hero (this recipe)1 (plus a re-roll buffer you probably won't use)~90

The Motor demo

The recipe proven on real, already-approved brand art.

Open the demo →

What it is

The whole Motor story as ONE continuous scroll film, built from The Motor storyboard (d=72, Chris's locked paper-craft style). Nine chained Seedance generations, 483 frames on one canvas: the overwhelmed owner's clutter folds itself away, the motor arrives, the light widens, the site blooms, the camera slides behind the page to the working parts, sinks below the bench, rises into the dusk shop and drifts out to the golden-morning welcome. The advert's voice-over lines ride each scene as copy phases; a route rail jumps between scenes; the finale is real HTML. The editorial layout is still in the page and serves reduced-motion, data-saver and no-JS visitors.

What it cost and touched

What to look at when you open it

If it earns its keep

The same hero block drops into any PageMotor site as a theme section: the frames folder, one canvas, and the copy phases. And for client work, the recipe reads as a productised line item: "premium animated hero, one generation, still page below". If Chris should see it as part of the wider Motor conversation, it can be published to the gated strategy hub alongside d=72.

Gotchas

The fork's hard-won list, plus what this build added. Symptom → cause → fix.

Carried over from the fork (still apply to any scrub build)

Hard-won on the film build (13 July)

Specific to the canvas-frames hero

Estate-specific notes