You check the Home Assistant GitHub repo. There's a new release, published three days ago. You open your HA dashboard, go to Settings, System, Updates. Nothing. No update available. The version_latest field in the API returns None. What gives?
Why the UI Doesn't Show the Update
Home Assistant has two separate version-awareness systems that don't move in lockstep:
- GitHub releases: Tagged the moment the HA team pushes a release. Publicly visible immediately.
- Supervisor update feed: A separate metadata feed that the HA Supervisor polls periodically. This is what powers the "Update Available" notification in your UI.
The supervisor feed can lag behind GitHub by hours or days. Sometimes longer. If you're checking GitHub directly (or running an automation that does), you'll see the version mismatch before the supervisor catches up.
This isn't a bug in your instance. It's the normal rollout process. HA staggers releases through the supervisor feed, likely to catch regressions before the full user base updates.
Confirm the Mismatch
First, verify what your instance actually thinks is available. Hit the HA REST API:
curl -s \
-H "Authorization: Bearer YOUR_LONG_LIVED_TOKEN" \
-H "Content-Type: application/json" \
http://YOUR_HA_IP:8123/api/states/update.home_assistant_core_update | \
python3 -m json.tool
Look at three fields in the response:
{
"state": "off",
"attributes": {
"installed_version": "2026.3.0",
"latest_available_version": null,
"skipped_version": null
}
}
state: "off" means no update available. latest_available_version: null means the supervisor genuinely doesn't know about a newer version. This isn't a display bug. The update entity has nothing to show.
Compare that against the GitHub release:
curl -s https://api.github.com/repos/home-assistant/core/releases/latest | \
python3 -c "import sys,json; print(json.load(sys.stdin)['tag_name'])"
If GitHub shows a newer version and the update entity shows null, the supervisor feed hasn't caught up yet.
Try Reloading the Supervisor
The supervisor checks for updates on its own schedule. You can ask it to re-check:
From the HA UI: Settings → System → top-right ⋮ menu → "Check for updates"
From the SSH add-on terminal:
ha supervisor reload
ha core check
If you don't have the SSH add-on installed, look for it under Settings → Add-ons (labeled "Apps" in newer HA versions) → search for "Terminal & SSH." Install it, start it, and you'll get a terminal in the sidebar.
Note: If you don't see "Add-ons" or "Apps" anywhere, you're running HA Core or HA Container (not HA OS). Add-ons require the Supervisor, which only ships with HA OS and HA Supervised installs. Check Settings → About → Installation Type to confirm.
Force the Upgrade via CLI
If the supervisor still doesn't see the update after reloading, you can force it. From the SSH add-on terminal (or direct console access):
# Check what the supervisor thinks is current
ha core info
# Force upgrade to latest
ha core update
ha core info shows both your installed version and what the supervisor considers latest. If there's a mismatch between what's installed and what GitHub shows, ha core update will pull the newest version regardless of what the supervisor feed says.
HA will restart after the update. Give it a couple of minutes, then verify:
ha core info
Why Not Just Use the REST API to Upgrade?
You might think: "I'll automate this with the REST API." There's a catch.
The /api/hassio/* endpoints (which control the Supervisor, including upgrades) require a Supervisor-level token. The long-lived access tokens you create in your HA profile don't have those permissions. You'll get a 401:
# This won't work with a regular long-lived token
curl -X POST \
-H "Authorization: Bearer YOUR_LONG_LIVED_TOKEN" \
http://YOUR_HA_IP:8123/api/hassio/core/update
# → 401 Unauthorized
Supervisor tokens are only available from inside add-ons. So the HA REST API can check versions (via the update entity) but can't trigger upgrades from outside the Supervisor's trust boundary.
The update/install service works for supervisor-visible updates:
# This works IF the supervisor already knows about the update
curl -X POST \
-H "Authorization: Bearer YOUR_LONG_LIVED_TOKEN" \
-H "Content-Type: application/json" \
-d '{"entity_id": "update.home_assistant_core_update"}' \
http://YOUR_HA_IP:8123/api/services/update/install
But if the supervisor doesn't see the update (the latest_available_version: null scenario), this call has nothing to install. You're back to the CLI.
Automating the Check
If you monitor HA versions in scripts (checking GitHub releases against your running version), be aware of the feed lag. A script that compares GitHub's latest tag against your installed version will report "update available" before the supervisor has it.
A better approach: check both sources. Only flag an update as actionable when the HA update entity confirms it. Report the GitHub-only mismatch as informational.
#!/bin/bash
# Smart HA update check: GitHub + Supervisor awareness
INSTALLED=$(curl -s -H "Authorization: Bearer $TOKEN" \
"$HA_URL/api/config" | jq -r '.version')
# What does the supervisor know?
SUPERVISOR_LATEST=$(curl -s -H "Authorization: Bearer $TOKEN" \
"$HA_URL/api/states/update.home_assistant_core_update" | \
jq -r '.attributes.latest_available_version // empty')
# What does GitHub say?
GITHUB_LATEST=$(curl -s \
https://api.github.com/repos/home-assistant/core/releases/latest | \
jq -r '.tag_name')
if [ -n "$SUPERVISOR_LATEST" ] && [ "$SUPERVISOR_LATEST" != "$INSTALLED" ]; then
echo "Update available: $INSTALLED → $SUPERVISOR_LATEST (ready to install)"
elif [ "$GITHUB_LATEST" != "$INSTALLED" ]; then
echo "GitHub has $GITHUB_LATEST but supervisor hasn't picked it up yet"
else
echo "Up to date: $INSTALLED"
fi
This prevents false alarms in your monitoring while still giving you visibility into upcoming releases.
The GitHub release and the supervisor feed are two different things. GitHub publishes first. The supervisor feed follows later, sometimes days later. If the UI says no update, check the CLI.
ha core updatedoesn't wait for the feed.
