If you’ve read the earlier post Retro Tech: What is the Gopher Protocol?, or even if you haven’t, this is related. Project Gemini is, in their words, “…a collaboratively designed internet protocol, which explores the space inbetween [sic] gopher and the web, striving to address (perceived) limitations of one while avoiding the (undeniable) pitfalls of the other.”
Like Gopher, Gemini is lightweight and text-based. Its purpose is for the distribution of arbitrary files (i.e. any file on the system), as well as creating a simple, lightweight configuration which makes linking between files easy. The official site uses the analogies of “the web, stripped right back to its essence,” or “Gopher, souped up and modernised a little.” If you had grown up using the web in the late 1980s, Gemini would probably seem quite similar. The page in the screenshot below can be accessed via the web proxy or on Gemini at gemini://gemini.circumlunar.space/docs/specification.gmi.
It is a client-server protocol, which uses request-response transactions, somewhat analogous to HTTP or gopher. Be that as it may, in Gemini, connections are closed after a single transaction ends and cannot be used again. In the case that Gemini transactions are served over TCP/IP, servers listen on port 1965 (which is in honor of the first manned Gemini mission, Gemini 3; this flew in March of 1965).
Gemini transactions are somewhat like a Gopher request or an HTTP “GET” request. According to the documentation, transactions happen in this manner:
C: Opens connection
S: Accepts connection
C/S: Complete TLS handshake (see section 4)
C: Validates server certificate (see 4.2)
C: Sends request (one CRLF terminated line) (see section 2)
S: Sends response header (one CRLF terminated line), closes connection under non-success conditions (see 3.1 and 3.2)
S: Sends response body (text or binary data) (see 3.3)
S: Closes connection
C: Handles response (see 3.4)
The FAQ asks, as many might wonder, “Whose fault is Gemini?” (i.e. who designed it?)
Project Gemini was started by Solderpunk firstname.lastname@example.org, who remains Benevolent Dictator For Now. However, the protocol has been designed in collaboration with a loose and informal community of interested parties via emails, phlog and Fediverse posts. Many people have shaped significant parts of the protocol, so Gemini should not be thought of as the work of one person.
As explained on their site, it can be used with a terminal-based client, but graphical versions also exist. According to the official site, the following clients can be used with Gemini, but there are others as well:
Some of the graphical clients are (descriptions quoted from the site):
- Castor – (Rust, GTK) – this is one of the earliest GUI clients, which supports Gemini, gopher, and finger
- GemiNaut – (C#), a user friendly GUI client for MS Windows.
- Kristall – (C++, QT), a combined Gopher and Gemini GUI client.
- LaGrange – (C, SDL), a beautiful tabbed GUI client with prebuilt binaries for Windows and MacOS.
Some of the terminal (command line) clients are:
- Amfora – (Go), a “fancy” terminal client
- Asuka – (Rust), an NCurses-based terminal client
- AV-98 – (Python), a terminal client derived from the popular VF-1 Gopher client
- Bombadillo – (Go), a combined Gopher and Gemini terminal client with vim-inspired key mappings.
- Elpher – (Emacs), a combined Gopher and Gemini client for the popular text editor / operating system.
There’s a lot more to Gemini than what’s been outlined here, but if it really interests you, the documentation goes into much more detail. For those of you who are obsessed with links, here are some samples (accessible over Gemini or using the web proxy):
A full list of these can be found at Gemini Portal.