# SERVER INFORMATION Hostname: gopher.kgivler.com Protocol: Gopher Port: TCP 70 Server software: HappyGopher Runtime: ..NET 10 Operating system: Ubuntu Linux host with a Linux container Service manager: Docker Compose Host deployment directory: /opt/joyful-stack Container application directory: /app Host content directory: /var/lib/happygopher/content Container content directory: /app/content Container user: Non-root .NET application user Transport security: None. Standard Gopher traffic is sent in plaintext. # ABOUT THE SERVER This gopherhole is served by HappyGopher, a small Gopher server written by Kyle Givler in C# and .NET. HappyGopher began as an experiment in implementing the Gopher protocol with a direct TCP listener. It has since grown into the software powering this site and part of a larger collection of classic Internet protocol services. The server supports: * Custom gophermap files * Automatic directory menus * Text, image, and binary content * Exact-selector compiled dynamic pages * Request timeouts * Selector size limits * Concurrent connection limits * Graceful shutdown * Mission Control telemetry Dynamic pages are resolved before static filesystem content. The first built-in example is available at: /server-time It returns the current server time in UTC as a Gopher text response. HappyGopher uses a reusable response writer for CRLF line endings, dot-stuffing, menu formatting, field sanitization, errors, and response termination. Requested selectors are normalized and checked to prevent directory traversal. Symbolic links and other filesystem reparse points are rejected when serving content. # DEPLOYMENT HappyGopher runs in a Docker container as part of the joyful-stack Docker Compose deployment. The container listens on TCP port 70 and publishes the same port on the VPS. The container runs as a non-root user. Linux capabilities are dropped except for NET_BIND_SERVICE, which is required to bind the traditional privileged Gopher port. Production content is mounted read-only from: /var/lib/happygopher/content to: /app/content This host mount replaces the sample content bundled in the container image. Production gophermap and text files are therefore maintained separately on the VPS. HappyGopher publishes best-effort startup and selector telemetry to Mission Control. Telemetry failures do not prevent the server from continuing to serve Gopher requests. # RELATED SERVICES This VPS also hosts several other public classic protocol services: * HappyEcho echo.kgivler.com TCP 7 * HappyDiscard discard.kgivler.com TCP 9 * HappyDaytime daytime.kgivler.com TCP 13 * HappyQOTD qotd.kgivler.com TCP 17 * HappyFinger finger.kgivler.com TCP 79 A fuller service list is available from this gopherhole in: services.txt # SOURCE CODE https://github.com/JoyfulReaper/HappyGopher HappyGopher is licensed under the MIT License. Copyright 2026 Kyle Givler .