The Unsinkable Molly Brown: a full-featured Gemini server implemented in Go

solderpunk 79dd948a9f Merge pull request 'Add initial systemd service example' (#3) from strega-nil/molly-brown:add-systemd into master 2 days ago
.gitignore ff650fd7b6 Initial commit 6 months ago
LICENSE f686d23c40 Set copyright holder. 6 months ago 85a94a43b9 modify README 4 days ago
config.go db4ff190be Fix default port. 2 months ago
example.conf 1d0af7a541 Add example config file and expand to document basic setup. 1 month ago
handler.go 06809edfcc URL escape filenames in directory lisitngs. 6 days ago
logging.go c13acf9c4b Trying a different logging format... 6 months ago
main.go d14198aeba Add missing import from previous commit. 4 days ago
molly-brown.service.example dcf23cbd97 add initial systemd service example 4 days ago


The Unsinkable Molly Brown: a full-featured Gemini server implemented in Go.

For more info on Gemini see or gopher://


The easiest way for now to install Molly Brown is to use the standard Golang tool go (note I said "easiest", not "easy" - this is still a pretty clunky manual process, sorry). Unfortunately, you have to do a little bit of preparation for this to work (unless you're a Go developer yourself in which case you surely already have this done)...

Prepare your $GOPATH

  1. Create an empty directory ~/go.
  2. Set the $GOPATH environment variable to ~/go.

(you can in fact put your $GOPATH anywhere you like, but ~/go is the convention)

Fetch and build MB

Run go get If everything goes well, the end result of this will be that you'll have the Molly Brown source code sitting in ~/go/src/ and an executable binary sitting at ~/go/bin/molly-brown. If it makes you happier or your life easier, you can copy that binary to /usr/sbin/ or anywhere else.


In the source directory mentioned above, you should find a file named example.conf. Copy this to /etc/molly.conf and edit it to suit your environment. The default values for all possible options are specified in the file - just uncomment and change the ones which won't work for you. All options are explained below in the Configuration Options section.

Daemonisation and launching

Currently Molly Brown just runs like an ordinary program, without daemonising itself. You'll need to use another program, like the one at, to handle daemonising.

Currently Molly Brown is only integrated with systemd, so if you're using anything else you'll have to handle getting it to start on boot up yourself. If you are using a sufficiently right-headed operating system, the easiest way to do this is by putting your call to daemon (or whatever else you use) in /etc/rc.local.

Setting up with systemd should be reasonably easy; copy molly-brown.service.example from this directory to /etc/systemd/system/molly-brown.service. Then, make any necessary changes for your setup, and run the following:

# systemctl daemon-reload
# systemctl enable molly-brown.service
# systemctl start molly-brown.service

Note that Golang programs are unable to reliably change their UID once run (a source of constant frustration to me!). So don't start it as root, or it'll remain as root forever. Run it as nobody, or a dedicated molly user. Make sure that user has read access to the TLS keys and write access to the specified log file.

Configuration Options

The following options can be set in /etc/molly.conf:

  • Port: The TCP port to listen for connections on (default value 1965).
  • Hostname: The hostname to respond to requests for (default value localhost). Requests for URLs with other hosts will result in a status 53 (PROXY REQUEST REFUSED) response.
  • CertPath: Path to TLS certificate in .pem format (default value cert.pem).
  • KeyPath: Path to TLS private key in .pem format (default value key.pem).
  • DocBase: Base directory for Gemini content (default value /var/gemini/).
  • HomeDocBase: Requests for paths beginning with ~/username/ will be looked up relative to DocBase/HomeDocBase/username/ (default value users). Note that Molly Brown does not look inside user's actual home directories like you may expect based on experience with other server software. Of course, you can symlink /var/gemini/users/gus/ to /home/gus/public_gemini/ if you want.
  • LogPath: Path to log file (default value molly.log). Note that all intermediate directories must exist, Molly Brown won't create them for you.