Built From a Memory
In 1985, a copy of Micro Sistemas magazine arrived with a handful of BASIC games printed inside, nothing sophisticated, the typical text-based programs that circulated among hobbyists at the time. But they were enough to plant something.
Shortly after, a book arrived as a gift, more magazine than book, called Computer Spacegames (The edition I read at the time was the one released in Brazil, translated into Portuguese). One of those games was Space Mines. The player managed a mining operation on a distant planet, running cycles where decisions about workers' pay, entertainment, and conditions directly affected production. Improve salaries and morale climbed; morale climbed and output rose; output rose and word spread, drawing more miners to the colony, which made the next cycle harder to balance. Inevitably, the tipping point came: costs outran revenue, workers left, and the whole operation unravelled. The narrative it created was surprisingly rich for a few dozen lines of BASIC. My brothers and I spent hours there.
Plan9Basic is, at its core, a sentimental rescue. A way of bringing back the language that was the first door into technology, not out of nostalgia for its limitations, but out of respect for the directness it represented.
This project is truly 100% nostalgia and passion. I'm not trying to change the world here, or create a new technology that will be crucial to any area or segment. The purpose here is to remember a time that was full of learning and fun for me and that shaped my professional career. And in doing so, why not have fun during the process?
The goal has always been the same: keep the floor as low as possible while raising the ceiling as high as it can go. More libraries, more platforms, richer tooling, but always with the same principle underneath: the complexity should live in what you build, not in getting started.
A project that grows by addition for long enough stops being one project. Plan9Basic had reached three repositories — the interpreter, the IDE that hosts it, and a runner for shipping applets — with the interpreter pulled into the other two as a submodule. That is tidy on a diagram. In practice a one-line fix to the interpreter took three commits across three places, and forgetting the third produced no error at all: the runner simply kept building the previous version, quietly, for as long as nobody noticed.
So 2026 was the year the project got measured rather than extended. That turned out to be a different kind of work, and most of what it found was not where it was expected to be.
Several language bugs were sitting in plain sight, and in nearly every case the documentation was right and the code was wrong. instr was documented as returning a position and returned a flag — the implementation had computed the position and then thrown it away. Four string predicates took their arguments in the opposite order from the one every page described. A pair of functions that saved text and read it back was not, quite, a round trip. Fixing those meant changing the interpreter to match its own manual, which says something good about the manual and something poor about the tests.
So the tests came next, and the ones that already existed were audited rather than trusted. One had been passing for months while proving nothing. It claimed to show the interpreter needed no graphics framework, by compiling with that framework removed from the search path — except the compiler keeps those files beside the standard library, so nothing was ever removed. It linked 58 of them on every run and reported success. Another kept a list of known problems and never noticed that five of the files on the list had been deleted.
The lesson generalises, and it is not a comfortable one: a check is not evidence until it has been watched failing. Everything added since gets deliberately broken once, first, to see it go red.
The three repositories are one. A single command builds both applications, runs a thousand assertions, and checks that every documented function exists, that every code example on this site compiles, and that every worked result it promises is what the interpreter actually prints. These pages are verified against the language on every run, which is the only honest reason to claim they are accurate.
None of this is visible in a program you write. That is rather the point.