Cindy Zhu.
← all free guides
Building & apps Higgsfield

Build an interactive ripple landing page (zero code)

Hey, it's Cindy ๐ŸŒฑ This is the full build from the reel: a hero section where someone moves their mouse across your face and a chrome version of you ripples into view underneath. Agencies charge thousands for hero sections like this. You can have it running in about ten minutes, and you don't write a single line of code.
Get unlimited Higgsfield credits Limited time only try it first

๐Ÿ‘€ See it working first

I built a live version so you can play with it before you build your own. Move your mouse across it, and on your phone just drag your finger.

๐Ÿ‘‰ Open the live ripple demo


the trick

What's actually happening ๐Ÿง 

This looks like 3D. It isn't. It's two flat images stacked on top of each other, and your cursor paints a hole through the top one.

That's the whole trick. The normal photo of you sits on top, the chrome version sits underneath, and wherever your mouse goes, the top layer gets temporarily erased so the layer below shows through. The ripple and the liquid wobble are just that hole having soft, laggy edges instead of hard ones.

Once that clicks, the build stops being intimidating, because you're not animating a face. You're moving a mask.


Step 1: generate your portrait ๐ŸŒฑ

In Higgsfield, upload a clear photo of your own face and paste this. The photo is doing the important job here, so use one that's well lit and roughly front-on.

๐ŸŒฑ the base portrait
{
  "type": "image_generation",
  "reference_usage": "The uploaded photo IS the subject. Reproduce this exact
    person: their bone structure, eye shape and spacing, nose, mouth, jawline,
    hairline, hair and skin tone. Do not substitute, idealise or beautify them
    into a different person. Identity accuracy matters more than perfection.",
  "style": "ultra-realistic studio portrait",
  "subject": {
    "identity": "the person in the uploaded reference photo",
    "expression": "neutral, calm, quietly confident",
    "pose": "front-facing, head and shoulders, perfectly centered",
    "gaze": "direct eye contact with camera"
  },
  "composition": {
    "framing": "tight close-up from top of head to upper chest",
    "symmetry": "highly symmetrical facial alignment",
    "headroom": "consistent space above the head",
    "depth_of_field": "shallow, face in sharp focus"
  },
  "lighting": {
    "key_light": "soft frontal key slightly above eye level",
    "fill_light": "subtle fill to preserve facial detail",
    "rim_light": "minimal rim light for separation from the background",
    "contrast": "high contrast with smooth shadow falloff",
    "skin_detail": "natural skin texture, pores visible, no beauty smoothing"
  },
  "background": {
    "color": "deep matte black",
    "gradient": "subtle radial gradient behind the head",
    "noise": "clean, no grain"
  },
  "wardrobe": {
    "clothing": "dark zip-up jacket or high-collar top",
    "branding": "none"
  },
  "camera": {
    "lens": "85mm prime",
    "aperture": "f/1.8",
    "perspective": "eye-level"
  },
  "rendering": {
    "photorealism": "extreme realism, editorial quality",
    "color_grading": "neutral cinematic tones"
  },
  "mood": "intense, premium, modern, minimal",
  "negative_prompt": [
    "different person", "changed facial structure", "beautified face",
    "cartoon", "illustration", "cgi", "over-smoothing", "plastic skin",
    "dramatic colors", "harsh shadows", "visible logos", "celebrity likeness"
  ]
}
๐Ÿ’ก Save this image and don't lose it. Everything in step two depends on it.

the second layer

Step 2: generate the chrome version ๐Ÿชž

This is the most important step in the whole build. Upload the image you just made as a reference, then paste this.

๐Ÿชž the chrome layer
{
  "type": "image_generation",
  "style": "ultra-realistic cinematic sci-fi portrait",
  "base_image_usage": "Use the uploaded portrait as a strict layout reference.
    The head size, head position, tilt, shoulder line, framing and crop must
    match the uploaded image EXACTLY, pixel for pixel. This image will be
    layered directly on top of the original, so any shift in position breaks
    the effect. Match the composition first, style second.",
  "subject": {
    "pose": "front-facing, head and shoulders, centered, identical to reference",
    "face_visibility": "fully concealed by helmet",
    "emotion": "powerful, mysterious, elite"
  },
  "helmet": {
    "coverage": "full-face enclosed helmet, no skin visible",
    "concept": "high-end futuristic helmet with luxury craftsmanship",
    "structure": "monolithic shell with segmented armor geometry",
    "materials": ["matte black titanium", "dark chrome alloy", "carbon fiber",
      "energy-reactive glass"],
    "visor": {
      "type": "opaque or semi-opaque visor",
      "color": "deep black with subtle inner glow",
      "visibility": "eyes NOT visible",
      "effects": "faint internal HUD reflections only"
    },
    "details": ["micro-panel seams", "precision vents",
      "etched futuristic symbols", "thin glowing energy lines along contours",
      "layered mechanical depth"]
  },
  "integration": {
    "helmet_fit": "perfect anatomical fit to the head in the reference",
    "edges": "seamless closure around neck and jaw",
    "realism": "physically accurate proportions and reflections"
  },
  "lighting": {
    "key_light": "soft frontal cinematic light matching the reference",
    "accent_lights": "controlled rim lights defining the helmet silhouette",
    "glow": "very subtle internal glow, not overpowering",
    "contrast": "high contrast, smooth shadow gradients"
  },
  "background": {
    "color": "deep matte black, identical to the reference",
    "effects": "subtle volumetric haze for depth"
  },
  "camera": {
    "lens": "85mm prime",
    "aperture": "f/1.8",
    "perspective": "eye-level, identical framing to reference"
  },
  "rendering": {
    "photorealism": "extreme realism, AAA sci-fi film quality",
    "textures": "ultra-detailed metal, glass, nano-surfaces",
    "color_grading": "dark neutral cinematic tones"
  },
  "mood": "mysterious, intimidating, futuristic, premium",
  "negative_prompt": [
    "shifted head position", "different crop", "different framing",
    "face visible", "eyes visible", "open helmet", "cartoon", "anime",
    "illustration", "cgi look", "cheap armor", "bulky proportions",
    "logos", "text", "celebrity likeness"
  ]
}
โš ๏ธ The one thing that ruins this build. The two images have to line up pixel for pixel. If the head sits even slightly higher, lower or larger in the second image, the reveal reads as a glitch rather than a transformation. If yours don't match, regenerate the chrome version rather than trying to nudge it later. Put them side by side and flick between them before you move on.
๐Ÿ’ก Don't want a helmet? Swap the whole helmet block for a liquid chrome skin treatment: "replace all skin and hair with polished liquid chrome, mirror-finish molten metal, preserving exact facial geometry, expression and lighting." Keep every line about matching the reference layout.

the build

Step 3: build the effect in Unicorn Studio ๐Ÿฆ„

Unicorn Studio is a no-code tool for WebGL effects. Free to start.

  1. ๐Ÿ†• Start a new project.
  2. โฌ†๏ธ Upload your base portrait and fit it to the artboard.
  3. โฌ†๏ธ Upload the chrome version and fit it the exact same way, sitting on top.
  4. ๐ŸŽจ Select the overlay image and apply Gradient map.
  5. โœจ On the same image, apply Mouse trail.
  6. ๐Ÿ“ค Hit Export, choose Embed, and copy the link.

The exact values ๐ŸŽ›๏ธ

These are the settings from the build this is based on. Start here, then tweak to taste.

Gradient map

  • ๐ŸŽจ Colours: 000000 ยท 000000 ยท 8A05DB ยท DE37CC ยท E7EE9D
  • ๐Ÿ“ Position: X 50, Y 50
  • ๐ŸŒ€ Phase 24 ยท Scale 95 ยท Mix 100
  • ๐Ÿ” Wrap: Mirror
  • โšก Interactivity speed: 50

Mouse trail

  • ๐Ÿ“ Position: X 50, Y 50 ยท Clip to parent: off
  • โญ• Radius 31 ยท Strength 100 ยท Hardness 69
  • ๐Ÿ’ซ Tail 85 ยท Fluidity 54 ยท Dissipation 45
  • ๐ŸŒˆ Chromatic abb. 77 ยท Momentum 32
  • ๐ŸŽฌ Effect type: Reveal Background ยท Scale 2
  • ๐ŸŒฑ Background: 000000 at -32

The three that change the feel most: Tail (how long the trail lingers), Fluidity (how liquid versus how sharp), and Chromatic abb. (the colour fringe at the edge, which is most of why it reads as expensive). Move one at a time.

๐Ÿ’ก Worth knowing before you ship it: Unicorn Studio's free tier is for personal, non-commercial projects and adds a small watermark. If you're building this for a client or a business, you'll need their paid plan. If you'd rather avoid that entirely, see the no-Unicorn version at the bottom of this guide.

the page

Step 4: build the page in Claude Code ๐Ÿ’ป

Paste your embed link into Claude Code along with this prompt, and it builds the whole page around it.

๐Ÿ’ป the landing page prompt
I have a Unicorn Studio embed for an interactive hero effect. Build me a
complete, single-file landing page around it.

Here is my embed:
[PASTE YOUR UNICORN STUDIO EMBED CODE HERE]

Requirements:

HERO
- The Unicorn Studio effect is the full-viewport hero background.
- CRITICAL: the embed container MUST have an explicit width and height, or the
  scene renders as nothing and throws no error. Use width 100% and height
  100svh (not 100vh, so the iOS address bar doesn't cause a jump).
- Give the container position: relative, and layer my headline copy above it
  with z-index so the text sits over the effect.
- Make sure UnicornStudio.init() runs AFTER the container exists in the DOM.
- Set data-us-production="true". Do NOT lazy-load the hero.

CONTENT
- Headline, one supporting line, and a single call-to-action button.
- Below the hero: three short feature blocks, an about section, and a footer.
- Use placeholder copy I can easily replace, clearly marked.

DESIGN
- Dark theme to match the hero: near-black background, off-white text,
  one accent colour.
- Generous spacing, large type, nothing cramped. Modern and minimal.
- Subtle fade-up animations on scroll for the sections below the hero.

TECHNICAL
- One self-contained HTML file with inline CSS and JS. No build step, no npm.
- Fully responsive. On mobile the hero still fills the screen and the copy
  stays readable over it.
- Respect prefers-reduced-motion: disable the scroll animations.
- Semantic HTML, alt text, and sensible heading order.

Then tell me exactly how to preview it locally, and flag anything I need to
change before putting it online.
๐Ÿ’ก Ask Claude Code to "run it and show me a preview" so you see it working before you touch anything.

the free route

The no-Unicorn version (if you'd rather own the code) ๐Ÿ”ง

For this specific effect, Claude Code can build the whole thing itself with no third-party tool, no account and no watermark. It's free for commercial use and loads faster. Paste this instead:

๐Ÿ”ง the no-Unicorn build
Build me a single-file interactive "liquid reveal" hero section.

I have two pixel-aligned portrait images: base.jpg (a normal portrait) and
chrome.jpg (a chrome/helmeted version, identical framing).

Behaviour:
- Full viewport hero, 100svh, images object-fit: cover.
- chrome.jpg sits underneath, base.jpg sits on top.
- As the pointer moves, a soft liquid trail follows it and erases the top
  image so the chrome version shows through, then settles back over about
  one second.
- The trail should have a lingering tail and momentum, not a hard circle.
- Add a subtle chromatic fringe (offset the red and blue channels slightly)
  at the reveal edge.

Technical requirements:
- Use pointermove, not mousemove, so touch works.
- When there is no pointer input, animate the reveal along a slow drifting
  path so it is alive on mobile and before anyone interacts.
- IMPORTANT: radial-gradient(circle 26% at ...) is INVALID CSS and fails
  silently, because a circle's explicit size must be a length, not a
  percentage. Put the radius in the colour stops instead.
- mask-image cannot be CSS-transitioned (its animation type is discrete), so
  drive the easing per frame in requestAnimationFrame with a lerp.
- Ship both -webkit-mask-image and mask-image.
- Respect prefers-reduced-motion: show a static image, no animation loop.
- Overlay a headline and subline with correct z-index.

Give me one self-contained HTML file, and tell me how to preview it.

Those three technical notes in the middle are there because they're the exact bugs that make this silently do nothing. Handing them to Claude Code up front saves you an hour of wondering why your screen is blank.


How to get the most out of it ๐ŸŽ“

  • ๐ŸŒฑ If you're just starting: build it with your own face first, not a client's. You'll learn the alignment lesson on a photo you don't mind regenerating five times.
  • โšก If you're comfortable already: the highest-leverage change is the chrome image. Try a liquid metal version, an X-ray/wireframe version, and a "future you in ten years" version. The effect stays identical, but the concept changes completely, and that's what makes it yours instead of a copy.
  • ๐Ÿ“ฑ Always check it on a phone. There's no cursor on mobile, so make sure you've got either drag-to-reveal or an auto-drift. A hero that looks dead on mobile is worse than no hero.

the honest bit

The honest bit โœ…

๐ŸŽฏ Alignment is the whole build Ninety percent of failed attempts are two images that don't line up. Fix it at the image stage, never in the effect.
๐Ÿ–ผ๏ธ Two big images is real page weight Export at around 2048px wide for desktop and serve a 1024px version to phones, or your hero will be the slowest thing on your site.
๐Ÿ’ณ The free Unicorn tier is personal use only and watermarked. Client work needs their paid plan, or use the no-Unicorn version above.
๐Ÿ™‚ It won't replace a designer It replaces the version of your site where the hero was a centred headline and a stock photo.

The links ๐Ÿ”—

๐ŸŽฌ Higgsfield: higgsfield.ai (for both portraits)
๐Ÿฆ„ Unicorn Studio: unicorn.studio (the no-code effect)
๐Ÿค– Claude Code: claude.com/product/claude-code (builds the page)
๐Ÿ‘€ My live ripple demo

Follow @cindiezhu for more AI tips every single day ๐ŸŒฑ