catalog / ghcr.io/home-assistant/home-assistant / criteria

home-assistant — validation criteria

Per-image acceptance criteria for the ghcr.io/home-assistant/home-assistant profile (Home Assistant Core, the container install). Validated against …@sha256:f73512ba… (tag 2026.7.1 (the stable release at derivation time)), derived by drop-test against HA's own default invocation. The deployment sets no cap_drop (its compose comment: "tighten further only after verifying HA still boots"), so HA runs on the full Docker default cap set; this profile trims it 14 → 1.

Representative workload / correctness check

profiles/workloads/home-assistant.sh drives HA core's real write path, not just liveness: - reach the onboarding API (/api/onboarding) — HA only gets here after it has parsed config and written home-assistant_v2.db + .storage + logs into /config; - complete owner onboarding (create the first user) → HTTP 200 + an auth_code, a further real write to .storage/auth.

HA runs as root by design (no privilege drop), so — unlike forgejo/postgres — there is no non-root-uid assertion to make.

capabilities — derived by drop-test

filesystem — derived by drop-test

Coverage & confidence (moderate)

Per ADR-018, moderate — this is a base install. HA's hardware, USB, Bluetooth, and network integrations can each need more than DAC_OVERRIDE: a serial/Zigbee stick needs a --device mapping, Bluetooth needs D-Bus, some network integrations need NET_ADMIN/NET_RAW. The workload drives none of them, so coverage: partial — "one capability" is the floor, not a promise your HA with integrations needs nothing more.

Scope — this is HA core, integrations extend the minimum

This is the sharp edge for Home Assistant: its capability needs are a function of the enabled integrations, and a base instance exercises none of them. Capabilities a real install may pull in, NOT covered by this profile: - NET_RAW — the ping integration's ICMP, and some discovery paths. - NET_ADMIN — a few network-management integrations. - device access (a devices:/CL-0016 concern, not caps) — USB / Bluetooth / Zigbee / Z-Wave dongles, and /dev/dri for hardware-accelerated media. - NET_BIND_SERVICE — only if HA is configured to serve on a privileged port (the default :8123 is unprivileged).

So cap_add: [DAC_OVERRIDE] is the base-config floor, and the honest consumption model for an integration-heavy install is to re-derive against the real ./config (a deploy-check follow-up), not to treat this floor as complete.

Scope (run_config + out-of-band conditions)