Releases: ralleur/hauser
Release list
Hauser v0.6.3
Release identity
| Version | 0.6.3 |
| Git tag | v0.6.3 |
| Source commit | 69136d482b24b8049440314ba5a8452fefd615c1 |
| Image | ghcr.io/ralleur/hauser@sha256:375fa236b84b849d028e3c2896b2446e3ab1e8f406366d6d25a5298f41ae9d1d |
| Also tagged | :v0.6.3, :0.6.3 |
| Platforms | linux/amd64, linux/arm64 |
| Configuration | schemaVersion: 4; unchanged since 0.6.0 |
| Build run | https://github.com/ralleur/hauser/actions/runs/33653554835 |
What changed
- Import a scene from Home Assistant. If you already keep scenes in Home Assistant, you no longer have to rebuild them by hand. The scene editor offers "From Home Assistant" next to "Add new scene": it lists your existing scenes, those belonging to the room first, and turns the one you pick into a Hauser scene with its devices and their brightness and colour temperature. Home Assistant does not hand out a scene's stored target states over its WebSocket API, so the scene is applied in the room once to read them back — the editor restores the previous state when you close it, as it does for any other change you preview there.
- Rooms that only carry scenes are set up as rooms. During setup, a Home Assistant area now becomes a Hauser room even when no device is assigned to it and only a scene points there — via the scene's own area or the areas of the devices it controls.
- The camera live image works in the add-on again. In add-on mode the browser used to load the video stream straight from Home Assistant's internal address, which wall panels and phones without mDNS cannot reach — the tile stayed empty. The add-on now passes the stream through its own server.
- A panel no longer flashes on the right before an overlay opens. Long-pressing a room, a light or a scene briefly showed an empty dialog at the right edge while the overlay was still loading.
Also included, from 0.6.2
0.6.2 was tagged but never published as a release, so its fix ships here for the first time:
- The add-on could stay on "Connecting…" although it was already connected and values were updating. Home Assistant sometimes bundles several messages into one packet, and those bundles were being dropped — including the confirmation the app waits for. Bundles are now unpacked.
Upgrading
No migration and no configuration change. Update the add-on, or pull the new image tag with Docker Compose and recreate the container.
Verification
The published digest above was pulled and run through the container contract on this release: setup-required start, v1 → v4 migration, two restart cycles, backup and restore, and both fail-closed cases (invalid configuration, invalid migration). All passed.
One gap worth naming: the scene import was covered by unit tests but not exercised against a live Home Assistant instance before this release.
The bundled CHANGELOG.md for 0.6.3 does not list the camera fix — that change landed between the version bump and the release.
Hauser v0.6.1
Release identity
| Version | 0.6.1 |
| Git tag | v0.6.1 |
| Source commit | b66a4689e10c54d0e58c9a5c8e2fbd6c49843719 |
| Image | ghcr.io/ralleur/hauser@sha256:eaf57fc70bee5702de91310425ac60eed26c6577a57b2094080e31c61c39a743 |
| Also tagged | :v0.6.1, :0.6.1 |
| Platforms | linux/amd64, linux/arm64 |
| Configuration | schemaVersion: 4; unchanged since 0.6.0 |
| Build run | https://github.com/ralleur/hauser/actions/runs/33533806673 |
What changed
- A city map on the standby screen. When the panel rests, Hauser can place a subtle street map of your surroundings behind the clock and notes. The place comes from Home Assistant, from the device's own location, from a place search ("Dortmund, Germany") or from coordinates you type. The map is rendered once on the server; light and dark share one file, and Deep Night shows no map at all. Setup offers it as an opt-out with an example picture.
- Place search instead of coordinates. Type a town and pick it from a list. The search runs on the server against OpenStreetMap's geocoder; what leaves the server is a search term, never a stored address.
- The app starts noticeably faster. With a validated configuration already known, the real interface is mounted directly instead of a placeholder that is torn down moments later. Independent startup requests now run in parallel.
- Room pictures on phones are about a fifth of their previous size. A phone-sized variant is derived when an image enters the library, so a room tile shows its background in the first paint.
- The offline cache shrank from roughly 17 MB to 3.5 MB, which makes every service worker installation faster.
- A waiting update is offered, not forced. Hauser no longer reloads itself while you are looking at it. Idle wall panels still update on their own.
- Settings are easier to navigate. "Appearance" and "Layout & controls" merged into Interface & controls; Hotel Mode and guest access moved into a new Experimental group.
- Unfinished room edits survive leaving the section, and a restored draft is marked as such.
Upgrading
Room image storage gains a new on-disk format in this version. The migration runs automatically on the first start and is forward-only — downgrading to 0.6.0 after the update leaves the image library unreadable. Take a backup first if you want a way back.
Attribution
Map data © OpenStreetMap contributors, licensed under the Open Database License (ODbL). See NOTICE for the bundled example extract and the attribution placement.
Hauser v0.5.3
Release identity
| Version | 0.5.3 |
| Git tag | v0.5.3 |
| Source commit | 4640b2ef64f98fa8cb8ad8483ecdc9b0de62c19e |
| Image | ghcr.io/ralleur/hauser@sha256:083d8b0535a2c047406c12a7530838d8a4b3da71e0fb6f650e4a9ff1d489f309 |
| Also tagged | :v0.5.3, :0.5.3, :sha-4640b2ef64f9 |
| Platforms | linux/amd64, linux/arm64 |
| Configuration | schemaVersion: 4; automatic backed-up migration from v1 through v4 |
| Build run | https://github.com/ralleur/hauser/actions/runs/33373879884 |
What changed
- One shared climate control in the status bar and phone quick actions can now raise or lower every configured thermostat together.
- Phone climate controls distinguish current and target temperature more clearly, use consistent plus/minus buttons and make better use of the available width.
- Phone quick actions and optional room-editor state are loaded only when needed, reducing the initial phone bundle.
- ChatGPT-subscription room-image generation works again through the native Codex image-edit endpoint and JSON image result.
- Manual room-image uploads now accept exact same-origin requests such as
http://homeassistant.local:4173, fixing direct Home Assistant App access while continuing to reject foreign origins. - Manual room-image upload failures now follow the selected interface language.
Installation or update
Fresh install:
git clone https://github.com/ralleur/hauser.git
cd hauser
git checkout v0.5.3
cp .env.example .env
sed -i.bak 's/^HAUSER_IMAGE_TAG=.*/HAUSER_IMAGE_TAG=v0.5.3/' .env
docker compose pull
docker compose up -d
docker compose exec hauser node container/healthcheck.mjsExisting Docker/Compose installations:
./scripts/backup.sh backups/before-v0.5.3.tar.gz
git pull --ff-only
sed -i.bak 's/^HAUSER_IMAGE_TAG=.*/HAUSER_IMAGE_TAG=v0.5.3/' .env
docker compose pull
docker compose up -d
docker compose ps
docker compose exec hauser node container/healthcheck.mjsHome Assistant App users: Settings → Add-ons → Hauser → Update.
For rollback, use the previous immutable image ghcr.io/ralleur/hauser@sha256:d269a07bf25d1e701e6e2126036b382187e7a5eb7171ea8b0ae9dfc7c6342be3 and restore backups/before-v0.5.3.tar.gz if persistent data also needs to be reverted.
Verification evidence
- Private source gate: 108 test files / 1,449 tests, Svelte typecheck with 0 errors and 0 warnings, and production build passed.
- Public export/privacy and license gates passed; the public package passed 106 test files / 1,417 tests, production and static demo builds, typecheck, and performance budgets.
- Container contract passed setup-required and configured starts, schema v1→v4 migration, persistence across recreation, backup/restore, and invalid-config/migration fail-closed checks.
- The tagged workflow published the immutable two-platform manifest above. A clean post-publish pull by that exact manifest digest and the complete container contract smoke test passed on
linux/arm64. - Landing page and demo deployment passed: https://ralleur.github.io/hauser/ and https://ralleur.github.io/hauser/demo/.
Known limitations
- Hauser remains pre-release beta software. An external real-home Docker Compose installation has occurred, but v0.5.3 itself has not yet been independently verified across additional households or release-to-release upgrades.
- Real-hardware vacuum confirmation remains outstanding; Jellyfin's live path was verified against the maintainer's installation.
- French, Italian, Polish and Portuguese translations have not been reviewed by native speakers.
Security and support
Hauser is a hobby project without an SLA or guaranteed response time. It is designed for a trusted home LAN and must not be exposed directly to the public internet without an authentication and TLS boundary. Backups contain /data/config.json and may contain access tokens; store them with restricted permissions and appropriate encryption. See SECURITY.md.
Hauser v0.5.2
Release identity
| Version | 0.5.2 |
| Git tag | v0.5.2 |
| Source commit | 9d8ff74213e242bb2db95c04a3e266fb8548bd9b |
| Image | ghcr.io/ralleur/hauser@sha256:d269a07bf25d1e701e6e2126036b382187e7a5eb7171ea8b0ae9dfc7c6342be3 |
| Also tagged | :v0.5.2, :0.5.2, :sha-9d8ff74213e2 |
| Platforms | linux/amd64, linux/arm64 |
| Build run | https://github.com/ralleur/hauser/actions/runs/33181892931 |
What changed
- Camera feeds can become draggable, resizable pop-outs. They follow their room by default, can stay visible across room changes, retain their title bar controls and can return to the control surface.
- The home layout editor is now a live, unblurred drawer mirrored to the control surface. Panel size is continuous, can be reset, and supports one to four rooms per row.
- Camera, climate and layout controls are localized in German, English, French, Italian, Polish and Portuguese.
- The redundant Temperature heading and Safari installation hint were removed.
- Saving room configuration now refreshes the active household cache immediately.
Installation or update
Fresh install from this tag:
cp .env.example .env
docker compose pull
docker compose up -d
docker compose exec hauser node container/healthcheck.mjsHome Assistant App users: Settings → Add-ons → Hauser → Update.
Docker and Compose users: back up first (./scripts/backup.sh), then pull ghcr.io/ralleur/hauser:0.5.2.
Verification
The private-to-public privacy and license gates, 1,416 public tests, Svelte typecheck, production/demo builds, the 88 KiB phone-startup budget, the container migration/backup/restore contract, Pages deployment and the tagged multi-architecture image build all passed.
Hauser v0.5.0
Release identity
| Version | 0.5.0 |
| Git tag | v0.5.0 (annotated, 53fb0911) |
| Source commit | 2ca247eda3eba1ff7f1b3ac78dc6aaca33d0c193 |
| Image | ghcr.io/ralleur/hauser@sha256:4e2d5831a4177e3e0cba36a3c5d467928c3bc256d13117c5cadb334a8c60a900 |
| Also tagged | :v0.5.0 and :0.5.0 (same manifest; the Supervisor resolves the unprefixed tag) |
| Platforms | linux/amd64, linux/arm64 |
| Configuration | Household schema v4; the v1 → v4 migration path is included and verified |
| Container smoke | verify-container.sh against the published digest: setup_required=PASS, migration_v1_to_v4=PASS, cycles=2, backup_restore=PASS, invalid_config=PASS, invalid_migration=PASS |
| Source offer | /api/build-info on the published image returns version=0.5.0, revision=2ca247eda3eba1ff7f1b3ac78dc6aaca33d0c193, sourceUrl=https://github.com/ralleur/hauser, license=AGPL-3.0-only |
| Build run | https://github.com/ralleur/hauser/actions/runs/33118101166 |
The version number changed shape
0.4.0-beta.10 is followed by 0.5.0, not by 0.4.0-beta.11. Every release
below 1.0.0 is a beta — the version number carries that on its own, so the
-beta.N suffix is gone. Nothing about the project's maturity, support or
license changed with it: Hauser stays a self-hosted AGPL hobby project in its
public technical beta, and v1.0.0 still means the same thing it always did.
What changed
This release rebuilds the Rooms & devices settings page — the page where a
home is actually set up — and takes two everyday annoyances out of the way.
Added — Rooms & devices is a real room list
Each room now shows its current room image, its name and how many devices it
holds. Configure devices opens the room editor, Rename edits the name in
place, the six-dot handle drags the room into position — the arrow keys do the
same without a pointing device — and the overflow menu keeps move, rename and
delete. New room and Save changes sit where the list ends. As before,
nothing is written until the changes are saved.
Added — tapping a room's image opens the image editor
The thumbnail in the list leads straight to the room-image view of the room
overlay, where an image can be uploaded, picked from the library or removed.
Added — the room-image assistant and the library have their own cards
Both sit as illustrated tiles under the room list instead of two anonymous
rows.
Changed — Settings open on Rooms & devices
Coming back within 30 seconds still returns to the section that was open, so a
quick detour costs nothing; a later visit starts fresh.
Changed — resetting is one card with three tiles
Device names and icons, scenes, and re-reading rooms and devices from Home
Assistant. The last one used to be a separate section at the bottom of the
page.
Fixed — the room-image card on the home screen kept coming back
Dismissing it applied to one room only, and only until the next reload. A
checkbox on the card now switches it off for good on that device.
Fixed — saving room changes could be blocked by Jellyfin
Settings has no Jellyfin fields, yet an unverified Jellyfin sign-in disabled
Save changes. The first-run wizard still requires the tested sign-in.
Installation or update
Fresh install (Docker Compose), from a checkout of the tag:
cp .env.example .env
docker compose pull
docker compose up -d
docker compose exec hauser node container/healthcheck.mjsHome Assistant App users: Settings → Add-ons → Hauser → Update.
Docker and Compose users: back up first (./scripts/backup.sh), then pull
ghcr.io/ralleur/hauser:0.5.0. No configuration migration is required when
coming from 0.4.0-beta.x. The previous immutable reference for a rollback is
ghcr.io/ralleur/hauser@sha256:ae87b24af625e49ad211f11e22881393523150f9c28f36e0b615ba5e2b98ce84
(v0.4.0-beta.10).
Verification evidence
- Tests, typecheck, production build, static demo build and the container
contract: green in the tagged run above. - Export and privacy gate: green; the maintainer's private code-modifying AI
agent is absent from the package. - Container health, setup-required start, configured start, persistence across
recreation, backup/restore, invalid configuration and invalid migration:
PASSagainst the published manifest digest, pulled after publication. - The
linux/arm64image build hit a QEMUillegal instructioncrash on its
first attempt and was re-run once; the published manifest comes from the
successful run. The emulation crash was in the build container, not in
Hauser. - Landing page and demo were deployed from the same source commit:
https://ralleur.github.io/hauser/demo/
Known limitations
- Clean-room evidence is maintainer-operated. The one external installation
report to date is the Asustor NAS case in
issue #7; an external real-home
installation remains the next beta-stabilisation evidence gate. - The vacuum path follows the documented Home Assistant service set and is not
yet verified against real hardware. - Translations beyond German and English have not had a native review.
- Room-image generation requires the user's own OpenAI access and is optional.
Security and support
Hauser is a hobby project without an SLA. Please read
SECURITY.md before
reporting anything security-relevant. Do not expose Hauser directly to the
internet without an authentication and TLS boundary in front of it.
Hauser v0.4.0-beta.10
Release identity
| Version | 0.4.0-beta.10 |
| Git tag | v0.4.0-beta.10 (annotated, ad73b5dc) |
| Source commit | f5fda5460a5df7eaa2c8eb58e7ed9aefcad38eed |
| Image | ghcr.io/ralleur/hauser@sha256:ae87b24af625e49ad211f11e22881393523150f9c28f36e0b615ba5e2b98ce84 |
| Also tagged | :v0.4.0-beta.10 and :0.4.0-beta.10 (same manifest; the Supervisor resolves the unprefixed tag) |
| Platforms | linux/amd64, linux/arm64 |
| Container smoke | verify-container.sh against the published digest: setup_required=PASS, migration_v1_to_v4=PASS, cycles=2, backup_restore=PASS, invalid_config=PASS, invalid_migration=PASS |
| Source offer | /api/build-info on the published image returns revision=f5fda5460a5df7eaa2c8eb58e7ed9aefcad38eed, sourceUrl=https://github.com/ralleur/hauser, license=AGPL-3.0-only |
| Build run | https://github.com/ralleur/hauser/actions/runs/33063271176 |
What changed
This release makes the room-image assistant work inside the Home Assistant
App, and gives rooms that have no background or no devices yet somewhere to
start.
Fixed — the room-image assistant failed with a 403 in the Home Assistant App
Every write the assistant makes — starting a ChatGPT sign-in, uploading a
photograph, creating variants — was answered with HTTP 403 ORIGIN_FORBIDDEN
when Hauser ran as a Home Assistant App. The App can only configure the
loopback origins (http://localhost:4173,http://127.0.0.1:4173), while the
browser reaches Hauser under the host's own address, so a legitimate request
never matched the static allowlist and the assistant was unusable for anyone
who had not edited the origin list by hand.
The room-image origin check now accepts, in addition to the configured list, a
request whose Origin matches its own effective origin — protocol, host and
port, compared exactly, using the same same-origin comparison the rest of the
server already applies. The security boundary is unchanged in every other
respect: foreign origins, a differing port or protocol, null, malformed
values, a missing Origin on a write, and duplicate Origin headers all stay
rejected. Nothing is hard-coded to a particular address or hostname.
Fixed — room-image errors appeared in German in an English install
The assistant, the image-set library and the access panel displayed the
server's error text verbatim, and the server writes German only. They now show
the translated message for the operation that failed.
Fixed — a published image set could break the next server start
The expiry pass marked already published variant_set jobs as expired without
detaching the asset, which the metadata validation forbids — so the service
refused to start with "incoherent room-image job metadata". Records that carry
an asset are now left untouched.
Added — rooms without a background explain how to get one
A room with no image set assigned showed an empty tile. The home screen now
carries an onboarding card with a before/after band, the three steps the
assistant takes, and three ways out: generate an image, pick one yourself, or
dismiss the card. The assistant and the library are loaded only when one of
them is opened.
Added — rooms without devices offer a way to add one
Instead of a blank area, an empty room shows an Add device placeholder tile
that opens the same room editor as a long press on the room tile.
Added — the people on the pinboard can be named and added
Tapping a name renames that person, a header button adds another, and each gets
a note colour from a fixed palette. Existing tasks stay with their person.
Changed — the room-image assistant leads with the photograph
The OpenAI access step now appears only when access is missing and stays
reachable as a chip in the header afterwards; the consent text is one line with
the long form behind an info button. Choosing the photograph is the first thing
the assistant asks for, and offers the camera directly on touch devices.
Cropping and zoom moved to step two next to the style variants, because the
perspective correction changes the framing anyway. The focus picker is gone —
the generated sets already match the panel format exactly, so it changed
nothing.
Changed — the standby button sits in the title bar by default
The setting in the long-press menu now switches to the large floating button
instead of away from it.
Upgrading
Home Assistant App users: Settings → Add-ons → Hauser → Update. Docker and
Compose users: pull ghcr.io/ralleur/hauser:0.4.0-beta.10. No configuration
migration is required.
Hauser v0.4.0-beta.9
Release identity
| Version | 0.4.0-beta.9 |
| Git tag | v0.4.0-beta.9 (annotated, 96a8f27a) |
| Source commit | a52e2c3d19fdda87b41e0365f0e25f81aa7303ac |
| Image | ghcr.io/ralleur/hauser@sha256:bc761b19b79bdab15b3c7ce89b6bc539e80411c8f27f90e310746c88546ca108 |
| Also tagged | :v0.4.0-beta.9 and :0.4.0-beta.9 (same manifest; the Supervisor resolves the unprefixed tag) |
| Platforms | linux/amd64, linux/arm64 |
| Config schema | v4, with the v1 → v4 migration path included, plus a one-time navigation migration for configurations generated by beta onboarding |
What changed
This release answers the feedback in #8, makes the room-image assistant
actually usable, and fixes the source-offer surface the AGPL requires.
v0.4.0-beta.8 was tagged and its image published, but no release was issued
for it: the provenance defect below was found while verifying that exact image
digest. Everything beta.8 contained is in this release. If you are on
v0.4.0-beta.7, update straight to this version.
Fixed — the published container did not say where its source came from
Hauser serves its exact revision and the URL of the corresponding source at
/api/build-info, unauthenticated and before any configuration exists; that is
how the project meets section 13 of the AGPL. In every image published since
the license change, both fields came back empty, because the release workflow's
publish step never passed HAUSER_REVISION and HAUSER_SOURCE_URL into the
build. It also never passed HAUSER_RELEASE=1, the Dockerfile's own guard that
fails a release build instead of publishing an image which cannot back its
source claim — so nothing caught the omission. CI never saw it either, because
it runs the container contract against a locally built, commit-bound image
where those arguments are set. The image labels
(org.opencontainers.image.revision and .source) were always correct; only
what the running container reported about itself was missing.
v0.4.0-beta.7 and v0.4.0-beta.8 are both affected.
Added — Calendar and Notes reach the navigation (#8)
Onboarding produced a navigation with only Home and System (plus Media when a
media player was discovered), while the Calendar and Notes screens existed with
no way to reach them — the README's hero image showed tabs an onboarded install
never had. New installs now get Home, Calendar, Notes, optionally Media, and
System. An existing install whose navigation is still the untouched onboarding
result is migrated to the same set on load; a navigation you customized
yourself is left alone.
Added — a library for generated room backgrounds
Finished image sets were reachable from nowhere once the assistant had produced
them. Settings → Rooms & Devices now lists every set with a preview, its size,
its creation date and the room it is assigned to, and lets you assign a set to
a room, remove that assignment, or delete it after a confirmation. The header
shows how many sets exist and how much storage they occupy.
Added — one room-configuration overlay
Tapping a room under Rooms & Devices now opens the same overlay as a long press
on the home screen, instead of a second route with different capabilities. The
overlay also assigns image sets from the library, and a long press on a device
row moves that device to another room.
Fixed — the room-image assistant did nothing over plain http://
Generating an ID used crypto.randomUUID, which browsers expose only in a
secure context. On a panel reached over http:// in the LAN the request failed
while it was still being assembled — before any network call and before the
error handling — so pressing Create variants produced no request, no status
change and no message at all. It now falls back to getRandomValues, reports
unexpected failures instead of swallowing them, and places error messages
directly above the action buttons. The ChatGPT authorization code can be copied
with a click. The two candidates also differ as intended now: a realistic
composition with corrected perspective, and an illustration.
Fixed — both clocks froze (#8)
The dashboard and ambient clocks stopped advancing and only a manual reload
brought them back. They now resynchronize when the page is restored, the tab
becomes visible or the window regains focus, in addition to their regular tick.
Fixed — Status & Updates showed invented services and updates (#8)
The screen listed six pending updates and five connected services from
hard-coded prototype data, none of it reflecting the connected instance — which
is misleading about security-relevant state. A productive install now shows only
the verified Home Assistant connection and genuine pending update.* entities,
and says No updates available when there are none. The fictional list
remains only in the demo build, which is marked as such.
Fixed — German text in the English interface (#8)
The connection indicator, the Safari Add to Home Screen hint, and the
room-image assistant, its library and its access dialog are translated in all
six languages. The ambient hero text keeps the selected language consistently
instead of switching between English and German across visits.
Fixed — the floating power button covered controls (#8)
While System settings are open, the power control now sits in the title bar
even when the floating button is the general preference, so it no longer
obscures the Scenes Reset button.
Changed — the AI line on the lock screen is off by default
It calls a language model service, which should be a deliberate choice rather
than something that happens on first start. Turning it on is remembered; the
default is off on every install.
Installation or update
Back up before changing images. For the App, create a Home Assistant backup
that includes Hauser; for Compose, run ./scripts/backup.sh.
Fresh Compose install:
git clone https://github.com/ralleur/hauser.git
cd hauser
docker compose up -d
Update from v0.4.0-beta.7 or v0.4.0-beta.8:
./scripts/backup.sh
git pull
docker compose pull
docker compose up -d
The navigation migration runs once when the existing configuration is loaded.
It only applies to a navigation that is still exactly the onboarding result; if
you edited your navigation, nothing changes and Calendar and Notes stay absent.
Previous immutable image for rollback: ghcr.io/ralleur/hauser:v0.4.0-beta.7.
Note that rolling back to beta.7 or beta.8 reintroduces the empty
/api/build-info provenance described above.
Verification evidence
- Tests, typecheck, production build and static demo build: green in CI on the
tagged commit (Quality and release image, run
32960138996);
the same workflow passed onmainfor the identical commit as run
32959066371.
svelte-checkreported 0 errors and 0 warnings; the unit suite ran 1410
tests across 106 files. - Container health, setup-required start, v1 → v4 migration, persistence across
recreation, backup and destructive restore, and fail-closed behaviour on an
invalid configuration: allPASSin CI against the commit-bound image
hauser:ci-a52e2c3d19fd. - Post-publish digest pull and smoke: the published multi-architecture
manifest above was pulled from GHCR and put through the same full container
contract, producingsetup_required=PASS,migration_v1_to_v4=PASS,
cycles=2,backup_restore=PASS,invalid_config=PASSand
invalid_migration=PASS. This ran onlinux/arm64only;linux/amd64was
built and pushed in the same manifest but not separately smoke-tested after
publication. This is the first Hauser release whose published digest was
verified rather than only its commit-bound CI image. - Build provenance on the published digest:
/api/build-inforeturns version
0.4.0-beta.9, revisiona52e2c3d19fdda87b41e0365f0e25f81aa7303ac, source
https://github.com/ralleur/hauserand licenseAGPL-3.0-only— the
revision matches the tagged commit above. - Release metadata, license boundary and dependency audit: verified in CI by
verify-release-metadata.sh,verify-license-boundary.shand
npm audit --omit=dev --audit-level=high(found 0 vulnerabilities).
verify-release-metadata.sh v0.4.0-beta.9was additionally run against a
fresh clone of the tagged tree: package, lockfile, Docker metadata, changelog,
App manifest and release-day claims all match. - Export and privacy gate: clean. The full public preflight ran in an isolated
worktree beforea52e2c3dwas pushed. - Landing page and demo: deployed for the same commit (run
32960012138).
https://ralleur.github.io/hauser/ reports0.4.0-beta.9and
https://ralleur.github.io/hauser/demo/ answers200.
Known limitations
- The vacuum path (
beta.5) follows the documented Home Assistant service set
and is still not verified against real hardware. - The room-image assistant needs your own OpenAI account and bills against it.
Itshttp://fix was verified by the maintainer on a real panel; the
generated-image quality itself remains subjective and unverified by an
external user. - The fixes in this release have unit-test coverage and maintainer verification
only. None of them has been confirmed on an external, real-home installation. - The navigation migration was exercised by unit tests and by the container
contract's v1 → v4 migration path, not against a hand-edited real
configuration from an external install. - The post-publish digest smoke covered
linux/arm64. Thelinux/amd64half of
the manifest carries the same build but was not re-tested after publication. - An external, real-home installation covering this release remains the next
beta-stabilisation evidence gate. - This package...
Hauser v0.4.0-beta.7
Release identity
| Version | 0.4.0-beta.7 |
| Git tag | v0.4.0-beta.7 (annotated, e7e66551) |
| Source commit | 53eb36dac938604ea7cd8aa49319842dfa0d523a |
| Image | ghcr.io/ralleur/hauser@sha256:4d831a9b29378add81519dee619d74609de06e6aa71bdfc8eff65040c2bcdc19 |
| Also tagged | :v0.4.0-beta.7 and :0.4.0-beta.7 (same manifest; the Supervisor resolves the unprefixed tag) |
| Platforms | linux/amd64, linux/arm64 |
| Config schema | v3, with the v1 → v3 migration path included |
What changed
License change — AGPL-3.0-or-later
Starting with this release, Hauser is licensed under AGPL-3.0-or-later instead
of MIT. Everything released up to and including v0.4.0-beta.6 stays MIT and
can be forked from there; this applies going forward only, nothing has been
withdrawn or retagged. Running Hauser unmodified in your own home creates no
new obligation at all — AGPL only asks someone who modifies Hauser and offers
it to other people over a network to share the source of that modified
version. Contributions now require agreement to a CLA. Full
reasoning in ADR-025.
Fixed — reconfigure "Save changes" silently failed (#7, #9)
The setup wizard's reconfigure flow (Settings → Rooms & Devices) never sent
the If-Match / X-Hauser-Shared-Config-If-Match ETag preconditions that
POST /api/setup/activate has always required when reconfiguring. Every
reconfigure save was rejected with 428 CONFIG_PRECONDITION_REQUIRED before
anything was written — no console error, no visible feedback near the
button — and any rooms or devices found by Reload rooms and devices
reverted to the previously active configuration on leaving the screen. This
predates beta.5; it was not a regression. The wizard now captures both
ETags from the initial configuration load and sends them back on save.
Installation or update
Back up before changing images. For the App, create a Home Assistant backup
that includes Hauser; for Compose, run ./scripts/backup.sh.
Fresh Compose install:
git clone https://github.com/ralleur/hauser.git
cd hauser
docker compose up -d
Update from v0.4.0-beta.6:
./scripts/backup.sh
git pull
docker compose pull
docker compose up -d
Previous immutable image for rollback: ghcr.io/ralleur/hauser:v0.4.0-beta.6.
Verification evidence
- Tests (1439), typecheck, production build and static demo build: green in
CI (Tests, builds and container contract, run 97715280558). - Container health, setup-required start and persistence: verified by
scripts/verify-container.shagainst a commit-bound local image
(ci-53eb36dac938) in the same CI job. This is a build-time contract check,
not a pull/smoke test of the published multi-arch digest above. - Release metadata, license boundary and dependency audit: verified by
scripts/verify-release-metadata.sh,scripts/verify-license-boundary.sh
andnpm audit --omit=dev --audit-level=highin CI. - The
linux/amd64andlinux/arm64manifest was built and pushed to GHCR
successfully (Publish immutable GHCR image, run 97717399282); that job
does not separately pull and re-test the published digest. - The reconfigure-save fix itself is covered by an updated unit test
asserting theIf-Match/X-Hauser-Shared-Config-If-Matchheaders are
sent (household-config-v3.test.ts). It has not yet been exercised
end-to-end against a live Home Assistant instance by the maintainer or an
external user — reports on #7 or #9 are welcome once you've updated.
Known limitations
- The vacuum path (
beta.5) follows the documented Home Assistant service
set and is still not verified against real hardware. - The reconfigure-save fix in this release has unit-test coverage only; it
has not yet been confirmed against a live Home Assistant instance. - An external, real-home installation covering this release remains the next
beta-stabilisation evidence gate. - This package remains an experimental technical beta without a support SLA.
Security and support
See SECURITY.md. Hauser is a hobby project without an SLA —
do not expose it directly to the internet without an authentication and TLS
boundary in front of it.
Hauser v0.4.0-beta.6
Release identity
| Version | 0.4.0-beta.6 |
| Git tag | v0.4.0-beta.6 (annotated, 77cc73ca) |
| Source commit | 818fc227bcaa24ca0f3118d16c0688b787d391b3 |
| Image | ghcr.io/ralleur/hauser@sha256:2c854874f0837798d62387e0f394253fddec015db6b0bbad5df0a787e5779c4a |
| Also tagged | :v0.4.0-beta.6 and :0.4.0-beta.6 (same manifest; the Supervisor resolves the unprefixed tag) |
| Platforms | linux/amd64, linux/arm64 |
| Config schema | v3, with the v1 → v3 migration path included |
What changed
Fixed — setup activation rejected on non-allowlisted hostnames (#8)
POST /api/setup/activate and every other direct-browser API route (setup,
proxy, config, household-config, family data, ambient, ablage, notion bridge,
song library) checked the Origin header only against the static
HMI_ALLOWED_ORIGINS allowlist. Installations reached through a hostname not
in that list — for example the Home Assistant App's default
homeassistant.local:4173 — got 403 SETUP_REQUEST_FORBIDDEN on every setup
request, blocking onboarding entirely.
A request is now also accepted whenever its Origin header matches the
request's own effective Host header exactly (same origin, independent of
hostname), on top of the existing static allowlist. Cross-origin requests are
still rejected.
Installation or update
Back up before changing images. For the App, create a Home Assistant backup
that includes Hauser; for Compose, run ./scripts/backup.sh.
Fresh Compose install:
git clone https://github.com/ralleur/hauser.git
cd hauser
docker compose up -d
Update from v0.4.0-beta.5:
./scripts/backup.sh
git pull
docker compose pull
docker compose up -d
Home Assistant OS App: the App Store offers 0.4.0-beta.6 once the
repository is refreshed; existing installations are offered the update
because the manifest version changed.
Rollback to the previous release by immutable reference:
ghcr.io/ralleur/hauser@sha256:963564a36c4e6be32d9feded0dd99694200d6454164956f23516c3821d0dc528
Verification evidence
All results below are from the release preflight and the tag workflow for
this exact commit, plus a manual post-publish pull of the published digest.
| Check | Result |
|---|---|
| Unit tests | 1122 passed (86 files) |
Typecheck (svelte-check) |
0 errors, 0 warnings |
| Production build, demo build, Pages build | pass |
| Container: setup-required start | setup_required=PASS |
| Container: schema migration v1 → v3 | migration_v1_to_v3=PASS |
| Container: backup and restore | backup_restore=PASS |
| Container: invalid config stays fail-closed | invalid_config=PASS |
| Container: failed migration stays fail-closed | invalid_migration=PASS |
| Post-publish pull of the exact digest | pass — pulled by digest, container reports healthy, /api/health returns setup_required, UI serves HTTP 200 |
| Published image carries this fix | verified — against the running published container, POST /api/setup/activate with a foreign Origin still returns 403, while a same-origin request now reaches request handling (400 on an empty body, not 403) |
| Image labels | org.opencontainers.image.version=0.4.0-beta.6, revision=818fc227bcaa24ca0f3118d16c0688b787d391b3 |
Known limitations
- The static
HMI_ALLOWED_ORIGINSallowlist remains available and still takes
precedence for setups that deliberately front the App behind a different
origin (e.g. a reverse proxy that rewritesHost). - No external real-home installation has run on this release. The evidence
above is maintainer-operated clean-room, container-contract and post-publish
testing. - Hauser is not an Ingress application and adds no authentication of its own.
- The App supports
amd64andaarch64only.
Security and support
Report vulnerabilities as described in SECURITY.md. Hauser
is a self-hosted hobby project with no service-level agreement and no
compatibility promise beyond the documented paths. Do not expose the port
directly to the internet without an authentication and TLS boundary in front
of it.
Hauser v0.4.0-beta.5
Release identity
| Version | 0.4.0-beta.5 |
| Git tag | v0.4.0-beta.5 (annotated, 83a21c4a) |
| Source commit | 89f9d100b49322814ed9f46a8a2e0f0eaab63e31 |
| Image | ghcr.io/ralleur/hauser@sha256:963564a36c4e6be32d9feded0dd99694200d6454164956f23516c3821d0dc528 |
| Also tagged | :v0.4.0-beta.5 and :0.4.0-beta.5 (same manifest; the Supervisor resolves the unprefixed tag) |
| Platforms | linux/amd64, linux/arm64 |
| Config schema | v3, with the v1 → v3 migration path included |
What changed
Fixed — setup wizard entity discovery (#7)
The wizard mapped only lights, climate, temperature, presence, window and camera
entities. Switches were dropped without a trace: the domain was never mapped, so
room-assigned switches reached neither the generated room configuration nor the
ignored list. Media players were never offered as media targets even though the
runtime already supported them. A room also accepted only one entity per
non-light role, so several switches in the same room collapsed into a single
entry — switches may now appear as often per room as lights do.
Added — vacuums
Vacuums are discovered and exposed as a start / return-to-base control, built
against Home Assistant's documented vacuum service set. See the limitations
below before relying on it.
Installation or update
Back up before changing images. For the App, create a Home Assistant backup that
includes Hauser; for Compose, run ./scripts/backup.sh.
Fresh Compose install:
git clone https://github.com/ralleur/hauser.git
cd hauser
docker compose up -d
Update from v0.4.0-beta.4:
./scripts/backup.sh
git pull
docker compose pull
docker compose up -d
Home Assistant OS App: the App Store offers 0.4.0-beta.5 once the repository is
refreshed; existing installations are offered the update because the manifest
version changed.
Rollback to the previous release by immutable reference:
ghcr.io/ralleur/hauser@sha256:23b67bcb4f28cae691076708c96df3d6a346385bedd7e27088d0848953e119f7
Verification evidence
All results below are from the release preflight and the tag workflow for this
exact commit.
| Check | Result |
|---|---|
| Unit tests | 1120 passed (86 files) |
Typecheck (svelte-check) |
1690 files, 0 errors, 0 warnings |
| Production build, demo build, Pages build | pass |
| Performance budget | pass |
| Container: setup-required start | setup_required=PASS |
| Container: schema migration v1 → v3 | migration_v1_to_v3=PASS |
| Container: backup and restore | backup_restore=PASS |
| Container: invalid config stays fail-closed | invalid_config=PASS |
| Container: failed migration stays fail-closed | invalid_migration=PASS |
| Export privacy and license gate | license_files, media_asset_boundary, private_capability_boundary all PASS |
| Post-publish pull of the exact digest | pass — pulled by digest, container reports healthy, /api/health returns setup_required, UI serves HTTP 200 |
| Published image carries this fix | verified — the served bundle contains the switch/vacuum discovery mapping and the extended entity-role list |
| Image labels | org.opencontainers.image.version=0.4.0-beta.5, revision=89f9d100b49322814ed9f46a8a2e0f0eaab63e31 |
Known limitations
- The vacuum control has never run against physical hardware. It follows the
documented Home Assistantvacuumservice set (start,return_to_base) and
treats thecleaningandreturningstates as active. Real integrations vary
in both service set and reported states across device generations, so treat
this path as unverified and report what you observe. - No external real-home installation has run on this release. The evidence
above is maintainer-operated clean-room and container-contract testing. The
external installation reports received so far (#6, #7) were made against
earlier betas. - Hauser is not an Ingress application and adds no authentication of its own.
- The App supports
amd64andaarch64only.
Security and support
Report vulnerabilities as described in SECURITY.md. Hauser is a
self-hosted hobby project with no service-level agreement and no compatibility
promise beyond the documented paths. Do not expose the port directly to the
internet without an authentication and TLS boundary in front of it.