Jelly Black Cat
jellycat
OpusAstra
Winner
Fastest
Opus wins. Opus's black cat is the one you'd screenshot: glossy black jelly with a night sky of stars swirling inside, ruby edges against the moon and a stretched laser pounce; Astra built a cute, tidy smoky-grey cat in 26 minutes for $15, but its jelly reads as tinted glass in a flat grey room.
Who won? You pick
Pick the build you liked best to see what everyone else thinks.
Scorecard
Opus4Astra1
| Criterion | Opus | Astra |
|---|---|---|
| Jelly look | Black glossy jelly, glows ruby at the ears, tail and outline when backlit | Smoky grey glass, reads more plush toy than gummy candy |
| Wow factor | Stars drift inside and burst on every landing like a snow globe | Clean and cute, nothing happening inside the body |
| Face | Emerald eyes, slit pupils that go round on the hunt, pink nose | Big lime eyes, chunky muzzle, very readable |
| Laser hunt | Crouch, butt wiggle, a long stretched pounce, paw batting, tail chase | Follows the dot, the pounce is small and hard to read |
| Scene | Warm candles, moonlit window, the collection with a clear skeleton figurine | Flat grey room, the moon is a pale disc |
| Interface | Every control, a bit busy | Polished card, mood meter and toasts |
| Time | 1h46m00s | 26m00s |
| Overall | Winner | – |
The prompt
Build **"Jelly Black Cat"**: a real-time, interactive 3D **cute little black cat made of dark black-cherry jelly with glowing green eyes**, sitting on a cozy Halloween table at night. People **poke** it, **stretch** it, **pick it up**, **stroke** it until it **purrs** and the whole body hums, wave a **laser dot** it hunts and **pounces** on, pour it into a **box** (cats are liquid), **tickle** it and try to pet its belly, with **synthesised sound**, as ONE self-contained HTML file rendered with **WebGPU (WGSL)** and an automatic **WebGL2** fallback.
**This is part of a series called Jelly Monsters, and the most important thing is that it looks stunning.** Every frame should look like a high-end product photo of a gummy candy character: glowing, glossy, wobbly, adorable. Someone scrolling past a still frame should stop and want to touch it. Spend your effort on the look and the jelly feel first, features second.
**It must also be fun.** Every touch gets a reaction with personality: it flinches, giggles, gets grumpy, looks puzzled, shows off. This monster is the most jelly of them all: a cat is already half liquid, so every move it makes (the crouch, the butt wiggle, the pounce, the landing, the purr, pouring into a box) is a chance for the jelly to stretch, squash, ripple and ring out. It should be **hypnotic**: something you keep doing just to watch the jelly settle, the way people watch slow-motion videos of jelly dropped on a plate.
## Priorities
Build it in this order, and finish each tier properly before starting the next. A polished tier 1 beats a broken everything.
1. **Must be stunning:** the character (cute, readable, plush-toy proportions, a cat from its silhouette alone), the dark glowing jelly material with its ruby backlight, the glowing eyes, the jelly feel (the wobble, the ring-down after every move, the tail), the night table scene and its lighting, the base interactions (Poke, Stretch, Grab, idle life), the demo mode.
2. **Must work:** the special trick (the purr, the laser dot and the pounce, the box), the collection, colour flavours, Shake, Pose, Reset, sound, both renderers, the control card, the secret.
3. **Gags and polish:** Auto laser, stroking against the grain, always landing on its feet, knocking candy off the table, the loaf, Tickle, the collection's reactions, soft fog near the table, candle flicker reflected in the jelly and the eyes, slow motion, Cinema mode extras.
Never ship a feature half-working: if something from tier 3 can't be done well, leave it out cleanly.
## Deliverable
- One self-contained `.html` file with all JavaScript, WGSL, GLSL and CSS inline. Start it with `<!doctype html>`, `<meta charset="utf-8">` and a viewport meta.
- **No external requests of any kind**: no libraries, CDNs, web fonts, images, textures or audio files. Generate everything procedurally in code (sound included). Use system font stacks.
- It must run inside a sandboxed iframe (`sandbox="allow-scripts allow-pointer-lock"`). Do not use `localStorage`, cookies, `alert`, pop-ups or top-level navigation, and wrap any storage access in `try/catch`.
- This must be a live simulation, not a video, a pre-baked animation or a 2D fake.
- **Test hook:** if the URL has `?test=1`, expose `window.__toy` (no visible change) with `setTool(name)`, `poke(x, y, strength)`, `drag(x0, y0, x1, y1, ms)` (through the same code path as a real pointer drag with the current tool, in canvas pixels), `shake()`, `reset()`, `set(name, value)` for every slider, switch and flavour, the special-trick calls listed below, and `state()` returning `{ backend, tool, mode, volume, kinetic, busy, fps }` plus the special-trick fields listed below.
## The series look (same for every Jelly Monster)
**Character style**
- **A plush toy made of gummy candy.** Chunky, round, soft proportions: a big body, a big head (or one shape that is both), short stubby limbs if any. Nothing thin, spiky, sharp or realistic. No teeth beyond one tiny cute fang if the monster needs it.
- **Big glossy eyes** (each about a quarter of the face's width), glossy near-black candy with **one big soft white highlight** high up and a small second one, always visible whatever the lighting. Eyes **blink** now and then and **follow the pointer**. A **tiny smile**.
- **One or two strong colours** per flavour, plus a lighter face area. It must read at a glance as what it is (here: a black cat) from its silhouette alone.
- **Every part is attached to the body.** Nothing hovers or floats detached around the character (the ears, whiskers and tail all grow out of the body).
**The jelly**
- **Translucent all the way through**, never plastic: colour comes from absorption through the volume (Beer-Lambert), deep where it is thick and pale and bright at thin edges; the background is visible through it, bent by refraction (IOR about 1.35, like water). Small sharp wet highlights with a strong Fresnel sheen at grazing angles; no broad plastic clearcoat; tiny suspended air bubbles at different depths; faint internal grain.
- **It glows when backlit.** The moonlight from behind makes its edges and thin parts glow in its own colour. This is the signature look of the series.
- **It moves like jelly:** slow heavy jiggle (2 to 4 Hz), the top lags behind the base, it keeps its volume (squashed it bulges, pulled it thins), squashy dead bounces, never a rubbery boing.
**The scene**
- **A cozy Halloween tabletop at night**: a dark warm wooden table, three church candles of different heights on the left and back (real flickering flames, warm light that moves), a large window behind with a big pale moon and a deep blue-violet night sky, a little soft fog near the table surface. Two or three tiny props at the edges (a small pumpkin, scattered candy corn) that never compete with the character.
- **The collection:** the monsters from earlier days of the series sit in a row on a low wooden step at the back right of the table, as **tiny jelly figurines** about a fifth of the character's height, in the same jelly material (simpler shading is fine), softly out of focus, never in front of or overlapping the character. Each has its own big glossy eyes, blinks now and then and glances at the main monster when it does something big. They **react**: when the main monster does its big trick they hop and cheer, when it is shaken or dropped the table jolts and they wobble along, and when it poses they pose too. Tapping one with any tool makes it wobble, squeak and do a **tiny version of its own trick** (listed under The monster). They wobble on a cheap spring, no soft body of their own, and they never cost the main monster frame rate. In demo mode they sit still and only blink.
- **Lighting:** warm flickering candle key from the front-left, cool strong moon rim light from behind so the jelly glows at its edges, soft coloured shadows and a coloured light patch on the table where light passes through the jelly. Filmic tone mapping, gentle bloom on the candle flames and the jelly's highlights, a soft vignette.
- **Camera:** a slightly low three-quarter front view, close, like a food photo: the character fills about 55% of a square frame and looks into the camera. Orbit and zoom within limits; **no automatic follow cam that drifts**. The UI never covers the character on desktop.
## The monster (this monster)
- **A little black cat in jelly**: a chubby gummy kitten **sitting upright** on the table like a plush toy, facing the camera: a **big round head** (about as wide as the body) with **two soft rounded triangle ears**, a round pear-shaped body, two short front legs straight down in front, haunches tucked at the sides, round mitten paws, and a **long thick tail** that curls around its front paws with the tip curled up in a little hook. Short, round, soft: nothing thin or spiky.
- **The jelly:** **black-cherry**: so deep where it is thick (the body, the head) that it reads as a black cat at a glance, but never flat black or plastic: it is a very dark, very clear red, so you see a faint depth inside it, the candle highlights sit sharp and wet on top, and wherever light passes through the thin parts (**ears, tail, paws, cheeks, the edge of the silhouette**) it glows a rich **ruby red**. The moon behind it turns the whole outline into a glowing ruby rim and the ears into two little lanterns. This backlit dark-jelly look is the shot.
- **Eyes (this monster):** the series eyes, but **glowing emerald-green candy** instead of near-black: a big glossy dome with a darker green rim, a **soft vertical slit pupil**, the same big white highlight and small second highlight, and a soft green glow that lights the jelly around them a little and reflects on the table. The pupils **widen into big round black discs** when it hunts, in the dark, or when it is excited, and narrow back to slits when it is calm. They must read crisply against the dark jelly from every angle.
- **Face:** a tiny **pink jelly nose** (a rounded triangle), a little "w" cat mouth, rosy-pink inner ears (thinner jelly, so they glow brightest), and **three soft whiskers a side** as thick rounded sugar strands (glossy pale caramel, attached to the cheeks, gently springy, never needle-thin). One tiny cute fang may show when it yawns.
- **Toe beans:** each paw has **pink jelly toe beans** (four small and one big pad) underneath, shown whenever a paw lifts: when it kneads, swats, rolls over or is picked up.
- **The jelly feel (the most important part):** this cat is **dense, heavy, slow jelly**, like a big panna cotta, never rubber. Every move has **follow-through**: the head lags behind the body and catches up with a wobble, the belly and cheeks keep jiggling after the body stops, the tail swings after it like a heavy jelly rope with its own slow wave. Every landing, hop and drop ends in a **ring-down** you want to watch: a deep squash, a slow bulge back, two or three shrinking wobbles with the surface highlights sliding over the jelly, then perfectly still. The tail is a soft chain inside the body (about 12 segments, fat at the base, thinner but still rounded at the tip) that you can stretch out long with Stretch: it snaps back and lashes once before curling home.
- **Moving around:** it moves only with **little squishy hops** (squash, stretch up, land, squash), never a walk cycle. It always comes back to its spot with a few hops.
- **Idle life (this monster):** besides the base idle life, it grooms a paw (licks it, the paw squishing against its mouth), flicks one ear, slowly swishes the tail tip, yawns (tiny fang), and after about 20 seconds without input it settles into a **loaf**: paws tucked away, body sagging into a soft rounded loaf shape, eyes half closed. Any touch wakes it.
- **Mood in the tail:** happy = tail up with a curl; curious = tip twitching; grumpy = tail lashing and the jelly **puffed up** a little all over (bigger, rounder, the surface rippling as it puffs); scared (after a drop) = puffed tail for a second.
- **The collection** (3 figurines, oldest on the left):
- **Spider** (#1): a round teal gumdrop dome with a lighter mint face patch, two big eyes, eight short chubby aqua legs. Its trick: a rainbow fan on its back rises like a peacock spider's and it does a little side-to-side dance.
- **Ghost** (#2): a milky white-blue glowing ghost with a scalloped skirt, hovering just above the step. Its trick: it puffs up and goes "boo" with a tiny O mouth, and the nearest candle flame flickers.
- **Skeleton** (#3): an almost water-clear jelly figure sitting with its legs out, white candy bones visible inside (a round skull with the eyes in its sockets, a ribcage). Its trick: its bones rattle loose inside the jelly and click back into place one by one, skull last.
- **Flavours** (round swatches): **Black Cherry** (default: black-red jelly, ruby glow, green eyes), **Blackberry** (black-violet jelly, purple glow, gold eyes), **Midnight** (blue-black jelly, sapphire glow, green eyes), **Ginger** (warm orange jelly, amber glow, green eyes), **Snow** (milky white jelly, pale pink glow, blue eyes). Every flavour keeps the pink nose and toe beans.
## Base interactions (same for every Jelly Monster)
A tool picker with **Poke**, **Stretch** and **Grab**. The default tool is Poke. A press that ends within 6 px and 450 ms counts as a tap. Right-drag or two fingers orbit the camera with any tool. Pointer events with **pointer capture**, mouse, pen and touch.
- **Poke:** a tap presses a deep rounded dent that springs back with a wobble rippling over the whole body; it **flinches** (eyes squeeze shut, body ducks), then shakes it off. Holding presses deeper and the jelly bulges around the finger. Poked many times in a row, it gets a little grumpy (frowns, turns away), then forgives you.
- **Stretch:** grab any point and pull: the jelly stretches out locally like taffy, thinning near the finger and bulging back at the body, and on release **snaps back** with a big satisfying wobble. Never tears, never moves the whole body rigidly. The further you pull, the bigger the snap.
- **Grab:** pick the whole monster up by the point you grabbed; it dangles and sways with weight, its eyes go wide; release to drop it (a squashy splat and wobble), or release during a fast drag to toss it a little way. It always ends up back in its spot, happy.
- **Tickle:** with Poke, small fast circles on the body (about three loops) start a giggle fit: it squirms, ripples run all over the jelly, its eyes squeeze into happy arcs and it wriggles away from the finger, then catches its breath.
- **Shake** (button and `S`): the whole monster jiggles hard for a second like a plate of jelly being shaken, then settles.
- **Pose** (button and `F`): the monster strikes a cute pose, a different one each time in turn (a wave, a wink, a little "ta-da" with its arms up, adapted to its shape), the figurines in the collection pose too, and a soft white camera flash fires: the frame then holds still for 1 second with all UI and the cursor hidden (a clean screenshot), and the UI fades back. Never during demo mode.
- **Idle life:** it breathes, blinks, follows the pointer with its eyes and body, and every few seconds does a small cute idle animation of its own. Never perfectly frozen.
- **Reset** (`R`): back to its spot, settled.
- **Physics:** a volumetric soft body (a lattice of about 500 to 1,500 cells, XPBD or shape matching with volume preservation) skinned to a smooth high-resolution surface, with a fixed timestep (about 1/120 s) and bounded substeps. Deformation clamped so it always reads as itself; back to exact rest within 2 to 3 seconds; no jitter at rest, no explosions, no creep, nothing passing through the table.
## Special trick (this monster)
- **Stroke to purr:** with Poke, a slow drag along its back from the head towards the tail (about 150 px or more, slower than a tickle) is a **stroke**. It leans into your finger, the jelly under the finger dips and rises like a soft wave following it, its eyes squeeze into happy arcs and it starts to **purr**. The purr is **visible**: a fine, fast vibration of the whole body (about 25 Hz, very small amplitude) plus **slow shimmering ripples** spreading over the surface from its chest, so the wet highlights shiver and the ruby glow pulses gently with each purr breath (in and out, about 1.5 s). Every stroke adds to a **purr level** (0 to 1) that slowly fades out over about 6 seconds without strokes. At half level it starts to **knead** the table: front paws pressing down in turn, each paw squishing and showing its toe beans. At full level it rolls onto its back, belly up, paws curled (see Secret), then rolls back after a few seconds if nothing happens. This must be the most soothing thing in the toy.
- **Against the grain:** a stroke from the tail towards the head: it gives a grumpy "mrrp", its jelly **puffs up** with small ridges rippling backwards over the body like ruffled fur, the tail lashes, and the ridges smooth out over a second. The purr level drops to zero.
- **Laser dot** (tool `4`): a small bright **red laser dot** with a soft glow on the table follows the pointer (a little lag, a tiny jitter like a real laser pointer), only on the table area in front of and around the cat, always inside the frame. The cat **hunts** it:
- its pupils widen into big round discs and it tracks the dot with its head, ears forward, tail tip twitching, with a little excited **chatter**;
- when the dot stays still for about 0.4 s within about two body lengths, it **crouches**: the body sags low and wide, and it **wiggles its butt** side to side two or three times, each wiggle sending a visible wave of jelly from its back end through its body to its head;
- then it **pounces**: a fast arc onto the dot, the body **stretching long and thin in the air** (front paws reaching, the tail streaming behind), and **lands** with a deep squash, paws first, flat on the dot. The landing **rings out**: the body bulges back up, the head and belly jiggle, the tail wobbles down. It looks under its paws: the dot is now on top of its paw (it stares at it, puzzled). Move the dot away and it chases again;
- a dot moved fast makes it **skid** after it with a sliding squash; a dot on its own tail makes it **chase its tail** in a spinning circle two or three times, the jelly flung outwards, until it catches the tail and sits on it, dizzy; a dot on the collection step or out of reach makes it sit and stare, tail twitching, with a sad little "mew";
- turning the laser off: it looks around for the dot, then hops back to its spot.
- **Auto laser** (switch, `A`): the dot moves by itself in an endless, varied, calm pattern (pauses, little circles, fast dashes, a stop on the tail now and then), so you can just watch it hunt and pounce forever. Works with Slow motion. This is the screensaver of the toy.
- **Cats are liquid:** a small open **cardboard box** (procedural brown card with a soft printed stripe, about the cat's width but half its height) sits on the table front right. Drop the cat over it with Grab (or tap the box with Poke) and it **pours in**: it sinks in bottom first like thick syrup, the jelly flowing down into the corners and **filling the box to a square shape**, with a rounded jelly dome bulging a little over the rim and only the ears, eyes and tail tip sticking out of the top. (One way: the box walls hold the soft-body cells in while the rest shape blends into a box-filling shape over about 0.8 s, and back when it is pulled out; the surface, eyes and ears ride on it.) It sits there content, eyes slowly blinking, slightly bulging over the edges. Pull it out with Grab or Stretch: it **stretches up out of the box like taffy**, holding on at the bottom, then comes free with a wet slurp and flops onto the table with a ring-down, cat shape again. Poking it in the box makes the square jelly wobble like a jelly in a mould.
- **Always lands on its feet:** tossed with Grab, it twists in the air (head first, then the body follows, the jelly lagging behind) and always lands upright on all four paws with a deep squash, then looks proud.
- **Knocks things off the table:** sometimes, when left alone for a while (about 25 s, before the loaf), it hops to a candy corn, **looks you straight in the eye**, and slowly pushes the candy to the front edge of the table with one paw until it falls off with a tiny tick. A new candy corn appears back on the table a moment later.
- **Shake:** the base Shake, plus its jelly puffs up for a second afterwards and it shakes itself off like a wet cat, the wobble running from head to tail.
- **Test hook:** `laser(x, y)` (put the dot at canvas pixel `x, y`; `laser(null)` turns it off), `pounce()` (pounce on the dot now), `stroke(dir)` (`'with'` or `'against'`, as a real drag would), `boxIn()`, `boxOut()`, `autoLaser(on)`, `knock()` (push a candy off the table), `loaf()`, `toss()`, `figurine(i)` (tap collection figurine `i`, 0 = oldest), `pose()`, `tickle()`; `state()` adds `purr` (0 to 1), `kneading`, `belly` (true while lying belly up), `hunting`, `airborne`, `inBox`, `autoLaser`, `laser` (dot on), `pupils` (0 = slit, 1 = round), `posing`, `loaf` and `mood`.
## Secret (this monster)
- **The belly trap:** when it lies belly up at full purr, its round pink-tinted belly looks irresistible. Touch the belly with Poke or Stretch: it **grabs your finger** with all four paws (they close around the pointer position, toe beans pressing in), **bunny-kicks** with its back paws in quick little thumps, the whole jelly body jiggling wildly, nibbles once with its tiny fang, then lets go, rolls back onto its paws and grooms a paw as if nothing happened. A small badge: "It's a trap." Never hint at it in the UI.
## Sound
Every action has a **synthesised sound**, generated live with the **Web Audio API** (oscillators, filtered noise, envelopes). **No audio files, no samples.** Soft, cute, wet: squishes, bloops and creaks for the jelly; a short squeak for the flinch; a rising wet stretch and a satisfying snap-back bloop for Stretch; a splat for a drop; a jiggly rattle for Shake; a camera shutter click for Pose; and for this monster: the **purr** (the most important sound: a warm, low rumble around 25 Hz pulses of filtered noise over a soft 50 Hz hum, breathing in and out with the visible purr, swelling with the purr level, never harsh), little "mrrp" chirps, a tiny "mew" for the flinch, a grumpy "mrrr" against the grain, soft paw squishes for kneading, the excited chatter at the laser dot (tiny fast "ek-ek-ek"), a soft whoosh for the pounce and a deep wet **flump** for the landing, a squeaky skid, a syrupy glug as it pours into the box and a long wet slurp as it comes out, a giggle-purr for Tickle, playful thumps and a squeaky growl for the belly trap, the candy's tick as it falls off the table, a sleepy sigh for the loaf, a yawn, and a tiny high squeak plus a mini version of its own sound for each collection figurine.
Rules: create the `AudioContext` only on the first user gesture and never before; resume a `suspended` context on interaction; master gain into a compressor, no clipping; cap at about 16 voices; wrap every audio call in `try/catch`. Sound on by default; a **speaker button** and `M` mute it.
## Rendering (WebGPU with a WebGL2 fallback)
**WebGPU (WGSL) when available, with an automatic WebGL2 fallback that looks the same.** Detect at start; if WebGPU is missing, or adapter or device creation fails, use WebGL2. **If the WebGPU device is lost at any time (`device.lost`), switch to WebGL2 on the spot and keep rendering**: the toy must never end up on a blank screen. No libraries: write both paths yourself, sharing the scene data and the simulation. Show which one runs in the status pill.
- **Jelly:** back faces into a thickness buffer, then front faces, absorption from the distance light travels through the jelly, screen-space refraction of the scene behind (IOR about 1.35, offset scaled by thickness), a wrap-around subsurface term for the backlit glow, wet specular with Schlick Fresnel and a tight highlight, internal grain and bubbles. Opaque shading with an alpha value is not acceptable.
- **Eyes:** glossy dark candy domes with the white highlight painted in plus a real specular glint, so they always read as big cute eyes.
- **Scene:** candle flames as flickering additive sprites with a warm point light each; the moon as a soft disc with a rim light; soft shadows; table wood grain procedural; fog as a few soft sprites near the table.
- Preallocate all buffers and build every pipeline at start; never create shaders, pipelines or geometry during interaction. DPR capped at 2. An automatic **quality scaler** lowers resolution and bloom before it ever touches the jelly feel. It must stay smooth on a mid-range phone.
- Only if neither WebGPU nor WebGL2 exists, show a clear, well-designed message.
## Interface
A dark, cozy interface that stays out of the way; the monster is the hero and UI never covers it.
**Top left:** small caps `POKEABLE · JELLY MONSTERS 4 / 15`, a large italic serif heading on two lines: *Jelly* / *Black Cat.*, and caption lines "Pet it." / "Stretch it." / "Show it the dot."
**Top right:** a live status dot with `WEBGPU · LIVE` or `WEBGL2 · LIVE`, a **speaker icon button** (`ON` / `MUTED`), and `PAUSED` when paused.
**Right panel: control card "Black Cat"**, a floating card about 240px wide with 20px corners, dark charcoal with a hint of violet, soft shadow, no hairlines, plain system sans, bold sentence-case labels, and an accent colour taken from the active flavour's glow. Tools as rounded tiles with small drawn icons and key numbers (`1` Poke, `2` Stretch, `3` Grab, `4` Laser), the special-trick controls as a big accent button (**Shake**) and a switch (**Auto laser**), **Box**, **Pose** and **Reset** as chips, flavours as round swatches, sliders for **Softness**, **Wobble** and **Sound** (6px rounded track, round white thumb, monospace value chips), switches for **Slow motion** and **Cinema**, and **Pause / Resume** as a full-width pill. Collapsible to a small button; a bottom sheet on narrow screens.
**Bottom left:** a one-line hint per tool ("Tap to poke. Stroke its back to make it purr. Circle to tickle.", "Grab and pull. Let go to snap it back.", "Pick it up. Drop it in the box.", "Move the dot. Hold still and watch.").
**Cinema** (`C`) hides all UI and the cursor; a tap without drag, `C` or Esc brings it back. Respect `prefers-reduced-motion` for UI transitions and camera moves; the jelly still responds fully. Keys: `1` to `4` tools, `S` Shake, `A` Auto laser, `B` Box, `F` Pose, `P` next flavour, `C` Cinema, `M` mute, Space pause, `R` reset, `0` reset view.
## Demo mode (required)
If the URL has `?demo=1`, auto-play a 4-second loop with no user input: the object drops in, wobbles, gets poked or sliced once, then settles.
For this toy that means:
- **Hide all UI** and the cursor. One fixed quality preset (no quality scaler), the default flavour, the fixed default camera.
- **Never create an `AudioContext`**, play nothing.
- Deterministic, no randomness; restart every 4.0 s of real time from the identical state; drive the simulation from real elapsed time with the fixed timestep so the loop lasts 4 s at any frame rate.
- Timeline:
- **0.0 to 0.7 s:** the cat drops onto the table on its paws, lands with a deep squash and rings out, tail swinging in after it.
- **0.8 to 1.0 s:** an invisible finger pokes its cheek: it flinches, eyes squeezed shut, and shakes it off.
- **1.1 to 1.7 s:** an invisible hand strokes its back twice: it leans in, eyes in happy arcs, and the purr shimmers over the jelly.
- **1.8 s:** the red laser dot appears on the table about one body length to the front left; its pupils go round and huge.
- **1.8 to 2.2 s:** it crouches low and wiggles its butt twice, the waves running through the jelly.
- **2.2 to 2.7 s:** the **pounce**: long and stretched in the air, front paws reaching, tail streaming behind, glowing ruby at every thin edge against the moon. The most striking moment.
- **2.7 to 3.2 s:** it lands flat on the dot with a deep squash and a big ring-down; the dot goes off.
- **3.2 to 4.0 s:** it hops back to its spot, sits, curls its tail around its paws and settles, ready for the loop to start again.
- Start moving within 1 s. It is recorded in a slow software renderer: **the dark jelly, its ruby glow, the green eyes and the stretched pounce must read clearly at 15 fps**.
- Support `?demo=1&t=<seconds>` to freeze the demo at that time (for screenshots).
## Before you finish
Self-check against this list and fix anything that fails:
- **The scroll-stop test:** take still frames at rest, mid-stretch, crouched, mid-pounce, in the box, belly up and in every flavour. Each must look like a premium photo of a glowing gummy candy character: cute, glossy, translucent, backlit, with readable glowing eyes, and the collection reading as small background figurines that never steal the eye. The black cat must read as **dark jelly glowing ruby at its edges**, never as black plastic, rubber or a silhouette. If any frame looks like plastic, glass, a flat cartoon or something creepy, fix the look before anything else.
- **The cute test:** from the default view it reads instantly as a friendly little black kitten with big shiny green eyes; nothing sharp or scary, no claws, no teeth but the one tiny fang.
- Poke every part 50 times fast, stretch from every side as far as possible (the tail too), grab and toss it, shake it ten times in a row, move the laser dot wildly for a minute, put it in the box and shake it, pull it out of the box from every side, stroke it mid-pounce, switch flavours mid-wobble, leave Auto laser on for five minutes: never an inverted or exploded body, jitter at rest, a cat stuck in the box shape or off its spot, the cat leaving the frame or landing on the collection, a part through the table or a crash. After every test it ends up back in its spot, cat-shaped and settled.
- Every tool, button, switch, slider and key; stroking with and against the grain; kneading and rolling over; the tail chase; the skid; out-of-reach staring; tapping each figurine; Pose several times in a row; Tickle; the loaf; knocking a candy off; pause and resume; Slow motion; Cinema; resizing to phone width with touch.
- **The fun test:** pet, poke, stretch, tickle, box and hunt with it for a minute. Every action gets its own visible reaction and sound, every landing and wobble is worth watching to the end, and it never feels like a static model being deformed. **The hypnosis test:** watch Auto laser for a minute and stroke it for a minute: you should not want to stop.
- The secret by hand.
- Sound: every action has its effect, nothing before the first gesture, mute works, no clipping.
- `?demo=1` matches the timeline, loops cleanly, shows no UI and plays no sound; `?demo=1&t=2.45` freezes mid-pounce, stretched in the air.
- No console errors or WebGPU validation errors on WebGPU AND on the WebGL2 path, the device-lost fallback works (simulate it with `device.destroy()`), and it stays smooth on a mid-range phone.
Make it the most beautiful jelly toy you can. The jelly feel comes first: it should be the cat people can't stop petting, and the pounce they replay in slow motion.