Skip to content

Releases: ralleur/hauser

Hauser v0.6.3

Hauser v0.6.3 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 02 Sep 16:59

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

Hauser v0.6.1 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 01 Sep 17:31

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

Hauser v0.5.3 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 31 Aug 09:09

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.mjs

Existing 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.mjs

Home 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

Hauser v0.5.2 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 28 Aug 15:10

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.mjs

Home 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.

Demo: https://ralleur.github.io/hauser/demo/

Hauser v0.5.0

Hauser v0.5.0 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 28 Aug 10:47

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.mjs

Home 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:
    PASS against the published manifest digest, pulled after publication.
  • The linux/arm64 image build hit a QEMU illegal instruction crash 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

Hauser v0.4.0-beta.10 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 27 Aug 15:31

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

Hauser v0.4.0-beta.9 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 26 Aug 11:11

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 on main for the identical commit as run
    32959066371.
    svelte-check reported 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: all PASS in 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, producing setup_required=PASS, migration_v1_to_v4=PASS,
    cycles=2, backup_restore=PASS, invalid_config=PASS and
    invalid_migration=PASS. This ran on linux/arm64 only; linux/amd64 was
    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-info returns version
    0.4.0-beta.9, revision a52e2c3d19fdda87b41e0365f0e25f81aa7303ac, source
    https://github.com/ralleur/hauser and license AGPL-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.sh and
    npm audit --omit=dev --audit-level=high (found 0 vulnerabilities).
    verify-release-metadata.sh v0.4.0-beta.9 was 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 before a52e2c3d was pushed.
  • Landing page and demo: deployed for the same commit (run
    32960012138).
    https://ralleur.github.io/hauser/ reports 0.4.0-beta.9 and
    https://ralleur.github.io/hauser/demo/ answers 200.

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.
    Its http:// 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. The linux/amd64 half 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...
Read more

Hauser v0.4.0-beta.7

Hauser v0.4.0-beta.7 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 25 Aug 07:23

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.sh against 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
    and npm audit --omit=dev --audit-level=high in CI.
  • The linux/amd64 and linux/arm64 manifest 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 the If-Match / X-Hauser-Shared-Config-If-Match headers 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

Hauser v0.4.0-beta.6 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 22 Aug 16:34

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_ORIGINS allowlist remains available and still takes
    precedence for setups that deliberately front the App behind a different
    origin (e.g. a reverse proxy that rewrites Host).
  • 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 amd64 and aarch64 only.

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

Hauser v0.4.0-beta.5 Pre-release
Pre-release

Choose a tag to compare

@ralleur ralleur released this 16 Aug 19:29

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 Assistant vacuum service set (start, return_to_base) and
    treats the cleaning and returning states 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 amd64 and aarch64 only.

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.