.post

Building a MUD in 2026

When I was 13, my first real experience with the internet came in 1994. My sister had just left for college and was required to sign up for her campus computing system. That winter she came home with her massive IBM PS/Note laptop, excited to show me the university’s VAX system.

Our house was a CompuServe house (keyword: NOSTALGIA), and we rarely ventured beyond its walled garden of communities. But this—this was the open frontier. Telnet? A server across the country that would respond to commands? This was magic baby.

My sister had also discovered MUDs: multi-user dungeons, servers hosting role-playing games with other people online. Many were inspired by Tolkien: hack-and-slash worlds leaning heavily on the D&D rulebooks. She fell into a group playing on Phoenix MUD (which still exists, and I still log into occasionally), and I followed. I dove into the systems, learned to script using TinTin++ on my Concentric shell account, and explored UNIX tools like GNU Screen. It was my first step into a larger world. You see, Phoenix MUD ran on CircleMUD, a derivative of DIKU MUD. If you follow the lineage of most early MMORPGs, you eventually end up at DIKU. For me, CircleMUD provided a C codebase, a set of text files for world building, and a steep learning curve. I never launched a MUD of my own, but the experience shaped skills I still use daily.

Why a MUD in 2026?

Because who can afford a GPU in this economy??

Kidding aside, I’ve been carrying around a story I want to tell. A historical-fiction world. Characters. A setting I want to build out. I’ve attempted it through every graphical engine I know, but I always ran into the wall of not being able to create the art I envisioned. Asset packs get me close, but it never feels like my world.

A MUD may solve all that. I get interactivity without the burden of 3D production. I can focus entirely on worldbuilding, systems, and narrative. And have a bit of fun doing it.

I started a month ago writing socket and Telnet negotiation code in C using libuv. It worked, but dealing with telnet protocol details in C is a bit of a slog. I spent a couple of days thinking about languages that would make this easier while still performing well. Then it hit me: Erlang and OTP.

I was exposed to Erlang because I worked at Mochi Media which had leveraged Erlang and OTP for our ad serving and other tools. I had written some toy things in it, but what I remembered was Erlang has binary pattern matching that borders on magical. OTP gives me supervision trees, processes, and fault-tolerance for free. Need a state machine? gen_statem is right there. Rooms, zones, mobs. Each can be a process. The architecture just started spilling out. Command processing? Pattern matching!

There was one problem: I am terrible at Erlang syntax. It never fully clicked for me. I tried writing some simple servers and still really struggled. I was ready to go back to my C version when I remembered: an acquaintance once worked extensively with Elixir. He always told me that it was Erlang but with a much more forgiving syntax. I took a look and it immediately made sense. The underlying concepts (ETS, DETS, gb_trees, OTP, etc.) were all there, but for some reason the syntax was something I could hold in my head.

Looking Ahead

So yes: I’m writing a MUD, in Elixir, in 2026. I’ll use this space to document the process. Let’s see where it goes.