I’m introducing my interpreter VΘXΔM.
That said, I want to be upfront about what this is: a project I built mainly for myself, to see if I could. It competes with nothing and displaces nothing: Frotz, Glulxe, Lectrote, Parchment, Gargoyle, and the rest are the interpreters of record, and I use them too. This was about learning the specifications by enforcing them, one cited section at a time, and seeing how far a from-scratch implementation could honestly get.
The answer turned out to be: farther than I expected.
The machines
- The full Z-Machine: all eight story file versions, including version 6 with its pictures, palettes, and windows, so that Arthur, Shogun, and Zork Zero play illustrated. Held to CZECH’s exact tallies in CI.
- Full Glulx and Glk: glulxercise passes all seventy sections.
- The Å-machine, the VM Dialog compiles to: certified the strongest way I could think of: every test battery the reference implementation ships replays byte-identical to the reference engine’s own transcripts, at the same seed.
The faces
- A painted terminal, a pygame window, a browser tab (
voxam --web story.gblorb– GlkOte served locally, art and sound included), a Tauri desktop app, and a raw stdio GlkOte wire (--glkote) for anything that wants to drive it. - Version 6 plays in the browser, too; the whole screen as one scaled canvas in the art’s own 320x200, palettes baked into the pictures. I’ll call it partially: the core gameplay is there, but some (very rough) edges are still being sanded.
- Stefan Vogt’s arc_image picture band rides along: a conformant z5/z8 with a sidecar Blorb plays with its picture following the story, in the browser and the desktop app alike. I wanted to give Arcturus some love because I’m massively impressed with the project.
The command line, which is where most of the fun lives
- Every session is reproducible:
--seedplus the same commands gives the same session, forever. That’s the foundation on which everything else stands. --recordwrites a play session as an acceptance script: a small grammar that can spell every input a display can produce, mouse clicks as<click x y>and menu keystrokes included; then--acceptreplays it. Forty-four recorded playthroughs replay end-to-end in CI, and their annotations double as a record of where the games’ published walkthroughs go wrong. There are already many acceptance scripts.- VΘXΔM also speaks RegTest, Andrew Plotkin’s regression-test format, twice over:
--regtest my-suite.regtestruns a script through a built-in in-process runner on any platform, and the same file runs under Plotkin’s own reference implementation, drivingvoxam --plainover pipes; CI holds both to the same verdict. A seed on the script’s interpreter line makes the whole suite deterministic under either runner, which isn’t something most interpreters can offer RegTest at all. --shotsphotographs a recorded walk frame by frame at a real display – the pygame window, or your own browser running headless – and--strip-diffcompares two filmstrips pixel by pixel with VΘXΔM’s own PNG decoder. A seeded walk reproduces to the pixel.--babelreports any story’s IFID by the Treaty of Babel’s rules; Infocom games are named from a table of their 246 known releases, and everything that can be named plays under its own title.--decomposereads a Blorb apart chunk by chunk – picture sizes, sound durations, the iFiction record in its own words – and--extractfrees the art, sound, and story as ordinary files that open anywhere.--listingdisassembles a whole story txd-style, and--tracewrites every instruction a session executes as it runs.- And the small period details:
--tandyraises the legendary Tandy bit, and the interpreter platform of §11.1.3 is claimable per run, so the games that check whether they’re on an Amiga can be told they are.
It’s on PyPI (pipx install voxam), with the Tauri version on the GitHub Releases area. The repo’s STATUS file is a ledger of exactly what’s enforced and what isn’t, kept honest by a test suite with 100% statement and branch coverage. While this is at version 2.3.0, that was me marking development milestones while I had a whole bunch of time on my hands. I fully expect there to be bugs still to be ferreted out and, in fact, I’m going to take a break and just play lots of games through the interpreter and see where it breaks!
Maybe next
- Injectable “cheats,” similar to what Bocfel documents.
- Text-to-speech, so sessions can be heard as well as read.
- Automapping, drawn from the session itself as it plays.
- Comparing a running Infocom game against Infocom’s own source; in the neighborhood of the Visible Zorker, though not the same idea: less “watch the source run” and more “hold the session against the ZIL and see where they illuminate each other.”
- Continue building out the Story Probe, which attempts to learn how to play textual interactive fiction, but without AI or an LLM involved, including brute forcing its way to solutions.

