• I Replaced My Web Stack With Gopher (1991) and Failed Less
  • ___
  • |_ _|
  • | |
  • |___|
  • ___ _ _
  • | _ \ ___ _ __ | | __ _ __ ___ __| |
  • | / / -_) | '_ \ | | / _` | / _| / -_) / _` |
  • |_|_\ \___| | .__/ |_| \__,_| \__| \___| \__,_|
  • |_|
  • __ __
  • | \/ | _ _
  • | |\/| | | || |
  • |_| |_| \_, |
  • |__/
  • __ __ _
  • \ \ / / ___ | |__
  • \ \/\/ / / -_) | '_ \
  • \_/\_/ \___| |_.__/
  • ___ _ _
  • / __| | |_ __ _ __ | |__
  • \__ \ | _| / _` | / _| | / /
  • |___/ \__| \__,_| \__| |_\_\
  • __ __ _ _ _
  • \ \ / / (_) | |_ | |_
  • \ \/\/ / | | | _| | ' \
  • \_/\_/ |_| \__| |_||_|
  • ___ _
  • / __| ___ _ __ | |_ ___ _ _
  • | (_ | / _ \ | '_ \ | ' \ / -_) | '_|
  • \___| \___/ | .__/ |_||_| \___| |_|
  • |_|
  • __ _ ___ ___ _ __
  • / / / | / _ \ / _ \ / | \ \
  • | | | | \_, / \_, / | | | |
  • | | |_| /_/ /_/ |_| | |
  • \_\ /_/
  • _
  • __ _ _ _ __| |
  • / _` | | ' \ / _` |
  • \__,_| |_||_| \__,_|
  • ___ _ _ _
  • | __| __ _ (_) | | ___ __| |
  • | _| / _` | | | | | / -_) / _` |
  • |_| \__,_| |_| |_| \___| \__,_|
  • _
  • | | ___ ___ ___
  • | |__ / -_) (_-< (_-<
  • |____| \___| /__/ /__/
  • ╔─*──*──*──*──*──*──*──*──*──*──*──*──*──*──*──*─╗
  • ║1 ........................................ 1║
  • ║2* ........................................ *2║
  • ║3 ........................................ 3║
  • ║1 ...........Posted: 2026-01-22........... 1║
  • ║2* Tags: gopher haskell my_warez my_servs . *2║
  • ║3 ........................................ 3║
  • ║1 ........................................ 1║
  • ╚────────────────────────────────────────────────╝
  • # RFC-ish
  • Please *DO NOT* share.
  • If you're reading this it's because I think your opinion *particularly* matters
  • when it comes to software design and/or the Gopher Protocol, or something along
  • those lines.
  • I'm looking for comments along these lines:
  • * Spirit/abstract of this message as well as the style (the vibes and overall
  • message)
  • * Technical inaccuracies
  • * Missing counterarguments
  • * Places I'm being hand-wavy
  • * Links/sources I should add
  • * Alternative titles (or if you like the current, or could suggest another)* I
  • Replaced Complexity with Intimacy: A Love Letter to RFC 1436
  • * Scale Dazzles, Intimacy Sustains: A Formal Defense of Gopher
  • Please submit any comments to me via:
  • * IRC/XMPP: https://gopher.someodd.zip/services/irc.md (I'm also in the Bitreich
  • IRC, but I may miss your message)
  • * Email: hi@someodd.zip
  • * Mastodon: @someodd@fosstodon.org[1]
  • * You could even leave a comment on Phorum[2] or Interlog[3]
  • # Intimacy in the Forgotten Stack
  • *- Scale dazzles; intimacy sustains.*
  • > "I find no peace, and yet I make no war; I fear, I hope, I burn, and I am ice;
  • > I fly above the heavens, yet lie on the ground; And nought I have, and all the
  • > world I seize on." -- *Petrarch, Canzoniere 134*
  • *Don't worry, this isn't going to be one of those essays where a guy quotes
  • Petrarch and then explains Kubernetes.* However, I feel the simple prose of
  • Gopher replacing my modern software stack merits flourish.
  • I replaced a modern web stack with a 1991 protocol and got fewer failures and
  • more time to spend joyfully.
  • A system is a love poem. Perhaps short, hopefully faithful in form: composed of
  • verses that speak to each other, remembered by heart, and carried as one's own
  • craft.
  • Fidelity lives in intimacy. The romance of lovable systems lies in three
  • virtues:
  • * **Knowability**: small enough to live in your head.
  • * **Composability**: its parts can be *composed like verses*, each complete,
  • each
  • in dialogue.
  • * **Ownership**: you bear the stake, so you care.
  • From these emerge resilience, clarity, and joy.
  • My proof is **Gopher**: a 1991 protocol whose RFC you can whisper like a sonnet.
  • On it I've built and self-hosted a publishing stack. I chose it because those
  • three virtues endure.
  • Some say Gopher is dead. True. So am I... *eventually*. Until then, let's serve
  • menus :p
  • Closeup of my server
  • ## The Value (beyond vibes)
  • > "Neither can embellishments of language be found without the order of thought,
  • > nor thoughts shine without the light of language." -- Cicero, *De Oratore* III
  • > (trans.)
  • **Cognition**: Humans don't scale; architecture must. Compose into units one
  • brain can hold. Short feedback loops cut repair time. Treat complexity as a
  • budget: spend it at seams, not in guesswork. Intimacy helps individual
  • understanding; shared mental models are still hard to build.
  • **Contracts**: Interfaces are promises. State inputs, outputs, guarantees;
  • version them small. When seams aren't in daylight, microservices congeal into a
  • distributed monolith. Contracts alone don't create shared meaning.
  • **Ownership**: Reliability is a who. If everyone owns it, no one does. Name a
  • steward, grant authority, and keep accountability humane. Most failures begin at
  • unowned handoffs. The cost is a bus factor--so intimacy needs an exit plan, for
  • a new brain to rely on.
  • **Joy**: Joy is operational. Teams maintain what they love; miserable tools get
  • bypassed. Fast to hack means fast to debug and easy to teach: morale compounds
  • into uptime.
  • As an extreme case, I wrote a Gopher daemon in i386 assembly (gasm[4]): ~2 KB
  • binary, ~24 KB RAM at runtime.
  • This approach doesn't replace large-scale systems; it constrains parts of them.
  • Scale isn't forbidden. Aim to keep some components small enough to reason about.
  • I use this where it fits: edges, tools, internal services, publishing, glue.
  • This thesis locates exactly where intimacy belongs: at the seams.
  • ## A Smaller Internet Taught Me This
  • > "Simplicity is intentional." -- *RFC 1436*
  • *I've seen stacks with more layers than a Viennese pastry. Gopher, by contrast,
  • is toast.*
  • Most people assume the web *is* the Internet. Click a link, scroll a page,
  • curtain falls; applause. But that's only one act of a much older play.
  • Gopher was born at the University of Minnesota, 1991. Specified in RFC 1436[5],
  • brief, deliberate, legible. In fact, "surfing the Internet" was coined before
  • the web by Gopher's own Mark McCahill[6].
  • Quick technical overview (see its simplicity, knowability, composability):
  • - Send a *selector* like `/foo/bar.txt` or `Hello, world!` to the server, get
  • back text/file/menu
  • - Menu-driven navigation: special text the client knows how to present; each of
  • its lines links to a *selector* with a letter code the client needs in order
  • to understand how to present the content it links to (text/menu/file)
  • - Its flourish, `IndexSearch`, simply sends a user-specified string to a
  • selector, getting a menu back
  • - Therefore, strict separation of navigation and content
  • - The rest is up to the client, the user, that's the contract
  • That's the whole contract. That restraint is decadent. Its simplicity is
  • permissive; I made/ported games on my gopherhole[7] (having even turned ALL of
  • Gopherspace into an MMORPG[8]).
  • The Internet Gopher Protocol hides a lesson in its structure: simple, easily
  • glued together, easy to master. The point is the shape of the relationships you
  • can still see.
  • Simplicity is compression for the mind.
  • ### How I Fell In (and Stayed)
  • > "In striving to be brief, I become obscure." -- Horace, *Ars Poetica*.
  • I fell into Gopher by implementing the spec. I wrote a tiny client, Waffle[9],
  • straight from RFC 1436[10], that experience started a journey that rewired my
  • taste.
  • Pressure-testing Gopher through heavy self-hosting[11], adjacent protocols like
  • Gemini[12] (richer, but more complex), participation at Bitreich[13] (Gopher
  • liminalists led by a suckless[14] trickster), and conversations with people who
  • built these systems (including Gopher and first MMORPG[15] co-author Bob
  • Alberti[16]) made a pattern obvious: legibility enables punk hackability.
  • All this rewired my taste. I now bias toward protocols and tooling I can explain
  • end-to-end, because that collapses debugging time and makes iteration cheap.
  • Gopher is small enough that experimentation stays local--when something breaks,
  • the failure surface is still human-scale.
  • The smallness of the protocol also gave me room to experiment with
  • LiquidHaskell[17] and Nix[18]. Gopher's narrow grammar, thus clarity, separated
  • novelty from signal and sharpened my sense of the Unix creed: *do one thing
  • well, and glue it with joy.*
  • Constraints aren't cages; they're invitations.
  • *Tell someone you're writing a Gopher server in 2025 and they look at you like
  • you hand-weave shoelaces. Which... yes.*
  • ## The Stack, the Masquerade
  • > "And all things are bound together, each by its secret affinity." -- Giordano
  • > Bruno, *De Vinculis in Genere* (On Bonds in General)
  • The masquerade is choreography.
  • It's three small daemons with narrow contracts: build, serve, search.
  • Behind the velvet masks and candle-smoke, everyone knows their part. The music
  • is simple. The rules are strict. That is why the dance holds.
  • **Bore: the Scrivener.**[19] At the corner table, he scratches furiously with a
  • quill. Every file I drop in a directory, he arranges into order: indexes, feeds,
  • flourishes, prepared for gopherspace. His fidelity is quiet and absolute.
  • **Venusia: the Confidant.**[20] From boring, quotidian tomes, to occult
  • incantations of READMEs which are actually Literate Haskell Scripts[21], she
  • whispers it onto the public wire. Private to published is a single breath.
  • **Ryvm: the Librarian.** [22] Among crowded shelves kept in careful order, he
  • retrieves fitting volumes according to inquiry. Technically, a full text search
  • engine for the file system which is formally verified (using LiquidHaskell
  • [practical here precisely because the surface area is small]): query in,
  • documents out. Memory without mysticism.
  • Together they dance: Scrivener, Confidant, Librarian. Their steps are simple,
  • their composition resilient.
  • Their secret: the masks are swappable.
  • Bore could be Make; Venusia, gophernicus; Ryvm, `grep`.
  • The names are mnemonic; the architecture (e.g., separable contracts) matters
  • more than the cast.
  • Keep the contracts and the choreography holds.
  • ------------------------------
  • What this makes possible (beyond Gopher):
  • - **Dashboards** that expose system health with the same ease as serving a poem.
  • - **Journaling** where each entry is an artifact, mirrored seamlessly to the
  • web.
  • - **Resilient hosting** on shaky Wi-Fi or tiny single-board machines -- the
  • stack hums even on a gondola's bandwidth.
  • "Why not just Markdown + S3?" Because protocol primitives shape cognition. Menus
  • and selectors discipline navigation and recovery. Venusia[23] can serve static
  • files *or* shell-scripted gopherapps with equal, hackable grace.
  • Compose systems as you would compose a sonnet: strict form, infinite play.
  • *My observability stack is called `tail -F`. Sometimes I upgrade it to
  • "coffee."*
  • ### How it feels to maintain my gopherhole
  • On my laptop I mount `source/` over `sftp`, write a phlog in plain text with
  • some frontmatter[24] and maybe a small ASCII flourish. **Save.** Bore rebuilds,
  • The ryvm-searchable results appear in `output/`, which is served to gopherspace
  • by Venusia, which I also have mounted. `output/` also contains non-generated
  • files like media and binaries (and more text!), untouched by the build.
  • When I want something dynamic, I write a small Literate Haskell script (or a
  • longer one[25]) and configure Venusia ( `routes.toml`) to execute it via
  • `runghc`. Some examples on my gopherhole[26]:
  • * GopherGPT[27]: an LLM you can talk to via Gopher
  • * Interlog[28]: an experimental phorum
  • * Colossal Cave: play the original text adventure game!
  • No ceremony, no framework gravity.
  • I host a friend's elegant Gopher-HTTP proxy[29] I modified (which I use
  • here[30]). Sometimes I mirror to the web[31]. Jekyll sweeps the artifacts to
  • HTTP; a friend's proxy speaks `Gopher <-> HTTP` without drama.
  • The fastest RCA is the one your brain can run in real time.
  • *Most of the system's reliability comes from the fact that there isn't much of
  • it.*
  • ## Reflection: Techno-Romance, Not Neo-Luddism
  • -- yet another tech manifesto?
  • > "Be wise, drink free, and scale your long hopes to the short measure of time."
  • > -- Horace, *Odes* I.11
  • This is a preference for systems small enough to be held. Love is a positive
  • quality, rather than a differential relation like "anti-bloat." I fell when I
  • could hold it in my head. The RFC had margins. Daemons had names. The shape of
  • the system was legible. Intimacy was the revelation.
  • I stopped caring about bug counts. What mattered was how fast I could understand
  • them. The hard problem is actually the limits of minds.
  • > "Thinking of it like that, a method of easily serving directories of data,
  • > **rather than a scaled down web** makes the whole thing more appealing I
  • > think." -- Rob Sayers
  • From small, stubborn tools I learned something larger than any protocol: that
  • constraint *aims* creativity. That depth hides in restraint. That learning
  • happens fastest when a system resists excess and invites attention. A tool you
  • can know by heart teaches you how to think, not just how to deploy.
  • There was joy in the quiet satisfaction of care. Config files that behaved.
  • Systems whose quirks became familiar. That joy is a reliability feature, because
  • we maintain what we understand, and we understand what we stay close to.
  • Gopher got composted early (got this idea by interviewing Cory Doctorow for the
  • documentary), returning its nutrients to the soil: clarity, patience, craft.
  • What matters is choosing systems, and lives, that can be tended. To know a thing
  • deeply. To care for it responsibly. To leave it better than we found it.
  • That is enough.
  • ## Closing invitation: Menu Walk with Me
  • I'm turning a page, and leaving a mark here. This stack remains my way of
  • publishing, my daily companion, my practice.
  • You can explore my gopherhole[32] (try Lagrange[33] [GUI] or Bitreich's sacc[34]
  • [TUI]) , open an issue on GitHub, or drop by my IRC/XMPP, or other services[35].
  • I'll be there: maintaining, debugging, supporting, building.
  • Come walk the menus. If the conversation holds, let's work together.
  • ## Special thanks
  • - **Bob Alberti**, for generosity, history, and play. And y'know, for his work
  • on the Internet Gopher Protocol.
  • - **Screwlisp**
  • - **Bitreich**[36], without which this thesis and my deep love of Gopher would
  • never have crystalized. Their work on bringing Gopher with into 2026 and
  • beyond--and telling people why, is crucial.
  • - **Norm Macdonald**, for teaching restraint, timing, and when *not* to explain
  • the joke.
  • - **Federico Fellini**, **Andrea Zanzotto**, **Francesco Petrarca**, and
  • **Thomas Mann**, whose work shaped the voice and patience behind this essay.
  • *(Zanzotto collaborated directly on* Fellini's *Casanova*; this piece
  • knowingly borrows that lineage.)
  • - **The MADE**, for taking small histories seriously.
  • - The Gopher community and the wider smallnet/indieweb world, for keeping
  • clarity alive without spectacle.
  • - **Fosstodon**, for reviewing this document and for always being a well of
  • support.
  • - The users on my IRC and XMPP servers, who tolerate long explanations and ask
  • better questions.
  • And thank **you** for reading. At the core of all of this is a simple hope: that
  • care is legible, and that someone else might recognize it and respond.
  • ## Footnotes
  • [1]: @someodd@fosstodon.org: https://fosstodon.org/@someodd
  • [2]: Phorum: https://gopher.someodd.zip/1//phorum
  • [3]: Interlog: https://gopher.someodd.zip/1//interlog
  • [4]: gasm: https://github.com/someodd/gasm
  • [5]: RFC 1436: https://datatracker.ietf.org/doc/html/rfc1436
  • [6]: Gopher's own Mark McCahill: https://en.wikipedia.org/wiki/Mark_P._McCahill
  • [7]: my gopherhole: gopher://gopher.someodd.zip
  • [8]: turned ALL of Gopherspace into an MMORPG: /phlog/gopherspace-rpg.gopher.md
  • [9]: Waffle: /phlog/waffle.gopher.txt
  • [10]: RFC 1436: https://www.rfc-editor.org/rfc/rfc1436
  • [11]: self-hosting: https://gopher.someodd.zip/1/services
  • [12]: Gemini: http://geminiquickst.art/
  • [13]: participation at Bitreich: /phlog/brcon-2025.gopher.txt
  • [14]: suckless: https://suckless.org
  • [15]: first MMORPG: /phlog/scepter_of_goth.gopher.txt
  • [16]: Bob Alberti: https://albatross.org
  • [17]: LiquidHaskell: https://github.com/ucsd-progsys/liquidhaskell
  • [18]: Nix: https://nixos.org/
  • [19]: **Bore: the Scrivener.**: https://github.com/someodd/bore
  • [20]: **Venusia: the Confidant.**: https://github.com/someodd/venusia/
  • [21]: READMEs which are actually Literate Haskell Scripts: https://github.com/someodd/grpg/blob/master/README.md
  • [22]: **Ryvm: the Librarian.** : https://github.com/someodd/ryvm
  • [23]: Venusia: https://github.com/someodd/venusia
  • [24]: frontmatter: https://jekyllrb.com/docs/front-matter/
  • [25]: or a longer one: /phlog/gopherspace-rpg.gopher.md
  • [26]: my gopherhole: https://gopher.someodd.zip
  • [27]: GopherGPT: https://gopher.someodd.zip/0//phlog/chatgopherpt.gopher.txt
  • [28]: Interlog: https://github.com/someodd/interlog
  • [29]: a friend's elegant Gopher-HTTP proxy: https://github.com/sternenseemann/gopher-proxy
  • [30]: here: https://gopher.someodd.zip
  • [31]: I mirror to the web: https://www.someodd.zip/phlog-mirror
  • [32]: my gopherhole: gopher://gopher.someodd.zip/
  • [33]: Lagrange: https://gmi.skyjake.fi/lagrange/
  • [34]: sacc: https://packages.debian.org/sid/sacc
  • [35]: my IRC/XMPP, or other services: https://gopher.someodd.zip/services/
  • [36]: **Bitreich**: gopher://bitreich.org