Desclution Link
Log in to the link.
A small members-only chatroom. Sign up with your email, pick a username and a spellword, and you're in.
Served from my desk
Checking…This runs on my desktop.
Not a cloud region, not a managed platform. Every message in Desclution Link goes through a machine sitting in my room. When it’s off, the link is off, and /status will tell you so.
- 01Youbrowser, over HTTPS
- 02Tailscale Funnelpublic HTTPS → my machine
- 03Home serverloopback-only port
- 04Docker networkprivate bridge
- 05ASP.NET Core + SignalRthe chat service
- 06PostgreSQLnever exposed
Why self-host it?
Partly an engineering exercise, partly an experiment in running real software on hardware I control.
Deploying to a managed platform hides the hard parts. Running it myself brings them all back: networking, storage, container lifecycles, monitoring, security boundaries, and what happens when the machine reboots.
The point isn’t to pretend a home server is production. It’s to understand what managed infrastructure actually does for you, by doing it by hand first.
What I learned
Networking
Tunnels, reverse proxies and why the service only listens on loopback. The public way in is Funnel, never an open port.
Persistent storage
Named Docker volumes, migrations that run on boot, and not losing the database when a container is rebuilt.
Container lifecycle
Health checks, restart policies and start-up ordering, so the chat service waits for Postgres instead of crashing.
Monitoring
A private Grafana, Prometheus and Alloy stack, reachable only over the tailnet, for logs and metrics from the box itself.
Security boundaries
Explicit CORS origins, rate limits, hashed spellwords, email-verified signups, and a database with no route in from outside.
Deploying by hand
git pull, docker compose up, check /health. Small enough to understand end to end, which is the whole point.