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.
The Moonlander Gemini browser showing the Techrights Gemini website.
|Internet media type|
(November 29, 2020 )
|Type of format||Markup language (like Markdown)|
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
Gemini is a hypertext protocol designed with those simpler times as a guideline.
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
# 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.
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:
or a link with descriptive text next to it:
=> gemini://example.com 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 Gemini protocol is as simple as the markup language. Clients ask for a
gemini://example.com/address. 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 clients do not have to be very advanced. Making one is relatively easy, which is why there are so many of them.
|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|
|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||C||Feature-complete and user-friendly desktop GUI client with inline image viewing, multiple tabs, bookmarks and more.|
|Moonlander||Rust||A really simple Gemini client using the GTK toolkit. Has a few basic keyboard shortcuts and bookmarking functionality.|
|Kristall||C++||graphical Gopher and Gemini client using QT.|
|spacewar||Electron.js||Gemini browser running on Electron.|
|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.|
|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.|
|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
|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.|
|geminize||Firefox addon that redirects gemini:// URLs and links to a customizable HTTP-to-Gemini proxy.|
|gemlog.sh||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://gemini.bortzmeyer.org/software/lupa/stats.gmi|
|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.|
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.