Gemini: new internet protocol

Featured image: Project Gemini. Image Credit: NASA

Project Gemini is an early NASA human spacefilght program.

The Gemini protocol is a new internet protocol that takes user privacy seriously.

I came across Gemini when I got distracted and was reading about the Gopher protocol. Gopher was interesting to me because I felt the modern web standards were too complicated. From the app developer's perspective, there are so many things you have to be aware of in order to have a website that uses good practices and also meets stakeholders' tastes. It is not that the web standards are bad; I believe the complexity is proportional to how powerful the web platform is. But when all I want to do is publish some tidbits on a personal website, all its complexity is simply unnecessary.

Years ago I looked at the Gopher protocol. It was quite idiosyncratic, which was understandable for such early technology. The text format was not aesthetically pleasing to my 'modern' senses. So I gave it a pass.

The Gemini protocol is a modern evolution of Gopher, called 'Souped-Up Gopher', with aim of user privacy in the age of ubiquitous user tracking. But I am more interested in how simple the protocol spec is. A functional Gemini server can be written in about 100 lines of Go code. I am sold.

Into Geminispace

The Gemini web is called Geminispace. Gemini sites are called capsules.

I am using two Gemini clients using and both are great. I did not bother to try others.

Lagrange desktop GUI client is my go-to client and the experience is almost comparable to using Firefox. I am taken how polished it is, given the nicheness of the protocol. The first time I ran it, Korean texts were not rendered, but there was a helpful guide from the browser about which fonts (Noto) I needed to install. It also supports Gopher.

Amfora terminal client when I want to browse from terminal for some reason.

Here are some interesting capsules I found:

Making a Gemini calsule

The markup language used to serve over Gemini is called 'Gemtext', which resembles a stripped-down Markdown format. Because I am using Hugo for this website, the content is already in Markdown format. So I thought it would be relatively easy to convert the posts into Gemtext, and that is the case for most part. The result is here:


Here are some notes:

Lack of inline links

When compared to web, the most striking thing about Gemini is that it has no inline links. Gemtext only lets you put links on a line on their own. I am a person who uses inline links in texts very liberally. Even on Slack messages I plaster them with reference links. I tried to preserve each inline link when converting to Gemtext and the result is acceptable, but a bit awkward. If a link-heavy site like Wikis is to be converted this way, I imagine it would be too cluttered to be viewable.

I get the simplicity rationale. But because hyperlinks are such an important feature, it is what makes the web a web, I think the links are where the spec can expand more on.


In Gemini, the use of TLS is mandatory and client session/identity is also handled with TLS certificates. From technical standpoint this is great. But I am worried that this will prove a barrier to adaption because handling TLS certificates is not a general skill, even among programmers. In the company I work, only a fraction of the engineers are familiar with TLS. I considered TLS as an Ops detail.

For learning TLS basics, I recommend TLS Mastery by Michael W Lucas. This is the book that got me some TLS literacy after years of blindly copying and pasting openssl commands and being on general state of confusion.

I am using Smallstep certificate manager and their tools to generate certificates while writing server. The CLI tool conveniently installs CA root certificates on system keychain.

Jupyter Notebook

Since The Jupyter Notebook is a web-based technology, I imagine converting notebooks to Gemtext will not be simple. I tried nbconvert's markdown support to convert one of the notebooks, but the tables outputs are rendered with HTML tags so it is not immediately usable. It will be interesting to see tools to develop on this area.

The Future

I think Gemini will establish as a niche but prominent alternative protocol to the web.

I agree with the points made in this blog post. The lack of Content-Length is strange. It is helpful to know how much content you expect to receive from the receiving end, if only to avoid receiving more than you have space for and crashing.

I may keep maintaining my capsule, because the tech is so simple the upkeep is minimal. I may implement dynamic/interactive content that I think is interesting. Viewership-wise it does not matter which protocol it is in, nobody reads my blog anyways.