Hello everyone,
some of you know me from my games, the Hibernated series, The Curse of Rabenstein, or Ghosts of Blackwood Manor. Today I want to show you what I have been building for quite a while now: Arcturus, a new programming language for interactive fiction, with its own compiler that emits standard Z-machine story files.
The idea behind Arcturus is simple to state and was challenging to achieve: give the author the comforts we know from modern systems like Inform 7 and Dialog, but compile them down to very efficient Z-code, so the same game that feels contemporary to write also runs well on an 8-bit machine. Big things with little code and syntactic sugar. That’s the fundamental idea.
What it looks like
Arcturus never pretends to be English, and it never makes you fight punctuation either. Every construct is one keyword led line on an indent skeleton, so a stranger can open a game’s source and follow the story:
room shop
name "The Tick-Tock Emporium"
desc "Clocks cover every wall, disagreeing politely about the minute."
north workshop
thing coin in shop
name "silver coin"
words coin, silver
desc "One honest coin."
Behavior is handlers, and I consider them the heart of the language. A handler lives on an object, a kind, a room, or free at file level, and an action walks that chain most specific first. One mechanism covers what elsewhere takes instead rules, before and after rulebooks, daemons, and life routines:
on take when clockmaker is not paid
change refused to true
say "The clockmaker's eyes never leave you. One coin, first."
stop
on after take
say "The carriage clock ticks against your palm, keeping your pulse now."
every 4 turns do clock_chimes
on each_turn when player holds fish
say "The cat pads after you, green eyes fixed on the fish."
The same shape carries a surprising distance. Arcturus follows the modern darkness model (in the dark you can still feel what you carry, so INVENTORY works, but EXAMINE and READ refuse), and if you want it stricter, Inform 7’s “Instead of taking inventory when in darkness” rule translates very easy to Arcturus:
on inventory when is_lit is false
say "It is far too dark to rummage through your belongings."
stop
You will find more of these modern comforts throughout: vary for self-varying prose, beyond for reach modeling, computed descriptions, multi-room scenery, doors, locks, kinds with inheritance. And some things I believe exist in no other system: grains, scenery words that answer verbs without any object behind them, so a room can be dense with detail at almost zero cost; a container model that tracks what the player has actually seen and words itself accordingly; auto-scoring where the compiler sums your maximum score at compile time. Scope, by the way, is something you will almost never think about. The library handles it quite well. I think ![]()
The compiler is called arcc and currently handles Z-machine version 5 and version 8. There are no plans to support other Z-machine versions. For retro systems, v5 is all you need and the modern author will be happy with the ceiling that z8 provides. But feel free to change my mind ![]()
Cosmos, the Arcturus standard library
The standard library, Cosmos, is written in Arcturus itself and ships as editable source, not a black box. To change a standard message you redefine its block (a block is what some of you consider a routine) in your own story and yours wins, or you just fork the English language pack, which you can easily do, as the parser is language agnostic. But more on that below. Optional features are granules you summon (summon is what you know as include or import in other languages): two complete conversation systems (classic Infocom ask/tell and a menu-driven one), a status line, verbose exits, extended verbs, nautical directions, ambience and more. What you do not summon is simply in your story. Modularity was a very important factor in the creation of the Cosmos standard library.
That last part is the compiler’s doing. arcc is a whole-program, multi-pass compiler with strict dead-code elimination: it sees game and library at once and a build carries only what the game actually uses, provably, byte for byte. Text compression is automatic, every compile prints a statistics ledger of your Z-machine headroom, and --zversion 8 targets version 8 for large releases. Tailored abbreviations can be created through a compiler flag. The compiler is pure Python, standard library only, one self-contained file (including the standard library): download, chmod, done, on any OS. If you want to fork something form the library, you can eject the corresponding .granule file.
Why Cosmos you may ask? Well Arcturus is a star and the narrative arc every story is built on. The game file is a .storyarc file. And in cosmology, where the Cosmos is the environment of stars, the library is the environment of your story. Also, I found it funny, should I ever release a minimal version of the library, I could call it MicroCosmos. On a side note: granules are the convection cells that tile the Sun’s photosphere, since Arcturus is a star, a summoned module is a .granule on its surface.
Pictures (yes pictures, and this is not .z6)
This one I am a little proud of: Arcturus games can carry images in z5 and z8 story files while staying fully standards compliant. The pictures ride an extension opcode in the range a conformant interpreter must simply ignore, and a story only draws after an interpreter raises a capability flag that picture-aware interpreters alone set. So the opcode call is hidden from an interpreter not supporting the format. The same file plays as pure text on Frotz or any classic interpreter, and shows its art where art is understood. No Blorb or separate builds.
Note that arc_image supports two picture modes: 9 lines and 12 lines height. The 9 lines height (72 pixels) is equivalent to Infocom’s Arthur, and the 12 lines (96 pixels), almost half of the screen, is what you know from environments like DAAD.
Actaea and arcimg
Actaea is the reference interpreter, also a single Python file with zero dependencies. It plays any well-formed v5 or v8 game (not just Arcturus output) in a window or in the terminal, does Quetzal saves that interoperate with Frotz both ways, and doubles as a debugger and disassembler. It renders arc_image pictures today; a set of interpreters for retro systems with arc_image support is in the making. You already saw a few pictures of Actaea throughout this thread. Here is one in --console mode from my MacOS Terminal.
Actaea is fully standards 1.1 compliant, fully verified also with CZECH, @zarf 'sTerpEtude and Praxix. Note that Actaea currently, as Arcturus itself, supports Z-machine version 5 and version 8. Here you can see it running Jigsaw through the UI.
arcimg completes the toolchain: you paint one master image, and the tool converts it to the ideal native format of every retro target, fifteen machines so far, each conversion tuned to what that hardware does best.
And if you write in VS Code, a syntax highlighting extension for the Arcturus file types ships right in the repository, with install instructions in the README. Your game source, the Cosmos library, and the granules all have proper colouring.
Languages, docs, examples
The parser is language agnostic: grammar and wording live in a language granule, and English, German, and Spanish ship with the compiler. German is my own work as a native speaker, and the Spanish granule was built together with Pablo MartĂnez, whom many of you know from the Spanish IF scene or from this forum as @Kozelek. You can eject the language granule and adapt it to your own tone, or your own language, without touching the parser’s machinery.
The documentation is complete: a full syntax reference with two worked games (including the classic Cloak of Darkness), a runtime reference, and guides for the granules, the interpreter, and the image workflow. Alongside them, over thirty small example games each isolate one feature.
Where to get it
Everything lives here, MIT licensed:
The whole toolchain is two self-contained files (a third if your game uses pictures). All you need is Python 3.11 or later. The README’s Quickstart has you compiling and playing in about a minute.
A word on how Arcturus is built
I want to be very open about how this project, so I am going to post what is already written on my repository (kinda): the language design, the syntax, Cosmos, and the compiler are my work, and Arcturus is a human-driven project. I use Anthropic’s Claude Code as a coding assistant. It doesn’t do anything I couldn’t do myself. Python is my language of choice, and I use it daily in my role as regional head of a department at a global software company. Arcturus is a serious effort and I build it the way any engineer would build a project of this scope today. I know some of you have mixed feelings or objections about AI, and I take that seriously. For me, a coding assistant buys the time and the efficiency that make a project of this scope possible for the community, and what it enables in the end are new opportunities for interactive fiction and new, wonderful human-made stories. That is what matters most to me. The repository keeps a full log of my design decisions and the code I made along the way. This is not another Sunday-afternoon-vibe-coding-experiment but a thoughtfully crafted product with a full-featured roadmap and quality assessment through regression tests, where the human factor in the loop makes the difference.
Join the communtiy
If you want to talk: we have a young but very active community on Discord, with early adopters already writing real games in Arcturus and throwing a plethora of bugs at me like @improvmonster, shaping it significantly with their feedback. Come join us:
I am happy to answer everything here in the thread as well.
Stefan



