The build story
Iris in the loop.
Iris was nearly twelve when this started. She was curious about what Dad did all day, about those screens of gibberish the rest of the family politely walked past. Scratch and the block-based tools were fun for a while, but she could tell they were not the same thing. The cat moved because you dragged a block, not because you had typed words and the computer had read them.
Irenaverse is the bridge I built for her: a browser-based coding playground with its own language, Irene. It is the smallest language that can express the games a twelve-year-old wants to build without lying about how real code works. It sits between Scratch (too magical) and real tooling (too punishing: semicolons, stack traces, blank pages).
A language where the game loop is grammar
Most learn-to-code tools bolt the game loop on as a library. In Irene,
on tick:,
on key_down "space": and
on collide hero, barrels:
are part of the language itself, so a beginner writes a real moving game in three lines
without ever hearing the word “callback”. This is lesson three of
thirty-eight, and it is running here. Change the 5.
Lesson 3 · Move the dog
dog = sprite("dog", 100, 100)
on tick:
dog.x = dog.x +
Sixty ticks a second, the number added each time. A bigger number is a faster dog. A minus sign sends it the other way.
Change the 5 and the dog runs faster. Change
x
to
y
and it falls. That loop, type words and the computer obeys, is the entire point. Even the
error messages were written for her: no SyntaxError, no stack traces. Irene says
things like “I expected a number here, but I got the word
dog. Did you forget quotes?”
Safe by construction
Irene compiles to nothing and ships nowhere. It is a lexer, parser and tree-walking
interpreter, about 4,800 lines of TypeScript, running in a Web Worker in the kid’s
own browser at 60 Hz. The server never executes a line of user code. A step cap per
tick means the classic first crime,
while true:,
trips a friendly error instead of freezing the editor.
Grown-ups sign up in the open. Children never do: a kid account exists only because an adult issued the invite, which keeps the consent where the law wants it. A published game is visible two invites deep and no further, so a friend of a friend can play it and a stranger cannot. Comments pass through an AI safety check with one hard rule: if the check is down, a kid’s comment is never silently eaten. It posts flagged for review instead. Never silence a kid because of infra.
The month the curriculum ran out
By late July she had finished 37 of the 38 lessons, and her own usage data said something uncomfortable.
- lessons finished
- 37 of 38 lessons finished
- lines changed, median
- 4 lines changed, median
- lessons changed 2 lines or fewer
- 12 lessons changed 2 lines or fewer
- started from a blank file
- 0 started from a blank file
The starters already contained the answer. She was riding the conveyor correctly, which made it my bug, not hers. Three things came out of that. Quests: a goal, a handful of checkpoints and an empty file, with nothing to tweak because there is nothing there. Checks that look for her work, not just the right words: the idea has to turn up on a line she wrote. And an escape hatch, because a line-diff heuristic is only a heuristic, so three refusals in a row let her through anyway, and I count how often that fires.
Ren, and the twelve-line rule
Ren is the coding buddy, and Ren is meant to hint rather than hand over the program. Until July that rule lived only in Ren’s instructions. On the 25th the kid escalated to capital letters, asked for something to copy and paste, and Ren wrote out two complete programs. The rule is now a filter over the streaming reply: past twelve lines inside a code fence it closes the block, past two blocks it stops sending. Ren also says the cap exists up front, instead of promising a file that will not arrive. It is the guardrail I should have built first.
Making it pay for itself
It opened to strangers on 11 June: seven days free with no card, then NZ$5 a month for a whole family. One plan, no tiers, no card up front, because conversion through friction is a trick and the product should have to earn the subscription.
The tutoring budget is a token wallet the whole household shares, and its size came from thirty days of production data rather than a guess: one engaged kid burns about a million tokens a month, so the wallet holds two million. A family that empties a full one costs about NZ$6.50 to serve against NZ$5 of revenue. I know that number and I chose it, because a household metered halfway through the month has been sold something worse than nothing. Entitlement and credit are asked separately, so a subscriber who has spent the month is told to top up rather than told to subscribe, and a canary emails me if a day’s model spend crosses its ceiling.
Docs first, then twenty days
The first commit was documentation: what it is, who it is for, the language spec, the architecture, a phased roadmap, all written before any code. Then the phases landed fast: language and editor, lessons and accounts, Ren, sharing and remixing. First commit on 22 May, open to paying strangers on 11 June. Twenty days of evenings.
And the name on the tin is real. The roadmap’s test for every feature is whether Iris or a real friend would use it. Playtesting her games surfaced physics bugs that were fixed the same week, and the character sprites shipped at 100 pixels until kid feedback shrank them to 70. She is not a persona in a product doc. She is the user, and the loop is short: she plays it at the kitchen table, and the fixes ship before bedtime.
Got a domain that needs its own playground, or its own language? Here’s how we could work together.