VΘXΔM: a Z-Machine, Glulx, and Å-machine interpreter in Python

Yep, that’s fair. To be clear, the affectation name was never exposed, at the command line or in any interface at all. It was just an artifact in the README, which has now been revised.

The critique was technically right and culturally beside the point: VΘXΔM isn’t Greek. It’s display lettering, same family as the heavy-metal umlaut. Nobody pronounced Mötley Crüe as “Moetley Cruee.” And the provenance was just the spellbook glyph aesthetic, which was kind of the whole joke. (Just like Arthur could never get the hang of Thursdays, I could never get the hang of jokes.)

I think the far better critiques, as I came to see them, are that screen readers announce it as “v theta x delta m,” it doesn’t copy-paste or search cleanly, and, in running prose, it makes every sentence SHOUT.

I just tried Voxam 2.3.0 for macOS; it doesn’t work at all on my machine.

I opened the DMG, dragged the file into Applications, double clicked it, approved it in macOS Settings → Privacy & Security, double-clicked it again. It prompted me to open a story. I selected Counterfeit Monkey, and I got this:

voxam is not on this machine’s PATH.

Install it with:

uv tool install voxam

(or pipx install voxam, or pip install voxam). If it was
installed moments ago, sign out and back in so the PATH
refreshes for desktop apps.

Yeah, that’s the current issue. Tauri is just a frontend, so it requires Voxam (the Python project) to be installed, as that text says. It then looks for that and uses it. That was part of how all the front-ends use the same wire, but it’s not documented very well.

On the README, all I have so far is this:

  • 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 nudge). The shell drives the voxam command, so install that first – pipx install voxam or uv tool install voxam puts it on the PATH.

Not ideal, as I was just figuring out how to implement that kind of stuff. From the other thread, this is actually why I like the idea of Go (or, more likely, Rust, now that I’ve played around with it): I can use a channel mechanism. One single output for every single front end.

Cairn is written in Swift, so it’s pretty easy to pull apart

I’ll need a moment to get the image of a certain robot being torn apart in Planetfall out of my head. :slight_smile:

I created Cairn as an experiment in spec driven development using Claude and Open Spec. I needed a good project idea to really push Open Spec to understand better how it worked, and whether or not it could be used to create code that was not just AI slop. I started work on it in June, and 838 commits later, I have the product as it sits today.

The specs for the project are substantial, and have been evolving as I built features. The published z-code specs out there were my starting point, but has grown to over 50 separate specification topics on things such as game session UI, separation of logic (UI, shared engine, database, etc).

Truth be told, I also built it because I wanted to play the old Infocom games, but with a bunch of modern features (like auto-mapping, in-game materials like PDFs, note taking, invisclues, and synchronization across iCloud from Mac to iOS/iPad OS).

You are correct, there is a LOT of code in Cairn (around 60k lines of Swift), but a LOT of specifications to go with it. It’s been pretty stable, except for one particularly tough database migration in iCloud that went sideways in production, but I got it resolved. Because the spec is so detailed, really gnarly bug fixes can get squashed quickly.

It’s been a successful experiment in agentic, spec driven development. And I got a game for myself that I actually want to use.

IMO, modern enterprises, (with the proper amount of discipline and detailed, evolving specifications) can pivot to a world where the developer really shifts into a role of architect and product owner.

You wouldn’t consider maybe porting it to Android, would you? :innocent:

you know, 3 months ago, my answer would be a resounding no. but, now that things are in production and reasonably stable, and I have such a extensive specification written that is platform agnostic, its actually not outside of the realm of possibility. I have zero android experience, and a great deal of .NET experience in my background. I may look into a port. Also contemplated a web version too. One of the nice things you get for free on the apple stack is iCloud based database synchronization. Allowed me to extend the app from Mac only to synchronize games, materials, and saves with iPad and iPhone without standing up a single server. Not sure if that would be possible for Windows or Android ports.

Well, if it does happen, you got a customer. If it doesn’t, it’s great as it is. I love the problem that you were trying to solve with Cairn. I think it’s a big one. But that’s no surprise given my posts. :wink:

I won’t retire on the proceeds, but I can at least cover my developer license for Apple and my AI fees. :slight_smile:. This is a little like owning a jeep. it’s not a cost effective use of your time, but you will have a lot of fun!

Exactly this! That’s entirely why I’m doing this as well. It’s also forced me to really engage with the ideas of the community in terms of implementation. I’ve been a long time participant but, after doing a lot of contract testing for game companies around design as well as story and narrative experience testing, I found I had a desire to approach textual IF from the ground up, as it were.

There is a wave of nostalgia going through younger generation. Simpler devices. They are rediscovering things like iPods and cassette players and retro gaming. I have a feeling that we might see a resurgence of interest in interactive fiction in the next few years. For the right type of person, it is a remarkably engaging experience. It’s a great example of “less is more”. Now that Cairn is shipped, I am actually knee deep in playing planetfall, a game I’ve not played in 40 years. so, everything old is new again when you have little memory of the game. I go in my office, dim the lights, crank up the ultrawide monitor, find the right background music and lose myself in the experience. Next thing I know, 4 hours have gone by and I should be asleep. :slight_smile:

On Android, Google offers Google Play Services; it’s very similar in scope to iCloud GameKit for Apple devices.

I threw a (very minor) bug report onto git, just a little something involving the status bar and increasing the font. But I also just wanted to say - great job, thanks for doing this and sharing it. It looks really nice and provides a good experience playing through games! :slight_smile:

On it as we speak! Thank you for writing up. I have a 2.5.0 version going up that fixes some issues, including one that Dan found where some Macs won’t find Voxam even when installed. I’ll get your bug fix in that! Should be deploying today.

UPDATE: 2.5.0 is deployed.

To be clear, in my case, I hadn’t installed the Voxam CLI at all; I’d wrongly assumed that this was an app bug, rather than an installation prerequisite. (And I never went back in to install Voxam globally, either.

(Does installing Voxam on my PATH require me to install its dependencies in my system Python installation? If so, I don’t think I’ll ever want to do that.)

It uses pipx, so it shouldn’t—that should automatically make a new venv, and the thing that goes in your PATH is a script that activates that venv and then runs it.

Daniel is correct. Whether you do uv tool install voxam (which is only if you use uv-managed Python versions) or pipx install voxam, both build Voxam in its own private virtual environment and expose only the voxam command on your PATH. Your system Python’s site-packages is never touched.

The one thing worth knowing: the optional extras do have dependencies: screen pulls in blessed for the painted terminal, graphics pulls in pygame-ce, sound pulls in sounddevice. They’re opt-in, they buy a presentation layer and never correctness. Under the uv tool or pipx, they land in that same isolated environment rather than your system Python. Without any of them, Voxam still plays every game as a plain text stream.

This is where I’m hoping the Rust version actually provides a slightly more single-source solution. I’m getting there but I’m finding my learning with Rust is going slower than anticipated. I’m finding the language doesn’t quite match how I think about code, so I’m re-orienting to think differently.

I’ve done a few exercises with Rust out of curiosity but I find that I think in C++ 11. That makes it extremely challenging to try and think and work in Rust. Even though I work mostly in C# these days, I still think in C++. I don’t know if Rust gives you any benefits over Go for your use case. Only you will know that.