Self-hosted homelab infrastructure visualizer — interactive network diagram with live status monitoring
Self-hosted homelab infrastructure visualizer — interactive network diagram with live status monitoring
Self-hosted homelab infrastructure visualization, documentation, scanning & live monitoring
Screenshots · Features · Installation · Documentation · Rack Canvas · Network Scanner · Zigbee / Z-Wave · Proxmox · Live View · MCP Server
## About Homelable is a self-hosted infrastructure visualization solution. It provides a network/zigbee/zwave scanning feature to accelerate the identification of machines, devices and services deployed on your local infrastructure. Homelable also offers a healthcheck system through multiple methods (ping/TCP, /health API, etc.) to get a global overview of online/offline services. Every device also gets a **document** — written for you from what the scan found, and yours to maintain from there — next to a Library of pages you write yourself: runbooks, incidents, a network overview. Your homelab stops being documented in a wiki somewhere else. You can also select some pre-built design styles, or personalize each device in your diagram. If you just like the design, you can only run the frontend and export your design as PNG. If you are running Homeassistant, check the [Homelable HA version](https://github.com/Pouzor/homelable-hacs) (via HACS) --- ## Screenshots--- ## Features From one-click **network scans** and **Proxmox / Zigbee / Z-Wave** imports to **live status monitoring**, floor plans, **rack canvases** with port-to-port patching, a **markdown documentation space** for the whole lab, multi-canvas layouts and an **MCP server** for AI assistants — Homelable maps, documents and watches your whole homelab. Every feature, with how to turn it on and use it, is described in **[FEATURES.md](./FEATURES.md)**. --- ## Installation Docker (from the **[pre-built GHCR images](./INSTALLATION.md#pre-built-docker-images)**), Proxmox LXC, **[bare metal without Docker](./INSTALLATION.md#bare-metal--no-docker)** (`sudo bash scripts/install-baremetal.sh` — systemd unit plus nginx on a Debian/Ubuntu host), build from source, configuration, and development setup are all covered in **[INSTALLATION.md](./INSTALLATION.md)**. --- ## Rack Canvas Next to the network diagram, Homelable draws the **physical** side of your lab: racks, the gear mounted in them, and the patch cables between their ports. It is a canvas kind of its own — create it from the canvas switcher, **New Canvas → Kind → Rack**. ### Usage 1. **Add Rack** in the header drops a rack; double-click its frame to set U height, 19"/10" width, numbering direction and colours 2. **+ Device** in the sidebar mounts something — an entry from your Device Inventory, a new device (which joins the inventory), or an accessory (blank, shelf, cable manager) 3. Pick a **faceplate** from the visual catalog: servers, switches, routers, patch panels, UPS and PDUs, desktop NAS towers, shelves and blanks 4. Click **Patch**, then drag from one port to another to cable them — across racks if you need to. Click a cable and press Delete to unplug it 5. **Save Rack** when you're happy; nothing is written behind your back Gear sits in a U range and part of a 12-column width grid, so half- and third-width machines share a U; a drop snaps to the nearest free slot. A mount can follow the status check of its matching diagram node, and **Import links** derives patches from the links already drawn on your diagrams. > **Full documentation:** [docs/rack-canvas.md](./docs/rack-canvas.md) --- ## Documentation Homelable keeps its own markdown documentation space, so the lab is described where it is drawn. Sidebar → **Documentation**. Every device has a document, generated once from what the scan actually found — identity, hardware, one section per service, network, operations, troubleshooting — and never rewritten behind you. Beside it, a **Library** of pages you write: runbooks, incidents, decisions, a network overview, from a template or blank. ### Usage 1. **Pick a device** in the tree — one with no document yet gets one written from its facts. Re-pivot the tree by zone, subnet, type, rack, vendor, tag… at no cost; it is grouped from data the app already holds 2. **Write markdown**, save explicitly — nothing is ever saved behind your back. `/` inserts a freshly generated block (services, hardware, network, rack) from the device's current data 3. **Link things**: `[[VLAN plan]]`, `[[device:nas-01]]`. Each document lists **Linked from** at the bottom, so you can see what points at it 4. **History**: up to 50 versions per document. Read one, diff it against the current body, restore it — what it replaces is kept too 5. **Search** the whole space, tag documents, and set `review_every: 6m` on the ones that rot; a document past its interval is badged as due A device that changes after its document was written raises a **device data changed** banner, and **Regenerate** rebuilds the document from scratch when you want that. Old per-device **Notes** migrate into documents from a banner, non-destructively. Full mode only — documents need the backend to store, index and search them. > **Full documentation:** [docs/documentation.md](./docs/documentation.md) --- ## Network Scanner The scanner runs `nmap -sV --open` on your configured CIDR ranges and populates a **Pending Devices** queue. From the sidebar you can then approve (adds a node to the canvas), hide, or ignore each discovered device. ### Triggering a scan To save you time when mapping your infrastructure, Homlable can scan your network and report all the services it detects. It can also identify them, saving you even more time. Click **Scan Network** in the sidebar. The Scan History tab opens automatically and refreshes every 3 seconds until the scan completes. ### Deep scan (custom ports) By default the scanner only probes nmap's standard port set. To fingerprint services on non-standard ports, enable the deep scan via `.env` (all options are overridable per-scan from the scan dialog): ```env # JSON array of port specs — each entry is a single port "N" or an inclusive # range "N-M" (1–65535, N <= M). These are ports, not CIDRs or bare integers. SCANNER_HTTP_RANGES=["8080","9000-9100"] SCANNER_HTTP_PROBE_ENABLED=true # send an HTTP probe to those ports for service ID SCANNER_HTTP_VERIFY_TLS=false # verify TLS certs on the HTTP probe ``` The listed ports are appended to nmap's `-p` spec. Invalid entries (out-of-range, malformed, or reversed ranges) are silently skipped. ### MAC addresses (Docker) The scan reports no MAC address when the backend runs on a Docker bridge network — ARP is layer 2, and from a bridge every LAN host sits behind the Docker gateway. It also means a DHCP device that changes IP comes back as a new inventory entry, since matching prefers the MAC. Fix and caveats: [INSTALLATION.md](./INSTALLATION.md#scanning-from-docker--mac-addresses). ### macOS / root privileges Some nmap scan types (SYN scan, OS detection) require root. If the scan fails with a permissions error, run it manually with sudo using the included script: ```bash cd backend sudo python ../scripts/run_scan.py 192.168.1.0/24 # Multiple ranges: sudo python ../scripts/run_scan.py 192.168.1.0/24 10.0.0.0/24 ``` Results are written directly to the database and appear as Pending Devices in the UI without restarting the backend. > On Linux the backend process itself can be given the `NET_RAW` capability instead of running as root: > ```bash > sudo setcap cap_net_raw+ep $(which nmap) > ``` --- ## Node Check Methods Homelable continuously monitors your nodes and displays their live status (online / offline / unknown) directly on the canvas. Each node can be configured with an independent check method suited to the service it runs. | Method | Description | |--------|-------------| | `ping` | ICMP ping | | `http` | GET request, success if status < 500 | | `https` | GET with TLS verify | | `tcp` | TCP connect (target: `host:port`) | | `ssh` | TCP connect to port 22 | | `prometheus` | GET `/metrics` | | `health` | GET `/health` | --- ## Zigbee2MQTT Import Homelable can connect directly to your MQTT broker and import your Zigbee network topology from **Zigbee2MQTT**, placing each device on the canvas as a typed node. ### Prerequisites - A running **MQTT broker** (e.g. Mosquitto) accessible from the Homelable host - **Zigbee2MQTT** connected to the broker with at least one device paired ### Usage 1. Click **Zigbee Import** in the left sidebar (below "Scan Network") 2. Enter your broker host, port (default `1883`), optional credentials, and base topic (default `zigbee2mqtt`) 3. Click **Test Connection** to verify reachability, then **Fetch Devices** 4. Select the devices you want from the grouped list (Coordinator / Router / End Device) 5. Click **Add N to Canvas** — devices are placed in a grid with IoT edges ### Node Types | Type | Z2M Device | Icon | |------|-----------|------| | `zigbee_coordinator` | Coordinator | Network hub | | `zigbee_router` | Router (mains-powered) | Radio | | `zigbee_enddevice` | End Device (battery) | Antenna | Hierarchy is set automatically: coordinator → routers → end devices (`parent_id`). LQI (Link Quality Indicator) is stored as a node property. > **Full documentation:** [docs/zigbee-import.md](./docs/zigbee-import.md) --- ## Z-Wave Import Homelable can also import your **Z-Wave** network from **Z-Wave JS UI** (formerly `zwavejs2mqtt`) over the same MQTT broker, dropping each node on the canvas as a typed node. ### Prerequisites - A running **MQTT broker** (e.g. Mosquitto) accessible from the Homelable host - **Z-Wave JS UI** connected to the broker with its MQTT gateway enabled and at least one node included ### Usage 1. Click **Z-Wave Import** in the left sidebar (below "Zigbee Import") 2. Enter your broker host, port (default `1883`), optional credentials, MQTT prefix (default `zwave`), and gateway name (default `zwavejs2mqtt`) 3. Click **Test Connection** to verify reachability 4. Choose a target — **Pending section** or **Canvas directly** — then **Import to Pending** / **Fetch Devices** 5. Select the devices you want from the grouped list (Controller / Router / End Device) and click **Add N to Canvas** ### Node Types | Type | Z-Wave Role | Icon | |------|-------------|------| | `zwave_coordinator` | Controller | Network hub | | `zwave_router` | Routing (mains-powered) node | Radio | | `zwave_enddevice` | End Device (battery) | Antenna | Hierarchy is set automatically: controller → routers → end devices (`parent_id`), derived from each node's neighbor list. Z-Wave has no LQI, so that property is omitted. > **Full documentation:** [docs/zwave-import.md](./docs/zwave-import.md) --- ## Proxmox VE Import Homelable can import your **Proxmox VE** inventory over the Proxmox REST API — hosts, VMs and LXC containers arrive as typed, named nodes with run state and hardware sp
No open issues yet, or sync has not completed.