A 20-second cartoon in a world of felt and paper. Every frame was drawn by our own code: our own path tracer, models and animation written as programs. Generated pictures were used only as a target to aim at. This page walks through how it was made, using the real prompts and notes from the production chats.
Length
20 s, 480 frames
Frame
1440 × 1080, 24 fps
Brief to v1
4 h 37 min
Scroll down. The film stays on screen while you read.
1
The ask
Before this, the same engine had made two dark, cinematic films. Nurbek, a director in Higgsfield marketing, wanted to see something else.
Nurbek
Can we do something bright now? Cartoons, for kids. You went too far into cinema. Let's try other directions. What can you offer? You understand what you're capable of now.
Three styles were proposed: clay, felt and paper, and bright 3D. The answer was short.
Nurbek
Let's do all three.
Each style got its own chat. The lead chat wrote this brief for the felt one (shortened, original wording):
Lead brief to the felt chat
Make a 20-second bright children's cartoon in a world of felt and paper […]: fuzz on felt, cardboard sets with visible layers and edges, threads, buttons, stitches, painted paper — entirely in our own code.
A story with a hook in the first second and a funny or touching twist; ideally the twist plays on the handmade material (a thread unravels, a paper sun is lifted by a hand-stick).
Generate targets: turnarounds of the heroes and 6–8 styleframes. They are a target for comparison; they never go into the frame. Then models in code, side by side with the refs; an animatic under music; the final render; sound.
Rendering only on remote GPUs. Show the styleframes and the animatic before the final render.
2
A story that runs on the material
A tiny felt chick crows at dawn, but the paper sun will not rise. It climbs the cardboard hill and finds the sun asleep on the far end of the moon's yarn, hung over a wooden spool. Hanging on the yarn with all its weight, it hauls the sun up. The twist: the moment it lets go to celebrate, the sun drops and night falls again. So it ties the yarn to a fat sleeping sheep, who now holds the day up while snoring.
The whole film was timed to a bar map of the music before anything was modelled: the sunrise sits on the drop at 11.1 s, and the music stops for the gag between 13.4 and 15.7 s. Tap a time to jump the film there.
Time
Shot
What happens
Hook
Night, close on the felt nest. The chick springs up on a wire spring and crows.
Wide
The whole diorama: cardboard hills, felt trees, the paper moon on red yarn from a spool, the sheep asleep. Nothing happens.
Crow
It crows with all its might. The moon only wobbles on its yarn.
Climb
Three hops up the cardboard layers. Behind the hill, the paper sun is asleep on the other end of the yarn.
Pull
It grabs the yarn, then hangs on it with its whole weight. Slowly the yarn gives.
Drop
The sun rises and wakes. Pop-up flowers spring open, the sky turns to day.
Gag
It lets go to clap. The sun drops, instant night, the music stops. It snatches the yarn back: day again on the downbeat.
Twist
It ties the yarn round the sleeping sheep in a bow and crows from its back. Title.
Lead, on the story and styleframes
Approved. A lovely idea: the handmade world plays into the story itself (the sun on a thread over a spool), and the gag with the sheep holding the day is strong. The mechanics must read in one wide shot (the moon, the thread over the spool, the sun on the other end) before he grabs the thread, or the twist won't land.
The frog in the parallel cartoon is also called Pip, so rename the chick.
The chick was renamed Chik.
3
Targets, not footage
The heroes, the props and one styleframe per shot were generated with GPT Image 2.5 on Higgsfield. They define what the film should look like. None of these pixels is in the film; everything you see on the right was rendered from code.
TargetTurnaround of the chick, generated.
TargetThe sheep.TargetProps.
Image prompt for the chick turnaround
Character turnaround sheet of a handmade felt toy: a tiny round yellow felt chick named Pip, about 6 cm tall, shown in four views in a row on a plain warm light-grey studio background — front, three-quarter, side profile, back. Egg-shaped body made of soft wool felt with visible fuzz and fibres, a hand-stitched seam running round the belly in contrasting orange thread, two small flat felt wing flaps sewn at the sides with running stitches, a small tuft of three felt feathers on top of the head, two shiny black sewn-on button eyes with four holes and thread crosses, a little orange felt beak made of two triangles, short orange felt feet with three toes. Soft studio lighting, macro product photography of a real craft toy, shallow depth of field, consistent proportions in all views, clean layout, no text.
Eight styleframes, one per shot
TargetStyleframes, generated with the turnarounds as references.
4
Teaching our renderer felt and paper
The renderer is our own path tracer: it traces how light bounces through the scene, on the GPU through WebGPU, inside headless Chrome. The integrator, acceleration structure, materials, camera, denoiser and tone mapping are our own code. It ran on rented Runpod GPUs and a remote RTX 5090, never on the Mac.
The felt chat copied the engine and taught its copy two new materials:
Felt fuzz. A sheen layer, the soft glow that velvet and wool show at grazing angles, so the felt lights up along its contours in backlight.
Paper that lets light through. Diffuse transmission for thin paper, so the moon, the stars and the sun glow from behind.
Plus bump strength on materials, for the fibre surface.
The textures are generated in code as well: felt, paper and corrugated cardboard, written with numpy. Geometry comes from a small kit: felt pillows and paper cut-outs grown from 2-D shapes, tubes for yarn, wire and stitches, and thousands of surface fibres for the fuzz. The chick alone carries about 9,000 fibres and about 300,000 triangles; a full scene is about 2.4 million.
5
Models in code, checked against the turnarounds
Each hero was built as a program and rendered in the same four views as its target, so the two could be compared side by side.
Our codeTurnaround renders from our engine.
Our codeSet, night.Our codeSet, day.
The chat kept an honest list of gaps against the targets. The chick: the body drifts toward orange under the warm key light, and the tuft merges into one shape when small. The sheep: the fleece reads as grey noodles in neutral light where the target is fluffier and creamier. The set: the hills are less obviously layered cardboard, and the foreground is emptier than in the styleframes.
6
Target and code, shot by shot
On the left of each pair is the generated styleframe; on the right is the same moment from the finished film. The code version is simpler. The staging, the light direction and the story beat carry over. Tap a pair to play that moment.
7
Animatic and the lead's notes
The whole film was first rendered small and noisy (640 × 480, 40 samples per pixel) with the music, synthesised sound effects and a title, to check story and timing before the expensive render.
Animatic v1, with the licensed track it was cut to at that stage.
The felt chat listed its own fixes: the third shot repeated the angle of the first; the sleeping sun had to be pushed to the centre of frame; the chick was too small in the sunrise and the gag; it walked through the sheep in the last shot; the night was murky.
Lead, on the animatic
The story and timing read, and your list of composition fixes is right — do all of it. But the main gap with the styleframes is the look. The felt must be visible: a fuzz halo along the contour glowing in backlight, seams with stitches, hills as stacked felt layers with the corrugated cardboard edge visible in the cut. The night is flat: it needs a deep-blue night with a warm glow from the paper moon and stars. The sun and moon are tiny in the wide shots: bring the mechanics closer so they read.
The composition fixes went into this film. The bigger look notes arrived after the final render had started, so they are being worked into a separate look pass; the film on this page is that first finished cut with the sound and title of v1.1.
8
The render on rented GPUs
Nothing heavy ran on the Mac. The chat brought up its own Runpod pods with RTX 4090 cards (at $0.89 an hour each), checked that WebGPU saw the NVIDIA card, and split the frames between them.
The animatic: 480 frames across three pods.
The final: 1440 × 1080, 192 samples per pixel, on four pods. About 20 seconds of wall time per frame on one 4090, mostly spent packing and uploading the scene's 2.4 million triangles.
After review, frames 0–11 and 158–479 were rendered again on three pods.
Each pod was deleted as soon as its part was done, and every deletion was checked.
9
Review, frame by frame
Before anything reaches Nurbek, a machine pass measures every frame and every audio sample, flags jumps, holds and pops, and gives a reviewer one frame per shot to look at. Then a fresh agent with no context watches the film cold.
The fresh eyes gave the first cut 4 out of 10.
What it found, and what was fixed:
A cut between two shots from the same angle looked like a mistake. It became one continuous shot with a comic push-in.
The gag did not read: the chick was tiny and the release was invisible. Now the release, the clap and the yarn zipping up play in a medium shot, and the chick turns and stares into the lens.
The yarn looked glued to the chick's crest. Now it hangs in profile, holding the yarn in its beak.
The moon passed through the chick. It now lands in front of the moon, and the moon and sun get motion blur.
The yarn crossed the sheep's face. The loop moved round the body.
The opening was static. The nest now trembles before the spring pops.
The second machine pass showed only intended or minor flags. Remaining weak spots are written down: the chick is small in the wide shot at 2–4 s, and the sheep's fleece looks greyish.
10
Clearing it for the main page
Nurbek
Re-check this felt video for IP, completely. It's going on the main page.
The check covered frames, story, names, title, font and music. Three items came up: the title was set in Arial Rounded, a commercial font; the music was a track from a licensed library; and the sheep might be compared to a famous animated sheep.
Nurbek
The music has to change. Just generate similar music.
That's a different sheep. Ours is just an ordinary sheep.
Change the music and the font, and that's it. Quickly.
The sheep stayed. Version 1.1 kept the picture exactly as it was and changed two things:
Music. Four instrumentals generated with Sonilo Music on Higgsfield. The chosen one has its drop landing on the sunrise at 11 seconds by itself; it was fitted to the edit in code, with the stop for the gag kept in place and our own sound effects mixed under it.
Title. GOOD MORNING! is now set in Fredoka, a free font under the SIL Open Font License.
Music prompt, the chosen take
Cheerful cosy indie-pop instrumental for a children's animated short, 106 BPM, major key, warm acoustic guitar and ukulele strums, glockenspiel melody, light claps and snaps, soft kick and bass, sunny morning feeling, gentle quiet intro that builds, then a bright full chorus drop, playful and heartwarming, no vocals
The new version passed the machine check and was delivered 52 minutes after v1.