Gemini (protocol)#Software
{{short description|TCP/IP application layer protocol}}
{{Infobox protocol
| name = Gemini
| image =
| caption =
| standard =
| developer = Solderpunk et al.
| introdate = {{Start date|2019|06}}
| website = {{URL|https://geminiprotocol.net/}}
}}
{{Infobox file format
| name = Gemtext
| icon =
| iconcaption =
| icon_size =
| screenshot =
| screenshot_size =
| caption =
|_noextcode =
| extension = .gmi, .gmni, .gemini
|_nomimecode = true
| mime = text/gemini
(unofficial)
| type_code = TEXT
| uniform_type =
| conforms_to =
| magic =
| developer = Solderpunk et al.
| released =
| latest_release_version = 0.24.1
| latest_release_date = {{start date and age|2024|08|28|df=yes/no}}
| genre = Markup language
| container_for =
| contained_by =
| extended_from =
| extended_to =
| standard =
| open = Yes
| url = {{URL|https://geminiprotocol.net/docs/specification.gmi}}
}}
{{IPstack}}
Gemini is an application-layer internet communication protocol for accessing remote documents, similar to HTTP and Gopher. It comes with a special document format, commonly referred to as "gemtext", which allows linking to other documents. Started by a pseudonymous person known as Solderpunk, the protocol is being finalized collaboratively and {{as of|2022|10|lc=y}}, has not been submitted to the IETF organization for standardization.
History
The Gemini project was started in June 2019 by Solderpunk. Additional work has been done by an informal community of users. According to Solderpunk's FAQ, Gemini is not intended to replace Gopher or HTTP, but to co-exist with them. Much of the development happened on the Gemini mailing list until the list disappeared at the end of 2021 due to a hardware issue.{{Cite web|url-status=dead|url=https://lists.orbitalfox.eu/listinfo/gemini|title=Gemini Info Page|archive-url=https://web.archive.org/web/20211020132800/https://lists.orbitalfox.eu/listinfo/gemini|archive-date=2021-10-20|access-date=2021-10-20}} The creation of the Usenet newsgroup comp.infosystems.gemini in October 2021 was the first new newsgroup in the Big Eight hierarchy in eight years.{{Cite web|url=https://lists.orbitalfox.eu/archives/gemini/2021/007388.html|title=Gemini Usenet Newsgroup|archive-url=https://web.archive.org/web/20211026220037/https://lists.orbitalfox.eu/archives/gemini/2021/007388.html#%3C704705533.350997.1635162832645@ichabod.co-bxl%3E|archive-date=2021-10-26|url-status=dead|access-date=2021-10-26}}
Design
The Gemini specification defines both the Gemini protocol and a native file format for that protocol, analogous to HTML for HTTP, known as "gemtext". The design is inspired by Gopher, but with modernisation such as mandatory use of Transport Layer Security (TLS) for connections and a hypertext format as native content type.{{Cite web|date=2023-03-23|title=Project Gemini Speculative Specification v0.16.1|url=https://gemini.circumlunar.space/docs/specification.gmi|website=gemini.circumlunar.space|quote=5 The text/gemini media type. Response bodies of type "text/gemini" are a kind of lightweight hypertext format, which takes inspiration from gophermaps and from Markdown.}}
The design is deliberately not easily extensible, in order to meet a project goal of simplicity.{{cite web |url=https://lwn.net/Articles/845446/ |first=Jake |last=Edge |title=Visiting another world |date=2021-02-10 |access-date=2021-02-19 |work=lwn.net}}
= Protocol =
Gemini is designed within the framework of the Internet protocol suite. Like HTTP/S, Gemini functions as a request–response protocol in the client–server computing model. A Gemini server should listen on TCP port 1965. A Gemini browser, for example, may be the client and an application running on a computer hosting a Gemini site may be the server. The client sends a Gemini request message to the server, and the server sends back a response message. Gemini uses a separate connection to the same server for every resource request.{{Cite web|date=2023-03-23|title=Project Gemini Speculative Specification v0.16.1|url=https://gemini.circumlunar.space/docs/specification.gmi|website=gemini.circumlunar.space|quote=1 Overview. Connections are closed at the end of a single transaction and cannot be reused.}}
Gemini mandates the use of TLS with privacy-related features and trust on first use (TOFU) verification being strongly suggested.{{Cite web|date=2020-11-29|title=Project Gemini Speculative Specification|url=https://gemini.circumlunar.space/docs/specification.gmi|url-status=live|archive-url=https://web.archive.org/web/20210512232442/https://gemini.circumlunar.space/docs/specification.gmi|archive-date=2021-05-12|access-date=2021-06-25|website=gemini.circumlunar.space|quote=4.2 Server certificate validation. Clients can validate TLS connections however they like (including not at all) but the strongly recommended approach is to implement a lightweight "TOFU" certificate-pinning system which treats self-signed certificates as first-class citizens.}}
File:Gemini-amfora-QXnB62ZnnsI.webm
Gemini resources are identified and located on the network by Uniform Resource Locators (URLs), using the URI scheme gemini://. A Gemini request consists only of such a URL, terminated by CRLF
; the header of a Gemini response consists of a two-digit status code, a space, and a "meta" field, also terminated by CRLF
. If the server is successful in finding the requested file, the "meta" field is the MIME type of the returned file and after the header follows the file data.
+ Example session
| Client | gemini://example.com/ |
Server | 20 text/gemini
# Example Title Welcome to my Gemini capsule. * Example list item => gemini://link.to/another/resource Link text |
=Gemtext format=
Gemtext format is line-oriented and the first three characters of a line determine its type. The syntax includes markup for headlines, flat list items, pre-formatted text, quotes and link lines. As with HTTP hypertext, URIs are encoded as hyperlinks to form interlinked hypertext documents in the Gemini "web", which users refer to as Geminispace.
Geminispace
"Geminispace" denotes the whole of the public resources that are published on the Internet by the Gemini community via the Gemini protocol. Thus, Gemini spans an alternative communication web, with hypertext documents, including hyperlinks to other resources easily accessible to the user.
{{As of|2024|July|post=,}} Geminispace consists of around 3900 online known Gemini appearances ("capsules") identified by crawling over 600,000 URIs.[https://proxy.vulpes.one/gemini/gemini.bortzmeyer.org/software/lupa/stats.gmi "Statistics on the Gemini space"] {{Webarchive|url=https://web.archive.org/web/20210211090333/https://proxy.vulpes.one/gemini/gemini.bortzmeyer.org/software/lupa/stats.gmi |date=2021-02-11 }}. Proxied gemini://gemini.bortzmeyer.org/software/lupa/stats.gmi
Software
class="wikitable sortable" style="table-layout: fixed;"
|+ Gemini clients include: |
scope="col" | Name
! scope="col" | Platform !Client Type ! scope="col" | License ! scope="col" | Written in |
---|
{{rh}} | [https://github.com/mochaman/alhena Alhena]
| Linux, macOS, Windows, BSD |GUI | GPL 3.0 | Java |
{{rh}} | [https://github.com/makeworld-the-better-one/amfora Amfora]
| BSD, Linux, macOS, Windows |Terminal (TUI) | GPL 3.0 | Go |
{{rh}} | [http://aminet.net/package/comm/net/AmiGemini AmiGemini]
| AmigaOS |GUI (Intuition) | MIT |
{{rh}} | [https://github.com/blmayer/ereandel ereandel]
| Bourne shell |Terminal (TUI) | MIT |
{{rh}} | [https://git.sr.ht/~julienxx/asuka asuka]
| |Terminal (TUI) | MIT |
{{rh}} | [https://tildegit.org/solderpunk/AV-98 AV-98]
| |Terminal (CLI) | 2 Clause BSD | Python |
{{rh}} | [https://tildegit.org/acdw/bollux Bollux]
| |Terminal | MIT | Bash |
{{rh}} | [https://bombadillo.colorfield.space Bombadillo]
| BSD, Linux, macOS |Terminal (TUI) | GPL 3.0 | Go |
{{rh}} | [https://github.com/Corewala/Buran Buran]
| Android |Mobile App | GPL 3.0 | Kotlin |
{{rh}} | [https://sr.ht/~julienxx/Castor Castor]
| |GUI (GTK) | MIT |
{{rh}} | [https://sr.ht/~julienxx/Castor9 Castor9]
|Plan 9 |GUI | | C |
{{rh}} | [https://github.com/snoe/deedum Deedum]
| Android and iOS |Mobile App | GPL 3.0 |
{{rh}} | [https://mbays.sdf.org/diohsc/ Diohsc]
| |Terminal (CLI) | GPL 3.0 | Haskell |
{{rh}} | [https://git.scuttlebot.io/%25V0D7DtSnZyyAp1NbgOJF2ZAFMeUy9eXwyClCEKYUYAI%3D.sha256 dillo-gemini]
|BSD, Linux, macOS |Plugin (Dillo) | FSFAP | Shell |
{{rh}} | [https://github.com/pitr/gemini-ios Elaho (gemini-ios)]
| iOS |Mobile App | MPL 2.0 | Swift |
{{rh}} | [https://github.com/emacsmirror/elpher Elpher]
| |GUI (Emacs) | GPL 3.0 |
{{rh}} | [https://codeberg.org/jeang3nie/eva Eva]
| |GUI (GTK) | MIT |
{{rh}} | [https://git.sr.ht/~soapdog/fafi-browser Fafi]
| |GUI | MIT | Racket |
{{rh}} | [https://www.marmaladefoo.com/pages/geminaut GemiNaut]
| Windows |GUI | GPL 3.0 | C# for Microsoft Windows |
{{rh}} class="table-rh" | [https://github.com/boomlinde/gemini.filter.dpi gemini.filter.dpi]
| |Plugin (Dillo) | MIT | Go |
{{rh}} class="table-rh" | [https://ranfdev.com/projects/geopard/ Geopard]
| |GUI (GTK) | GPL 3.0 |
{{rh}} class="table-rh" | [https://sr.ht/~sircmpwn/gmni gmni]
| |Terminal (CLI) | GPL 3.0 | C |
{{rh}} class="table-rh" | [https://github.com/dimkr/gplaces gplaces]
| Linux |Terminal (CLI) | GPL 3.0 or later | C |
{{rh}} class="table-rh" | [https://github.com/jfoucher/Jimmy Jimmy]
| macOS |App | MIT | Swift |
{{rh}} class="table-rh" | [https://kristall.random-projects.net Kristall]
| |GUI (Qt) | GPL 2.0 |
{{rh}} class="table-rh" | [https://gmi.skyjake.fi/lagrange Lagrange]
| Windows, macOS, Linux, iOS, Android |GUI | 2 Clause BSD |
{{rh}} class="table-rh" | [https://sr.ht/~admicos/moonlander Moonlander]
|Linux |GUI (GTK) | MIT |
{{rh}} class="table-rh" | [https://sr.ht/~lioploum/offpunk Offpunk]
| |Terminal (CLI) | 2 Clause BSD | Python |
{{rh}} class="table-rh" | [https://vaccor.space/rocketeer/ Rocketeer]
| iOS, macOS |App | | Swift |
{{rh}} class="table-rh" | [https://rosy-crow.app Rosy Crow]
| Android |Mobile App | MIT |
{{rh}} class="table-rh" | [https://orllewin.neocities.org/seren/ Seren]
| Android |Mobile App | | Kotlin |
{{rh}} class="table-rh" | [https://github.com/starfish-app/Starfish/ Starfish]
| elementary OS/Linux |GUI | GPL 3.0 |
{{rh}} class="table-rh" | [https://autistici.org/interzona/tinmop.html Tinmop]
| |Terminal (TUI) or GUI | GPL 3.0+ |
{{rh}} class="table-rh" | [https://telescope.omarpolo.com Telescope]
|BSD, Linux, macOS |Terminal (TUI) | ISC | C |
{{rh}} class="table-rh" | [https://github.com/InvisibleUp/twinpeaks Twin Peaks]
| Windows |GUI | GPL 3.0 | C# |
{{rh}} class="table-rh" | [https://atariage.com/forums/topic/326428-gemini-protocol-browser-virgil99/ VIRGIL99]
| TI-99 |Terminal | |
The Gemini software list covers client, server, libraries, and tools.{{Cite web |title=Gemini software |url=https://geminiprotocol.net/software/ |language=en}}
Gemini-to-HTTP proxy server gateways such as Mozz.us can be used by web browsers lacking Gemini support.{{Cite web |title=About Mozz.us |url=https://portal.mozz.us/about |language=en}}
Reception
Gemini is praised for its simplicity but criticized for "excluding people who use ordinary web browsers".{{cite web |last1=Proven |first1=Liam |title=Toaster-friendly alternative web protocol Gemini attracts criticism for becoming exclusive clique |url=https://www.theregister.com/2022/01/27/gemini_protocol/ |website=The Register |date=27 Jan 2022}} Gemini's usefulness has been said to be "dependent on the kinds of content available on Gemini and whether it appeals or not". Stéphane Bortzmeyer has said Gemini is retro but with modern features.{{Cite web |title=Gemini, a modern protocol that looks retro |url=https://archive.fosdem.org/2021/schedule/event/retro_gemini/ |access-date=2022-10-30 |website=archive.fosdem.org |language=en}}
See also
References
External links
- [https://geminiprotocol.net/ Official website]
- [https://geminiprotocol.net/docs/faq.gmi Project Gemini FAQ]
- [https://www.linux-magazine.com/Issues/2021/245/The-Rise-of-the-Small-Internet Gopher, Gemini, and the rise of the small Internet: Beyond the Web] in Linux Magazine
- [https://portal.mozz.us/ Mozz.us Gemini-to-HTTP proxy]
{{URI scheme}}
Category:Application layer protocols