HAVOCLABSOS
An attempt to build a branded homelab OS dashboard by forking CasaOS-UI (Vue.js 2.7) and replacing the entire frontend with a custom HavocLabs design. The CasaOS backend Go services were meant to stay untouched — just swap the UI.
It got further than expected before hitting a wall. Then we scrapped it.
What actually got done
- Forked
IceWhaleTech/CasaOS-UItohavoclabs1206/havoclabsos-ui - Cloned to the VPS, installed deps with pnpm
- Got the Vue CLI dev server running on port 3000
- Set up
dev.havoclabs.orgin Caddy with a real Let's Encrypt cert — after fighting through a DNS propagation delay that got Caddy stuck in an exponential backoff retry loop - Fixed a webpack-dev-server host-check rejection ("Invalid Host header") by adding
allowedHosts: "all"tovue.config.js - Fixed a missing
import Vue from 'vue'in the router — CasaOS assumed Vue was a global, webpack disagreed - Completed a full screen audit: 4 top-level views, 108 components, 287 CasaOS branding references to replace
- Set up a systemd service to manage the dev server (had to specify a working directory or it compiled the wrong project)
Why it was scrapped
The UI connected to a CasaOS backend for authentication. There was no CasaOS backend running — just the frontend dev server. Login did nothing. The plan assumed we'd have a CasaOS instance running somewhere to develop against, but we didn't have one set up.
Rather than stand up a full CasaOS server just to have a backend to poke at, we pulled the plug. The idea is still valid — the NUC 13 homelab is the right place to run a real CasaOS instance when that comes together.
Bugs fixed along the way
- ACME backoff loop — Caddy tried to get a cert before DNS propagated, got NXDOMAIN, entered a 10-minute exponential backoff. Fix: reload Caddy to reset the retry state once DNS was live.
- Invalid Host header — webpack-dev-server v5 rejects requests where the Host header doesn't match localhost. Fixed by setting
allowedHosts: "all"in the devServer config. - Wrong working directory — nohup launched the dev server from the shell directory, not the project root. The server compiled nothing and served garbage. Fixed with an explicit
WorkingDirectoryin systemd. - Vue not defined —
router/index.jscalledVue.use(VueRouter)without importing Vue. Works fine when Vue is a browser global; fails under webpack ESM. Fixed with a one-line import.
Also removed
clawdbot — found a rogue AI agent installation at /root/clawd/ and /root/.clawdbot/. No active process, no service, just files. Deleted.