~/journal/gaw-gaw-and-the-jumping-poops

GAW GAW and the Jumping Poops

Written April 18, 2026, about 7 minutes to read.

The game my 5-year-old designed.

My daughter, like most 5 year olds, likes to play games on her iPad.

There was this long overdue idea in my head: build her a game that’s actually hers, and get some real hours together while doing it. I wouldn’t know much about game development apart from a couple of attempts with Flash when I was 12 at the end of the ’90s. So nothing much that’s transferable into 2026. But you know, we have Claude Code now and all the open-source tooling, the entry bar to game development shouldn’t be that high anymore.

Brainstorming with my kid

I asked my daughter what kind of game she would want to create, and she described something where she is the main character. Like Mario, but she’d draw the enemy characters herself. Then she sketched these on paper:

Enemy sketch by my daughter Second enemy sketch by my daughter
Later on I would need to figure out how to actually represent them in game (p.s. Claude just one shotted them and implemented pixelated version from the above photos)

Creating the main character sprites with ChatGPT

Now we had the enemies. How about the main character?

I snapped a fresh photo of her and asked ChatGPT to give me Chibi-style character sprites for a platform game. It generated them for both me and my daughter, game characters that actually resembled us.

Reference photo Chibi sprite - daughter Chibi sprite - me
Chibi sprite sheet

Not bad ha? The only photo I provided was the one you see above. ChatGPT came back with a few different options and suggested the Chibi-style ones would suit an 8-bit platform game best.

One-shotting the game on a Saturday afternoon

We built the rest in one Saturday afternoon. I sat down with Claude Code and the first version was up and running pretty much within an hour (except uh figuring out how to deploy to her iPad was a little tricky).. Then one iteration after another, each time she played an iteration of the game, she came up with hilarious new features; that there should be little poops going around, that they gotta jump here and there then later they gotta melt down if they come across a puddle, the Minnie Mouse companion for her and the Mickey Mouse for me. The sketches turned into sprite enemies, the Chibi characters got animation frames, and the world filled up with rules she kept inventing as we played.

Character select screen with Halil, Lara, and Karolcia

The rules she came up with

The best part of the project wasn’t the code. It was the lovely little rules she kept inventing, round after round, each time she played the latest version.

  • The poops jump. Brown ground enemies are little cartoon poops. They don’t just patrol, they hop at random intervals. She thought that was funnier.
  • Strawberries shout GAW GAW. Five GAWs every time you get close :) gaw gaw is our internal joke with my daughter. GAW GAW is a scary monster that comes out from both of us sometimes.. She asks me from time to time to imitate the gaw gaw monster.. And I give her the gaw gaw monster, telling ghhhaaw.. ghaaaaw.. slowly at an angry tone. Then she kisses me and gaw gaw monster calms down.
  • Sticks chant KOLA KOLA. Two voices, one low and one high. Not real words. Just a thing a child decided sticks would say, and so sticks say it.
  • Sticks deflate before they die. First stomp flattens them, they keep walking. Deflation is funnier than death, so deflation stays.
  • Water puddles melt enemies. Only on the second encounter. The first one just makes them damp. The second: they stop, shrink, turn blue, and cry “oh my god-tow.” Which is what a kid says when she means “oh my god, ow.”
  • The pterodactyl gets concussed. First stomp doesn’t kill it. The body squashes, one wing droops, three yellow stars orbit its head. A concussion animation on a pterodactyl. Because one-shot kills aren’t dramatic enough.
  • Eight eggs, eight companions. Hatch one and a companion joins your parade. The win screen reads “ALL 8 MICKEYS RESCUED!” or MINNIES or SCOOBYS depending on who you picked. The plurals aren’t strictly correct. Each was typed by hand, with love.
In-game screenshot showing the player, platforms, yellow coins, and a brown poop enemy

Shipping it to her iPad

Important caveat: I was never trying to ship this to the App Store. I just wanted the game on her iPad, running, iterable. Developer mode + USB cable + a bash script. That’s the whole deployment target.

The game is a WKWebView pointing at a bundled game.html. Which sounds simple until you try it from a Linux laptop with no macOS in sight.

The first surprise was canvas taint. WKWebView treats file:// images as cross-origin the moment you draw them to a canvas, and the game’s rendering pipeline crops sprite frames from a sheet using drawImage into a <canvas>. Loading the sheet from an external PNG: black box, silent fail. The fix was to embed every sprite as a base64 data URL directly in game.html. Data URLs are same-origin so the canvas is happy. Yes, the HTML grows to 4.4 MB. Fine.

Then there’s pixel-perfect upscaling. Pixel art gets ugly if you scale by a non-integer factor, so everything has to snap to an integer multiple of devicePixelRatio, recomputed on orientation change. iPad portrait and iPhone landscape each get their own scale factor so the character silhouette stays clean.

Xcode 26 had its own set of joys. ibtool hangs on storyboards (removed them). actool hangs on asset catalogs (patched icons manually). codesign complained about embedded provisioning profiles, which --deep on the sign step fixed. None of this is in Apple’s docs.

The whole flow lives in one deploy.sh: build, sign, install on the USB-connected device. About 15 seconds, my daughter has the new build.

The next step is to drop the cable entirely. Ship the game as a PWA: host the web bundle behind a subdomain, Add to Home Screen once on her iPad, and from then on every new version just lands when she reopens the icon. No Xcode, no cable, no USB trust dialogs. Same pixel art, shipped like a web page.

From iPad to the web

After a few iterations, the iPad flow was solid, but the game was trapped inside it. Besides, I figured much later that it can be there for at most 30 days in developer mode. The freaking game expired after 30 days and would require a new deployment.. Then I figured, why am I not distributing the game from the open web! So I added a second build target, build-web.sh, that produces a web bundle with external WebP sprites. 110 KB of HTML plus three sprite files. About 600 KB total.

Most of the size reduction was the sprite pipeline. optimize_sprites.py crops each 1536x1024 source sheet to its content band, repacks the frames tight, runs pngquant, and exports a lossless WebP. From 2.5 MB per sheet to ~150 KB.

Now the game fits in a blog post. This one, specifically.

Play it

Pick a character, dodge the poops, splash a strawberry, rescue the eight eggs. If the pterodactyl ends up concussed, that’s a feature.

Heads up: embedding shrinks the pixel art and the resize math doesn't love that. For the full 8-bit crispness, open it full screen ↗ and play in landscape.

Chibi Runner character select
TAP TO PLAY

On your phone: tap PLAY, then Share → Add to Home Screen once. After that you launch it like a native app, no browser chrome, full landscape.

It’s also open source: github.com/ibo549/platformer. If you want to fork the game, remove the original characters and add yourself and your kid, you are more than welcome; I would very much like to hear about it so please reach me out if you fork the game!

Next steps

A few ideas kicking around for the next iteration:

  • Characters from a photo, on the fly. Drop in a headshot and get a Chibi-style pixel sprite generated automatically. Same pipeline we did manually with ChatGPT, just baked into the character select screen.
  • Bring your own companion. Upload a photo of a pet, a toy, a stuffed animal, or just type “friendly robot”, and watch it hatch from an egg and follow you around.
  • Two-player mode, over LAN or a share code. Play with a friend on the same WiFi via peer-to-peer WebRTC, or generate a short code like GAW-KOLA that your friend types in to connect from anywhere. Race to the eggs, splash each other with the puddles, compare pterodactyl concussion counts.

Back to the journal