.plan

Artemis: A GNOME Desktop App for Hunting Parks on the Air

Back in September, I moved to Linux full-time on my home desktop — Arch and GNOME 48, to be exact.

I was really impressed with GNOME and its direction. I try to build software for whatever platform I’m living on, and it had been forever since I’d built a GTK app. I remembered it being pretty involved. I had a couple of false starts with C and GTK4, but now there’s libadwaita and Vala. I was really impressed with what elementary OS has built using Vala and libadwaita. So I built an app with libadwaita and Vala.

I’m a Parks on the Air hunter. It’s a fox-and-hound activity where one amateur radio operator (yes, a ham) sets up in a state or national park. They call out for hunters to find them. When they log ten hunters, the park is considered “activated” and added to their tally. This happens every day, all over the world. Next time you’re at a state park on the weekend, look around. You might see a car or truck with some wires leading to an antenna hung in a tree or set up on the ground. You just found an activator in the flesh.

So what does this have to do with apps? I don’t have much time to activate these days, but I do find myself with time to hunt. Hunters can find parks by scanning the bands, just looking for folks to talk with. Or they can use the spots page on the official POTA website. I’m more of the second type. I want to know which bands are the most active and how I can stretch my setup. Can I hear that station in New York from LA? Turns out I can. It’s a lot of fun.

So my app is a desktop client for accessing POTA spots. I can search and filter by band, park, country, operator, etc. I added a map view so I can see states or countries I’d like to add and pounce on activators that way. It also integrates with Hamlib so I can control my radio directly from the app. Found an activator? Click “Tune” and my radio flips to the correct band and frequency.

It’s called Artemis, after the goddess of the hunt. I may or may not have been playing a lot of Hades while building this.

It’s been a lot of fun getting this app ready for release. It’s available as source on GitHub or via Flathub.

If you’re a ham and you’ve stumbled across this, I’d love for you to check it out and let me know what you think.

A brief aside: RSS

If it wasn’t obvious about writing about MUDs and telnet, I like a lot of “early internet technologies.” So I was shocked, shocked I tell you, that my static site generator that builds this blog (see Developer Rite of Passage #137) was without an RSS feed.

Well now I can sleep at night. I added a feed.xml template and now have it publishing alongside the content here.

It’s my personal feeling that RSS is one of those core technologies that we should continue to support. Their are many folks, like me, who don’t want an algorithm to curate their feeds and RSS is a key component of that.

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.