Ryōri Quest (料理クエスト)
a phone-first game for learning Japanese by cooking

The title screen, sized for a phone held in one hand.
On a wide screen

The title screen. Every menu leads with hiragana, with the romaji and English underneath.
What it involved
- Game Testing
- Playwright plays a whole dish: chapters, unlocking, stars, XP, stamps and the victory screen.
- E2E Automation
- Browser playthroughs run against the built game at phone and desktop sizes and fail on any page error.
- Mobile-first QA
- Every step is checked to fit a 390px-wide phone with no sideways scrolling.
- Access Control
- An invite gate in server middleware with signed cookies; tests cover typed codes, one-tap links and which paths skip it.
- Content Moderation
- Display names are tidied, length-checked and screened by a profanity filter before anyone else sees them.
- Text-to-Speech
- Mochiyuko's lines are Kokoro TTS generated on a local GPU, and a voice actor can replace any line.
- Smoke Testing
- After each deploy, a script checks from outside that APIs refuse visitors and a wrong code is rejected.
- Observability
- Game analytics, players per invite code, and a live strip of who is playing, in an admin report.
About
A cooking game for learning Japanese, played in the browser and installable to a phone's home screen. Menus are in hiragana, and each dish is a run of mini-games hosted by Mochiyuko, who talks you through it, ending in a stamp, stars and XP, with chapters that unlock in order. I built it solo, with AI tools for the code and the art. Mochiyuko's voice is generated locally with Kokoro TTS on my own GPU, and a built-in VoiceDub tool lets a voice actor record over any line from her phone; recordings stay private until an admin publishes them. Accounts and cloud saves run on Supabase, and the whole beta sits behind an invite gate checked on the server.
- JavaScript
- Vite
- Playwright
- Supabase
- WebGL
- Kokoro TTS
- Vercel
- PWA
How it's tested 5 checks
a new player cooks onigiri from start to stamp in a real browser
Playwright plays the built game in Chrome at phone and desktop sizes: chapters and unlocking, a whole dish, stars, XP, the stamp and the victory screen. Mini-games are finished through a test hook that only exists on localhost, and a playthrough fails on any page error or sideways scroll.
the invite gate is checked on the server before any page or API is served
Unit tests cover a typed code, a one-tap invite link, a wrong code, and exactly which paths may skip the gate. After each deploy, a smoke check confirms from outside that APIs refuse visitors without a pass and a wrong code is rejected.
player names are screened before anyone else can see them
Display names are tidied and length-checked, and reserved or unfriendly names are refused through a profanity filter, each with its own unit test.
voice lines can be replaced by a human without a redeploy
Generated lines ship with the game. A recorded line replaces the generated one on every device once an admin publishes it. Tests pin down the permissions: only voice contributors may record, and only admins may publish.
an admin kitchen report shows who is playing and where they get stuck
Analytics events from the game, players per invite code, a live strip of who is playing right now, and each dish's step spread, so a mini-game that loses players shows up as data.