I turned the most famous comic on the internet into a 3D room you can put your own face into, in five days, by describing it. The app worked on day one. The dog took all week.
01The idea
You know the comic. A dog in a bowler hat sits in a room that's on fire, sips his coffee and says "This is fine." KC Green drew it in 2013 and it has described most weeks of most people's lives since.
I wanted to step inside it: the actual room, in 3D, that you can walk the camera around. And I wanted to be the dog. Upload a selfie, and it's your face sipping coffee while everything burns.
My first message set the brief and asked for a plan before anything got built:
Keep the stylised comic but enable the use to pan and zoom and rotate (with proper camera angles) … button that allows the user to pause the animation and … take a snapshot, and copy to their clipboard or save to their local storage. Help me plan this out before you begin
This is fine is the result. Add a selfie and become the dog, as a photo or as a cartoon. Spin the camera round. Snap it, make a two-panel comic, record a clip. And if you know where to look, throw a disco in the inferno.
First visit
Spin it round02Plan before you draw
Last time I checked the data before designing anything. This time there was no data to check, but there were decisions, and they'd shape everything after. So before writing a line, Claude came back with a plan and five questions.
I answered all five in one breath:
1 let's try a blend 2 real 3d 3 media pipe first and option to add later 4 also in browser gallery 5 this-is-fine. Also make this mobile first so the user can also take a photo with their front facing camera or add from their photo gallery
| The question | My answer | What it decided |
|---|---|---|
| Your face, or a dog with your face? | A blend | A slider from human to full dog, so you can be anywhere in between |
| Real 3D, or a flat comic with depth? | Real 3D | A proper scene you can orbit, built with three.js |
| How do we read a face? | MediaPipe first | Google's face tracking, running in the browser. No server, so no upload |
| Where do snapshots go? | In-browser gallery | Saved on your device only |
| What's it called? | this-is-fine | The repo, the URL, the lot |
Then, before a single screen existed, a design note that changed the whole product:
Think about how the photo upload can be stylised so instead of mapping it as a photo it might be better to be a 3d model stylised like the dog
A photo pasted onto a cartoon dog looks like a photo pasted onto a cartoon dog. So the app measures your face instead and draws it in the comic's style: your face shape, your skin tone, your hair, your glasses, your beard. I asked to keep the photo as an option too. People want to see themselves first, so photo is now the default and cartoon is one tap away.
03What got built
The first day was the product. The rest of the week was the dog, the polish and a lot of secrets.
| What | How much |
|---|---|
| Day one | 38 commits: the 3D room, face detection, the cartoon face, photo mode, snapshots, the gallery, and a first dog made of spheres |
| Code written | About 9,950 lines, plus a 345-line Blender script that builds the dog |
| Test faces I sent | 42, in three batches, to tune the cartoon's skin, glasses and beard detection |
| Improvements in one go | 18, from a single "do them all" |
| Secret modes | 8 on the keyboard, 5 of them with a gesture on phones too |
| Automated tests | 59, run on every change |
What you can do with it:
- Become the dog. Take a selfie or pick a photo. Choose photo or cartoon, then slide from human to full dog and watch a snout grow out of your face.
- Go live. Turn on the front camera and the dog copies your head, your blinks and your mouth. Smile and it falls in love. Frown and it cries.
- Direct the scene. Panel 1, Panel 2, front, side and above, or drag to orbit and pinch to zoom. The fire grows the longer you watch.
- Share it. A snapshot, a two-panel comic like the original strip, an 8-second clip with sound, or a looping GIF, in screen shape or 9:16 for Stories.
- Find the secrets. Type
partyfor a disco inferno. Then there are moods: cry, dance, sleep, angry, love. Type2capfor a podcast. Press B for bed.
Photo
Cartoon
Full dog
04How it works
If you're a designer, read the plain-English bit of each step and skip the code. If you build things, the code is there for you.
1. Your face never leaves your phone
Face tracking is Google's MediaPipe, which finds 478 points on a face plus expressions like a smile or a blink. It runs in your browser, in a background worker so the page doesn't freeze, and its model files are served from my own site. There is no upload, because there is nowhere to upload to.
That made the privacy note in the welcome card an easy promise to keep: your photo stays in your browser. It also means the whole thing works with no signal at all once you've visited.
2. Measured, not pasted
The cartoon face is drawn from measurements. The app lines your face up, compares it with an average face and exaggerates the differences, the way a caricaturist does. Then it samples your skin and hair colour, nudges them into the comic's palette, and checks for glasses, sunglasses and a beard.
I sent 42 test faces to tune it. The first batch found real bugs: a beard spotted on a clean-shaven face because of a shadow, glasses missed on thin frames. Beard detection now looks for texture rather than darkness. You only find those with real faces.
3. A dog built by a script
The dog isn't drawn in a 3D app by hand. It's built by a Python script that drives Blender: spheres and capsules for each part, fused into smooth shapes, given a skeleton, and exported as a 220 KB file. Change a number, run the script, get a new dog. More on why in section 07.
4. Comic ink
Comics have outlines, and not just around the edge. Where an arm crosses a tummy, there's a line. The usual 3D trick for outlines only draws the silhouette, so the dog read as one orange blob.
So every frame is drawn twice. The second time, invisibly, each body part gets its own colour: arm, paw, tummy, leg. Wherever two different colours meet with a jump in depth, the app inks a line on the nearer one.
// look either side of each pixel: a different part that's further away means an edge
float jump = thereDepth - here.y - slope;
if (there.x != here.x && jump > 0.03) hits += 1.0;
5. Every sound is made up on the spot
There isn't a single audio file in the app. The fire's crackle, the disco loop, the sobbing, the snoring, the 2Cap chiptune: all of it is synthesised in the browser as it plays, from oscillators and noise. It costs nothing to download, and everything plays through one engine, so a clip records exactly what you hear.
6. Everything else
- The site: Vite, React and three.js, on Vercel, served at theluckystrike.co.uk/this-is-fine through the same rewrite as my other side projects.
- Offline: a service worker keeps every file, including the face models, so it works on a plane.
- Sharing: clips record the canvas and the sound together; GIFs are encoded in the browser; Story mode crops to 9:16 and follows the dog.
- Security: I asked for a check halfway through. It found nothing serious and tightened what the page is allowed to load.
- A launch video: 20 seconds, captured frame by frame from the real app, with a soundtrack Claude wrote in code.
05How I prompted
As before, these are my real messages, typos and all. Most were typed on my phone. None of them is clever. They read like notes to a designer sitting next to me.
Answer the questions in one line
You saw it in section 02: five questions, five answers, one message. When Claude asks good questions, the fastest thing you can do is answer them plainly and get out of the way.
Ask for a list, then say "do them all"
What other improvements can be made
Do them all
18 can be Vercel analytics
Eighteen improvements, from a smoother face pipeline to offline support, in three messages. The third one was me editing a single item on the list. I did it again later with "Do 3 through to 17".
Describe what you see
The drinking motion is still off, he drinks and the cup disappears to his ear
also the flames have flat line artifacts at the top
No diagnosis, just the symptom. The cup was going to his ear because the arm was posed by angles rather than aimed at his mouth; now it reaches for the mouth like a real arm. The flame lines were a maths cliff at the tip of each flame. I didn't need to know either of those things. I only needed to notice.
Ask why, not for a fix
Im wondering why my face does not work well
With a screenshot of my own face, blotchy and purple. There were three causes, one of them a bug introduced that same day. Asking "why" got all three. Asking "make it better" might have got one.
Change your mind out loud
When doing the face tracking mode, it's probably better to track the face only and not transfer the face onto the dog. That keeps it simpler too
Live mode originally put your live face on the dog. It was clever, and it was busy. Now the dog's own face copies yours. Simpler, and funnier.
Make it feel right for the person
All of it but first when the user takes a photo or selfie for the face it is replacement, default to the face being human not dog, so that they feel the effect
Default to photo too when the use adds a selfie or photo
Two small defaults, the biggest change to how the app feels. The first thing you see should be you.
Typos are fine
Do it in
Phong check seems fine
"Do it in" meant "do it". "Phong check" meant "phone check". Both understood, both done.
Hear "no" when it's right
Need a hot key that is when the user types “2Cap” it replaces the beanie and adds to 2 caps to the dog. The music / background sounds changes to a chiptune rendition of 2Pac’s California Love
Claude built the two caps and said no to the song. A chiptune cover is still a copy of someone else's music, and this is a public site. Instead it wrote an original West Coast-style chiptune for the mode. Same vibe, nobody's song. That was the right call, and I didn't have to think of it.
Ask for a security check
It’s probably a good thing to do a security check on this repo
Nothing serious turned up, which is the best answer. It still tightened the rules about what the page may load, I checked them on a preview on my phone first, and now the tests fail if anything ever breaks them. Ten minutes, and I sleep better.
06What broke
The usual suspects, and a few new ones. None needed me to understand the cause, only to notice it.
| What I saw | What was actually wrong | The fix |
|---|---|---|
| The dog's feet were floating | It was made of separate spheres, and nothing held them together | Rebuilt as one rigged model, in Blender, by script |
| Live mode didn't see my face on desktop | A second face tracker, for video, couldn't start alongside the photo one | One tracker that switches between photo and video |
| Orange blotches on my face | The dog's skull was poking through the face after a change that day | The skull flattens further back when a face is on |
| Purple and green patches on skin | Colours were reduced channel by channel, in a space that crushes shadows | Reduce brightness only, and keep each colour's hue |
| Thin lines streaking off the flames | A sudden drop in the maths at each flame's tip | Make the drop smooth |
| No sound on my phone | Phones mute web audio on silent unless it's started in the right way | Start it inside the tap, and play it as media |
| Two-finger tap did nothing | The second finger landing on the dog reset the first | Count it as the second finger |
07Teaching a robot to draw a dog
Faces, cameras and sharing were quick. The dog took the whole week, one layer at a time.
Layer 1: a dog made of balls
Day one's dog was spheres and capsules arranged in the right places. From the front it passed. From the side it fell apart.
the dog needs improvements too, the render means the feet are detached. what can you do to improve it
Day one
Day fiveLayer 2: a 3D artist that's actually a script
Claude offered three options. The best one needed a proper 3D model with a skeleton, which normally means a 3D artist. I asked the obvious question:
C, but cant you do that?
It could. It installed Blender as a Python library and wrote a script that builds the dog part by part, fuses each part into one smooth surface, gives it bones, and decides how much each bone moves each bit of fur. The app then poses those bones live: breathing, sipping, wagging, dancing.
Layer 3: the outline only knew the edge
hmm, whilst renders better, the outline is failing because it only exists around the edge of the dog so cannot tell where the arms and legs and rest of the body are when viewing and it animates..
That message led to the comic ink in section 04. It's my favourite kind of feedback to give: what I expected, what I saw, and why it mattered. Then a few rounds of "I feel like the dog outline on limbs and feet and hands can still be improved" until the paws read properly.
Layer 4: the cup and the ear
The sip was posed by rotating the shoulder and elbow by set amounts. Set amounts don't know where a mouth is, so the cup kept ending up at his ear. The fix was the way robot arms and game characters do it: say where the hand should go and work backwards to the elbow. Now the cup always meets the mouth.
Layer 5: the head joins the body
The head was a separate ball sitting on the neck, because the face swap needed to replace it. That left a seam under the chin. I'd asked how much work it would be to fix early on, and parked it with "wait for now". After testing on a real phone, I came back with "let's do it now". The skull, snout and ears went into the model, the face now rides the head bone, and the ears swing a little behind every head turn.
Layer 6: and then it got silly
Once the dog could move properly, it could do anything. Cry, with tears that arc to the floor and pool into puddles. Get angry and turn red. Fall in love. Fall asleep. Climb into bed.
C · cry
G · angry
L · love
B · bedThe last thing I asked for was the duvet: "it’s blocky and looks off". It was a rounded box. Now it's a soft surface draped over the dog, with lumps where its knees are, a sheet folded back at the chin, and fabric hanging over the sides. A week earlier the dog's feet were floating. Now we're arguing about bedding.
08What I took from it
The Listening Room taught me that taste is the bottleneck. Sample Explorer taught me the first evening is the easy bit. This one added a few more.
Decide before you draw. Five questions answered on day one shaped everything that came after. "A blend" became a slider. "MediaPipe first" became a privacy promise.
The character is the product. The face tech is clever, but people react to the dog. Most of the week went on how he sits, sips and reads. That was the right place to spend it.
Defaults are design. Starting new faces as human, and as the photo, changed how the app feels more than any feature did.
Let it say no. The best call in the project was Claude turning down a cover of someone else's song and writing an original instead.
Your best prompt might be a symptom. "The cup disappears to his ear." "Flat line artifacts at the top." "My face does not work well." I said what I saw. That was always enough.
Go and put your face on the dog. Slide it to full dog. Type party. If you end up sipping coffee in a burning room with a crowd of strangers dancing round you, it's working. This is fine.
Built with Claude Code, after KC Green's comic. Face tracking by Google MediaPipe; every sound synthesised in the browser. Read the companion pieces, The Listening Room and Sample Explorer.