Tech Digest

Home automation

Home Assistant

Local-first automation hub that speaks nearly every smart home protocol without a vendor cloud

Home automationApache-2.0Maturearm64 buildsOIDC via plugin
Last reviewed Profile maintained against the project's own documentation
Operational load
4 / 5
Heavy
Idle memory
600 MB
typical use ~1600 MB
Moving parts
1
containers in a normal deployment
Backup shape
SQLite backup
needs a dump or a stop

Home Assistant is a Python automation platform that talks directly to Zigbee, Z-Wave, Matter, Thread, Wi-Fi and local APIs through more than a thousand integrations, and keeps state, history and automations on hardware you own. It replaces the vendor apps and clouds behind SmartThings, Google Home and Alexa routines, and it keeps working when your internet does not.

Our verdict on Home Assistant#

Pick the installation method first, because it is the one decision you cannot cheaply reverse. The project now supports exactly two: Home Assistant OS and Home Assistant Container. Core (a Python venv) and Supervised (Supervisor on your own Debian) were deprecated in May 2025 and support ended with the 2025.12 release, along with i386, armhf and armv7 builds. Only HA OS gets Apps (the name for Add-ons since 2026.2), one-click updates and Supervisor-managed backups. Container is the right call if you already run a Docker host and are happy installing Mosquitto, Zigbee2MQTT and ESPHome yourself, but Thread and Z-Wave lose their turnkey path because those are app-driven. The ongoing cost is honest and unavoidable: a monthly release with a breaking changes list, and a home-assistant_v2.db that reaches several GB if you never touch purge_keep_days. Budget an hour a month, not zero.

Who Home Assistant is for#

Choose it if

  • Anyone who wants Zigbee, Z-Wave and Matter devices from five vendors to appear in one place and keep working offline
  • People leaving a cloud hub after a service shutdown or a subscription that appeared overnight
  • Homelabbers who already run Docker and want the hub to be one more container next to Mosquitto and Frigate
  • Renters with a pile of cheap sensors and no appetite for another vendor account

Look elsewhere if

  • You want an appliance you never touch; a monthly breaking-change cadence is the price of admission
  • Your household will not tolerate the lights being broken while you debug YAML on a Saturday
  • You are still on a 32-bit Pi or armv7 board, because those builds ended with 2025.12

What running it actually looks like#

One container, port 8123, config on a bind mount. HA OS is an appliance: flash the image to a Green, a Pi or a VM, give it the documented 2 GB of RAM and 2 vCPUs, and Supervisor handles apps and updates. Container is ghcr.io/home-assistant/home-assistant:stable with /config mounted and, in practice, --network=host, because without host networking mDNS and DHCP-based discovery find almost nothing. USB radios need --device=/dev/serial/by-id/..., never /dev/ttyUSB0, which renumbers across reboots. First run is an onboarding wizard and then autodiscovery does most of the work. Upgrades pull a new image; the risk is never the container, it is the YAML and the HACS components a monthly release invalidates.

Resource profile#

Memory
600 MB idle, around 1600 MB in ordinary use. The core Python process sits near 400 MB; the rest is Supervisor plus every app you run alongside it (Mosquitto, Zigbee2MQTT, ESPHome). Docs ask for 2 GB minimum when you build a VM.
CPU and acceleration
Under 5 percent idle on any modern quad core. Spikes come from recorder writes, template sensors that re-evaluate on every state change, the nightly purge at 04:12, and camera streams, not from the automation engine itself.
Storage growth
The recorder database is what grows. Expect roughly 20 to 150 MB per day depending on how chatty your entities are, held to a rolling 10 days by default, plus whatever your backups weigh.
Operational load
4 of 5, Heavy. A release every month, each with its own breaking changes section, and YAML or a custom component can stop the whole instance from starting. The recorder database needs deliberate pruning, and a restore has to land on the same or a newer core version.

Figures describe a small single-household install and are the working assumptions behind our stack planner. Your numbers will differ with library size, user count and hardware. See methodology.

Data and backup surface#

Everything lives in the config directory. Back up configuration.yaml, automations.yaml, scripts.yaml, secrets.yaml, custom_components/ and, above all, the hidden .storage/ directory, which holds config entries, the device and entity registries, users and refresh tokens. Restore without .storage/ and you re-add every integration by hand. home-assistant_v2.db is a live SQLite file, so a plain cp of a running instance can give you a torn copy; use the built-in backup integration (it now works on every install type) or stop the container. Losing the database costs you history graphs and nothing else, so excluding it makes backups much smaller. Skip home-assistant.log, deps/ and tts/.

Derived backup shape

SQLite backup. sqlite3 <db> ".backup out.db" while running, or stop the container and copy. A live cp of a WAL-mode SQLite file can restore corrupt.

Traps and surprises#

Supervised and Core installs are no longer supported

If you followed a 2022 tutorial that put Supervisor on your own Debian box, that path was deprecated in May 2025 and lost support at release 2025.12. It still runs, but the docs and the issue tracker will not help you. Supervised users are pointed at HA OS, Core users at Container. Migration is a backup restore, so do it deliberately rather than after something breaks.

The recorder database quietly eats the SD card

Recorder writes every state change to SQLite by default and keeps 10 days. A talkative install adds 50 to 150 MB a day, which is both multi-GB files and constant small writes that wear flash. Cut it with exclude filters on power meters and device trackers, raise commit_interval to 30 seconds, lower purge_keep_days, and put long-term stats where you actually look at them. Moving to MariaDB relocates the problem, it does not solve it.

Container installs have no Apps panel

Apps (formerly Add-ons) are a Supervisor feature, so a Container install has no app store. Integrations that are app-driven, notably Thread and Z-Wave, have no out-of-the-box path there. You run the matching containers yourself: the Zigbee2MQTT image, the Mosquitto image, the OpenThread border router. That is fine if you already run Docker, and a genuine surprise if you picked Container because it sounded simpler.

Custom components break on the first Wednesday of the month

Core ships monthly and deprecates aggressively. HACS integrations frequently lag by days or weeks, and one component that fails to load can prevent startup. Read the breaking changes section before you click update, keep the previous backup, and remember that a backup cannot be restored into an older core version, so a rollback means rolling the container tag back too.

Specifications#

Category
Home automation
Licence
Apache-2.0 (Permissive)
Written in
Python
First release
2013
Maturity
Mature
Datastore
SQLite (recorder), MariaDB or PostgreSQL optional
Default ports
8123
Ships as
ha os appliance image, docker, vm image
arm64 builds
Yes
Identity
OIDC via plugin. No official OIDC provider; people use the HACS custom component hass-oidc-auth or an auth proxy, and the companion mobile apps handle proxy logins badly.
Replaces
SmartThings, Google Home, Amazon Alexa routines, Hubitat
Project site
www.home-assistant.io
Source
github.com/home-assistant/core
Documentation
www.home-assistant.io/docs

Alternatives to Home Assistant#

Everything else in home automation, closest in operational weight first.

ToolOps loadIdle RAMLicence
Frigate3, Moderate700 MBMIT
ESPHome2, Light150 MBMIT (Python tooling) and GPL-3.0 (C++ device runtime)
Node-RED2, Light110 MBApache-2.0
Zigbee2MQTT2, Light90 MBGPL-3.0

Where Home Assistant comes up elsewhere#

Sources#

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.