When you start self-hosting over 50+ services on your own hardware, one of the biggest challenges is figuring out how to showcase your work without putting your entire infrastructure at risk.
A beautifully designed homelab landing page is incredibly satisfying to look at. Naturally, you might want to share screenshots or even the live URL with friends or potential employers.
However, exposing the direct login pages to sensitive internal panels—like Portainer (which has literal root access to my containers), Nextcloud (my private file storage), or Netdata (system metrics)—is a massive security risk. Even behind strong passwords, presenting an active login form to the open internet invites brute-force attacks and zero-day exploitation.
The Solution: Real Frontends, Disabled Backends
Instead of exposing my live services, the public-facing dashboard links to exact replicas of those login pages. I achieved this by writing Python scripts (using BeautifulSoup) that scrape the raw HTML, CSS, and SVG logos directly from my internal apps. It then automatically rewrites the asset paths, strips out all backend form-submit logic, and injects a preventDefault() JavaScript block.
For aggressive SPA frameworks like Stirling-PDF or Netdata, I go a step further, aggressively cleaning out the framework scripts that attempt to fire JSON requests to missing APIs, substituting them with identical static HTML overlays.
The result? If you click "Netdata" on my dashboard, you see the exact Netdata loading screen. But it’s fundamentally sandboxed. This allows me to confidently show off my stack in public, while restricting actual authentications strictly to my internal Tailscale mesh VPN.