HappyFinger and HappyEcho July 11, 2026 Apparently my VPS is becoming a retirement home for ancient Internet protocols. It started with HappyGopher, my small Gopher server running publicly on port 70. Once that was working, the obvious next question was: what other old protocols can I resurrect with entirely too much modern .NET infrastructure? The first answer was HappyFinger. HappyFinger is a tiny Finger server written as a .NET 10 Worker Service. It listens on the traditional Finger port, TCP 79, accepts a request, and returns the deeply useful response: ``` You fingered me! How dare you! ``` That is currently the entire service. It has connection limits, request timeouts, asynchronous socket handling, graceful shutdown, and a proper systemd service. All of that engineering exists to deliver one stupid sentence over a protocol created before I was born. Perfect. Then came HappyEcho. HappyEcho implements the classic Echo Protocol on TCP port 7. Send it some bytes and it sends the same bytes back. No HTML, no JSON, no JavaScript, no account system, and no twelve-layer enterprise architecture. Just bytes going in and the same bytes coming back out. Because exposing a raw echo service to the public Internet is at least slightly questionable, HappyEcho has a few practical protections: ``` - A maximum number of concurrent connections - A connection timeout - A maximum number of bytes echoed per connection - Pooled network buffers - A systemd memory limit - An unprivileged Linux service account - Only CAP_NET_BIND_SERVICE for binding port 7 ``` So it is not completely reckless. It is safeish. Both services are now running on the same inexpensive VPS as HappyGopher, Random Steam Game, Uptime Kuma, Beszel, and IT-Tools. Somehow the machine still has plenty of memory and spends most of its time doing absolutely nothing. There is something satisfying about running protocols like Gopher, Finger, and Echo on modern infrastructure. They are small enough that I can understand nearly every part of the implementation. There is no framework hiding what happens between accepting a socket and returning a response. They also make excellent excuses to experiment with networking, Linux services, resource limits, monitoring, and deployment without needing to invent another giant application. The modern web does not need another TCP echo server. That is exactly why I made one. .