Skip to content
A gemini protocol server in Common Lisp
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Germinal, a Gemini Protocol server

Germinal is a server for the Gemini Protocol, written in Common Lisp.

It is named after the early 20th century Yiddish-language anarchist newspaper Germinal. I wanted to name it after an anarchist publication to convey the idea of people sharing information and ideas with each other, in contrast to the way the web is used to push advertising from corporations to people. And it happened that Germinal shares some sounds with Gemini.



  • Serves any type of document with an appropriate mime type.
  • Serves .gmi files as text/gemini, the gemini mapfile format.
  • Serves index.gml as a directory listing, if it exists
  • Serves a simple directory listing for directories without index.gml
  • Serves only world-readable content, much like Gophernicus.


  • Configuration by environment variables, command-line, or config file
  • Keep up to date with protocol changes
  • Logging (though not too much logging)


  • authentication by client certificate
  • cgi-bin support


This is still a bit of a hack, and if you don’t have a working Common Lisp development environment, you will probably have trouble getting it running. The included will build a single executable, but unfortunately it depends on a shared library that will be somewhere in your ~/.cache folder…

You also need to generate a self-signed cert and key. Currently these need to be named cert.pem and key.pem and be stored in the working directory germinal will be run from. This will improve in the future when I write the configuration parts. You can generate the cert like this:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes


Run germinal. It will listen on port 1965 on all interfaces, and serve content from /var/gemini/. It will only serve world-readable files, regardless of what user it is running as.

You can’t perform that action at this time.