Poor Man's Web

The Small Web. “Smol Internet” or even “The Dork Web”. Many names for the modern phenomena of people getting away from the Big Internet of corporate gatekeepers, where data is money and users don’t own any of it anymore.

The Small Web is a reboot of the Internet as we know it. No, it’s not going to replace the Big Internet, but rather to create a niche for enthusiasts where people can freely express themselves, the tech stack is simple and transparent, where publishers have all the freedoms and consumers have a choice what to read. A place where time goes slowly and the content is created just for fun.

Isn’t it what we had 20-30 years ago?

Finger Protocol

The finger program existed back in the 70s, but “Finger-as-a-Service” appeared in 1991, as described in the RFC 1288. What finger does is telling the self-published information about the user. Typically it was some basic metadata (time zone, name, email) as well as the two text files from the user’s home directory: .project and .plan.

It was designed to be used as an alternative to the modern daily standups, but since people always brought some fun into computing - they put some humorous lines there, or just some personal wisdom (think of the old-school Twitter). Some even used it to query the number of bottles in the local vending machine!

If we speak about Finger Protocol, there is nothing simpler than that. Just establish a TCP connection to port 79 and send the user name you would like to query:

$ echo | nc typed-hole.org 79
Welcome to the Typed Hole
Uptime:  13:29:57 up 100 days, 12:27,  0 users,  load average: 0.37, 0.50, 0.64
Users currently logged in: probably julien

Available fingers:

username:               get user infos
username.feed:          get user latest toots
username.phlog:         get user latest phlog entry
lobsters:               get lobste.rs hottest stories
weather:                get typed-hole.org current weather
temp:                   get typed-hole.org current CPU temperature
cyoa:                   finger your own adventure
textfile:               read a random textfile from textfiles.com
smog:                   read SMOG e-zine issues

$ echo "julien" | nc typed-hole.org 79
Login: julien                           Name: julienXX
Directory: /home/julien                 Shell: /bin/bash
Timezone: Europe/Paris
Logged: no
| Protocol    | Address                                 | |..
| Gopher      | gopher://typed-hole.org                 | |..
|             | gopher://sdf.org/1/users/julienxx       | |..
| Gemini      | gemini://typed-hole.org                 | |..
|             | gemini://9til.de                        | |..
| Web         | http://www.julienblanchard.com          | |..
|             | https://www.circumlunar.space/~julienxx | |..
| Email       | julien@typed-hole.org                   | |..
| ActivityPub | @julienxx@fedi.9til.de                  | |..
| XMPP        | julienxx@xmpp.circumlunar.space         | |..
| Talk        | julien@typed-hole.org                   | |..

28.11.19 trying to setup an OpenNIC tier 2 server
04.01.20 added support for finger in Castor
11.01.20 Castor has an icon and a Makefile for easier installation
22.05.20 Typed-Hole will be unavailable for a few days as I'll be moving
03.06.20 The move went well, stuff should be back online. Working on an upcoming plan9 tilde server gopher://9til.de
05.06.20 Made a little finger server for plan9 https://git.sr.ht/~julienxx/finge.rc
19.07.20 Still working on 9til.de, so much things to do and learn before I can safely host people but it's shaping up
26.07.20 Successfully installed 9front under OpenBSD vmm
23.11.20 My laptop is now running 9front, do I really need another OS?

Simple as that. The 50-year-old technology like finger can be used to report today’s weather or the current top stories from Lobste.rs!

A modern reincarnation of Finger is probably https://special.fish/ - a low-tech social network focusing on people’s profiles rather than feeds.


Even though I can hypothetically imagine the comeback of Finger as a minimal micro-blogging or news platform, it has a problem with discoverability and interactive content.

The predecessor of the modern HTTP, Gopher, tried to solve these issues.

Gopher holes (that how websites would have been called, if not for HTTP) are collections of documents that a user can fetch or query.

Gopher became quite popular in the early days of the Internet, as it supported different content types (MIME types, in modern terms) and had great command-line and GUI clients for all the platforms.

Yet, underneath it all Gopher Protocol was not much harder than Finger, it also was just plain text sent over a TCP connection on port 70:

$ echo | nc typed-hole.org 70
ityped-hole.org TITLE   null.host       1
i               null.host       1
iWelcome to Typed Hole!         null.host       1
i               null.host       1
i               null.host       1
IYou are here   clusterhat.jpg  typed-hole.org  70
0Finger         julien  typed-hole.org  79
i               null.host       1
0What is the Typed Hole about?  typed-hole.txt  typed-hole.org  70
i               null.host       1
iSome of the gopher toys developed here:                null.host       1
i               null.host       1
1Choose your own adventure      /cyoa   typed-hole.org  70
1Lobste.rs      /users/julienxx/Lobste.rs       sdf.org 70
1Tilde.news     /users/julienxx/Tilde.news      sdf.org 70
1Soccer Standings       /users/julienxx/Soccer  sdf.org 70
i               null.host       1
1Phlog Roll     /~julienxx/moku-pona/updates.txt        typed-hole.org  70
i               null.host       1
iThe typed-hole commune:                null.host       1
i               null.host       1
1julienxx       /~julienxx/Log  typed-hole.org  70
i               null.host       1
i____________________________________________________________________________           null.host       1
i                        Gophered by Gophernicus/101 on Raspbian/9.11 armv6l            null.host       1

 echo /~julienxx/Log | nc typed-hole.org 70
i______ _     _                         null.host       1
i| ___ \ |   | |                        null.host       1
i| |_/ / |__ | | ___   __ _             null.host       1
i|  __/| '_ \| |/ _ \ / _` |            null.host       1
i| |   | | | | | (_) | (_| |            null.host       1
i\_|   |_| |_|_|\___/ \__, |            null.host       1
i                      __/ |            null.host       1
i                     |___/             null.host       1
i               null.host       1
i               null.host       1
i               null.host       1
iA dump of some stuff I learned and ramblings.          null.host       1
i               null.host       1
i               null.host       1
0[31 Mar 2019] Gopher aesthetics        /~julienxx/Log/gopher-aesthetics.txt    typed-hole.org  70
0[31 Mar 2019] Re: tomasino - fun answers       /~julienxx/Log/re-tomasino-fun-questions.txt    typed-hole.org  70
0[24 Jan 2019] Finger your own adventure        /~julienxx/Log/finger-your-own-adventure.txt    typed-hole.org  70
0[06 Jan 2019] Plain-text chat  /~julienxx/Log/plain-text-chat.txt      typed-hole.org  70
0[31 Jul 2018] Announcing Soccer on Gopher      /~julienxx/Log/soccer.txt       typed-hole.org  70
0[27 Jul 2018] Gophsters        /~julienxx/Log/gophsters.txt    typed-hole.org  70
0[25 Jul 2018] Lobste.rs        /~julienxx/Log/lobste.rs.txt    typed-hole.org  70
0[10 Jul 2018] Phlogging        /~julienxx/Log/phlogging.txt    typed-hole.org  70
0[25 Jul 2017] Journaling my life at work using Github  /~julienxx/Log/journaling.txt   typed-hole.org  70
0[24 Jul 2017] Getting started with F# and .NET Core    /~julienxx/Log/fsharp.txt       typed-hole.org  70
0[14 May 2016] Fancy Rust development with Emacs        /~julienxx/Log/rust_emacs.txt   typed-hole.org  70
0[17 Nov 2015] Rust on AWS Lambda       /~julienxx/Log/rust_lambda.txt  typed-hole.org  70
0[29 Oct 2015] Using Resque with Rust   /~julienxx/Log/resque_rust.txt  typed-hole.org  70
0[13 Jul 2015] How I upgraded my Ruby with Contracts    /~julienxx/Log/contracts.txt    typed-hole.org  70
i               null.host       1
i____________________________________________________________________________           null.host       1
i                        Gophered by Gophernicus/101 on Raspbian/9.11 armv6l            null.host       1

Even though it’s still readable, that’s not how Gopher was meant to be consumed. The Gopher client should parse the input line by line, tell the line type by its first character (i=“info”, 0=“text file”, 1=“directory” etc) and present it to the user in an eye-candy manner.

For example, all this tab-separated columnar data is just links - human readable link name, followed by the document path, host name, and port. These can be represented as clickable buttons or assigned to hotkeys to make the navigation easier.

Most Gopher clients also supported the bookmarks and the navigation history, much like the modern web browsers do.


Enough of the history. Both Finger and Gopher are still alive today, but are mostly abandoned. The revival of the old web comes with the Gemini protocol.

In its simplicity, Gemini resembles Gopher a lot. However, it uses TLS for secure connections, MIME types for content, and supports some basic text formatting.

And it is still accessible with nothing but netcat!

$ echo gemini://gemini.circumlunar.space/ | ncat -C --ssl gemini.circumlunar.space 1965
20 text/gemini
# Project Gemini

## Overview

Gemini is a new internet protocol which:

* Is heavier than gopher
* Is lighter than the web
* Will not replace either
* Strives for maximum power to weight ratio
* Takes user privacy very seriously

## Resources

=> docs/        Gemini documentation
=> software/    Gemini software
=> servers/     Known Gemini servers
=> https://lists.orbitalfox.eu/listinfo/gemini  Gemini mailing list
=> gemini://gemini.conman.org/test/torture/     Gemini client torture test


The first reponse line is a status code and a MIME type, followed by the markdown-like document with headers, lists and links. Additionally, preformatted text and quotes are supported.

If you ever dreamt of the web without bloat - that’s Gemini.

I tried writing a unified client for Finger, Gopher and Gemini and it took me no more than 2 hours for both, CLI and primitive GUI versions (using Go+Lorca). The protocol is simple enough for beginners to write a decent client. I highly recommend you to give it a try, it is very rewarding to have your own “browser” surfing the Small Web!

But what’s next?

History repeating

Gopher came into decline when HTTP arrived. Gemini now tries to resurrect it by offering roughly the same set of features, only 20 years later. So far it’s working surprisingly well - at the moment of writing Gemini has 280K pages, and it keeps growing! Most of the pages are plain text, followed by images, followed by audio/video/binary. English dominates as a language, and all the pages are hosted on roughly 1K “capsules” (sites).

Yet, Gemini receives a fair criticism – one can achieve similar experience of the small web using plain HTML/CSS and running a self-hosted blog with RSS. Maybe the killer feature of Gemini is being niche and geek-friendly, much like web felt in its early days.

Anyway, The Gopher Renaissance is happening right now, and it’s up to you to decide whether the world needs it or not. I have some irrational warm feeling towards Gemini, I even considered making this blog available on Gemini/Gopher. If only there was a public Gemini capsule that could grab plain semantic HTML or Markdown and serve it via Gemini. Even some API to publish GMI files form the CI/CD pipeline would be good. But that’s probably a topic for another post.

I hope you’ve enjoyed this article. You can follow – and contribute to – on Github, Mastodon, Twitter or subscribe via rss.

Apr 27, 2021