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 (and immediately discovered it had to specify a working directory or it would compile 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 plan is saved. 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 current shell directory, not the project root. The server started but compiled nothing and served garbage. Fixed by running it via systemd with an explicit
WorkingDirectory. - 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.