From LinuxReviews
Jump to navigationJump to search

Gemini is a really simple free and open application layer protocol for very simply formatted hypertext. It is like the world wide web in the early 1990s. The text formatting is limited to a sub-set of the Markdown mark-up language. Gemini supports TLS for security, and that is the extend of modern technologies that are supported.

Moonlander showing the techrights gemini site.jpg
The Moonlander Gemini browser showing the Techrights Gemini website.
Developed bySolderpunk
IntroducedJune 2019; 1 year ago (2019-06)
Internet media type
Type codeTEXT
Developed bySolderpunk
Latest release
(November 29, 2020; 5 months ago (2020-11-29))
Type of formatMarkup language (like Markdown)
Open format?Yes

Regular web browser support is non-extent, one of a number of specialized Gemini browsers is required to enjoy the content that is available using the Gemini protocol. It is possible to browse Gemini sites using regular web browsers by going through specialized web proxies who convert the gemini:// protocol and content into simple HTML pages.

There Used To Be A Simpler Time

The very early web had simply formatted HTML documents with few images. There weren't a lot of bloated JavaScript attached to every web page, advertising was limited or non-existent, and there were no videos, large CSS files or other bloat attached to the very early webs HTML documents.

Gemini is a hypertext protocol designed with those simpler times as a guideline.

There is no support for images or video files within documents (they can be linked to and opened in external applications), there is no support for CSS or other formatting trickery, there is no JavaScript, WebAssembly or ways of executing code in people's browsers and the potential for advertising is limited to text-only advertisements.

The sum of the pages published using the Gemini protocol is sometimes referred to as the "Gemini space" (similar to how the sum of HTML pages available on the Internet is called "the web").

Gemini does support TLS, and that is pretty much the only technology from the modern web it supports. The practical security it provides in the "Gemini space" is in practice zero; the use of self-signed certificates is encouraged and the vast majority of Gemini sites have a self-signed certifiate.

The Gemini Markup

Some Gemini markup shown in KWrite. Tip: You can name files .md and have Gemini markup be shown correctly since Gemini is a subset of Markdown markup.

Those who are somewhat familiar with the Markdown markup language will immediately feel very comfortable with the Gemini markup language. Don't worry if you're not, Markdown is a simple markup language and Gemini is even simpler since it only supports a limited Markdown sub-set.

The Gemini Markup is mostly just plain text. Long lines are wrapped to fit the screen. Two short lines in a row are not wrapped. Long paragraphs should, therefore, be written as one long line of text. Blank lines are rendered as-is, five blank lines in a row are shown as five blank lines in a row.

Headings are made with the # sign. Add more for sub-headings, though you can only have three headline layers. There is nothing equivalent to HTMLs <h4></h4> sub-heading.

# Heading

## Sub-heading

### Sub-sub-heading

Lists can be made using bullet-points (*):

* Apple
* Pie

Blockquotes are made by prefixing text with >, just like you do with old-school e-mail.

> blockquotes!

Pre-formatted text can be added by adding ``` before and after the pre-formatted text.

                      ,;                         L.                
          .Gt       f#i                      t   EW:        ,ft t  
         j#W:     .E#t            ..       : Ej  E##;       t#E Ej 
       ;K#f      i#W,            ,W,     .Et E#, E###t      t#E E#,
     .G#D.      L#D.            t##,    ,W#t E#t E#fE#f     t#E E#t
    j#K;      :K#Wfff;         L###,   j###t E#t E#t D#G    t#E E#t
  ,K#f   ,GD; i##WLLLLt      .E#j##,  G#fE#t E#t E#t  f#E.  t#E E#t
   j#Wi   E#t  .E#L         ;WW; ##,:K#i E#t E#t E#t   t#K: t#E E#t
    .G#D: E#t    f#E:      j#E.  ##f#W,  E#t E#t E#t    ;#W,t#E E#t
      ,K#fK#t     ,WW;   .D#L    ###K:   E#t E#t E#t     :K#D#E E#t
        j###t      .D#; :K#t     ##D.    E#t E#t E#t      .E##E E#t
         .G#t        tt ...      #G      ..  E#t ..         G#E E#t
           ;;                    j           ,;.             fE ,;.

No hypertext language is complete without support for links. Gemini solves that by allowing you to link on single lines with just a link that start with =>. It can either just be a link:

=> gemini://

or a link with descriptive text next to it:

=> gemini:// Optional descriptive text

And that's all, folks. That's all you get to do in Gemini's markup language.

You may be left wondering how you would go about inserting a table into a Gemini page. You can't, so you don't.. You may also wonder how you make text bold or italic. You can't, so you don't.

Read the paragraph above this one if you have further questions about things you'd like to do using the Gemini markup language that we didn't mention in the examples of what you can do above.

The Protocol

The Gemini protocol is as simple as the markup language. Clients ask for a gemini:// The servers responds with 20 text/gemini and the Gemini document. Both client and server requests end their text lines with a CRLF (carriage return + line feed). And that's it, that's all there is to it.

Gemini Browsers

Gemini clients do not have to be very advanced. Making one is relatively easy, which is why there are so many of them.


Name Language Description
Amfora Go "fancy" terminal client.
Asuka Rust an NCurses-based Gemini client.
AV-98 Python Gemini client derived from the popular VF-1 Gopher client.
bollux Bash bash Gemini client.
bombadillo Go combined Gopher, Gemini, Finger, and File client with vim-inspired key mappings.
cgmnlm C colorful gemini line-mode client, fork of gmni.
diohsc Haskell simple line-based command-response terminal user interface with ANSI colour.
Elpher Emacs combined Gopher and Gemini client for the popular text editor / operating system.
gem.awk Awk minimal but usable interactive Gemini client in < 250 LOC of Awk.
gemini-demo-1 Python minimal but usable interactive Gemini client in < 100 LOC of Python 3.
gemini-demo-2 Lua minimal but usable interactive Gemini client in < 100 LOC of Lua.
gemini-demo-3 Go minimal but usable interactive Gemini client in not quite < 100 LOC of Go.
gemini-fetch Node.js cURL-like CLI for loading content from Gemini URLs.
gmni C CLI utility (like curl
min Go supports advanced features like input and client certificate generation.
ncgopher Rust gopher and gemini client for the modern internet.
tinmop Common Lisp opinionated Mastodon and Gemini client


Name Rating Language Description
Agregore Electron.js peer to peer web browser with support for loading Gemini pages.
Alrisha QML QML-based Gemini client.
Castor Rust graphical Gemini client using GTK.
Fafi Racket graphical Gemini browser written in Racket.
GemiNaut C# user friendly graphical Gemini client for MS Windows.
Lagrange Yeonjung-happy.jpgYeonjung-happy.jpgYeonjung-happy.jpgYeonjung-happy.jpgYeonjung-happy.jpg C Feature-complete and user-friendly desktop GUI client with inline image viewing, multiple tabs, bookmarks and more.
Lagrange showing
Moonlander Kim.Se-jeong.confused.jpgKim.Se-jeong.confused.jpgKim.Se-jeong.confused.jpg Rust A really simple Gemini client using the GTK toolkit. Has a few basic keyboard shortcuts and bookmarking functionality.
Moonlander showing Tunerapp.jpg
Kristall C++ graphical Gopher and Gemini client using QT.
spacewar Electron.js Gemini browser running on Electron.


Name Language Description
Ariane Kotlin/Java Gemini protocol client for Android based OS.
Deedum Dart an Android and iOS client made with Flutter.
Elaho Swift full featured Gemini protocol browser for iOS.
Gem Python Gemini client for Ubuntu Touch.
Xenia Java Gemini proxy for Android.
Phaedra Java Gemini client for Android supporting even very old ones; author recommends using Ariana if a current Android is at hand.

Gemini Servers

Name Language Description
Agate Rust simple Gemini server for static files.
a-h/gemini Go Server for Linux, Mac, Raspberry Pi. Supports SNI for multiple domains on the same server, has Docker image.
blizanci Erlang server designed primarily for robustness and security.
Denoscuri Typescript simple Gemini server written using Deno and Typescript.
Dʒɛmɪni Racket server with features like SNI and CGI.
Diamant Ruby simple Gemini server for static files.
Duckling proxy 🦆 Go scheme-specific filtering proxy for Gemini clients to access the web.
Earl Server Kotlin Gemini fileserver for the JVM.
Ergol PHP light Gemini server able to host several capsules with different cerificates.
GeGoBi Python server to facilitate easy Gemini-Gopher bi-hosting.
Gemeaux Python server using only the Python standard library.
gemini-ipfs-gateway Go an IPFS Gateway that makes IPFS content available over the Gemini protocol.
gemini-server Haskell lightweight server for the Gemini protocol.
geminid C Gemini Server in C.
geminid Scheme Gemini Server in CHICKEN Scheme.
gemini-php PHP simple Gemini server in PHP.
JAGS-php PHP fork of gemini-php with support of dynamic pages.
geminim Nim an async lightweight Gemini server made in Nim.
gmid C simple and secure Gemini server.
gmnisrv C high-performance Gemini server for POSIX systems.
Gemserv Rust server with features like vhosts, CGI, SCGI, reverse-proxying and more.
Germinal Common Lisp serves any type of document with an appropriate mime type.
GLV-1.12556 Lua the first Gemini protocol server with a lot of features.
Hydepark Rust discussion forum application for Gemini.
Jetforce Python built-in static file server with support for gemini directories and CGI scripts.
Lupa Pona Perl simple single directory Gemini server.
Marami Prolog server written in Prolog.
Molly Brown Go full-featured Gemini server implemented in Go.
net-gemini Go gemini server inspired by Molly Brown.
northstar Rust gemini server implementation.
Orbit PHP Gemini server implemented in PHP.
Phoebe Perl Gemini/web wiki.
pollux Rust simple server that will only serve one `index.gemini` file.
rc-gemd Shell simple Gemini server written in rc (for plan9 operating systems
Satellite Go small Gemini server for serving static files.
Shavit Go configurable Gemini server for UNIX operating systems.
Space-Age Clojure Gemini server written in Clojure.
Taurus Rust A Concurrent Gemini Server.
Titan Rust simple TOML-configured Gemini server and an Express-like Gemini server framework.
twins Go YAML-configured Gemini server supporting vhosts, FastCGI and reverse-proxying.
vger C Gemini server written in C used with inetd.

Tools / Utilities

Name Language Description
CAPCOM Python Atom feed aggregator for gemini.
cl-yag Common-Lisp Static site generator producing gemini, gopher and html.
comitium C A feed aggregator for gemini supporting many formats and protocols.
gemini-pandoc-lua-filter Lua lua filter for pandoc to output Gemini text.
gemini-to-html Node.js JavaScript library for parsing Gemini pages, and for rendering them to HTML.
geminize Firefox addon that redirects gemini:// URLs and links to a customizable HTTP-to-Gemini proxy. Bash Utility for writing and managing gemini logs (gemlogs
gem.git Python git frontend CGI script.
gemini_http Go simple tool for viewing gemini files that are placed on a http server.
gemmit Go social news aggregation and web content rating website for the gemini protocol.
gloggery Go basic static site generator for blogs in Gemini.
gmitohtml Go proxy that renders Gemini pages using HTML.
gmi2html Zig tiny gemtext to HTML converter with a focus on performance.
gmi2html Sed sed script to convert text/gemini to html.
gmi-web JS generate _semantic_ HTML styled for readability and mobile-friendliness.
gmnhg Go renders a Hugo site to a Gemini site.
gssg Go simple gemini static site generator. Generates pages, index and atom feeds.
Html2GeminiPy Python Converts Html sites to Gemini sites using markdownify and md2gemini.
kiln Go simple static site generator for Gemini sites.
Lupa you can see them at __gemini://
Manisha and compatible, such as Icinga plugin to monitor Gemini servers.
md2gmn Go renders Markdown text to Gemini pages.
md2gemini Python converter from Markdown to the Gemini text format.
spacewalk Go Page-hash based feed aggregator for gemini.
MastoGem Go Mastodon proxy for Gemini.

Video Presentations

Gemini Links

This isn't meant to be a catalog of the entire Gemini space, these are just a few links to you have something to try if you acquire a Gemini browser.

Add your comment
LinuxReviews welcomes all comments. If you do not want to be anonymous, register or log in. It is free.