A tiny web app where a young child can make their own games — not just play them.
Built for my five-year-old daughter. The plan was to find her a toy that lets kids build games, but everything felt either too grown-up (Scratch needs reading), too restricted (kid game makers that only let you change colours), or too "watch this video and tap when prompted" (most app-store creativity apps).
So I sat down with her, asked what she'd want, and we made it together. She picks a template or starts blank, drops in a few stickers — or draws her own with a finger — gives each one a "power" (move, bounce, follow my finger, jump, score on tap, win on touch…), and hits ▶. The thing she just made plays as a real game.
The whole thing is designed around what a 5-year-old can actually do, not what an adult thinks a 5-year-old should be able to do.
- 🧩 Maze — a mouse chasing some cheese through corridors. Arrow keys / on-screen pad.
- 🦘 Jump & run — a frog jumps across platforms toward a trophy, dodging a wandering bug. Tap-or-hold to jump variable heights.
- 🐠 Aquarium — a peaceful sandbox seeded with hand-drawn fish, a crab, a starfish, seaweed, and bubbles. No goal, no timer — just a living scene she can keep adding to.
- 🐹 Whack-a-mole — eleven hamsters bounce around the grass; tap them before the timer runs out.
- 🎨 Blank — start with nothing.
- Drop stickers — ~280 emoji organised like a phone keyboard (Animals / Food / Faces / Nature / Things / Symbols, plus a Recent tab seeded with kid favourites). Tap or drag onto the stage.
- Draw her own — a finger-painting pad with bright colours and three brush sizes; the result becomes a sticker she can place and animate, exactly like a stock one.
- Give things "powers" — icon-tile menu: move (left/right/up/down/follow finger/wander), bounce, spin, falls (gravity), arrow-key control, run-and-jump (platformer), tap reactions (sound / vanish / grow / shrink / score), and collision rules (touch → score / win / lose / vanish / sound / block).
- Pick a goal — score-to-win (3 / 5 / 10 / 20) and a timer (30 s / 1 m / 2 m / 5 m).
- Pick a background — sky / grass / sea / space.
- Resize, copy, delete any sticker with one tap.
- Rename the game by tapping its name.
Full-screen Phaser scene. On-screen d-pad and jump button if her game uses arrow controls. Score and timer in the HUD. Win / lose card at the end. Restart in one tap.
- Icons + short words, never text input (except the one optional "rename" field for parents).
- Big tap targets (≥ 56 px) sized for a child's finger.
- Audio "pop" on every press — covers her not reading every label.
- No destructive action without a friendly confirm ("Throw away? 🗑️ / Keep ❤️").
- Auto-save on every edit — she never has to remember to save.
- Auto-named games ("Maze 1", "My game 3") so she never has to type.
- Touch first, mouse-friendly.
- Apple emoji on Apple devices, Noto Color Emoji elsewhere — so the stickers and UI look the same across phones and laptops.
- Maze — "things can stop me; goals are reachable through paths."
- Jump & run — "gravity, jumping, dodging enemies."
- Aquarium — "I can make a world for things to live in." Also the sneakiest one: the starter creatures are obviously hand-drawn, so the kid sees that her drawings belong here too.
- Whack-a-mole — "score within a time limit."
- Blank — "now do whatever you want."
npm install
npm run devOpen http://localhost:5173.
npm run buildOutput in dist/. Static files, no server needed.
Two routes already wired:
- Cloudflare Pages — connect the GitHub repo, framework preset Vite, build command
npm run build, outputdist. That's it. - GitHub Pages —
.github/workflows/deploy.ymlauto-deploys on push tomain. Enable Pages in repo settings → Source: GitHub Actions. The workflow setsVITE_BASE=/GameBuilder/so assets resolve under/<repo>/.
React + TypeScript + Vite + Phaser 3 (arcade physics). Zustand for editor state. IndexedDB (via idb-keyval) for local saves. Stock stickers are inline-SVG <text> data URLs; the seeded aquarium creatures are hand-authored multi-colour SVGs. Sound effects are tiny WebAudio blips — no audio files to download.
The data model is one self-contained JSON GameProject per game (assets embedded as data URLs, no external files), which is also why future "share a game with grandma" can be a URL or a single file with no backend needed.
Personal project, kid-driven roadmap. Built in evenings by following her around with "what's missing?". Adding things she asks for; pruning things she doesn't touch.