HAPPYGOPHER HappyGopher is a small Gopher server written in C# and .NET 10. It began as an experiment in implementing the Gopher protocol and eventually became the server powering this site. HappyGopher deliberately avoids web frameworks, databases, JavaScript, and other machinery that a Gopher server does not need. At its core, it is a TCP listener, a content directory, a small routing layer, and the protocol handling required to produce correct Gopher responses. FEATURES * Custom gophermap menus * Automatic directory menus * Text, image, and binary file serving * Exact-selector compiled dynamic pages through IGopherPage * Dynamic-page precedence with static filesystem fallback * Reusable Gopher response writer * Correct CRLF line endings and response termination * Dot-stuffing for text responses * Menu-field sanitization * Configurable listening address, public host, and content root * Concurrent connection limits * Selector byte limits and request timeouts * Path traversal protection * Symbolic-link and reparse-point protection * Graceful shutdown * Best-effort Mission Control telemetry * Automated unit and integration tests * Windows Service support * Docker deployment on Linux * Non-root container execution DYNAMIC PAGES HappyGopher can serve compiled dynamic pages that implement IGopherPage. A dynamic page owns an exact Gopher selector, writes its response to the provided output stream, and reports the type of response it produced. Dynamic pages are checked before static files and directories. When no dynamic page matches, HappyGopher falls back to the normal content store. The live server currently includes: /server-time This page generates the current server time in UTC. At present, dynamic pages must be registered in the application during startup. Adding one therefore requires rebuilding and redeploying HappyGopher. A planned feature is runtime discovery of IGopherPage implementations from external assemblies. The intended design is a configured directory containing page plug-in DLLs that HappyGopher can discover and load at startup. That will allow new compiled pages to be added without recompiling the main HappyGopher application. The plug-in loader does not exist yet. The current IGopherPage support is compiled into the application. DEPLOYMENT HappyGopher runs in a Docker container on an Ubuntu Linux VPS as part of the joyful-stack Docker Compose deployment. The public instance is available at: gopher://gopher.kgivler.com/ The container listens on TCP port 70 and runs as a non-root user. Production content is mounted read-only from the VPS into /app/content. STATUS HappyGopher is experimental but operational. The static content server, generated menus, gophermap rendering, dynamic page routing, timeout handling, connection limits, security checks, and Mission Control telemetry are all in active use on the live server. SOURCE CODE https://github.com/JoyfulReaper/HappyGopher License: MIT Copyright 2026 Kyle Givler ====================================================================== .