Writing · Side project

This is fine: I put my face on the dog in the burning room by describing it to AI

A working app on day one, a dog that took all week. The idea, the tech, and exactly how I prompted to get there.

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.

This is fine as a 3D scene: the cartoon dog in a bowler hat sits on a chair with a mug of coffee, flames all around the room, smoke on the ceiling and a speech bubble saying THIS IS FINE. Camera angle buttons and a shutter button sit along the bottom.
The room, the fire, the dog, the coffee. Everything here was designed, modelled, built and deployed by Claude from my descriptions.

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.

The first-visit card: the dog in the burning room at the top, then three lines: add a selfie and become the dog, go live and the dog copies your moves, style it then share a snap, comic or clip. A note says photos stay in your browser.First visit
The same room from the side: the dog on its chair in profile, the table beside it, flames along the walls, showing the scene is fully 3D.Spin it round
A short welcome that says up front your photo never leaves your phone, and the room from an angle the comic never showed you.

02Plan 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 questionMy answerWhat it decided
Your face, or a dog with your face?A blendA slider from human to full dog, so you can be anywhere in between
Real 3D, or a flat comic with depth?Real 3DA proper scene you can orbit, built with three.js
How do we read a face?MediaPipe firstGoogle's face tracking, running in the browser. No server, so no upload
Where do snapshots go?In-browser gallerySaved on your device only
What's it called?this-is-fineThe 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.

1day to a working app
63commits
5days of building
0lines of code I typed
Commits per day: 38 on 30 October, 13 on 31 October, none on 1 November, 8 on 2 November and 4 on 3 November. 3830 OCTthe app, the face, the room 1331 OCTthe dog, rebuilt 01 NOVSunday 82 NOVmoods and sharing 43 NOV2Cap and the bed
Commits per day. Day one built the app; everything after was making it better and making it weirder.
WhatHow much
Day one38 commits: the 3D room, face detection, the cartoon face, photo mode, snapshots, the gallery, and a first dog made of spheres
Code writtenAbout 9,950 lines, plus a 345-line Blender script that builds the dog
Test faces I sent42, in three batches, to tune the cartoon's skin, glasses and beard detection
Improvements in one go18, from a single "do them all"
Secret modes8 on the keyboard, 5 of them with a gesture on phones too
Automated tests59, run on every change

What you can do with it:

A close-up of the dog with a smiling woman's photographic face mapped onto its head, under the bowler hat, with the floppy ears either side.Photo
The same face drawn as a cartoon: big round comic eyes, inked brows, a toothy grin and curly cartoon hair, in the comic's flat colours.Cartoon
The cartoon face slid all the way to dog: the same eyes and grin, but with a black dog nose and a snout pushing forward.Full dog
One face, three ways: the photo, the cartoon drawn from measurements, and the slider pushed to full dog. (The face is NASA's public-domain test portrait.)
Party mode: the room lit by coloured disco spots, a mirror ball hanging from the smoke, a pink DISCO INFERNO neon sign on the wall, and a crowd of colourful original characters dancing around the dog among the flames.
Type "party". The lights drop, a mirror ball comes down, a crowd turns up, and everyone dances while the room burns. Disco inferno.

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.

From a selfie to a shareable picture: your photo, face tracking in a background worker, your face built as a photo or a cartoon, attached to the dog's head, drawn in the 3D room with comic ink, then shared. All of it runs on your phone; nothing is uploaded. 01 · YOUA selfieor a photo,or the camera 02 · MEDIAPIPEThe face478 points, in abackground worker 03 · BUILDERYou, drawnas the photo,or as a cartoon 04 · THE DOGThe headyour face ridesits head bone 05 · THREE.JSThe roomtoon shading,comic ink 06 · SHARESnapphoto, comic,clip or GIF all of this happens on your phone · nothing is uploaded · it even works offline
One selfie's trip into the room. There's no server on the other side of the dashed line.

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.

Left: the usual outline traces only the silhouette, so an arm in front of the body disappears into it. Right: comic ink also draws a line wherever one body part sits in front of another, so the arm reads clearly. THE USUAL OUTLINEsilhouette only COMIC INKevery part that overlaps another the arm vanishes into the tummy the arm, the chin, the tummy
Same shapes. The outline on the left can't tell an arm from a tummy. The ink on the right draws where parts overlap, like a comic artist would.
GLSL · ink the near side of a step between parts
// 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

Three phone screenshots: the room with the camera chips and shutter, the Your face sheet with Take a selfie, Choose a photo and Go live buttons, and party mode with a Party badge and a dancer in a top hat.
Built for phones first: the room, the face sheet, and a party in your pocket.

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.

My own face on the dog, before the fix: harsh bands of pink, purple and green across the skin, dark red blotches on the lips and nostrils, and patches of orange fur showing through the forehead and cheek.
The screenshot I sent. Orange fur showing through (the skull poking out after a change that day), skin crushed into purple and green bands, and a strong pink tint. All three fixed in the next commit.

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.

2Cap mode: two dogs face each other across the table, each wearing two stacked caps, navy and red. The left dog has a short trimmed beard, the right one a long dark beard. A 2CAP PODCAST banner hangs on the wall and the speech bubble says WEST SIDE. THIS IS FINE.
Type "2cap": two caps each, a twin across the table, two beards, a podcast banner and an original chiptune. The bubble updates itself.

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 sawWhat was actually wrongThe fix
The dog's feet were floatingIt was made of separate spheres, and nothing held them togetherRebuilt as one rigged model, in Blender, by script
Live mode didn't see my face on desktopA second face tracker, for video, couldn't start alongside the photo oneOne tracker that switches between photo and video
Orange blotches on my faceThe dog's skull was poking through the face after a change that dayThe skull flattens further back when a face is on
Purple and green patches on skinColours were reduced channel by channel, in a space that crushes shadowsReduce brightness only, and keep each colour's hue
Thin lines streaking off the flamesA sudden drop in the maths at each flame's tipMake the drop smooth
No sound on my phonePhones mute web audio on silent unless it's started in the right wayStart it inside the tap, and play it as media
Two-finger tap did nothingThe second finger landing on the dog reset the firstCount 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

The day-one dog on a phone: a chunky orange figure made of rounded shapes, with a big speech bubble.Day one
The day-five dog on a phone, from the same camera angle: one smooth model with inked inner contours, floppy ears and the mug held in its paw.Day five
Same camera, five days apart. The left one is built from balls. The right one has a skeleton.

Layer 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.

The dog crying: fountains of blue tears arcing out from both eyes, a frown, and one paw raised to wipe an eye.C · cry
The dog angry: its fur flushed red-orange, thick scowling brows, a frown, and puffs of steam rising from its head.G · angry
The dog in love: pink heart-shaped eyes, a wide smile and little red hearts floating around its head.L · love
Bed mode: a wooden bed beside the empty chair, the dog lying with its head on the pillow under a soft blue duvet, Zs floating up and a speech bubble saying THIS IS… ZZZ.B · bed
Four of the eight secrets, each with a key on desktop. On phones: long-press the dog to cry, double-tap to dance, tap its hat for 2Cap, two-finger tap for bed.

The 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.

Open 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.