← The Journey

Building Momentum: Homelab Services + Website Launch

Projects 2026-06-08 · Sunday 4 min read 80% AI

Energy sitting at 6/10, mood a flat meh — not the conditions you'd associate with what turned out to be one of the more productive days in recent memory. Between waking up and the end of the night, a full observability stack came online, two services became publicly accessible behind Cloudflare tunnels, and a portfolio website went from a blank folder to live on Vercel. Six sessions. One day.

The Monitoring Stack

Started with the homelab. The goal was proper observability — something that would tell me what's actually happening on the OptiPlex rather than just assuming everything's fine. Spun up Prometheus, Grafana, Loki, Promtail, Node Exporter, cAdvisor, and UnPoller as a full Docker stack, then built a custom Homelab Overview dashboard through the Grafana Python API. Panels for WAN uptime, device count, container count, CPU, memory, disk, network throughput, and PoE power draw. It went live at status.n5hq.me.

Not everything was clean. The dashboard imports were a mess — wrong metric prefixes, corrupted variables — and needed patch scripts to sort out. cAdvisor on cgroup v2 doesn't emit container name labels, so Docker containers show up as hash paths instead of readable names. The WAN uptime panel also has a query bug: the failover interface returns -1 when inactive and drags the average down. Workarounds in place but the clean fixes are queued for next session.

Immich Goes Public

While the monitoring stack was still fresh, got Immich publicly accessible at photo.n5hq.me through the existing Cloudflare Zero Trust tunnel — added a second hostname to the same cloudflared instance that was already routing Home Assistant. No Docker changes needed, just configuration. Satisfying because of how simple it was.

Website: Zero to Live in a Day

The rest of the day was six sessions of website work.

Session one built the initial landing page: a single index.html with a Navy/Teal/Beige colour palette, Poppins display paired with Inter body, responsive mobile-first, and deployed to GitHub and Vercel before the session closed. Sessions three through six expanded it into a full portfolio system — About Me with career goal and stat cards, expandable portfolio tiles, dedicated project pages for in-progress and upcoming work, a full HomeLab showcase page with all the infrastructure detail, and a Contact form routing to FormSubmit.co.

Session four built the blog publishing system from the ground up. A Node script scans the Obsidian vault journals, extracts frontmatter, copies the markdown files to blog/posts/, and generates a posts.json manifest. The blog index and reader are live on the site. This journal entry was the first post published. Session five was almost entirely bug fixes — the reader was fetching wrong file paths, the sidebar was showing duplicate entries, and the blog index was broken from calling undefined functions. All fixed, but it took a full session. Session six added the claude_pct frontmatter field, which controls the AI disclosure badge shown on each post. Honest, and genuinely interesting context for anyone reading.

What's Next

  • Fix WAN uptime panel query (wan_networkgroup="WAN" filter)
  • Decide on Cloudflare Access for Immich (photos are sensitive)
  • Update Cloudflare DNS — point n5hq.me root + www to Vercel CNAME
  • Verify domain shows valid in Vercel after DNS update
  • Replace website placeholder copy with real bio and project descriptions
  • Add real project screenshots to portfolio tiles

A 6/10 energy day that produced more than most high-energy days. Monitoring stack live, two services behind proper tunnels, full portfolio site from nothing to deployed — all in one go. It's easy to take for granted in the moment because you're just moving from one task to the next, but stepping back it's a lot. The blog being wired directly to the Obsidian vault is the detail I'm most pleased about. Zero friction between writing and publishing is worth more than it sounds.