> cd ~/blog/sight-word-quest

Building a PWA for My Daughter

2026-03-15

My daughter came home from kindergarten with a list of Dolch sight words she needed to learn before the end of term. The list had 220 words on it. "The", "and", "a", "to" — words that don't follow phonics rules, that kids just have to memorise through repetition. Her teacher recommended flashcard apps. I looked at three of them and they were either ad-laden, required a subscription, or had UI so cluttered that a six-year-old couldn't navigate them independently. I built one instead.

Why a PWA

The requirements were specific: it had to work offline because our tablet's connectivity is unreliable, it had to be installable on her Android tablet without going through an app store, and it had to run in a browser so I could also open it on my laptop to add word lists. A Progressive Web App hits all three. Service worker for offline, Web App Manifest for installation, standard HTML and JavaScript that works anywhere with a browser. No build toolchain, no framework — just a manifest.json, a sw.js, and a few hundred lines of vanilla JavaScript.

The installation experience on Android is genuinely good now. Chrome prompts "Add to Home Screen" after a couple of visits. From her perspective it's just an app with an icon. She has no idea it's a website.

Gamification for a Six-Year-Old

I spent more time on this than any other part of the project. The research on what motivates young children to repeat tasks is pretty consistent: immediate positive feedback, visible accumulation, and a sense of progression that isn't tied to failure. So: a star for every correct answer (shown immediately, with animation), a streak counter that resets only at the start of a new day rather than on a wrong answer, and word "levels" based on how many times you've answered correctly — not on how few times you've been wrong. Getting something wrong just means you'll see the word again sooner. There's no penalty screen, no red X, no score comparison.

I deliberately avoided a points leaderboard or competitive element. She's six. The goal is to make repetition feel rewarding, not to make her feel ranked.

Parent Dashboard

Progress is stored in localStorage keyed by word. The parent dashboard reads that store and shows which words have been seen, which are mastered (five correct answers without a miss in the last session), and which haven't been touched yet. I can pull it up on my laptop, see where she is in the list, and manually mark words if she's demonstrated them in reading but not in the app. It's deliberately simple — no graphs, no trend lines — because I don't need analytics, I need a quick answer to "how are we doing?"

Building for Someone You Love

I've shipped production software to thousands of users with less anxiety than I felt deploying this to one six-year-old. When you care deeply about the person using something you built, every rough edge feels unacceptable. The tap targets weren't big enough on the first version. The font wasn't readable enough at arm's length on a tablet. The loading animation ran too long and she'd look away. I fixed all of it because watching her use it and frown was unbearable in a way that a bug report never is.

Her review, delivered after about two weeks: "It's pretty good. The stars are nice. Can you make them bigger?" Stars are now bigger. Shipping.

sight-word-quest JavaScript PWA

← back to blog