At home, I had converted my previously gaming computer into a server for my primary document and photo storage using TrueNAS Scale.
TrueNAS Scale is a platform on top of Debian, bundled with k3s. Naturally, the team behind TrueNAS took the opportunity to support Helm Charts for managing applications.
I have configured a domain (e.g.
mydomain.com) and its wildcard subdomain (e.g.
*.mydomain.com) to point to my TrueNAS server. This allows me to access my applications using the same root domain, differentiated by subdomains (e.g.
As my list of applications grew, the variants of subdomains linearly increased as well. I try my best to conveniently name the subdomain to what makes sense, but still sometimes I just can’t recall it.
And then, the 💡 idea showed up: what if there is an application to dynamically show all available apps? No configurations, just query the information directly.
TrueNAS internally has something like it, but it’s the administration page, which consequentially comes with authentication wall. I want something quick and dirty.
So I created wilsonehusin/ingress-directory. The look may be somewhat of an eyesore right now, but hey, incremental progress.
You can check out the source code yourself. The technical overview is quite minimalistic:
- kubernetes/client-go to query Kubernetes API server on list of Ingress objects which exists.
- The same Go program is also a web server to serve the traffic. Because of kubernetes/client-go, the simplest decision is to just write the web server in Go too.
- Frontend is built with TailwindCSS and AlpineJS. TailwindCSS CLI is really pleasant. I dread managing frontend libraries over Node when the only thing I need is a library or two.
Frontend may have been overkill because I could have written the HTML template renderer in Go, but I would not be learning anything new from this project. Thus, I decided to take the scenic route with AlpineJS and it was fun!
This has been quite a joyful exercise over ~2 weekends. With the program now deployed on my home server, I can imagine future me to want more from this project and I will save that for future me.