Inspiration
Gopher is the internet that the Web erased. In 1991 it was a clean, hierarchical, text-first way to publish and browse documents; by 1995 browsers had made it irrelevant, and thousands of gopher holes went dark. Most of what is left is reachable only through a terminal client or a text-mode browser — technically alive, practically dead.
I wanted to know whether a 34-year-old protocol could feel native in a modern browser without pretending it is HTTP. GopherHollow is my answer: bring the protocol back to life, but make the experience of using it feel like 2026.
What it does
GopherHollow is a Gopher client and publisher that runs in the browser.
- Browse any gopher hole at
host:portand render its menu as a modern, navigable page instead of a wall of type-0/type-1 lines. - Search across the live Gopherspace with a crawler that walks menus, indexes item titles and text files, and exposes full-text search over what is actually reachable today.
- Render item types natively: menus as navigation, text files as readable documents, and binary items as downloads.
- Publish your own hole from the browser: write a document, and the server builds the menu tree and serves it over real Gopher.
How I built it
A Go backend speaks the Gopher protocol directly — one TCP connection per request, terminated by .\r\n — and exposes a small JSON API. A crawler walks the Gopherspace from a seed list, follows menu links breadth-first with per-host limits, and stores documents and links in SQLite for search. The frontend is a single-page app that renders menus and documents, keeps a real navigation history, and never leaks raw protocol bytes to the user.
Challenges
The protocol has no length prefix, no content type negotiation, and no error channel: a server closes the connection or returns an item type you did not expect. Slow or dead hosts hang indefinitely, so every fetch needs a timeout and a budget. Menus are also wildly inconsistent across servers, and the crawler has to survive malformed lines instead of crashing on them.
What I learned
Reaching back to a protocol with no framing taught me more about network failure modes than any modern HTTP work. It also made the value of a spec explicit: writing the behavior down first meant the agent implemented a documented contract instead of guessing.
What's next
Authoring tools for non-technical publishers, a public index snapshot so search works without a crawler running, and TLS for Gopher so the revival is not also a security regression.
Built With
- docker
- gin
- go
- kiro
- sqlite
- tailwindcss
- typescript
- vite
- vue-3
Log in or sign up for Devpost to join the conversation.