Shipping · 2 min read · 19 October 2026

Ketikaria: a typing game for kids who can't read yet

A browser typing game for ages 4 to 10, including children who can't read. Every instruction has a voice, every key is a big target, and there's no way to fail.

Small cartoon hands pressing oversized rounded keys with shapes, next to a speech bubble with a sound wave
4–10
ages it's designed for
56 px
minimum size of every tap target
0
audio files: music and sound are synthesised

01 · What it is

A typing game for children, working name Ketikaria.

It's for ages 4 to 10, including kids who can't read yet. The tagline is "Tekan. Dengar. Tumbuh.": press, listen, grow. A small character called Lumi guides them.

02 · Designing for pre-readers

If a child can't read the instruction, the instruction has to speak.

  • every control has an icon, a label and an audio demo
  • tap targets and buttons are at least 56 px
  • speech waits 1.2 seconds, so a slow child isn't talked over
  • no alarms, no "Gagal", no accuracy percentage, no confetti
  • modes aren't locked by age

Progress is a small garden: five seeds grow a plant.

03 · Sound without audio files

There isn't a single audio file in the game.

Narration uses the device's Indonesian voices through speechSynthesis. Music and sound effects are synthesised with Web Audio oscillators, turned down while narration plays and stopped when the tab is hidden. It also respects reduced motion.

const ctx = new AudioContext();
const osc = ctx.createOscillator();
const gain = ctx.createGain();
osc.frequency.value = 523.25; // C5
gain.gain.setValueAtTime(0.2, ctx.currentTime);
gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.3);
osc.connect(gain).connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 0.3);

04 · A small stack

React 19, TypeScript, Vite and plain CSS.

The content is a JSON catalogue (56 items in the current draft), progress lives in localStorage, and Playwright checks the flows. No backend, nothing to log in to.

05 · The deploy gotcha

It ships to Cloudflare Pages with Direct Upload.

Two things I learned there: without --force, Wrangler can create a Workers project instead of a Pages one, and a Direct Upload project can't be switched to Git integration later. Pick the deploy model before the first upload.

npx wrangler pages deploy dist --project-name ketikaria --force

06 · Not done yet

It isn't ready for a pilot.

Still missing: a voice pack with two characters, narrated onboarding, and testing with real children on real devices. That's the next milestone, not a launch.

Next storyDoes AGENTS.md change what a coding agent builds?