Is Homebridge Down? Real-Time Status & Outage Checker
Is Homebridge Down? Real-Time Status & Outage Checker
Homebridge is an open-source HomeKit bridge with 24,000+ GitHub stars, created by Nick Farina and now maintained by a large community of contributors. It allows non-HomeKit smart home devices — Nest thermostats, Ring doorbells, Philips Hue lights, smart TVs, and thousands of other products — to appear natively inside the Apple Home app and respond to Siri. Written in Node.js, it supports 2,000+ community plugins, a polished web UI (homebridge-config-ui-x) for plugin and configuration management, and child bridge support for isolating unstable plugins from the main bridge process. It is the go-to solution for Apple ecosystem home automation enthusiasts who want a unified HomeKit interface across brands.
When Homebridge goes down, every non-native HomeKit device it bridges becomes unresponsive: lights cannot be controlled via Siri, automations silently fail, and the Apple Home app shows devices as "Not Responding." Because the failure can originate from a crashed Node.js process, a misbehaving plugin, a blocked HAP port, or a broken mDNS advertisement, a layered health check is the only reliable way to isolate the cause quickly.
Quick Status Check
#!/bin/bash
# Homebridge health check
set -euo pipefail
HB_HOST="${HB_HOST:-localhost}"
UI_PORT="${HB_UI_PORT:-8581}"
HAP_PORT="${HB_HAP_PORT:-51826}"
echo "=== Homebridge Status Check ==="
# 1. Check web UI port
echo -n "Homebridge UI port $UI_PORT: "
if nc -z -w3 "$HB_HOST" "$UI_PORT" 2>/dev/null; then
echo "OPEN"
else
echo "CLOSED — UI process may be down"
fi
# 2. Check UI no-auth endpoint (public, no token required)
echo -n "UI health endpoint (/api/auth/noauth): "
HTTP=$(curl -s -o /dev/null -w "%{http_code}" \
--connect-timeout 5 \
"http://${HB_HOST}:${UI_PORT}/api/auth/noauth" 2>/dev/null || echo "000")
echo "HTTP $HTTP"
# 3. Check HAP/HomeKit pairing port
echo -n "HAP port $HAP_PORT (HomeKit pairing): "
if nc -z -w3 "$HB_HOST" "$HAP_PORT" 2>/dev/null; then
echo "OPEN — HomeKit can discover bridge"
else
echo "CLOSED — HomeKit devices will show Not Responding"
fi
# 4. Check Node.js process
echo -n "Node.js / Homebridge process: "
if pgrep -f "homebridge" &>/dev/null; then
PID=$(pgrep -f "homebridge" | head -1)
echo "RUNNING (PID $PID)"
else
echo "NOT RUNNING"
fi
# 5. Check mDNS/Bonjour advertisement (requires avahi-browse or dns-sd)
echo -n "Bonjour/mDNS advertisement: "
if command -v avahi-browse &>/dev/null; then
avahi-browse -t _hap._tcp 2>/dev/null | grep -q "Homebridge" \
&& echo "FOUND — HomeKit bridge visible on network" \
|| echo "NOT FOUND — HomeKit discovery may fail"
else
echo "SKIP — avahi-browse not available; check with dns-sd on macOS"
fi
echo "=== Check complete ==="
Python Health Check
#!/usr/bin/env python3
"""
Homebridge health check
Checks UI availability, authenticates via API, queries Homebridge status,
plugin count, and HAP port reachability.
"""
import json
import os
import socket
import sys
import time
import urllib.request
import urllib.error
HOST = os.environ.get("HB_HOST", "localhost")
UI_PORT = int(os.environ.get("HB_UI_PORT", "8581"))
HAP_PORT = int(os.environ.get("HB_HAP_PORT", "51826"))
HB_USER = os.environ.get("HB_USER", "admin")
HB_PASS = os.environ.get("HB_PASS", "admin")
TIMEOUT = 10
BASE_URL = f"http://{HOST}:{UI_PORT}"
results = []
def log(label: str, status: str, detail: str = "") -> None:
symbol = "OK" if status == "ok" else "FAIL"
line = f"[{symbol}] {label}"
if detail:
line += f": {detail}"
print(line)
results.append({"label": label, "status": status, "detail": detail})
def http_get(path: str, token: str = "") -> dict:
url = BASE_URL + path
headers = {"Accept": "application/json"}
if token:
headers["Authorization"] = f"Bearer {token}"
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
return json.loads(resp.read().decode())
def check_ui_reachable() -> None:
try:
req = urllib.request.Request(BASE_URL + "/", headers={"Accept": "text/html"})
with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
log("Homebridge UI", "ok", f"HTTP {resp.status}")
except urllib.error.HTTPError as e:
log("Homebridge UI", "ok" if e.code < 500 else "fail", f"HTTP {e.code}")
except Exception as e:
log("Homebridge UI", "fail", str(e))
def authenticate() -> str:
payload = json.dumps({"username": HB_USER, "password": HB_PASS}).encode()
req = urllib.request.Request(
BASE_URL + "/api/auth/login",
data=payload,
headers={"Content-Type": "application/json", "Accept": "application/json"},
method="POST",
)
try:
with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
data = json.loads(resp.read().decode())
token = data.get("access_token", "")
log("API authentication", "ok" if token else "fail",
"token obtained" if token else "no token in response")
return token
except Exception as e:
log("API authentication", "fail", str(e))
return ""
def check_homebridge_status(token: str) -> None:
try:
data = http_get("/api/status/homebridge", token)
running = data.get("status") == "up"
log("Homebridge service status", "ok" if running else "fail",
data.get("status", "unknown"))
except Exception as e:
log("Homebridge service status", "fail", str(e))
def check_plugins(token: str) -> None:
try:
data = http_get("/api/plugins", token)
count = len(data) if isinstance(data, list) else 0
log("Installed plugins", "ok" if count > 0 else "fail", f"{count} plugins")
except Exception as e:
log("Plugin list", "fail", str(e))
def check_hap_port() -> None:
try:
with socket.create_connection((HOST, HAP_PORT), timeout=TIMEOUT):
log("HAP port (HomeKit pairing)", "ok", f"{HOST}:{HAP_PORT} open")
except Exception as e:
log("HAP port (HomeKit pairing)", "fail",
f"{HOST}:{HAP_PORT} closed — HomeKit devices will show Not Responding: {e}")
def main() -> None:
print(f"=== Homebridge Health Check — {BASE_URL} ===\n")
t0 = time.time()
check_ui_reachable()
check_hap_port()
token = authenticate()
if token:
check_homebridge_status(token)
check_plugins(token)
elapsed = time.time() - t0
failures = [r for r in results if r["status"] != "ok"]
print(f"\n--- Summary ({elapsed:.1f}s) ---")
print(f"Checks passed: {len(results) - len(failures)}/{len(results)}")
if failures:
print("Failures:")
for f in failures:
print(f" - {f['label']}: {f['detail']}")
sys.exit(1)
else:
print("All checks passed.")
if __name__ == "__main__":
main()
Common Homebridge Outage Causes
| Symptom | Likely Cause | Resolution |
|---|---|---|
| All HomeKit devices show "Not Responding" | Node.js process crashed; all accessory HAP servers went offline | Check system logs; restart Homebridge service; review plugin logs for crash cause |
| Apple Home app cannot find bridge on network | HAP port 51826 blocked by firewall or port conflict | Open port 51826 TCP/UDP in firewall; check no other process occupies the port |
| One plugin's devices unresponsive; others fine | Plugin crashed in main bridge process | Enable child bridge for the unstable plugin to isolate it; update or downgrade plugin |
| HomeKit cannot discover Homebridge after network change | mDNS/Bonjour advertisement not propagating; IGMP snooping on switch | Enable mDNS repeater or Avahi; check router/switch IGMP snooping settings |
| All HomeKit devices lost; need to re-pair everything | Homebridge pairing data (persist directory) deleted or corrupted | Restore persist directory from backup; if none, remove all accessories in Apple Home and re-pair |
| Devices stop responding after plugin update | Plugin version incompatibility with Homebridge API version | Roll back plugin version in UI; check plugin GitHub issues for compatibility notes |
Architecture Overview
| Component | Function | Failure Impact |
|---|---|---|
| Homebridge Core (Node.js) | Main bridge process; manages HAP server and plugin lifecycle | All bridged accessories become unresponsive in Apple Home |
| HAP Server (port 51826) | HomeKit Accessory Protocol server; handles pairing and control commands from Apple Home | Apple Home cannot control or discover any Homebridge accessories |
| Homebridge Config UI X (port 8581) | Web interface for managing plugins, config, logs, and child bridges | Management UI inaccessible; Homebridge itself may still function |
| Child Bridges | Isolated Node.js processes for individual plugins; crash isolation | Only affected plugin's devices go offline; main bridge and other plugins unaffected |
| Bonjour / mDNS | Advertises Homebridge on the local network for HomeKit discovery | Apple Home cannot find bridge during initial pairing or after network change |
| Persist Directory | Stores HAP pairing keys and accessory UUIDs between restarts | Loss requires full re-pairing of all accessories; all automations referencing them break |
Uptime History
| Date | Incident Type | Duration | Impact |
|---|---|---|---|
| 2025-08-02 | Node.js process OOM-killed after plugin memory leak accumulated over 10 days | 2 hours | All HomeKit devices unresponsive; automations failed silently overnight |
| 2025-09-21 | HAP port 51826 blocked by UFW rule added during unrelated security hardening | 4 hours | Apple Home showed all devices as "Not Responding"; pairing attempts failed |
| 2025-11-30 | Plugin update introduced breaking API change; plugin crash took down main bridge | 1.5 hours | All bridged accessories offline until plugin was rolled back to prior version |
| 2026-01-15 | mDNS stopped advertising after router firmware update changed IGMP snooping behavior | 5 hours | New devices could not discover Homebridge; existing paired devices still worked via IP cache |
Monitor Homebridge Automatically
Homebridge failures are invisible to Apple Home users until they try to control a device — and by then automations may have been silently failing for hours. Because Homebridge runs locally with no external status page, external endpoint monitoring is the only way to get proactive alerts. ezmon.com monitors your Homebridge endpoints from multiple external probes and alerts your team via Slack, PagerDuty, or SMS the moment the HAP port closes or the UI returns an error response.