name: scroll-cinematic description: Build an award-winning "3D scroll" website of ANY kind from ONE prompt — product launch, portfolio, agency, contractor/home-services, restaurant, real estate, personal brand, event, app, etc. Generates a high-end cinematic hero visual + clips (360° orbit, fly-through, reveal, explode, parallax) fitting the site's subject with the Higgsfield MCP, slices them into a scroll-scrubbed canvas frame sequence with ffmpeg, builds a branded multi-section site (Lenis smooth scroll + scroll reveals), and launches it on localhost. Use when the user asks for a "3D scroll" site, scroll-driven hero/reveal, a cinematic landing page, a buckssauce/Apple/Awwwards-style scroll site, or "build me a website like X" — for a product OR a service, person, place, or brand. Trigger words: 3D scroll, scroll animation, cinematic hero, fly-through, turntable, scroll site, landing page, portfolio site, agency site, Higgsfield site.
Scroll-Cinematic — one-prompt 3D product sites
What this actually is (read first)
The viral "3D scroll" effect is not Three.js. It's a canvas image-sequence scrub:
a short cinematic clip is exported to ~180 numbered JPGs, all preloaded, and the frame
drawn to a <canvas> is chosen by scroll progress. Scrolling forward/backward plays the
clip. Add Lenis smooth scroll + scroll-synced overlay copy and it reads as premium 3D.
The "3D" comes entirely from the source video — which we generate with Higgsfield.
Stack: plain HTML + CSS + JS + Lenis (zero build, runs from any static server).
Prerequisites
- Higgsfield MCP connected + credits (~$1–2 / site). This is the only thing the user must set up.
- ffmpeg — DO NOT ask the user to install it. Step 0 below installs it automatically (no Homebrew).
- This skill installed at
~/.claude/skills/scroll-cinematic/.
Step 0 — Ensure ffmpeg (run first, always)
Run bash ~/.claude/skills/scroll-cinematic/scripts/ensure-ffmpeg.sh. It uses system ffmpeg if
present, otherwise downloads a static binary to /tmp/ffmpeg-bin/ffmpeg (macOS/Linux, no Homebrew).
The extract/compress scripts already fall back to that path. Never block the build on ffmpeg.
THE PIPELINE — run all of this from the single prompt
1. Decide the brief (works for ANY site — no extra questions unless the subject is unclear)
From the user's prompt pick: site type, hero subject, vibe/palette, brand/name (invent one if not given), and 2 hero motions. The hero subject is whatever the site is about — a product, a person/founder, a building/space, a dish, a vehicle, or an abstract visual. Default motions by site type:
- Product (bottle, gadget, shoe, cosmetic) → 360° rotation + explode/pour/reveal.
- Portfolio / personal brand → cinematic portrait or abstract liquid/geometry motion + a slow parallax/orbit.
- Agency / app / SaaS → abstract 3D shape/logo morph or UI-in-space + light-streak fly-through.
- Contractor / home services / real estate → slow orbit or fly-through of a building/home/jobsite + a detail reveal.
- Restaurant / food → dish 360° + ingredient/steam motion or interior fly-through.
- Fitness / events / travel → motion of the subject (athlete, crowd, landscape) + a sweeping camera move. If unsure, default to one hero orbit/fly-through + one reveal/parallax clip.
2. Generate the hero keyframe (Higgsfield generate_image)
- Model:
nano_banana_pro(top quality / crisp). Prompt the hero subject for the site (product, person, place, abstract), strong lighting, intentional background, "ultra sharp, photorealistic, 8k, editorial/advertising". 16:9. (For portfolios you can also use a brand-colored abstract 3D render so there's no likeness/IP issue.) - Poll
job_displayuntilstatus:"completed"; keep the job id (used as the video start frame).
3. Generate 1–2 cinematic clips (Higgsfield generate_video)
- Model:
seedance_2_0,resolution:"1080p",aspect_ratio:"16:9",duration:6,medias:[{role:"start_image", value:<keyframe id>}]. Always passdeclined_preset_id:"24bae836-2c4a-48e0-89b6-49fcc0b21612"if it suggests a preset; if it suggests a different preset, retry with that preset's id indeclined_preset_id. - Motion prompt patterns (pick what fits the subject):
- turntable — "smooth seamless full 360-degree rotation, one complete revolution, stays centered".
- fly-through — "slow continuous forward camera flight through/around the [building/space/scene], smooth dolly, deep parallax".
- reveal/explode — "the [contents/components/elements] burst or assemble outward and float in slow motion" (keep it object/scene context — moderation-friendly).
- abstract — "elegant slow-morphing liquid-metal / glass / particle form drifting and rotating".
- Generate both clips in parallel (two tool calls in one message), then poll
job_display. 1080p renders take ~3–8 min; sleep in the background between polls. - Cost: preflight with
get_cost:trueonce; ~54 credits per 1080p clip. Confirm if the user is low.
4. Handle render results
completed→ downloadresults.rawUrlwithcurl.nsfworfailed→ refunded, retry. Moderation false-flags abstract "floating pills/ dissolving figures"; reword to product-context, or switch that clip togrok_video_v15(resolution:"720p", more lenient). Product turntables/explosions pass at 1080p.- Tell the user about any retry; never claim a clip rendered if it didn't.
5. Slice + compress frames (ffmpeg)
scripts/extract-frames.sh <clip.mp4> frames/<name> 180→ ~179 numbered JPGs.scripts/compress-frames.sh frames/<name> 1600 88→ 1600px wide, q88 (crisp, <~15MB/section).- One folder per clip (e.g.
frames/spin,frames/explode).
6. Build the site from templates/
- Copy
templates/index.html,styles.css,scroll-cinematic.jsinto the project. - Edit the
SCRUB_SECTIONSconfig (bottom of index.html) — one entry per clip:{ section:"#hero", frameCount:179, bg:"#0a0a12", framePath:(i)=>\frames/spin/frame_${String(i).padStart(4,"0")}.jpg` }`. - Write brand copy, palette (CSS vars), benefit/colorway/feature sections, stats, CTA.
- Hue-shift trick for product variants/colorways (no extra generation):
ffmpeg -i base.png -vf "hue=h=120:s=1.15" variant.png.
7. Launch on localhost
- Copy
templates/Launch Demo.commandinto the project, edit PORT + name,chmod +xit. - Start it (
python3 -m http.server <port>),curlthe page + a frame to confirm 200,openthe URL. - Tell the user the URL + that double-clicking the .command relaunches it for recording.
Engine rules (already in templates/scroll-cinematic.js)
- Preload every frame; paint frame 0 on first load; redraw only when the frame index changes.
- Sticky stage: outer section
height: 420–600vh, innerposition:sticky; top:0; height:100vh. Progress =clamp(-rect.top / (rect.height - innerH), 0, 1). Throttle in the rAF loop. - Cover-fit draw + HiDPI (
devicePixelRatio, cap 2). Drive updates from the Lenis rAF loop (robust to any scroll source). Overlay copy fades over per-line[in,out]progress windows. - Multi-section:
SCRUB_SECTIONSarray; engine skips sections whose element is missing.
Known gotchas
- More/larger frames = slow load → keep 1600px / q88 / ~180 frames.
- Continuous-motion clips only (no hard cuts — ugly when scrubbed backward).
- The headless screenshot tool blanks sticky-canvas sections when scrolled; verify with pixel sampling, and view live in a real browser.
python http.serverpreviews die when idle — the.commandlauncher is the durable demo.
Files
templates/index.html,styles.css,scroll-cinematic.js— multi-section scrub site.templates/CinematicReveal.tsx— React/Next drop-in (optional).templates/Launch Demo.command— double-click localhost launcher.scripts/extract-frames.sh,scripts/compress-frames.sh— the ffmpeg pipeline.