Gemini and Spartan without a browser

A particular joy of the Gemini and Spartan protocols – and the Markdown-like syntax of Gemtext – is their simplicity.

Screenshot showing this blog post as viewed over the Gemini protocol in the Lagrange browser
The best way to explore Geminispace is with a browser like Lagrange browser, of course.

Even without a browser, you can usually use everyday command-line tools that you might have installed already to access relatively human-readable content.

Here are a few different command-line options that should show you a copy of this blog post (made available via CapsulePress, of course):


Gemini communicates over a TLS-encrypted channel (like HTTPS), so we need a to use a tool that speaks the language. Luckily: unless you’re on Windows you’ve probably got one installed already1.

Using OpenSSL

This command takes the full gemini:// URL you’re looking for and the domain name it’s at. 1965 refers to the port number on which Gemini typically runs –

printf "gemini://\r\n" | \
  openssl s_client -ign_eof -connect

Using GnuTLS

GnuTLS closes the connection when STDIN closes, so we use cat to keep it open. Note inclusion of --no-ca-verification to allow self-signed certificates (optionally add --tofu for trust-on-first-use support, per the spec).

{ printf "gemini://\r\n"; cat -; } | \
  gnutls-cli --no-ca-verification

Using Ncat

Netcat reimplementation Ncat makes Gemini requests easy:

printf "gemini://\r\n" | \
  ncat --ssl 1965


Spartan is a little like “Gemini without TLS“, but it sports an even-more-lightweight request format which makes it especially easy to fudge requests2.

Using Telnet

Note the use of cat to keep the connection open long enough to get a response, as we did for Gemini over GnuTLS.

{ printf " /posts/gemini-without-a-browser 0\r\n"; cat -; } | \
  telnet 300

Using cURL

cURL supports the telnet protocol too, which means that it can be easily coerced into talking Spartan:

printf " /posts/gemini-without-a-browser 0\r\n" | \
  curl telnet://

Using Ncat/Netcat

Because TLS support isn’t needed, this also works perfectly well with Netcat – just substitute nc/netcat or whatever your platform calls it in place of ncat:

printf " /posts/gemini-without-a-browser 0\r\n" | \
  ncat 300

I hope these examples are useful to somebody debugging their capsule, someday.


1 You can still install one on Windows, of course, it’s just less-likely that your operating system came with such a command-line tool built-in

2 Note that the domain and path are separated in a Spartan request and followed by the size of the request payload body: zero in all of my examples

Screenshot showing this blog post as viewed over the Gemini protocol in the Lagrange browser×


  1. Spencer Spencer says:

    Fetching a website or API over telnet is a useful excercise for new web developers. It seems like almost all successful protocols are just text commands once you strip off encryption.

    1. Dan Q Dan Q says:

      @Spencer: 100%. I have fond memories of working this out during my first reading of the (then just-published!) HTTP/1.1 RFC and seeing what else I could pull off with what was functionally just a telnet client that was smart enough to turn off its terminal emulation negotiation features! FTP, IRC, SMTP, Gopher… all highly accessible over telnet.

      It pleases me a lot that, thanks to HTTP’s backwards-compatibility (I’m yet to see a HTTP/2 or HTTP/3 webserver that rejects connections that fail to upgrade protocol, but it might happen on some sad day), developers can still go through this rite of passage today. And that tools like ncat make the otherwise-hard part – the SSL/TLS layer- so lightweight and simple!

      (I also routinely appreciate that nginx can detect http connections attempted to https ports and respond appropriately: that’s a really cool and underappreciated feature of my favourite web server!)

Reply here

Your email address will not be published. Required fields are marked *

Reply on your own site

Reply by email

I'd love to hear what you think. Send an email to; be sure to let me know if you're happy for your comment to appear on the Web!