Cindy Zhu.
Free guides
Build real things Claude

Build Apple's scroll effect with Claude

Hey, it's Cindy 🌱 You commented APPLE, so here is the complete build: a short product animation, turned into an Apple-style scroll effect with Claude.
btw the waitlist for AI System Club is now open! If you're keen on using AI to automate your content, video editing, job search, business or build AI agents, feel free to sign up (only if you want to hehe). Ps. the waitlist gets first dibs:)
understand the effect

What you are actually building

This effect is usually called a scroll-scrubbed image sequence. A tall page creates scroll distance. A canvas stays fixed on screen. As the visitor moves down the page, JavaScript converts scroll progress into a frame number and draws that frame onto the canvas.

Input A clean vertical or landscape animation exported as numbered still frames.
Controller The visitor's scroll progress from 0 to 100%.
Renderer An HTML canvas that displays the matching frame.
Polish Preloading, responsive sizing, reduced-motion support, and text overlays.
Do not use a giant GIF. GIFs are heavy, limited in colour, and do not give you precise frame control. A numbered WebP or JPG sequence is easier to scrub and optimize.

step one

Create the start and end frames

Use Whisk, another image generator you already like, or your own product photography. Keep the camera, lighting, product proportions, and background consistent between both frames. Only describe the transformation you want to happen.

start-frame prompt
Create a premium product hero image for [PRODUCT].

Composition: [DESCRIBE THE CAMERA ANGLE AND FRAMING].
Background: [DESCRIBE THE SET].
Lighting: soft studio lighting with controlled highlights.
Keep the product centred, fully visible, and easy to isolate.
No text, logos, interface elements, hands, or extra objects.
Aspect ratio: [16:9 OR 9:16].
end-frame prompt
Use the attached start frame as the exact visual reference.

Keep the same product, camera angle, lens, lighting, colours, background, and framing. Transform only this:
[DESCRIBE THE END STATE].

The product identity and proportions must remain unchanged. No text, logos, interface elements, hands, or extra objects.
If the product changes shape between frames, generate again before animating. Claude can fix code, but it cannot repair identity drift baked into the images.

step two

Animate between the frames

Upload both images to Google Flow and create a short image-to-video transition. The camera should stay locked unless camera movement is part of the concept. Slow, simple transformations create cleaner scroll sequences than frantic motion.

Flow animation prompt
Animate a smooth premium product transition from the first reference frame to the final reference frame.

Keep the camera completely locked. Preserve the product identity, proportions, materials, lighting, background, and composition throughout. The only motion should be [DESCRIBE THE TRANSFORMATION].

Use slow, physically believable movement with no sudden jumps, warping, duplicate objects, text, or camera shake. Finish exactly on the supplied end frame.

A clip between three and six seconds is enough. Export at the same aspect ratio you want on the website and use the highest practical quality. The website will use the extracted frames, not the video file itself.


step three

Turn the animation into frames

  1. Upload the clip. Open EZGIF's video-to-JPG tool or extract frames locally with FFmpeg.
  2. Choose a useful frame rate. Start around 15 to 24 frames per second. A five-second clip at 20 fps produces about 100 frames.
  3. Export numbered files. Keep names sequential, such as frame-0001.webp, frame-0002.webp, and so on.
  4. Compress them. WebP is usually the best starting point. Aim for visual quality without making the full sequence painfully large.
optional FFmpeg command
mkdir -p public/frames
ffmpeg -i product-animation.mp4 -vf "fps=20,scale=1600:-2" -c:v libwebp -quality 82 public/frames/frame-%04d.webp

If the sequence is still heavy, reduce the dimensions, frame rate, or WebP quality in that order. Test on a real phone using mobile data, not only on fast desktop Wi-Fi.


step four

Give Claude Code the full build brief

Place the numbered frames in your website project, then give Claude Code the prompt below. Replace the bracketed values before running it.

complete Claude Code prompt
Build a responsive scroll-scrubbed image-sequence section for this website.

Assets:
- Frames live in [FRAME FOLDER].
- File pattern is [EXAMPLE: frame-0001.webp].
- There are [NUMBER] frames.

Behaviour:
1. Create enough vertical scroll distance for the animation to feel controlled, around 300vh as a starting point.
2. Keep a full-viewport canvas sticky while the user scrolls through the section.
3. Convert progress through the section into an integer frame index from 1 to [NUMBER].
4. Draw the matching image to the canvas using a contain-style fit, preserving aspect ratio and centring it.
5. Preload the first frame immediately, then preload the remaining frames without blocking the page.
6. Use requestAnimationFrame so rapid scroll events do not trigger unnecessary redraws.
7. Recalculate canvas size on resize and account for devicePixelRatio so the result stays crisp.
8. Add a loading state that disappears when enough frames are ready.
9. Respect prefers-reduced-motion by showing one static representative frame instead.
10. Do not introduce a new framework. Follow the architecture and styling already used in this project.

Add three optional text overlays that fade in and out at roughly 10%, 45%, and 80% scroll progress. Keep all copy and timing values in one easy-to-edit configuration object.

After implementing it, run the existing checks, explain which files changed, and tell me exactly where to edit the frame count, folder path, section height, and overlay copy.

make it feel premium

The five details that matter

Load the first frame first The visitor should see the product immediately instead of a blank canvas.
Use device pixel ratio A canvas sized only with CSS can look soft on high-density screens.
Keep the camera stable Motion inside the scene feels intentional. Camera drift feels like broken tracking.
Use simple overlay timing One short thought per beat. Do not cover the product with a paragraph.
Provide reduced motion Some visitors explicitly ask websites not to animate. Show them a strong still frame.
Test the real network A beautiful 40 MB sequence is still a bad mobile experience.

debugging

If it is not working, check these first

  1. The canvas is blank. Open one frame URL directly and confirm the path, numbering, file extension, and capitalization are exact.
  2. Frames jump or disappear. Confirm every number exists. A missing file in the middle creates a visible gap.
  3. The image looks stretched. Ask Claude to calculate a contain fit from the canvas and image aspect ratios instead of forcing width and height independently.
  4. Scrolling feels laggy. Reduce image dimensions, preload in batches, and ensure drawing happens inside requestAnimationFrame.
  5. Mobile crops the product. Keep the canvas full-screen but use contain rather than cover, then adjust the source composition if it leaves too much empty space.
Claude debugging prompt
Audit the scroll-sequence implementation you just built.

Check for missing frame requests, incorrect zero-padding, canvas stretching, excessive redraws, memory pressure, layout shift, weak loading behaviour, and mobile cropping. Use the browser console and network panel where available. Fix confirmed issues only, then summarize the cause and the change.
the waitlist is now open

AI System Club is launching soon

Build AI systems with me through recorded lessons you can follow at your own pace. Join the waitlist for first access and the founding price.

btw this list gets first dibs
the moment doors open :)