A tiny Game Boy Color ROM where a cat guides you through Japan — one kana at a time.
You wander through five little locations — a train station, a street, a restaurant, a convenience store, and a park — chatting your way through short Japanese scenes and answering kana quizzes to keep going. Miss too many and it's game over. Nail them and watch your score climb.
The whole thing is hand-assembled from TypeScript. No engine, no SDK — just raw opcodes wired into a 32 KB ROM.
| Scene | Name | Vibe |
|---|---|---|
| えき | Station | Arriving somewhere new |
| みち | Street | Wandering around town |
| レストラン | Restaurant | Ordering food (poorly) |
| コンビニ | Convenience store | Late-night snack run |
| こうえん | Park | A quiet ending |
- Title screen → pick a scene
- Read through a short dialogue (in Japanese!)
- Answer kana quiz questions
- Keep your lives — gain your score
- Advance to the next location
Needs Node.js 25+ — older versions (e.g. 18) won't work with the current toolchain.
npm install
npm run buildOut comes build/kananeko.gb — load it in any Game Boy emulator and go.
A symbol file (build/kananeko.sym) is also produced for debugging.
npm test # run all tests
npm run test:coverage # with coverage
npm run lint # lintTests cover ROM structure, dialogue flow, kana gameplay, per-scene progression, and full start-to-finish playthroughs — all driven by serverboy, a headless Game Boy emulator.
src/
asm/ assembler, opcodes, hardware defs
game/ gameplay logic, fonts, dialogue, HUD
scenes/ station, street, restaurant, conbini, park
build.ts ROM entry point
test/ unit, integration, and emulator-driven tests
scripts/ utility scripts
build/ ROM output
- The ROM is assembled entirely from TypeScript — a custom assembler in
src/asmemits raw Game Boy machine code. - Hiragana, katakana, and latin glyphs are all baked into the ROM as tile data.
- Gameplay tests boot the actual ROM in a headless emulator and drive it with simulated joypad input.
- The final ROM is exactly 32 KB — one bank, no mapper.