Homelable is a self-hosted infrastructure visualization solution. It provides a network/zigbee 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.
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 (via HACS)
Docker, Proxmox LXC, build from source, configuration, and development setup are all covered in INSTALLATION.md.
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.
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.
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:
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/24Results 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_RAWcapability instead of running as root:sudo setcap cap_net_raw+ep $(which nmap)
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 |
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.
- A running MQTT broker (e.g. Mosquitto) accessible from the Homelable host
- Zigbee2MQTT connected to the broker with at least one device paired
- Click Zigbee Import in the left sidebar (below "Scan Network")
- Enter your broker host, port (default
1883), optional credentials, and base topic (defaultzigbee2mqtt) - Click Test Connection to verify reachability, then Fetch Devices
- Select the devices you want from the grouped list (Coordinator / Router / End Device)
- Click Add N to Canvas — devices are placed in a grid with IoT edges
| 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
Live View lets you share a read-only snapshot of your canvas with anyone on your network — no login required. It is disabled by default.
Add LIVEVIEW_KEY to your .env:
LIVEVIEW_KEY=your-secret-key
Then restart the backend:
docker compose restart backend
Use this URL to view your canvas:
http:///view?key=your-secret-key
The page shows your canvas in pan/zoom-only mode — no editing, no credentials needed. Clicking a node that has an IP opens it in a new tab.
Homelable can expose a small JSON stats endpoint that gethomepage consumes through its built-in customapi widget. Disabled by default.
Add HOMEPAGE_API_KEY to your .env:
HOMEPAGE_API_KEY=your-secret-key
Restart the backend (docker compose restart backend).
GET /api/v1/stats/summary — requires header X-API-Key: your-secret-key. Returns:
{
"nodes": 12,
"online": 9,
"offline": 2,
"unknown": 1,
"pending_devices": 3,
"zigbee_devices": 5,
"last_scan_at": "2026-05-14T10:00:00+00:00"
}- Homelab:
- Homelable:
icon: mdi-lan
href: http://homelable.local:3000
widget:
type: customapi
url: http://homelable.local:8000/api/v1/stats/summary
method: GET
headers:
X-API-Key: your-secret-key
mappings:
- field: nodes ; label: Nodes
- field: online ; label: Online
- field: offline ; label: Offline
- field: pending_devices ; label: Pending
- field: zigbee_devices ; label: Zigbee
- field: last_scan_at ; label: Last scanThe backend port (8000) must be reachable from your gethomepage container.
Homelable can exposes a Model Context Protocol server so any MCP-compatible AI client (Claude Code, Claude Desktop, Open WebUI…) can read your homelab topology and act on it.
| Action | |
|---|---|
| Read | List all nodes, edges, full canvas, pending devices, scan history |
| Write | Add / update / delete nodes and edges, trigger a network scan, approve or hide discovered devices |
1. Add the keys to your .env:
# Authenticates AI clients (Claude Code, etc.) → MCP server
MCP_API_KEY=mcp_sk_changeme
# Authenticates MCP server → backend (internal Docker network only, never exposed)
MCP_SERVICE_KEY=svc_changeme
# Generate both with:
# python3 -c "import secrets; print(secrets.token_hex(32))"No plain-text passwords involved — AUTH_PASSWORD_HASH is only used for the web UI login.
2. Start the MCP service:
docker compose up -d mcp
# MCP server is now listening on http://<your-homelab-ip>:8001Proxmox LXC / bare-metal (no Docker): create the LXC via community-scripts/ProxmoxVE (or any Debian/Ubuntu LXC), then inside it run
sudo bash scripts/lxc-mcp-install.sh. Installs ahomelable-mcpsystemd service, prompts forMCP_API_KEY/MCP_SERVICE_KEY(auto-generated if you press Enter), and skips prompts ifmcp/.envalready exists.
3. Configure your AI client:
Claude Code — run this command in your terminal:
claude mcp add --transport sse homelable http://<your-homelab-ip>:8001/mcp \
--header "X-API-Key: mcp_sk_yourkey"Or add it manually to ~/.claude.json:
{
"mcpServers": {
"homelable": {
"type": "sse",
"url": "http://<your-homelab-ip>:8001/mcp",
"headers": {
"X-API-Key": "mcp_sk_yourkey"
}
}
}
}Claude Desktop — edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"homelable": {
"type": "sse",
"url": "http://<your-homelab-ip>:8001/mcp",
"headers": {
"X-API-Key": "mcp_sk_yourkey"
}
}
}
}- "What nodes are currently offline?"
- "Add a new LXC container named
piholeat 192.168.1.5, connected to my switch." - "Trigger a network scan on 192.168.1.0/24 and show me the pending devices."
- "Show me the full canvas topology."
- The MCP server is not intended to be exposed to the internet — keep port 8001 firewalled to your LAN.
- Rotate the key any time by updating
MCP_API_KEYin.envand restarting:docker compose restart mcp. - The MCP server communicates with the backend over the internal Docker network — the backend API is never directly exposed to MCP clients.