Michael Alyn Miller

Hermes BBS is now Open Source

The Hermes BBS package is now open source under the three-clause BSD license! The code is available on GitHub and includes commit history for the 3.5.11-series of beta releases. I have code in private branches – interactive Forth interpreter, anyone? – that I hope to get onto GitHub in the future as well.

A brief history…

I purchased the source code to Hermes II from Bill Dolinar in December 1998. I had been a user of Hermes almost since the first release and getting the chance to contribute directly to the project was a long-time dream of mine. I knew that BBSes were pretty much irrelevant at this point, but I always liked the idea of what I called “community-oriented computing,” and I hoped to play with variations on that theme in Hermes.

Olympus, the official support BBS for Hermes, was available via telnet within a few days of the transition. This was accomplished in what I consider to be a tremendous(ly awful?) hack:

  1. The Mac SE/30 running Hermes was connected to a Livingston PortMaster via a null modem cable.
  2. The PortMaster listened on a TCP port and proxied connections on that port to the Hermes serial port.
  3. I wrote a UNIX daemon which connected to that PortMaster endpoint and presented itself as a virtual modem. Hermes would then send my daemon AT commands to initialize the “modem”, listen for calls, etc.
  4. The daemon listened on port 23 and implemented the necessary parts of the telnet protocol. Connections arriving on the telnet port were turned into a ring indication, Hermes would “answer” the phone, and data would flow back and forth through the proxy.

Hermes got real telnet support in September 1999, but for those nine months all telnet connections to Olympus went through the aforementioned tin-cans-and-string proxy setup. Ironically, the proxy approach supported file upload and download, whereas the native TCP/IP support added in 1999 wasn’t able to support file transfers until 2001.

Interesting footnote: support for ANSI escape sequences in Mac OS telnet clients was pretty spotty in 1999. I solved this problem by writing my own terminal emulator in Java and deployed it as an applet on the Hermes web page in February 1999. This made it possible for users with only a web browser to connect to Olympus. The applet included the exact same font used in Hermes itself, although it drew the font pixel-by-pixel since there was no standard for web-based fonts at the time!

A test-bed for craziness!

Hermes ended up being the place where I would test crazy ideas before implementing them in actual products. I didn’t like writing Pascal- or C-based externals, for example, so in 2002 I created a Python-based external API. Hermes was still a 68k Pascal app though, so embedding CPython into Hermes was out of the question. Instead, I embedded JPython into a Java library, which I hosted from a PowerPC-based external – the first one ever! – and then ran that in mixed-mode from the 68k Pascal process. This required almost no changes to Hermes itself; just one extra external API for getting access to raw user input. Hermes was also modified to detect Python based externals and would then use this PowerPC-Java-JPython runtime to launch the external.

The first external written in this form was Leech 2000, a Python version of Leech. Docs for the Python-based API are still on the Hermes web site, although I deprecated that API in 2009 when I created the Forth-based API.

Why the change in languages? Among other things, the Python approach required that you had a PowerPC-based Macintosh, which made it difficult to run Hermes in emulators such as Basilisk II. Olympus had long ago stopped running on real hardware and was instead virtualized on my FreeBSD server. Being able to run a pure 68k app was appealing from both a virtualization perspective and a historical perspective, seeing as how Hermes itself could run on computers as old as the Mac Plus.

The Forth-based external system works, but has not been released. I hope to get that onto GitHub someday. It is quite enjoyable to develop an external entirely from the BBS prompt – the Forth-based runtime includes a Vim-style editor that is also written in Forth!

The future?

The decision to open source Hermes was a long-time coming and more difficult to make than you might have expected. In a lot of ways I felt like open sourcing Hermes was admitting that I would no longer be working on the project, and yet doing nothing at all was pretty much the same thing. There was also the issue of tooling: building Hermes requires some very ancient software (THINK Pascal 4.0 for sure; ideally THINK C 5.0 and a specific release of MPW as well), but open sourcing Hermes meant that you needed cutting-edge tools (Git) to actually get the code. I have a Titanium PowerBook G4 that exists solely to work on the Hermes source code; potential developers would need a similar setup.

Ultimately though none of these reasons were good enough to keep Hermes tucked away on my laptop, so last weekend I spent a bunch of time building a shell script to convert source files, resource files, etc. to and from various Git-compatible formats. In theory, anyone should now be able to build their own version of Hermes.

What happens next? That’s up to you. Maybe all of those people asking for a Mac OS X port of Hermes will rise up and build their own? You never know… ;)