Skip to main content

VΘXΔM

A Specification-Accurate Z-Machine and Glulx Implementation
Early and Late Infocom + Modern Inform
(+ Dialog w/ Å-machine + Arcturus)

Built with Python Voxam is released under the MIT license.

Works On
Windows        macOS        Linux

PyPI package latest release Supported Python versions Coverage: 100% branch, enforced in CI

CI status Conventional Commits: 1.0.0

Open with vscode

Contributions welcome

If you find any of this useful, consider leaving a ⭐️ for the repo.

What does Voxam mean?


An interpreter for the Z-Machine, for Glulx, and for the Å-machine, written in Python.

Three virtual machines, spanning the whole history of interactive fiction:

  • The Z-Machine is the virtual machine Infocom designed in 1979 to run its text adventures, and which the community has used ever since. This is the home of everything from Zork to the modern Inform and PunyInform games. This is also the target of Arcturus, a modern programming language and compiler designed for writing interactive fiction that compiles down to efficient Infocom Z-Machine story files.
  • Glulx is the Z-Machine's successor, built to shed the size limits of the Z-Machine, and the target of today's Inform.
  • The Å-machine is a specialized virtual machine created by Linus Åkesson to run interactive fiction written in his Dialog programming language, and which is now community maintained.

Voxam reads a compiled story file and executes it, with two guiding commitments:

  • Fidelity to the specifications: the Z-Machine Standard, the Glulx and Glk specifications, and the Å-machine, with every rule the interpreter enforces citing the section it came from.
  • Reproducibility, so that a recorded play session replays identically, forever.

Voxam is developed against real games. The Zork trilogy, Trinity, A Mind Forever Voyaging, The Hitchhiker's Guide to the Galaxy, and -- filed in triplicate, blood pressure rising -- Bureaucracy have all been played to winning conclusions, several to perfect scores. Arthur draws the sword from the stone in what is, as far as I know, the first seeded, replayable Arthur session anywhere; The Lurking Horror and Sherlock reach perfect scores with their sounds heard aloud; Arthur, Shogun, and Zork Zero render their art in a real graphics window; and even Journey -- Infocom's finale, a game with no command line at all -- replays through its opening chapter as pure keystrokes. Forty-five recordings verify those sessions end-to-end, their annotations doubling as an archaeology of where the games' published walkthroughs go wrong. Glulx joins them: Adventure answers at the terminal, and glulxercise says "All tests passed." The Å-machine arrives certified harder still: every test battery its reference implementation ships replays under Voxam byte-identical to the reference engine's own transcripts. Miss Gosling's Last Case walked three hundred fifty-one commands to its finale.

The full ledger -- the current release, what plays, what's certified, and what remains -- lives in STATUS.md; the road here, told era by era, is HISTORY.md; the thinking underneath it all, principles and vocabulary alike, is DESIGN.md; and the setup for working on Voxam itself is CONTRIBUTING.md.

How to Play

One command, several faces: every one of them speaks all three machines, and a story file is all any of them needs:

  • At the terminal. voxam story.z5 runs with the screen extra installed, the painted display takes over: status line, windows, menus, real time. --plain keeps the classic text stream.
  • In a window. voxam --graphics story.ulx shows a pygame window: the illustrated home of the Version 6 games, Glulx's canvases and mouse, and a fine roomy home for everything else.
  • In a browser. voxam --web story.gblorb is a GlkOte tab on your own machine, in your system's own light or whichever you pick, art and covers inlined, saves written beside the story.
  • As a desktop app. Grab the Voxam installer for your platform from the latest release (Windows, macOS, Linux; unsigned, so expect the usual first-run nudges). The shell drives the voxam command, so install that first: pipx install voxam or uv tool install voxam puts it on the PATH.
  • On a wire. voxam --glkote story.z8 runs the whole session as JSON stanzas on stdin and stdout, the seam any GlkOte-speaking host drives down a pipe.

Installation of the app itself is one line (see Installation), and the flags' full stories live in PLAYING.md.

Installation

Voxam requires Python 3.12 or later, and it's an application rather than a library, so it installs like one: in its own environment, with only the voxam command placed on your PATH. Nothing lands in your system Python.

pipx install voxam

If your Python is uv managed:

uv tool install voxam

Either way the story files, the saves, and the transcripts are ordinary files in ordinary places, and uninstalling takes the whole thing back out again.

To try it without installing anything at all, uvx fetches the package to its cache, runs it, and leaves your PATH untouched:

uvx voxam story.z5

The extras, and what they cost

Voxam's core has no dependencies whatsoever. The interpreter, the story formats and the wire are standard-library Python: it decodes its own PNGs, writes its own savefiles, and serves its own pages. So an install of Voxam alone brings in Voxam alone.

Three optional extras buy presentation, never correctness: screen for the painted terminal, graphics for the pygame window, and sound for sampled audio. They do have dependencies of their own -- blessed, pygame-ce, sounddevice -- and under either installer above those land in Voxam's own environment beside it, still nowhere near your system Python:

pipx install "voxam[screen,graphics,sound]"
uv tool install "voxam[screen,graphics,sound]"

uvx needs the extras named before the command:

uvx --from "voxam[screen]" voxam story.z5

The one genuinely system-level requirement anywhere is PortAudio, which the sound extra needs on Linux (apt install libportaudio2 or the local equivalent) because it's a C library rather than a Python package. On Windows and macOS the sound extra is self-contained.

Without any of the extras Voxam plays as a plain text stream. Every game still works; the status line simply stays imaginary, and the sound games play in the conforming silence they were shipped to accept.

Voxam ships no story files. Bring your own: the IF Archive hosts hundreds of freely available games, and story files you own from commercial collections work as-is.

Playing stories

The faces above in full, and everything else a session can do: PLAYING.md. Which 1980s machine to tell a game it is running on, and the games that genuinely play differently for it; seeds and repeatable sessions; saves, transcripts, and the streams; Blorb resources and cover art; and the flags that read a story file apart rather than run it.

Development

The contributor's setup lives in CONTRIBUTING.md: the environment and the task table, the project conventions, the pre-commit hooks and the commit message rules, the instruments Voxam is developed with (acceptance recordings, RegTest suites, the benchmark, the probe, and the filmstrip), and the optional reference material.


🪄 The Name


VΘXΔM

The name Voxam draws from two sources of inspiration:

  • From Latin, vox means "voice," evoking the idea of turning a player's command into action, like voice into magic.
  • In Zork: Grand Inquisitor, voxam was a spell meaning "to separate the energies of different magics." That maps well to the process of parsing, breaking down a command into meaningful parts, isolating intent from raw text.

So whether seen as linguistic alchemy or parser sorcery, VΘXΔM stands at the intersection of command and consequence; of input and invocation.

In terms of a few more historical details, the VOXAM spell has a hilarious relevance in Zork: Grand Inquisitor: it's a complete joke and serves absolutely no functional purpose in the main game. When you first receive your spellbook from Y'Gael at the bottom of the well, VOXAM is one of the three starting spells written inside (alongside REZROV and IGRAM). According to the in-game lore, it belongs to the class of High Magic and, as stated earlier, is defined as a spell to "separate the energies of different magics."

Its actual relevance breaks down into two categories:

  • In the Main Game: Pure Flavor & Trolling. While you use REZROV to open the very first locked door and IGRAM to turn purple things invisible later on, VOXAM can't be cast successfully on anything.
  • The Developer Joke: The developers included it purely as world-building flavor to pad out your initial spellbook and to trick players into trying it on various magical anomalies throughout the Great Underground Empire.

Also worth mentioning is the "Booznik" System. Later in the game, you discover that the Grand Inquisitor has "Boozniked" (reversed) all magic. If you were theoretically able to reverse VOXAM, it would mean "conjoin the energies of different magics," but the spell remains entirely useless to your inventory.

So: a spell defined as separating the energies of different magics, that generations of players cast hopefully at every anomaly in the Great Underground Empire, and that never once worked on anything -- until now. Point this one at a story file and it separates raw Z-code into opcodes, operands, and intent, exactly as advertised.

Twenty-nine years later, the spell finally works on something.

Chris McDonald, in Techno History, wrote:

"Humans are ceaseless borrowers and copiers. Perhaps, contra Ecclesiastes, there is an occasional new thing under the sun, but certainly humans think no new thoughts ex nihilo. And yet we are also ceaseless inventors. We combine existing ideas in new ways or place them in new surroundings, and suddenly the old becomes new, in a wonderful alchemy of the mind."

A borrowed machine, a borrowed spell, a borrowed voice -- combined in new surroundings until the old became new. VΘXΔM is that alchemy, practiced on Z-code.

👨‍💻 Author

Made with 🤍 by Jeff Nyman

Website - Jeff Nyman

LinkedIn - Jeff Nyman

☦️ Doxazein (δοξάζειν)

חֶסֶד וֶאֱמֶת אַל־יַעַזְבֻךָ קָשְׁרֵם עַל־גַּרְגְּרֹתֶיךָ כָּתְבֵם עַל־לוּחַ לִבֶּךָ

"Let not mercy and truth forsake thee:
bind them about thy neck;
write them upon the table of thine heart."
Proverbs 3:3

🕹️ Acknowledgements

This project stands on the shoulders of the team at Infocom, the MIT-born company that invented the Z-Machine to let Zork, and everything that followed, run unmodified across nearly every computer of its era. Particular thanks go to Marc Blank and Joel Berez, who designed the Z-Machine's virtual architecture, and to Tim Anderson, Bruce Daniels, and Dave Lebling, whose work on Zork at MIT gave the format a reason to exist. Thanks also to Graham Nelson, whose Inform language and Z-Machine Standards Document kept the format alive and well-documented long after Infocom itself was gone, making implementations like this one possible.

⚖️ License

The code used in this project is licensed under the MIT license.

Note: This license applies only to Voxam's own code. Two other things travel with it, and neither is covered by it.

The designs Voxam implements belong to the people who made them. The Z-Machine is Infocom's, and the Standard documenting it is Graham Nelson's work with the community's; Glulx, Glk and Blorb are Andrew Plotkin's; the Å-machine and the Dialog language it serves are Linus Åkesson's; arc_image is Stefan Vogt's; the Treaty of Babel is the Interactive Fiction Technology Foundation's. Implementing a specification is not owning it, and none of these belong to this project.

The code Voxam redistributes keeps its own license. The browser face and the desktop shell both ship Andrew Plotkin's GlkOte display (glkote.js, glkote.css, waiting.gif) and jQuery. Both are MIT, and both licenses travel in the package beside the files they cover, as LICENSE-glkote.txt and LICENSE-jquery.txt. jQuery, the stylesheet, and the spinner ride unchanged; glkote.js is a modified copy, and every change to it is marked VOXAM: in place, so the additions are legible against the original: the sound and colour dialects, the Version 6 stage with its scaled canvases and emplaced editor, and the support tokens that grant them. Two typefaces travel with them: Voxam Serif is Charis SIL under the SIL Open Font License, and Voxam Mono is Go Mono under the Go project's BSD license. Both are subset to the characters a story can print, and renamed as the OFL requires of a modified copy: their licenses ride beside them too, as LICENSE-voxam-serif.txt and LICENSE-voxam-mono.txt.

Story files belong to their authors. Voxam ships none, and reads yours without claiming anything about them.

✨ Long live the classics.

Metadata

Release files for voxam 2.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for voxam 2.7.0
File Size Uploaded
voxam-2.7.0.tar.gz 761.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for voxam 2.7.0
File Interpreter ABI Platform
voxam-2.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.6 MB

Release files / voxam-2.7.0.tar.gz

Download URL voxam-2.7.0.tar.gz
Size 761.8 kB
Tags Source
SHA-256 checksum
How to use checksums
39935561714205e4e2338ceeaa9462910aab1d51dd2343871faf3e47cb3837ac
BLAKE2b-256 checksum
How to use checksums
6dc1bdfced9bce7ae14b3c068fc7601973c9954d520c5e4168c9f4e3849ecb3f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.

Transparency log

Release files / voxam-2.7.0-py3-none-any.whl

Download URL voxam-2.7.0-py3-none-any.whl
Size 804.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a90299086f5453cacb020e9fd730ef1c842bc4044f5cd661961a125e9b23f766
BLAKE2b-256 checksum
How to use checksums
2c37dd88ed50cda3bf98c09fa781a3cdf730cdb6fe50e07dcfa7a89a22c015fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.

Transparency log

Release history Release notifications | RSS feed

2.8.0

2 release files

This release

2.7.0 This release

2 release files

2.6.1

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page