Unofficial Docker images and a fully reproducible build pipeline for running modern Home Assistant on 32-bit ARM (armv7 / armhf) hardware — e.g. a Turris Omnia, Raspberry Pi 2/3 in 32-bit mode, and similar boxes.
Home Assistant dropped 32-bit ARM support after release 2025.12: the armv7
base images stopped at Python 3.13 / Alpine 3.22, and the musllinux_armv7l
Python wheels for cp314 were never built. HA 2026.7.0 requires Python ≥ 3.14.
This repo bridges that gap — it rebuilds the entire image chain from source for
armv7 and documents every non-obvious thing that has to be worked around.
⚠️ Unsupported. 32-bit is end-of-life upstream. This is a stop-gap for people who want a few more releases before upgrading hardware. Expect to maintain it yourself. No warranty.
Pushed to Docker Hub (single-arch linux/arm/v7):
| Tag | Contents | Size (disk / compressed) |
|---|---|---|
gregy/homeassistant-armv7:2026.7.0 |
Complete — all integration requirements | ~2.8 GB / ~0.8 GB |
gregy/homeassistant-armv7:latest |
alias of the above | — |
docker pull gregy/homeassistant-armv7:2026.7.0All 1126 integration requirements install and import, including the packages
that need native compilation on armv7 (numpy, cryptography, av, grpcio,
rpds-py, jiter, zha/zigpy, isal, …).
The public images use the
gregy/namespace. To build and publish your own, setIMAGE_REPOinconfig.env(see below).
docker pull gregy/homeassistant-armv7:2026.7.0
# then recreate your container with the new image, keeping your /config volumeFirst boot may be slow: the recorder database migrates to the 2026.7.0 schema.
Building modern HA for armv7 hit a series of traps. The full write-up with root-cause analysis is in docs/FINDINGS.md; the highlights:
- Build natively on Graviton2/3, not QEMU. AWS Graviton2/3 run 32-bit ARM code natively at EL0, so an armv7 container builds at full speed. Graviton4 removed this — it will not work.
uname -mlies. Inside an armv7 container on an aarch64 kernel,uname -mreturnsaarch64. Use/etc/apk/archfor the real architecture.- The wheel-tag trap (the big one). CPython built here reports
sysconfig.get_platform() = linux-aarch64, somaturin/setuptoolstag freshly-compiled wheelslinux_aarch64anduvthen rejects them on thearmv7linterpreter. Fix: build with_PYTHON_HOST_PLATFORM=linux-armv7l. - jemalloc page size. armv7 uses 4 KB pages — jemalloc must be built with
--with-lg-page=12(upstream hardcodes 16 / 64 KB and crashes). - s6-overlay mapping was removed. docker-base deleted the
arm→s6-overlay-arm.tar.xzcase when dropping armv7; it has to be restored. - isal / Intel ISA-L has no 32-bit-ARM assembly — link against Alpine's
system
isa-lpackage instead of the bundled build. - Keep the toolchain out of the final image. Compile in a builder stage and copy only the Python env into a clean final stage (4.7 GB → 2.8 GB).
See docs/BUILD.md for the full walkthrough. Quick version:
cp config.env.example config.env # edit IMAGE_REPO, REGISTRY_SECRETS, AWS_*
# 1. provision a Graviton2 build host (or bring your own armv7-capable host):
bash scripts/provision.sh
# provision.sh copies this repo to the host and runs scripts/build.sh, which:
# base-alpine → base-python 3.14 → ha-base → core (complete, slim)
# then smoke-tests and pushes.
# 2. when done:
bash scripts/teardown.shTo build a smaller image with only your own integrations instead of all 1126, see the "Focused build" section of docs/BUILD.md.
patches/ Dockerfiles (patched forks of home-assistant/docker-base, docker, core)
scripts/ provisioning, build orchestration, requirements generation, teardown
docs/ FINDINGS.md (root-cause deep dive), BUILD.md (reproduction guide)
examples/ sample integration list + generated user requirements
config.env.example copy to config.env and edit
The Dockerfiles here are patched derivatives of home-assistant/docker-base, home-assistant/docker, and home-assistant/core, all licensed Apache-2.0. This repository is likewise Apache-2.0 (see LICENSE). "Home Assistant" is a trademark of the Home Assistant project; this is an unofficial community build and is not affiliated with or endorsed by them.