developer-tools

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

SymptomLikely CauseResolution
All HomeKit devices show "Not Responding"Node.js process crashed; all accessory HAP servers went offlineCheck system logs; restart Homebridge service; review plugin logs for crash cause
Apple Home app cannot find bridge on networkHAP port 51826 blocked by firewall or port conflictOpen port 51826 TCP/UDP in firewall; check no other process occupies the port
One plugin's devices unresponsive; others finePlugin crashed in main bridge processEnable child bridge for the unstable plugin to isolate it; update or downgrade plugin
HomeKit cannot discover Homebridge after network changemDNS/Bonjour advertisement not propagating; IGMP snooping on switchEnable mDNS repeater or Avahi; check router/switch IGMP snooping settings
All HomeKit devices lost; need to re-pair everythingHomebridge pairing data (persist directory) deleted or corruptedRestore persist directory from backup; if none, remove all accessories in Apple Home and re-pair
Devices stop responding after plugin updatePlugin version incompatibility with Homebridge API versionRoll back plugin version in UI; check plugin GitHub issues for compatibility notes

Architecture Overview

ComponentFunctionFailure Impact
Homebridge Core (Node.js)Main bridge process; manages HAP server and plugin lifecycleAll bridged accessories become unresponsive in Apple Home
HAP Server (port 51826)HomeKit Accessory Protocol server; handles pairing and control commands from Apple HomeApple Home cannot control or discover any Homebridge accessories
Homebridge Config UI X (port 8581)Web interface for managing plugins, config, logs, and child bridgesManagement UI inaccessible; Homebridge itself may still function
Child BridgesIsolated Node.js processes for individual plugins; crash isolationOnly affected plugin's devices go offline; main bridge and other plugins unaffected
Bonjour / mDNSAdvertises Homebridge on the local network for HomeKit discoveryApple Home cannot find bridge during initial pairing or after network change
Persist DirectoryStores HAP pairing keys and accessory UUIDs between restartsLoss requires full re-pairing of all accessories; all automations referencing them break

Uptime History

DateIncident TypeDurationImpact
2025-08-02Node.js process OOM-killed after plugin memory leak accumulated over 10 days2 hoursAll HomeKit devices unresponsive; automations failed silently overnight
2025-09-21HAP port 51826 blocked by UFW rule added during unrelated security hardening4 hoursApple Home showed all devices as "Not Responding"; pairing attempts failed
2025-11-30Plugin update introduced breaking API change; plugin crash took down main bridge1.5 hoursAll bridged accessories offline until plugin was rolled back to prior version
2026-01-15mDNS stopped advertising after router firmware update changed IGMP snooping behavior5 hoursNew 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.

Set up Homebridge monitoring free at ezmon.com →

homebridgehomekitapplehome-automationsmart-homestatus-checker