fantasy.grn.dk is コトバモン KotobaMon — a 3D monster-catching game that runs in an ordinary browser tab, where every monster is a Japanese word. ヒバナ hibana is a spark, コダマ kodama is a tree spirit, and catching one is how the word gets learned. It has a procedurally generated island with five biomes, twelve species, turn-based battles with a type chart, and full Japanese voice-over subtitled in Japanese, romaji and English at the same time. There is no download, no account, no build step and no backend: the whole game is 2,821 lines of vanilla JavaScript plus a vendored copy of Three.js, served as static files.
- Client
- GrN.dk — internal build
- Sector
- Browser games and language learning
- Period
- July 2026
At a glance
The challenge
The teaching problem came first. A vocabulary app is easy to build and easy to abandon; a game gets played. But most “learn a language” games bolt the learning on at the side — a quiz screen between levels, skippable, worth nothing. If answering correctly does not change what happens next in the game, it is decoration, and players learn to skip it.
Then the delivery constraints, which are the more interesting half for anyone commissioning software. A build like this only makes sense if it is quick to produce and effectively free to keep alive: no licensed artwork to buy, store and keep in sync; no per-character bill from a cloud voice API; no server process to patch at three in the morning; and no build toolchain that quietly stops working in two years and takes the project down with it. The monsters also had to be one hundred per cent original — this is a genre with famously well-defended trademarks.
And the audience it is actually for cannot read Japanese yet, which rules out showing only kana and equally rules out showing only English.
The solution
The game. You roam a procedurally generated island in third person — keyboard on a desktop, an on-screen joystick and A button on a phone. Five biomes (meadow, forest, lake, volcano, snowy peak) each hold their own species at their own level range. Walk into a wild monster and a turn-based battle starts, with eight elements and a type chart deciding what lands hard and what fizzles. Weaken it, throw a Kotodama Orb, and it joins the party. Six missions and a twelve-entry KotobaDex give the roaming a shape, including one deliberately elusive species — the moon rabbit ツキウサ, at a 15% base catch rate against a starter's 40%.
Learning is a move, not a screen. The vocabulary quiz is one of the actions available on the battle menu, once per fight. Get the word right and the catch chance goes up by a flat 0.25 — for scale, wearing a monster's health all the way down is worth 0.55, so a correct answer is worth about the same as taking 45% of its HP off, and it pays 25 points on top. Answering well is a genuine alternative to fighting well, which is the only way to make a learning mechanic matter. The bank is 36 words — the twelve monster names plus everyday vocabulary — asked in both directions, Japanese to English and back.
Three subtitles at once. Every spoken line shows the Japanese, the romaji reading and the English meaning simultaneously. A learner can hear the line, look at the kana, check how it is pronounced and confirm what it means without leaving the screen — the scaffolding that makes the game usable by a genuine beginner rather than only by someone who already reads Japanese.
Voice with no API bill. The 31 Japanese voice lines were generated once by a self-hosted Kokoro text-to-speech model running on the same server — a female voice for Professor Sakura, a male one for the narration — and written out as static MP3s alongside a generated manifest carrying all three subtitle rows per line. Nothing is billed per use, no text leaves the box, and there is no runtime dependency that can rate-limit or disappear. The music is generated too: the background tracks are a WebAudio step sequencer with separate roam and battle moods, so beyond the voice-over there are no audio files at all.
No build step, on purpose. Three.js 0.178 is vendored into the project and the rest is vanilla JavaScript using native ES modules — ten files, 2,821 lines. No bundler, no transpiler, no CI step to keep green: the files that are written are the files that ship, and they will still run years from now without a toolchain to resurrect. The visuals are procedural in the same spirit — terrain, monsters and trainer are all assembled from primitives in code rather than modelled in an external tool, so there are no art files to license or keep in sync. The only third-party thing loaded at runtime is the Japanese display webfont.
Cache discipline as a feature. Deploying is a file copy and a cache purge, but a CDN caches by file extension, so a half-purged deploy once served a stale module while a direct fetch of the same URL showed fresh bytes. The rule now is that every relative import and the stylesheet carry the same version query, bumped on every deploy and never reused. The version badge in the corner of the screen is derived at runtime from the loaded module's own version query — so a stale badge means a stale deploy, by design, and the game reports its own cache bugs.
Testable from the outside. An automated browser evaluates its scripts in an isolated JavaScript world where the page's own globals are invisible, but the DOM is shared. So the game exposes a small #e2e element: one attribute publishes the live game state as JSON, another accepts commands. That is what lets an unattended agent start a new game, skip the voiced intro, pick a starter, walk into a monster and check the result — the screenshot on this page was captured through that bridge.
The results
KotobaMon has been live at fantasy.grn.dk since 18 July 2026, on its own domain and certificate from the first day, and is currently at build v10.
It is also a worked example of the delivery model the rest of this portfolio describes. The whole game came off a Trello board one card at a time, each picked up by an AI agent: “Create a 3D pokemon game” was a single card, and over the following two days it was joined by cards for the music, the battle effects, a Water Gun move with mid-battle monster switching and a controls fix, further switching work, and a visible version number. Days, not weeks — and every one of those changes is traceable to the card that asked for it.
The running cost is the point. Static files behind a CDN: no database, no application server, no per-use voice bill and no secret to rotate. Progress is saved in the player's own browser, so there is no account to create and nothing about the player stored anywhere.
What it is not, it says out loud. It teaches vocabulary, not grammar; there are twelve species and one island; saves do not follow you between devices; and the procedural art is plain by choice, because plain art that ships beats commissioned art that does not. The longer write-up on the build decisions is here: Shipping a 3D browser game with no build step and self-hosted voice.
Learn their names, and you'll be learning Japanese too!