CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
All notable user-visible changes to Hauser are documented here. The project uses
Semantic Versioning for its public release line.
## [0.50.0] - 2026-11-02
- Room: every device on the picture can be resized like a lamp. A shape button switches between ellipse and rectangle, whose four corners can be adjusted individually like window corners; the button moves to the left near the image edge. Web and iOS share the shape, and the tappable area follows it.
- Room: the hint about devices without a position no longer floats over the room editor; it stays in the view settings.
## [0.49.1] - 2026-10-29
- Installation: the baseline x86-64 image installs its native build tools without running unrelated dependency hooks.
- Media: player inputs can be selected from Home Assistant's source list. Saved radio streams and playlists use real media IDs and the correct playback parameters; demo presets no longer appear in live households. Presets and their music/playlist type are shared with the native app.
- Laundry setup: when translated state names do not match a sensor, the error shows the source's internal state values. The native app now applies an existing sensor through the current validate-and-confirm flow.
- Room: the stage view selector uses light text on its dark surface in the light theme, so “Full screen” and “All rooms” remain clearly readable and look selectable next to “Image control”.
- Room: “Fade lamps when switched off” can be disabled per room under Room image → Set up image → Devices & light zones. It is on by default; switching it off keeps the light glow and device controls intact. The native app shares the same setting.
- Image control on the wall panel: whoever lands there no longer gets stuck
without the controls. A tap on an empty spot of the picture shows the placed
devices together with the way back, a swipe in from the left edge brings the
controls in, and the room still changes with a swipe anywhere else. In the
locked mode, pressing and holding the picture explains right away how to
unlock it ([#42](https://github.com/ralleur/hauser/issues/42)).
- Room on phones: hiding the controls now lets you operate devices directly
where they are placed in the picture. Tap to control, press and hold for
details, or double-tap an empty spot to show their zones and names briefly.
## [0.48.2] - 2026-10-25
- Room: the pale veil of a lamp that is off now stays on the lamp in the demo
rooms. Its zone had reached well past the globe, the shade or the bedside
lamp; demo visitors who still carry the old zones get the close ones once,
places they set themselves stay.
- Room: tapping the lamp picture on the project page opens the demo straight
in image control in the living room, where the lamps can really be tapped.
`demo/#image` leads there; opening the demo normally afterwards starts with
the usual view again.
## [0.48.1] - 2026-10-24
- Scenes: leaving the scene editor puts every lamp back the way it was, also
when a Home Assistant light group sits next to its lamps in the room —
before, the group switched a lamp back on that had been off. Adjusting one
lamp no longer runs the whole scene again.
- Room: “Assign devices” is back in the room settings, next to the room image
and the scenes; it is still also reachable under “Set up image”.
## [0.48.0] - 2026-10-24
- Room: on the wall panel, a lamp that is off now goes pale inside its light
zone in the room picture, and its warm colour fades back as soon as it is
switched on, from its tile or by tapping it in the picture.
- The live demo places its lamps on the lamps drawn in its room pictures, so
the effect can be tried in the evening living room, bedroom, bathroom and
kitchen.
- The project page shows it in moment 02 as a short, calm sequence of the
living room lamps coming on; the guide mentions it under devices in the
picture.
## [0.47.0] - 2026-10-23
- Room and exterior pictures: clear “Change image” and “Set up image” entries,
with devices and light zones, windows and weather, and surfaces together in
one editor. A missing device position is an optional configuration hint.
- The manual image workflow guides photo preparation, uploading the four
variants and reviewing them before applying the set. The workspace keeps
a dark, responsive surface with readable controls and simpler navigation.
- Reliability: a light tile uses its own Home Assistant entity when switching,
even while its previous room assignment is being replaced.
- Maintenance: Stresshaus distinguishes intentional HA outages from failures
and avoids stale iPad button queries and system keyboard controls.
## [0.46.1] - 2026-10-21
- Gate: Home Assistant no longer marks the Hauser app as experimental in its
app store, and it no longer needs advanced mode to show up. The beta note
stays in the app's documentation.
- Room: the project page shows the room picture as the switch. A new moment
after the day-evening-off preview shows image control in the evening, with
the lamps and blinds marked where they stand, and links to how it works.
- Energy on the phone: the project page shows the new energy screen next to
the iOS living room, with the house at the top and solar, battery and grid
below.
- The guide describes the three home-screen views, the room configuration
that now holds the layout settings, and devices in the picture (light zones,
points, tap and hold).
## [0.46.0] - 2026-10-19
- A glance: the lightbulb on a room only lights up for lamps. Smart plugs,
configuration switches, open blinds and vacuums stay listed and
controllable without lighting it, in existing homes too. A plug or relay
that powers a lamp can be counted with **Counts for the room light
indicator** in the device settings. Thanks to @ferlodavid (#32, #35).
- A glance: open doors and open windows are told apart. The overview, the
phone notice, the ambient screen and the room cards say "1 window open",
"1 door open" or both, based on the contact's Home Assistant device class
(`door` and `garage_door` are doors). Thanks to @ferlodavid (#33, #36).
- A glance: when the add-on has a newer Hauser version waiting, a
notification says so and where to update it. Hauser reads Home Assistant's
own update entity for the add-on, so nothing is fetched from the internet.
Dismissed, it stays away until the next version.
- Touch: blinds can be raised, stopped and lowered right on their tile. The
blind's settings cycle through three tile views: large (one tile wide, two
high, up and down stacked with stop beside them; the default), compact
(the buttons replace name and state on a normal tile) and the previous
tile without buttons. Only the buttons a blind supports are shown, and the
direction it is moving in lights up. Suggested by @ferlodavid (#39).
- Touch: the temperature control can be switched. A button at the top right
of the climate overlay and the thermostat detail cycles through a tick
slider (default, as in the iOS app), plus and minus, and an upright tick
slider like a lamp's brightness. The choice is kept per room.
- Room: the panel's room picker shows as many rooms on a page as look good,
up to eight by default (two columns, up to four rows), so a home with eight
rooms no longer has to page. The room configuration sets the upper limit per page
(4 to 16); with more rooms per page the picker uses three or four columns.
"Rooms per row" now belongs to the "All rooms" view. Suggested by
@ferlodavid (#40).
- Gate: Hauser speaks Spanish (Spain, informal "tú"). The whole interface is
translated, Spanish dates and numbers follow es-ES, and the language picker
offers Español. Translation by @ferlodavid (#30, #31).
- Weakness with dignity: the library asks for the Jellyfin server address on
its sign-in card when none is set yet. Before, it signed in against a
built-in default and could not be set up from there.
- Hidden simulator: tapping the clock five times opens it again with a mouse
or at a relaxed pace; only the pause between two taps counts now.
- A glance: the room temperature now shows on the room cards of the
**All rooms** view and on the phone, not only in the panel's room picker,
and it follows the room's **Show temperature** setting everywhere.
- Room: in **Assign lamps** the light zone shows its real size as a
see-through area with a white dot at its centre. Handles at the corners
stretch it into an ellipse of any width and height, and a handle on top
rotates it, so the zone can follow a lampshade. The night glow on the room
image takes the same shape.
- Room: **Assign lamps** is now **Assign devices**. Every device in the room
can get a spot on the room image: lamps keep their light zone, everything
else gets a point. Tapping a placed device on the room image does what
tapping its tile does (switch, open or show the detail), holding it opens
the detail, and a soft ring confirms the tap. A camera tapped on the image
brings its picture to the front.
- Room: one configuration mode. Pressing and holding a room or the
background opens the room configuration, which now also holds what the
layout panel from the right used to: a pill next to the control surface
drags its width, the view switch sits at the top centre, rooms per page,
rooms per row and rows at once sit under the rooms, and auto-hide, the
second control surface and reset are in the side column. Swiping left on
the stage opens it as well.
- Room: a third view, **Image control**. Only the room image is shown; the
control surface stays away outside configuration, and devices are used
through their spots on the image. Swipe to change rooms; double-tap an
empty spot to see the zones and names for a moment.
- Energy on the phone: the house now stands large and sharp at the top
instead of lying pale behind the numbers. The power right now sits in the
sky of the picture; below it, solar, battery and grid stand side by side,
each marked by a small coloured line instead of an icon.
- Energy: a home battery can be assigned under Services → Energy (charge
level, optionally its power, signed like the Home Assistant energy
dashboard). The phone shows the charge level with a small battery and
whether it is charging or discharging; the grid value accounts for it.
- Energy: consumers that were saved with only their entity ID (such as
`sensor.strom_pi_power`) now show their Home Assistant name, or else a
readable form of the ID, on the phone and the wall panel.
- The iOS app follows all of this with its next TestFlight build.
## [0.45.0] - 2026-10-15
- Room on the phone: an eye button hides the room controls so only the room
image remains; tapping it again brings them back, as in the iOS app.
- Cameras that Home Assistant cannot reach (offline, battery cameras without
an image) are answered as unavailable instead of being recorded as Hauser
server errors, so the error book no longer fills up with them.
## [0.44.0] - 2026-10-14
- A glance: room notifications occupy a scrollable sidebar on the right and
follow the room controls' automatic-hide delay. A visible count opens every
current message in full, including those beyond the first two on phones.
Opening notifications no longer dismisses them.
- The native iOS app receives Home Assistant's `hauser_` notifications and
dismisses them at their source. Its notifications list also works with
Apple Home states, observed doorbells and due reminders; notification links
now open that list. Open windows remain until closed, and completing a
reminder updates its source.
- Room: Music Assistant players are discovered through Home Assistant in web
and native media screens, with current title/artist, playback controls,
volume and starting a track, album, artist or station by name. Music
library browsing and queue editing are not part of this first integration.
- The notification guide includes a call-monitor automation for the last
caller display. Recipe integration remains a recorded suggestion.
## [0.43.5] - 2026-10-12
- Notification rules show the current Home Assistant entity name. Condition
notifications disappear when none of the rule's enabled triggers still match;
missing readings do not count as resolution, and finished laundry stays for
acknowledgement. Existing rules receive the updated blueprints on startup.
- The native iOS notification-rule editor now sends the server's trigger
format correctly, including numeric thresholds and zero-delay state rules.
- Image processing on older x86-64 hosts now has a native baseline fallback
for CPUs that cannot run the WebAssembly SIMD fallback either. Modern hosts
keep their existing image library.
- Room selection and device controls now scroll together on web panels and
in the native iPad app, keeping lower switches reachable when room cards
take up the available height. Vertical touch scrolling also works when
starting on the web room selector.
## [0.43.4] - 2026-10-11
- Scenes now keep checking actual device states until every remaining target
is confirmed together. Only devices that still differ receive another command;
temporary read or connection failures no longer end the check. New controls
and Undo take precedence. Available in the web app and the native iOS app.
## [0.43.3] - 2026-10-10
- Dignity when things fail: older Linux x86-64 hosts no longer lose the entire
app when the native image library crashes with an illegal instruction. Hauser
tests the library in a separate process and uses portable image processing
if that test fails. The portable library now matches the current sharp version.
## [0.43.2] - 2026-10-08
- A camera whose stream keeps breaking no longer floods Home Assistant: Hauser
waits half a minute before opening the stream again instead of retrying many
times a second, each time with a fresh still image. Cameras also pause while
the standby screen covers them, while the room controls are hidden and while
the browser tab is in the background; a camera popup still plays over the
standby screen. The native iOS app stops fetching camera stills under its
standby screen as well.
- The image library behind room pictures is updated to close a reported
security issue in one of its components.
## [0.43.1] - 2026-10-06
- Dimming an Apple Home light no longer keeps ramping after you let go: the
brightness glides briefly and then goes straight to the value you chose, even
when a lamp answers slowly. Same in the web panel and the native iOS app.
## [0.43.0] - 2026-10-06
- Moving to another Home Assistant no longer means starting over: Settings →
Maintenance now downloads one backup file with rooms, devices, scenes,
settings, notification rules, family data and room pictures, and restores it
on any Hauser server. Credentials such as tokens and PINs stay out of the
file. Restoring keeps the previous state as a backup on the server and
restarts Hauser by itself. Available in the web panel and the native iOS app.
## [0.42.0] - 2026-10-05
- Room-picture settings now offer “Define objects” directly in the web and native
iOS apps. View existing objects, change their type and outline, or add shapes
freehand or with a rectangle and draggable corners.
- Object edits also work with the bundled room pictures and remain associated
with the selected room and picture.
## [0.41.0] - 2026-10-05
- Room and touch: drag window corners to fit slanted panes; existing polygon
markings keep their shape when edited. Available in web and native iOS.
- Room: uploaded pictures now receive a local overcast version alongside evening
and night. Older pictures get missing overcast versions after updating, while
supplied versions stay intact. Each derived version can be restored from day,
without an AI account or provider call.
## [0.40.0] - 2026-10-04
### Changed
- Room-picture settings now separate choosing a first picture from managing
an existing one. The current picture, its creation method, window marking
and lighting variants are available directly in the room editor. You can
change the method or choose another picture from the same overview.
- Uploaded and manually created pictures expose their supplied and derived
variants. Replacing a variant preserves the creation method and window areas.
The native iOS app includes the same workflow in build 106 and saves Home
Assistant picture changes to the shared server.
- Reworked the README and wiki around setup choices, everyday use and the
differences between the web and native apps.
### Fixed
- Drawing window areas on a phone no longer triggers a room swipe.
- Apple Home brightness changes through the web bridge ease through every
dimming step, including with slow devices. A newer command cancels the
previous transition without switching the light back on.
## [0.39.2] - 2026-10-03
### Fixed
- Light commands use a short 300 ms transition, including brightness changes
from sliders, scenes and undo. Controls respond immediately while supported
Home Assistant lights fade smoothly to the new setting. Also available in
the native iOS app with build 103.
## [0.39.1] - 2026-10-03
### Fixed
- Room-photo uploads accept streamed requests without Content-Length, while
retaining the 12 MiB limit and rejecting incomplete transfers. The image
wizard now shows the specific upload error instead of a generic message.
- The optional Tailscale sign-in reminder appears once per tunnel process
instead of repeating every few seconds, without exposing its login URL.
## [0.39.0] - 2026-10-03
### Added
- Camera popups: long-press a camera to enable an automatic fullscreen view,
choose a motion, person-detection or doorbell trigger, and set a duration
from 5 to 120 seconds. The previous screen returns automatically; the
popup can also be closed manually. Settings apply to this device.
## [0.38.1] - 2026-10-03
### Fixed
- **Grace under failure:** room sensors keep their correct room after Home
Assistant areas are renamed, including humidity and CO₂.
- A delayed failure from an earlier device command no longer rolls back a
newer setting. Home Assistant timeouts while reading a response are reported
as temporarily unavailable.
- Sensor dropdowns remain readable on glass surfaces. Room and energy sensor
lists can be searched by name or entity ID.
- Updated development dependencies to address the reported vulnerabilities.
## [0.38.0] - 2026-10-02
### Added
- **Rain shows on the lock screen icon, and outside pictures get the
weather too.** The weather line on the lock screen shows sun, clouds, rain
or snow as it is outside instead of a fixed sun. A new room setting,
“Weather across the whole image”, lets rain and snow fall over a garden or
terrace picture instead of only inside drawn windows — on the panel and in
the iOS app.
- **CO₂ next to temperature and humidity.** Room settings have a CO₂ switch;
the room tile on the panel, the value strip on the phone and the iOS app
then show the room's CO₂ sensor in ppm.
- **Glass light.** Under Appearance → Card style a third option keeps the
glass look with fewer effects, for tablets where the full glass stutters.
### Fixed
- Fuel stations from the Tankerkönig integration no longer appear under
“Windows and doors” — their “open” sensor describes opening hours, not a
door. A station that was already listed disappears on its own.
- When a stored lock screen layout made the clock or week wider than the
screen, arranging it left the element hanging over both edges. Elements now
shrink a step until they fit, on the panel and in the iOS app.
- The central temperature control explains how to get the room list back
when a single climate entity is selected.
## [0.37.2] - 2026-10-01
### Added
- **Hauser tells you when it updates older room images.** After an update,
Hauser recalculates the evening and night versions of room photos uploaded
before 0.33. While it works, the room-image sign turns in the header and a
notification says so; when it is done, a notification names the rooms that
now darken in the evening. The same message appears in the iOS app, and the
App log records how long it took.
### Fixed
- **Older photos in the image library darken too.** Photos that sat only in
the library, not assigned to a room, kept their bright evening versions and
stayed bright when picked again later.
## [0.36.1] - 2026-09-30
### Fixed
- **The demo always shows the latest release.** Anyone who had opened the demo
before could keep seeing an older version, because the new one waited for a
confirmation the wall panel layout never offers. The demo now switches to the
new version right away.
## [0.36.0] - 2026-09-30
### Added
- **A new area in Home Assistant becomes a room.** When a new light, switch,
cover or vacuum shows up in an area Hauser has never seen, or a device on
the panel moves there, Hauser adds the room on its own and puts the device
in it, without running the setup again. The room starts without an image.
An area whose room you removed in Hauser does not come back by itself.
## [0.35.1] - 2026-09-30
### Fixed
- **Room settings on the wall panel read calmly.** The column with the room's
devices now stands on the same solid surface as the settings next to it, so
the blueprint lines no longer run through names and values. Room image,
scenes and lamps stay at the top while only the settings below them scroll,
with room to breathe in between. Hints under these entries use Hauser's own
typeface instead of a typewriter font.
## [0.35.0] - 2026-09-29
### Changed
- **Room settings sit right under "Assign lamps".** On the wall panel and the
phone, heating, temperature, humidity, windows and motion are shown directly
below the room image, scenes and lamps entries instead of behind a separate
"Advanced" page — the same layout as the iOS app.
### Fixed
- **Own room photos from older versions darken in the evening.** Photos
uploaded before 0.33 kept their bright daylight look at night, because the
evening and night versions were copies of the day picture. Hauser now
recalculates them once on start, so old and new photos follow the time of
day alike.
## [0.34.3] - 2026-09-28
### Fixed
- **Energy sensors save while the Energy page is switched off.** Choosing
producers and consumers under Settings → Services → Energy failed with
"Could not be saved" as long as the Energy module was off — which it is on a
new installation. The selection now saves, stays when you switch Energy off
and comes back when you switch it on.
## [0.34.2] - 2026-09-28
### Fixed
- **Panel settings survive a browser restart.** Panel width, rooms per row and
"return to use mode automatically" now come back from the server when a
browser starts with empty storage; before, the first start wrote the
defaults over the saved layout, and the return-to-use timer lived only in
the browser ([#28](https://github.com/ralleur/hauser/issues/28)).
## [0.34.1] - 2026-09-28
### Fixed
- **Room settings stay readable on the blueprint.** When you configure a room
on the wall panel, the control column and the settings next to it now sit on
solid surfaces, so the blueprint lines no longer run through names and values.
- **Two texts follow the interface language.** The width under Settings →
Control surfaces and the open-window note on the lock screen were still in
German in every language.
- **The lock-screen editor's bar is readable in the light theme.** The bar
with Reset and Done and the size menu now sit on paper with black ink in
every theme; before, the light theme drew them light with white text.
## [0.34.0] - 2026-09-28
### Added
- **Arrange the lock screen.** A long press on the lock screen (in edit mode)
or "Customize the lock screen" under Settings → Ambient & Standby dips the
screen into blueprint blue. Drag the clock, the weather, the week band, the
shopping list and the notes wherever you like; tap one and a small menu next
to it makes it larger or smaller in five steps — the menu jumps to the other
side when it would run out of the picture, and back when there is room again.
Every element keeps its natural anchor (the week band hangs from the bottom,
notes hang from the top), so it grows the way it always did when events or
items are added. Done keeps it, Reset brings the familiar layout back; deep
night still shows only the dimmed clock in the middle. Stored on the device,
like the other standby switches. The iOS app does the same on the iPad.
## [0.33.0] - 2026-09-27
### Added
- **The room-image wizard asks one question at a time and draws for free.**
Do you have a ChatGPT plan? Sign in and everything is drawn for you. Do you
have a Cloudflare account? Enter its ID and a Workers AI token, and the
wizard draws within Cloudflare's free daily allowance; evening and night are
derived from the day picture. Otherwise you draw it yourself: a workbench
per room shows for day, evening with lights, night without lights and
overcast whether a picture is there, only derived or missing, hands you the
wizard's wording for each version to paste into Gemini, ChatGPT or Bing
together with the input picture, and takes the finished picture back.
Below it, mark the windows by dragging rectangles — rain and snow are drawn
only there. The same four ways as in the iOS app.
### Changed
- **Your own photo has a night now.** An uploaded photo gets evening and
lights-off derived from it, darkened, instead of staying bright at night.
- Pictures you drew or uploaded yourself are no longer sent to the image
provider during the night runs for the overcast variant or the surfaces.
## [0.32.0] - 2026-09-27
### Added
- **Hauser speaks Dutch.** Choose Nederlands under Settings → Appearance →
Interface language; dates and times follow, and a Belgian device gets the
Belgian format. The translation was contributed by
[@pservais](https://github.com/pservais)
([#26](https://github.com/ralleur/hauser/issues/26)); the texts for today's
energy balance, the Apple TV remote and the quick-action bar were added
since and still wait for a native review. The iOS app follows.
- **The room image gets the panel to itself.** In the layout menu (long press
on the free stage) the control surface can hide itself after a time without
touch, from 5 seconds to 2 minutes; the next touch brings it back. "All
rooms" shows as many rows at once as you set and scrolls the rest, like the
phone, instead of squeezing many rooms into thin strips. Both also in the
iOS app.
- **Room setup on the panel stands where you control the room.** The room
selection, scenes and tiles sit exactly where they are in the control
surface, with the minus at the corner, holding to reorder and the plus tile
to add; room image, lamps and settings stand beside them. Tapping another
room in the selection sets up that room.
### Fixed
- **A thermostat you add to a room becomes its climate.** A thermostat added
to a room without one, for example a Versatile Thermostat, used to stay a
plain device tile. It now drives the room's climate tile, target
temperature and central climate control. Heat pumps and boilers stay
devices, as in the setup.
- **One unreadable calendar entry no longer breaks the standby week.** An
event whose start Home Assistant sends in a form no date can be read from
is left out, also from the stored calendar, instead of stopping the week on
the standby screen and the agenda.
## [0.31.0] - 2026-09-27
### Added
- **Errors write themselves down.** Hauser keeps an error log: when something
fails on the server, in the browser or in the iOS app, it notes where and
what kind of error it was, and repeats only raise a counter. Entity IDs,
names, readings, addresses and keys are removed before anything is written.
The log stays in your home; the question mark offers to include it and
shows every line first. Nothing leaves on its own.
### Fixed
- **One odd device no longer freezes the rest.** When Home Assistant sent a
state the panel could not read, the whole update stopped and every device
after it kept its old state. That device now drops out alone and lands in
the error log.
- **Feedback from the iOS app without a Hauser server** goes straight to the
inbox instead of opening a GitHub form.
## [0.30.2] - 2026-09-27
### Fixed
- **Notification rules reach Home Assistant again in the Add-on.** Saving a
rule ended with "The rules were saved, but Home Assistant did not apply
them" and a note that a bundled blueprint was missing. The Add-on image
ships the built app only, and the server looked for its blueprints next to
the source tree; it now finds them in the built app. The laundry assistant
installed its automation over the same path and is fixed with it (#25).
## [0.30.1] - 2026-09-26
### Changed
- **The project page reflects the current release.** It now names both ways
to Hauser — the panel for Home Assistant and the iOS app for Apple Home or
Home Assistant, with the public TestFlight link — and walks through what
changed since its last update: configuring on the blueprint and the mode
mark in the title bar, the day's energy balance and the sun arc, the phone's
quick bar, room sheet and in-place configuration, the week lying open on the
standby map, presence dots on room tiles and the one type family. Every
screenshot was retaken from this release and from the current iOS build.
## [0.30.0] - 2026-09-26
### Added
- **Shops can be renamed.** Under Settings → Content → Shopping list, open a
shop and change its name; the bound list and the category order stay. Name a
shop after the list it shows, for example one "Groceries" instead of three
supermarkets.
## [0.29.0] - 2026-09-26
### Changed
- **Ticking off on the phone holds.** A tick no longer bounces back when the
list happens to refresh at the same moment, and the ring is larger so it is
easier to hit in the shop; the whole row still takes the tap.
- **Done items stay under their shop for a day**, struck through, and a tap
brings one back if a finger slipped. The separate "Done" group at the end of
the page is gone.
### Documentation
- The wiki explains how a **Bring!** list becomes a shop through the Home
Assistant integration, and how any automation can **send its own
notification** to the panel with a `hauser_` notification id.
## [0.28.0] - 2026-09-25
### Changed
- **The week on the standby screen lies open on the map.** Seven columns with a
fine line per day instead of a dark glass band; times and today stand in dark
amber on the light ground and in the gold of the logo at night.
- **Configuring happens on the blueprint.** On the panel, room configuration now
sits on a blueprint of the room instead of a dark veil, and moving the notes on
the energy screen turns the house into a blueprint — as on the phone and in the
iOS app.
## [0.27.0] - 2026-09-25
### Added
- **Room tiles show who is around.** A green dot appears on a room tile while
a motion or presence sensor in that room reports someone, and fades away
once the sensor goes idle. Rooms with a camera carry a quiet camera symbol
in the top left corner. Both appear on the phone and in "All rooms".
## [0.26.1] - 2026-09-25
### Fixed
- **Notification rules save again.** Saving a new rule ended in "Saving failed"
as soon as the list held more than the laundry rule, and the rules were
lost whenever the App restarted. The server now accepts the full list and
keeps it with the other household data (#25).
- **A birthday no longer stops Hauser.** A birthday in the calendar whose name
contains letters such as "Ł" or an emoji stopped the server on that day.
## [0.26.0] - 2026-09-24
### Added
- **Hauser follows Home Assistant.** Move a device to another area in Home
Assistant and it moves to that room in Hauser, without reloading. A light,
switch, blind or vacuum added to Home Assistant from now on appears in the
room of its area. A device placed or hidden by hand in Hauser stays where
it is until its area changes in Home Assistant.
### Fixed
- **Room settings are stored for the whole household.** The chosen room
sensors, the phone action, central climate and several settings of the iOS
app were kept only on the device that set them. They are now saved centrally
and shown the same everywhere
([#24](https://github.com/ralleur/hauser/issues/24)).
## [0.25.0] - 2026-09-24
### Changed
- **Rain shows on the standby screen.** The rain over the standby screen was
so faint that it showed on no screenshot. Its streaks are now clearly
visible and still quieter than the clock.
## [0.24.1] - 2026-09-24
### Fixed
- **A heat pump is no longer taken for a room's heating.** Setup used to put
a heat pump or boiler found in a room on its tile, power button and flow
temperature included. Setup now skips heating plants, and the room
configuration has a “Show heating” switch to hide a heater that is already
there.
## [0.24.0] - 2026-09-24
### Added
- **A moving blind stops with a tap.** While a blind, shutter or motorised
door is opening or closing, tapping its tile stops it, like the switch on
the wall. Blinds whose slats can only open and close get two tilt buttons
in the device detail.
## [0.23.2] - 2026-09-24
### Fixed
- **A room's chosen sensor shows on every device.** The temperature and
humidity sensor picked for a room was stored centrally, but other browsers
kept showing their old choice until their site data was cleared. Every
device now picks up the household's choice on start
([#24](https://github.com/ralleur/hauser/issues/24)).
## [0.23.1] - 2026-09-24
### Fixed
- **Remove a person from the reminders board.** The example residents could
be renamed but never removed; the person dialog now has “Remove person”.
Their reminders stay in the list and move to the shared ones; the last
person stays, as in the iOS app. A pencil beside each name shows that a tap
renames it. Reported in the simon42 forum.
## [0.23.0] - 2026-09-24
### Added
- **The TV gets its remote.** When Home Assistant places a remote beside a
media player, as it does for an Apple TV, the device detail shows a
direction pad with select in the middle and back, home and play below —
as in the iOS app.
- **The phone greets on special days.** Birthdays, holidays and the first
snow now show their line at the top of the phone's home, with the same
confetti as the panel; the rooms move down instead of being covered.
- **Adding a device celebrates.** In the room configuration the plus springs
into a gold check, six sparks fly up, and the device moves into the room.
- **Today's energy balance.** A second tap on “Today” lays the day's balance
beside the energy wall: the share of your use that came from your own sun,
the gap the grid filled, and two bars on one kWh axis — produced above,
consumed below, the part used at home bridged in gold. A tap on a piece
shows its paper note with share and whether it was measured or calculated.
On the phone the balance sits directly under “Today”. It reads the daily
meters Hauser knows or, without them, the meters of Home Assistant's energy
dashboard since midnight — as in the iOS app.
- **The sun above the energy.** An arc between sunrise and sunset sits under
the day's figures on the panel and beside the title on the phone: the path
already walked drawn through, the one ahead dotted, flatter in winter; under
clouds only a pale shimmer, at night the sun rests. Hauser asks the weather
service it already uses for the times.
- **The house follows the weather.** When it is cloudy the energy screen
shows the overcast version of the house (the placeholder brings its own, a
house drawn by the assistant has one too), and rain and snow fall over the
whole picture — as in the iOS app, and switched off with the weather on the
stage.
- **The phone's quick bar is yours.** Its four fields are filled in “Adjust
home” (swipe left on the rooms): all off, the central temperature over two
fields or compact as a thermometer with the home average, and your own
buttons. A button of your own runs its steps with one tap — scenes and
devices from any room (toggle, on or off) and vacation mode — and a long
press in edit mode opens its sheet with name, symbol and steps. The fixed
vacation button is gone; a device you had placed on it becomes a button of
your own, and a running vacation keeps its button so you can end it.
- **Cameras together.** When a room has several cameras, they sit side by
side in one split view with fine seams; with an odd number the first takes
the full width. The room configuration switches it off, and the iOS app
reads the same switch.
- **Rename a room where you set it up.** A tap on the room's name (with the
pencil) in the room configuration renames it for the whole household — on
the panel, the phone and in the iOS app, which now uses the same way on a
Home Assistant server instead of keeping the name on one device.
- **Cameras before or after the tiles.** A camera stands above the device
tiles when it comes before the first tile in the room's order, otherwise
below — as in the iOS app. On the panel you drag it in the device list; in
the phone's room configuration an arrow on the camera card moves it.
## [0.22.1] - 2026-09-24
### Fixed
- **Energy totals appear.** Week, month and total now count the meters Home
Assistant already knows from its energy dashboard: grid import and feed-in,
solar and battery; house consumption is balanced the way the dashboard does
it. Setup never recorded such meters, so “Total” stayed empty in every home
and week and month were estimated from power sensors. Where no dashboard is
set up, the note under “Total” now says what it needs.
### Changed
- **The mode switch in the title bar is the h signet.** In use mode the h
stands alone; in edit mode the gold dot sits on it. Switching lets the dot
spring in or pop away, and the new mode shows beside the h for two seconds.
The h takes the colour of the date on the left, light over an image and dark
on a plain surface, on the panel and in the iOS app.
## [0.22.0] - 2026-09-24
### Changed
- **Hauser writes in its own hand.** One type family now carries both voices:
Alegreya Sans for everything you operate, Alegreya for the paper — the
greeting in standby, notes, the calendar sheet and the energy figures. It
replaces Inter and Instrument Serif on the panel, the phone, the iOS app, the
project page and the docs. Figures stand upright and keep their width, so a
clock or a slider value never jumps; every letter of the six languages is
part of the font.
- **The wordmark “hauser” beside the h signet is drawn from the same family**
and no longer depends on a font installed on the viewer's device.
### Fixed
- **A sensor tile keeps its value at full size.** A value whose box was a
fraction of a pixel wider than a whole pixel counted as too long and shrank
to the smallest size, for example “21 °C”.
- **The media screen stays up when a player vanishes for a moment.** While
Home Assistant reloads an integration, the player shows as unavailable
instead of taking the screen down; the climate stepper ignores a thermostat
it cannot see.
- **The iOS app works with a Docker installation, too.** Adding devices to a
room and camera pictures reached Home Assistant through Hauser only in the
Home Assistant app setup; with Docker the iOS app could not assign a device
and cameras stayed black. Hauser now uses the connection from setup for both.
## [0.21.5] - 2026-09-24
### Fixed
- **A room called “Constructor” no longer stops Hauser from starting.** The
name became an internal ID that every JavaScript object already carries, and
the start check failed with “The safe check failed”. Setup now gives such a
room a safe ID, and the configuration check refuses reserved IDs.
- **Lists with two entries sharing one ID keep working.** A CalDAV list can
hand out the same ID twice; the notes page, the standby screen and the phone
then failed with “each_key_duplicate”. The second entry gets a counter, and
ticking it off still reaches the right item — in the web app and the iOS app.
- **The scene editor survives a room without scenes**, and a device that
disappears while its command is under way (Home Assistant reloads an
integration) no longer takes its tile or detail down.
- **Turning on Media without any media player now says so** instead of just
failing: “No media player found. Media can be turned on after ‘Reload rooms
and devices’.”
### Added
- **Stress house, big round.** Every device type with every kind of broken
data, forty more rooms, floods of events and list entries, every button and
slider inside every device detail, scenes and room editing, a Home Assistant
that restarts and drops devices, an empty house, an all-unavailable house and
an imperial one — in the web app and the iOS app. The fixes above are what it
found.
## [0.21.4] - 2026-09-24
### Fixed
- **A device detail opens even when Home Assistant lists an option twice.**
A robot vacuum reporting its fan speeds as `quiet, quiet, max` took the whole
view down with "each_key_duplicate"; modes, presets, sources and speeds are
now listed once each.
- **The notes page survives a reminder with an unreadable due date.** A to-do
item whose due value is not a date stopped the page with "Invalid time
value"; such an item now simply shows no due date.
- **Energy settings save when a sensor also appears in a room.** Choosing the
power sensor of a plug that is already shown in its room as a consumer was
rejected as a duplicate and the save ended in an error. Energy only reads a
sensor, so it may appear in a room as well; the same sensor twice within the
energy selection is still refused.
### Added
- **Stress house.** Before each release the built app is set up against a
simulated Home Assistant full of real-world pitfalls and clicked through
end to end — every room, every tile with its detail, every tab and settings
section, the standby screen and the phone layout. The three fixes above are
its first findings.
## [0.21.3] - 2026-09-24
### Fixed
- **Home opens again when two devices share a name across domains.** Hauser
named its device tiles after the entity ID without the domain, so
`switch.hallway` and `light.hallway` (Home Assistant's "switch as light"
helper) or `media_player.tv` and `remote.tv` got the same name. In one room
the home screen then failed with "each_key_duplicate", and tapping one tile
could switch or open the other device. The second device now keeps its full
entity ID.
## [0.21.2] - 2026-09-23
### Fixed
- **A house picture from the assistant turns grey on cloudy days as a house.**
The overcast version that follows every new picture set was drawn with the
room recipe, so an exterior set could come back as a room. It now keeps the
recipe of the job that created the set, and the nightly run and the manual
button recognise the picture assigned to "Outside (energy)".
## [0.21.1] - 2026-09-23
### Fixed
- **The standby city map is generated again.** One of the two public map
services Hauser asked no longer answers and held every attempt for a minute
and a half; the other turns requests away for a few seconds when it is busy.
Generation then always ended in “The map service is currently unreachable”,
whatever location you chose. Hauser now asks the working service first, falls
back to a second mirror, and tries once more after a short pause before it
gives up (#22).
## [0.21.0] - 2026-09-20
### Added
- **On the phone, configuring a room happens where you control it.** Opened
from the room sheet, the configuration no longer flies in: the room picture
dissolves in place into its own blueprint — fine light drawing lines on
blue, computed from the picture you already have, so it works with your own
photos too. The room name, the scene bar, every device tile and the climate
card stay exactly where they are when you operate them.
- **Arrange devices by moving their tiles.** Hold a tile for a moment and drag
it to its new place; the others glide aside. A small minus on the corner
takes a device out of the room, and a dashed tile after the last device
opens the search with its category filters. The quick setup entries follow
below the devices.
- **A scene can set a colour per lamp.** The scene editor now offers colour
next to brightness and colour temperature, with the same swatches as the
lamp detail; “White” hands the lamp back to its colour temperature. Only
what a lamp can do is shown.
- **On the phone, a room's readings sit under its name.** Temperature,
humidity and presence stand above the scenes instead of taking up device
tiles — each only if the room measures it, and the presence circle glows
green when someone is there. The climate controls live behind the
temperature: a tap opens them, and a switch there puts the card back with
the devices for rooms that want it.
- **On the phone, the energy page shows your house.** The picture from the
wall panel lies pale behind the figures — your own house if you assigned
one — and fades towards the bottom, so the curve and the consumer list stay
calm.
### Fixed
- **The hint under “Generation” says which sensor is meant.** It is what your
solar system produces right now, not the feed-in to the grid; Hauser derives
feed-in and draw from generation and consumption itself.
- **The laundry notification can be set up on any installation.** Validating
or saving the washer or dryer ended in “Laundry setup failed. Try again from
a new preview.” wherever Hauser was opened under an address of its own —
which is every add-on installation. The setup now accepts the address it is
served from, like every other part of the settings (#21).
- **Saved energy sensors stay visible as saved.** After saving the selection
under Services, the page went back to the old selection as soon as you left
and returned, so it looked as if nothing had been saved. The selection now
stays as you saved it, and the reload hint appears, because the energy page
picks up new sensors on the next start.
- **A room you created yourself can pick its sensors.** Under “Advanced”, a
room only offered sensors from the Home Assistant area with the same name —
a hand-made room has none, so the list stayed empty or showed a single
sensor. The temperature and humidity pickers now also list every other
sensor in the home, and sensors and contacts you place in the room count as
the room's own.
## [0.20.6] - 2026-09-20
### Changed
- **Removing a device from a room is an animation, not a jump cut.** The row
puffs up for a moment, tips out of the list to the right and fades, and the
rows below glide up into the gap once it is gone.
### Fixed
- **Dragging devices into order no longer shivers.** The row now hangs on the
finger while its neighbours glide aside, and it changes places only after
passing a quarter of the next row — before, the list swapped back and forth
along the edges of the rows it was measuring against.
- **The bottom bar on the phone sits evenly.** The navigation pill kept less
room above it than below, so on phones with a home indicator it looked
pushed towards the quick actions. Both gaps now match on every device.
## [0.20.5] - 2026-09-18
### Fixed
- **A hand-written Compose file gets the picture wizard.** The image now sets
the room-image boundary (`HMI_ROOM_IMAGE_AUTH_MODE=direct`) itself. A Compose
file that does not copy the shipped environment answered
`503 AUTH_BOUNDARY_MISSING` to every room-image request, so saving the
OpenAI key and opening the wizard failed
([#19](https://github.com/ralleur/hauser/issues/19)).
- **The ambient texts stop asking for a model that is not there.** Hauser only
calls a language model for the standby lines when `HMI_AMBIENT_HOST` or
`HMI_AMBIENT_PORT` names one. Without it the route answers `204`, the lines
come from the built-in generator as before, and the browser console no
longer shows a `502` on every refresh
([#19](https://github.com/ralleur/hauser/issues/19)).
- **A fresh add-on install no longer hits a missing image.** The add-on
manifest on `main` named the new version before its image was built, so for
the first hour after a release the Supervisor failed with
`manifest unknown` ([#20](https://github.com/ralleur/hauser/issues/20)).
The release now publishes the image first and makes the version visible
afterwards.
## [0.20.4] - 2026-09-17
### Added
- **The energy screen takes your own photo directly.** Long-press the picture
in configure mode and choose "Choose custom image" — the photo becomes the
house picture and lands in the library, just like a room picture. Until now
the energy screen only offered the picture wizard or an image already in
the library.
## [0.20.3] - 2026-09-17
### Fixed
- **A calendar with a recurring event opens again.** Every occurrence of a
series carries the same identifier, and the calendar view stopped with
"This view failed to build" as soon as a series had more than one date in
view. Each occurrence now has its own identifier.
## [0.20.2] - 2026-09-16
### Changed
- **The project page now opens with both views of the home screen.** The hero
shows real captures of the two home views — one room filling the panel, and
all rooms as tiles — with the tile view after dark, where a room with a lamp
on carries its lit picture and a room with every lamp out carries the dark
one. A new section walks through the tile view by day and after dark, and
every screenshot on the page was retaken from the current release.
### Added
- **Every release now shows up as a GitHub release**, with its changelog
section as the notes. Watching this repository for releases tells you that a
new version exists — until now only a tag was pushed, which notifies nobody.
Home Assistant add-on installations were unaffected: the Supervisor has
always shown the update inside Home Assistant.
- **A moving `latest` image tag** for Compose installations that would rather
follow the newest release than a fixed number. Pre-releases are excluded, and
`compose.yaml` keeps pinning an exact version by default.
### Fixed
- **A view that fails to open now says so.** Until now anything that went wrong
while a view was being built left "Loading view." on screen forever, with the
cause visible only in the browser console. The view now shows what went wrong
and offers to try again, and the rest of the panel keeps working. Retry
buttons in the shell follow the interface language again.
- **A damaged job no longer switches the picture wizard off for good.** One
incoherent record kept the job store closed, and inside the add-on nobody can
reach the folder to clear it, so the wizard answered 503 forever. The folder
is now set aside once — nothing is repaired, nothing is deleted — and the
store opens empty.
- **A well-metered house can save its energy selection again.** The server
accepted at most 64 consumers, while the settings page pre-selects every
power sensor Home Assistant reports — a home with more of them could never
save the page. The limit is now 256, and going past it says so instead of
failing silently.
## [0.20.1] - 2026-09-15
### Fixed
- **An all-day event fills one day again, not two.** Calendars that deliver a
plain date — iCloud and CalDAV among them — were read as UTC, so a birthday
stretched into the next morning and showed up as a multi-day bar.
- **Picking your own room picture now says when the device cannot do it.**
Where the image library does not run, the upload said only that the picture
could not be saved; it now names the reason, and the log records what really
failed instead of a follow-up error.
- **Document storage can be set up from the panel.** Its PIN used to come from
the Mac keychain only, so in the add-on the storage stayed locked forever.
PIN, address and token now live together under Settings → Services.
- **Sheets on the phone come and go like app cards.** The room sheet, the More
sheet and the room setup now slide out in the same time and curve they slide
in, without fading; after a swipe the sheet continues from where your finger
let go instead of jumping back up first.
## [0.20.0] - 2026-09-14
### Changed
- **The demo greets you with the standby screen.** The first visit in a
browser tab opens on the clock over the street map, the way a panel rests
on the wall; a tap wakes it. A reload in the same tab starts on Home. Real
installations are unaffected, there the standby timer decides.
- **The demo's street map is Cologne**, five kilometres around the cathedral,
drawn from OpenStreetMap data like a real household's map.
- **Wiki pictures of the mode mark** in the title bar are current again.
## [0.19.1] - 2026-09-14
### Fixed
- **The room goes dark again when the last lamp goes out.** Since blinds,
switches and vacuums joined a room's device list, an open blind counted as
"on" and kept the evening picture lit. Only lamps decide now.
- **Room pictures on the phone in the demo.** The demo build skipped the
phone-sized picture variants, so the room tiles stayed empty.
- **Screenshots and wiki refreshed** for the glass card style, the question
mark in the title bar and the phone's frosted-glass controls.
## [0.19.0] - 2026-09-14
### Changed
- **A new house on the Energy screen.** The bundled placeholder — shown
wherever no exterior picture of your own is assigned, and in the demo — is
now a modern two-storey family house with a solar roof, day and night, with
the notes for solar, load and grid placed on it.
## [0.18.6] - 2026-09-14
### Changed
- **Home, Shopping list and Reminders are the phone's default bottom tabs.**
Everything else waits under "More". A device with its own saved order
keeps it.
## [0.18.5] - 2026-09-14
### Fixed
- **The active tab's highlight on the phone now encloses icon and label**
completely; on Energy and Shopping list the icon used to peek out at the top.
## [0.18.4] - 2026-09-14
### Changed
- **The phone's off button is all symbol.** The power sign now nearly fills
the button.
- **The "off" safety prompt is off by default.** New installations switch
everything off without asking; the prompt with its cut-off time can be
turned on under System → Interface & controls. A device that already had
the prompt on keeps it.
### Fixed
- **Climate pill and "All quiet" sat in the middle of the panel's footer.**
In the published build the footer's base stylesheet won over the panel
layout, so the climate control and the security status crowded around the
navigation instead of standing at the left and right edge; the workshop
build had the stylesheets in the other order and did not show it. The panel
footer rule now wins regardless of bundle order, and the status pill keeps
its rounded glass shape.
## [0.18.3] - 2026-09-14
### Changed
- **The off button on the phone shows only its symbol.** The word below the
power sign is gone; the button keeps its size and its spoken label.
## [0.18.2] - 2026-09-14
### Changed
- **Phone controls now match the panel's footer exactly.** Off, climate,
holiday and the navigation pill carry the same dark frosted glass as the
panel's pills, with light text, a faint bright edge and the same amber
highlight behind the active tab — identical in light and dark mode, as on
the panel. The calm taupe ground behind the room tiles stays.
## [0.18.1] - 2026-09-14
### Fixed
- **Stronger contrast on the phone controls.** Text and icons on the quick
actions and the navigation pill are darker and more opaque, the frosted
glass a little lighter and denser, and the active tab a deeper amber, so
labels read clearly on the taupe ground. Dark mode gets the same lift.
## [0.18.0] - 2026-09-14
### Changed
- **A quieter phone home.** In the glass card style the room tiles now stand
on a calm, warm taupe ground instead of the panel's relief: no waves or
diagonals between the tiles, only a very soft shift of light across the
bottom of the screen that stays put while you scroll. Off, climate, holiday
and the navigation pill share one matte frosted glass — a lightly tinted
warm grey with real blur, a faint bright edge and a soft shadow — with dark
warm-anthracite text and icons; minus stays blue, plus and off red, the
active tab amber. The two control rows sit a little closer to the tiles and
are slightly more compact; every touch target stays at least 48 px. Dark
mode gets the same material in its dark form. Panel and standard card style
are unchanged.
## [0.17.1] - 2026-09-14
### Fixed
- **The phone navigation pill is frosted glass too.** In the glass card style
it now carries the same dark pane as the quick actions and the panel's
footer pills, on every phone screen, so it no longer stands out as a light
bar under the dark glass above it.
## [0.17.0] - 2026-09-14
### Changed
- **The phone home stands on the same relief as "All rooms" on the panel.**
In the glass card style the room tiles no longer sit on a flat surface: the
quiet light or dark relief from the panel lies behind them, and the quick
actions row — off, climate, holiday — becomes the same frosted glass as the
panel's footer pills. The tiles scroll on behind it and shimmer through
instead of vanishing into a solid band. Other phone screens are unchanged.
## [0.16.1] - 2026-09-14
### Fixed
- **Swiping down closes the room sheet on the phone again**, even when the
room has so many devices that the list scrolls. As long as the list sits at
the top, dragging down pulls the sheet away; further down, the same movement
scrolls the list.
## [0.16.0] - 2026-09-14
### Added
- **Say something, right from the panel.** A question mark at the top right,
next to the standby button, opens a small sheet: "Something is wrong" or
"I would like …", a sentence, and an optional reply address. No GitHub
account, no forum. The sheet shows what travels along — version, language,
screen size, connection state — before you send. Messages go to a postbox
that the maintainer empties regularly; the demo shows the sheet but sends
nothing. Available in all six languages.
## [0.15.2] - 2026-09-13
### Added
- **Device groups.** Lights, fans, plugs and blinds that always act together
can become one tile: the device detail has a group button at the top right
instead of the close cross. Pick two or more devices of the same kind from
any room; the group takes the place of the device it was created from, and
every touch — on, brightness, colour, speed, position — goes to all members
with the same value. The group can be edited or dissolved later; dissolving
puts the original device back in its place. Groups live in Hauser only.
### Fixed
- **Lights that are on look on again.** In the glass card style, the icon
chip of a light tile stayed grey on the phone room sheet and on the wall
panel, and dimmed lights no longer showed their level. The chip now turns
warm when the light is on and follows the brightness, and the same applies
to the symbol and power button in the device detail.
- **The layout sliders on the wall panel move smoothly again.** Dragging the
"Adjust size" or "Rooms per row" ladder in the layout menu no longer
stalls: the swipe that closes the menu had been grabbing the finger.
- **Scene pills wrap instead of shrinking.** In the glass card style the
scene pills used to squeeze and cut off names; now they fill the row and
move to a second row when the control surface is too narrow, following its
width like the device grid.
### Changed
- **The layout menu is a glass sheet.** In the glass card style the layout
menu on the wall panel now uses the same frosted dark sheet as the other
overlays, with its setting cards as light glass on top.
- **Hauser opens in the language of the device.** Without a stored choice the
interface follows the browser or tablet language, and when none of the six
languages fits it now shows English instead of German. The language picked
in the settings — or during the setup wizard — still wins and is remembered
on that device.
## [0.15.1] - 2026-09-12
### Fixed
- **Panel pages were empty in the published build.** In 0.15.0 the stage on
the wall panel shrank to the height of the top bar, so every page showed
only the background relief; the workshop build had the stylesheets in the
other order and did not show it. The frame rule now wins regardless of
bundle order.
## [0.15.0] - 2026-09-12
### Added
- **Standby: the calendar can stay off the lock screen.** A new switch
under Appearance › Ambient & Standby, "Calendar in standby", removes the
week strip from the bottom of the lock screen; the wall then shows only
the clock, the weather and the notes. It stays on by default.
### Fixed
- **Room setup: adding a device.** Tapping into the search field now
glides it to the top instead of jumping. Tapping a type filter such as
"Light" works on the first tap; before, on the wall panel the list
snapped back and the tap was lost.
### Changed
- **Navigation: the marker glides.** The small gold underline under the
active tab is gone. A warm, translucent pill now sits behind the active
tab and glides to the next one when you switch, with a light spring that
overshoots a touch and settles; the icon of the active tab lifts slightly
and takes the gold. Reduced-motion settings switch without movement.
- **Pages move with the bar.** Switching pages is no longer a plain
crossfade. The new page comes in a short way from the side its tab sits
on, slightly smaller, and settles; the old page eases out to the other
side. Going back runs the other way. Reduced-motion settings switch
without movement.
- **Home comes back without a white flash.** Returning to Home from
another page shows the room picture from the first frame; before, the
stage was briefly white while the picture was decoded again.
- **Touch: the lock screen opens instead of cutting.** A tap on the
standby screen no longer jumps to the next frame. A soft ring runs out
from the finger across the glass, the clock lifts a touch and blurs, the
week strip and notes sink away, and the pane fades to reveal the room
beneath — just under a second, only transform and opacity. Locking is the
mirror image: the pane settles in, the clock comes into focus from a soft
blur, the week strip and notes rise into place, and from the standby
button the ring runs the other way, drawing in to the button. The idle
timer settles the pane quietly without a ring. Reduced-motion settings
skip all of it.
- **Phone shopping list: a quiet checklist.** The items carry the page now,
the interface steps back: a smaller title, store names as compact
headings with a small count beside them, items in regular weight, no
dotted separators. Every row is 48 px tall and tappable in full, with an
empty circle on the left that fills in the warm accent when you tap it;
the item then moves to a "Done" group at the bottom, where the store
stands small beside it and a tap brings it back. A short strip above the
navigation offers "Undo" for five seconds after each check. The plus
buttons are gone: each store ends in a muted "Add item" row that turns
into the input on tap and stays open for the next item after Enter. The
sync time sits small under the title; only an error stands out. Sort and
refresh are two icons in the top right, the active sort state in amber.
- **Phone energy: the story behind the numbers.** The page opens with the
power right now, large and in watts when it is small, with solar and grid
draw or feed-in as two quiet lines beneath. The period control belongs to
the history below it, one row "Today · Week · Month · Total" with the
concrete range underneath, so it is clear that the live value stays
untouched and that "Week" is the last calendar week. Today shows the load
curve of the day as a warm area over 24 h and a comparison with yesterday
up to the same time of day; the other periods show compact numbers. A
"Top consumers" list with thin share bars replaces the two navigation
buttons; "Show all" unfolds the rest. Several plugs are called "Measured
devices", not a house load. The status sentence, the "grid flow" line
and its orange dot are gone; only missing data gets a note.
## [0.14.0] - 2026-09-11
### Added
- **Home: All rooms at a glance.** The layout menu (long press on the free
area) gains a "View" pill: "Full screen" is the familiar stage — one room
picture, the room picker at the top of the control surface. "All rooms"
drops the picture and shows every room as a tile, the same tiles as on the
phone, with picture, name and light status. The room picker leaves the
control surface, which now belongs entirely to scenes and devices and
carries the room name as its heading; a tap on a tile brings that room into
the control surface. "Rooms per row" sets the tile columns. In portrait the
tiles take the upper band, the controls the full width below.
- **Home: swipe the control surface away.** A swipe to the left on the
control surface lets it fly out of the picture, in "Full screen" and in
"All rooms" alike. The stage then belongs entirely to the room picture or
the tiles, which spread to the full width. The next touch anywhere brings
the surface back; a tap on a tile also selects that room.
- **Phone home with many rooms.** The room grid scrolls again and fades
softly behind the quick actions (off, climate, custom button), which stay
put at the bottom; before, with many rooms the tiles ran underneath them.
A swipe to the left on the grid pulls a side sheet in from the right,
following the finger like the control surface on the panel; it holds
rooms per row (1 to 3) and a switch to hide the quick actions, and a
swipe to the right drags it out again. Both are per device, like the
order of the bottom bar.
- **Blinds come along from setup.** Covers (blinds, shutters, awnings) are
now a role of the household: the setup wizard hands them over into their
rooms like lights and switches, the household config accepts several per
room, and the command contract carries open, close, stop, position and
tilt. Before, a cover only reached a room through "Add device". The cover
sheet (open, stop, close, position ladder, tilt) is unchanged; the demo
shows one in the living room.
- **Sensors pick their symbol.** A sensor without a symbol of its own gets
one from what it reports: device class first, then unit, then words in
its name or entity id, German and English. Battery, temperature,
humidity, power, energy, voltage, current, CO₂, air quality, pressure,
light, rain, wind, water, gas, signal, motion, door, window, smoke and
more; the neutral gauge stays for everything else.
### Changed
- **Layout menu without ceremony.** The layout menu has no title and no
"Apply" or "Cancel": every setting takes effect the moment it is set. It
stays on the right and flies in from there, over everything instead of
pushing anything aside, and leaves on a swipe to the right, a tap beside
it or Escape. A swipe from right to left anywhere on the stage opens it,
in "Full screen" and "All rooms" alike. "Reset to default" sits top
right. The second control surface is added at the bottom and gets a fixed
room of its own, chosen right there.
- **Climate is a tile.** In the control surface the thermostat shrinks to a
tile the size of a device, showing target and current temperature and the
mode as its symbol, with no controls of its own. A tap opens the familiar
thermostat as a sheet: current, setpoint with minus and plus, modes. A long
press opens the tile's settings: "Controls in the surface" brings the
thermostat card back into the control surface, "Tile shows" picks target,
current or both, and "Step size" sets 0.5° or 1° per tap.
- **Sensor tiles show the value.** A sensor added to a room shows only its
reading on the tile, not its name. The device sheet has a switch "Name on
the tile" for the cases where the name matters.
- **Room: the thermostat never wraps.** When the controls stay in the
surface, the climate card is one light control surface at full card width:
the current temperature sits as a line above the setpoint, the frame around
the controls is gone, and the setpoint takes three fifths of the card at
hero size, the modes the rest. At any control-surface width the card keeps
its shape instead of breaking into two rows.
- **Gestures forgive a crooked finger.** A horizontal swipe no longer breaks
off when the finger drifts, and it claims the touch before the browser
starts to scroll. Pressed feedback on a tile waits a moment on touch, so
starting a scroll on a tile no longer makes it pop.
## [0.13.0] - 2026-09-10
### Added
- **Raum: The device search offers the types a room can take.** A tap into the
search field brings up pills — Light, Switch, Climate, Sensor, Media and the
rest — each with the number of devices behind it. One pill lists that type
without typing a word; the first thirty, with the remainder named below. As
soon as a letter is typed the pills step aside and the name search takes over.
- **Telefon: The pairing card opens the app on the same device.** Whoever
reached Hauser from their phone's browser cannot scan a QR code that sits on
the same screen. The card now offers "Open in the app on this device" — the
same link the code carries, as a handle. The wall panel does not show it.
### Changed
- **Raum: The stage fades softly from room to room.** The slow dissolve that
used to happen only when the last light in a room went out now carries every
room change, whatever time of day it is. Switching a light on inside a room
stays instant — that is a switch, not evening light.
- **Einstellungen: New symbols for the picture assistant and the catalogue.**
Both are drawn now instead of pixelled: no background, crisp at any size, and
they follow the theme like the Hauser mark — light on dark, dark on light,
with the spark and the sun staying gold.
- **Everywhere: No more scrollbars.** Hauser is swiped and scrolled, not dragged
by a bar; with a mouse attached the system used to draw fixed bars through
cards and glass surfaces. Scrolling is unchanged, only invisible.
### Fixed
- **Raum: The climate card no longer breaks into two rows when the column gets
narrow.** The current temperature, its symbol and its label shrink instead, so
the target temperature stays beside them.
- **Raum: The first tap on a suggestion in the device search arrives.** Leaving
the search field gave back the room the sheet had borrowed for the keyboard
and moved the section between press and release, so the tap landed beside its
target.
## [0.12.1] - 2026-09-10
### Fixed
- **Raum: One damaged picture set no longer keeps the house from starting.**
After an update across several versions, a set could lose its files while the
phone derivations were being added, leaving its catalogue entry in the old
shape. The store then refused the whole catalogue and the service never came
up. A set that breaks the contract is now passed over — the room falls back to
its default picture, the house starts, and the log names what was skipped. The
contract itself stays closed: what is passed over is not served and not
written back.
- **Raum: The overcast variant survives the derivation.** Adding the phone
derivations replaced the set's directory and dropped the optional overcast
picture, which costs its own model call. It is now carried across.
## [0.12.0] - 2026-09-09
### Added
- **Telefon: The quick action next to the temperature can carry any device.**
A long press on the vacation button opens an editor: pick any switchable
device and it sits behind the button from then on. Its icon is suggested from
the device itself, unless you deliberately choose your own from the icon
catalogue.
- **Telefon: The bottom bar can be arranged from the More menu.** Two groups —
the four slots of the bar and everything else. Drag a category upwards past
the heading to pin it below, or use plus and minus. "More" holds the last
slot as long as something sits behind it.
- **Raum: The house hands its room pictures to devices without AVIF.**
`GET /api/app/hero/:roomId/:variant?w=` returns the room's picture as JPEG in
the requested width — the same picture the wall shows, for the watch.
- **Raum: The demo has a ceiling fan.** It hangs in the bedroom and shows the
fan panel with speed, presets, oscillation and direction.
### Changed
- **Blick: The day theme stands on a warm ground.** The light surfaces move
from a cool grey to a warm off-white, and cards, overlays and borders follow
the same undertone so the surfaces no longer look patchy against each other.
The night theme is untouched.
- **Telefon: The More menu shows every category, not only the hidden ones.**
It carries a grip, a subtitle and one button that leads to arranging the bar.
Whoever looks here should not have to know where something hangs first.
- **Telefon: A swipe down closes a room from anywhere in it.** The gesture used
to hang on the sheet's head alone; it now works across the whole surface,
and the room editor has it too. While the content is scrolled, the downward
movement belongs to the list again.
- **Telefon: The device search lifts itself above the keyboard.** Tapping the
search field in a room's device list moves it to the top of the panel, so the
suggestions stand above the keyboard instead of behind it.
- **Telefon: Energy reads as a page.** Four periods sit in two rows with the
active one marked, the switch between flow and consumption says in plain
words where it leads, and the readings fill their row instead of standing
narrow at the edge.
- **Telefon: The shopping list fits a phone again.** Title and tools shared one
line and pushed the page sideways on a 390 pixel screen; they now wrap and the
page can no longer be scrolled horizontally.
- **System: The settings list sits evenly again.** The hairline between two
groups carried eight pixels of air that fell to one side, so the last entry of
a group sat visibly too high and the first of the next too low.
- **System: Without a Hauser server, the settings only show what works.** On the
Apple Home path there is no Home Assistant, Jellyfin, Paperless, family data
or room picture assistant — those sections and entries now stay out of the
list and out of the search instead of reaching into nothing.
- **System: The settings load one section at a time.** The screen used to bundle
all fourteen sections into a single 416 KB chunk that the companion app could
not load at all; it is now 17 KB plus the section you open.
- **Steuerung: The first tap after opening the app arrives.** Until the socket
stood, every command was dropped — exactly the window the first grab falls
into. Commands are now accepted and sent as soon as the connection is up.
- **Panel: The iPad's own status bar steps aside.** Hauser draws its own header
with clock, date and connection, so the system clock no longer stands above
it twice. It returns as soon as the view switches to the phone shell.
- **Blick: The project page shows the standby in six places.** Cologne, Paris,
Barcelona, New York, Amsterdam and a Bavarian village take turns behind the
clock, by day or by night, to show that the map is your own streets and that
the radius picks itself. The room section switches the real screen through
sun, rain, evening and lights off, controls included, and the two voices
section shows the lamp and fan panels stepping through their states.
- **Blick: The project page says what Hauser is, in the first sentence.** The
headline used to sit inside the picture frame and was cut off on phones, so
the first screen showed a living room and not one word about the product.
Headline, a plain description and the install facts now come before the
picture, followed by three sober paragraphs: what it sits on, what it runs
on, and who owns the data.
### Fixed
- **Blick: Rain and snow fill the whole screen.** The drifting layer began each
pass with its lower edge on the top of the screen, so it only snowed in the
upper part of the picture until the pass was nearly over — in standby as well
as in the window of a room. The movement now runs downwards out of its
resting position and covers the surface at every moment.
## [0.11.0] - 2026-09-07
### Added
- **Steuerung: Every device Home Assistant can control has its own second
level.** Blinds and valves get open, stop and close plus position and tilt;
vacuums start, pause, return to the dock and choose their suction; locks
lock, unlock and open the door; humidifiers and water heaters carry their
target and operating mode; lawn mowers mow, pause and dock; alarm panels arm
and disarm, asking for a code only when the device requires one; numbers,
selections and buttons can be set, chosen and pressed. Thermostats show
every mode they report, along with fan, preset and swing, and their scale
follows the device's own limits. As with the fan: what the device does not
report does not appear.
## [0.10.1] - 2026-09-07
### Changed
- **Blick: The project page tells the story of the panel, not a feature list.**
The first thing on it is the living room without any controls, moving
through sun, rain on the window, evening and night; then the three moments
the interface is judged by, the two voices of paper and instruments, and
what happens when the house does not answer. Every screenshot was retaken
from the current default pictures.
- **Raum: The demo home has solar on the roof.** The energy picture in the
demo carries all three notes — solar, measured load and grid — with a day
curve for generation and consumption, and the notes sit where they do not
cross the roof.
- **Blick: The demo opens quietly.** No promotional card for the room-image
wizard, no camera tile without a camera image, and the scribbled tips wait
until you touch the screen for the first time.
## [0.10.0] - 2026-09-07
### Changed
- **The room tiles on the phone go dark with the room.** In the evening a tile
now shows the unlit night picture whenever no light is on in that room, and
the lit one as soon as a lamp burns — the same reading the large stage has
always had, and the change fades in the same way: when the last light in a
room goes out, its tile sinks slowly into the dark instead of flipping.
The tiles still load the small phone-sized picture, so the darkened version
costs no more to show than the lit one.
## [0.9.1] - 2026-09-07
### Added
- **Fans have their own control panel.** A fan no longer hides behind an
on/off tile alone: press and hold it and the panel shows what the fan can
actually do — speed as a tick scale in percent, the preset modes the device
reports (normal, breeze, sleep, turbo, whatever it offers), oscillation on
or off, and the direction of rotation. Only what Home Assistant reports as
supported appears; a plain on/off fan keeps its plain panel.
### Changed
- **A running fan turns.** Its symbol rotates while the fan runs, on the tile
and in its control panel, and the tempo follows the speed: full speed turns
fast, the lowest step turns slowly, off stands still. Reduced motion keeps
the symbol still.
- **A dimmed lamp looks dimmed.** The symbol of a dimmable lamp now carries
its brightness in its colour, on the tile and in its control panel: full
brightness glows in the full accent, a low step stays visibly muted, off
remains grey. The step is readable at a glance, without a number.
### Fixed
- **Hauser starts on older processors again.** The image library ships
prebuilt binaries that require an x86-64-v2 processor; on older hardware —
and in virtual machines that present a generic CPU without SSE4.2 — loading
them failed, and because the image library is loaded at startup the whole
add-on refused to start instead of merely losing room images. A portable
WebAssembly build now ships alongside and is used automatically when the
fast one is rejected, and a failure to load images can no longer take the
panel down with it. Thanks to @nadi1971 for the report (#18).
## [0.9.0] - 2026-09-07
Everything below arrived between 0.8.2 and this release. It is one update:
the energy screen became a picture of your own house, the calendar became a
sheet of paper, and several places stopped claiming things the house cannot
measure.
### Added
- **The energy screen can show your own house.** The image assistant and the
image library now offer "Outside (energy)" as a target next to the rooms.
An image set assigned there becomes the stage of the energy screen: the day
version by day, the night version at night, fading between the two at dusk
exactly like a room. The detection knows solar modules as a new kind of
area, so the generation figure hangs on the real modules and the load figure
on a window; the grid figure points to the edge, where the grid is. Without
an assigned set the built-in picture stays.
- **The energy picture has a menu.** Press and hold its background in
configure mode and a small sheet offers what belongs there: create your own
house with the assistant, pick a picture from the library, move the notes,
or jump straight to the sensor assignment in the settings.
- **The notes on the energy picture can be moved.** Every note and its pin
can be dragged; "Done" keeps the arrangement, "Reset" returns to the
built-in positions. Positions belong to the picture they were set on, so a
new picture starts again from its template. A note can never end up outside
the visible picture, under the tab bar or over the figures at the top left.
- **The workshop simulator knows the energy screen.** Sliders for generation
and load, presets for noon, evening and grid draw, and the two special
cases — a house without a generation sensor and a house without any sensor.
### Changed
- **Energy lives in the picture.** The column of tiles is gone. Live
production, measured load and the grid sit as small paper notes in the
picture, each pinned by a hairline to the thing it measures, while the free
wall carries the day: the period's leading figure large in the paper voice,
the rest small beneath it. The period chips stay; the flow diagram, the
consumption card and the grid of figures are gone. What the house cannot
measure gets no note.
- **True curves.** The day's line was an invented shape. It now comes from
Home Assistant's five-minute statistics of the configured sensors, and it is
simply absent until there is data. Last week, last month and total show real
sums from the long-term statistics of the meters — produced, fed in and
drawn only where a sensor exists.
- **A new built-in picture for the energy screen.** No longer a balcony over a
specific city composed for a sidebar that no longer exists, but a generic
house from the garden in Hauser's illustration style, day and night. It is
also the demo picture.
- **The calendar is a sheet of paper, not a table.** Hairlines instead of a
grid, small caps weekdays, a serif month and serif day numbers. The current
week sits at the top in full size, the coming weeks follow a step quieter,
and a week without appointments folds down to its numbers. Today is a small
pinned slip instead of a blue box. All-day entries are paper notes; timed
entries are ink, with the time in the colour of their calendar instead of a
coloured edge. Every calendar gets its own paper colour, and a resident's
own calendar wears the resident's colour from the pinboard. The "updated at"
line and the refresh button are gone: the sheet refreshes on its own.
- **A clock never goes out.** When the household configuration is missing or
the server stays silent, the panel no longer imitates a dashboard. It shows
the time, the date and the coming days in the quiet standby style; the cause
is one translated sentence at the bottom, next to a reload button.
- **Losing the connection no longer stacks a banner over the stage.** The room
picture stays where it is and the controls dim as before. On the panel the
title bar carries the cause and reconnects on tap; on the phone a small
floating chip does the same without pushing the content down.
- **No dashes where the house has nothing to measure.** A figure only exists
with a reading: without a value the field is gone, and without fields the
section is gone — on the panel, on the phone, in the sensor tile and detail
window, and for the media source.
- **The settings fit on one screen.** The sidebar lists nine areas without
scrolling, separated by hairlines instead of five headings. Maintenance and
diagnostics, the library override and the unfinished hotel mode are folded
away: they appear when the hidden gesture reveals them (tap the logo three
times) and the search finds them at any time.
- **The consent line in the image assistant names the purpose**, not a number
of image calls. The number of provider calls still shows next to the button.
- **The ambient street map is on by default.** It still appears only once a
location is set and the server has rendered the map, so nothing changes for
installations without one; a second device no longer starts without the
background. Turning it off is what gets stored now.
### Fixed
- **The calendar is there from the first minute.** On a freshly set-up panel
the calendar tab and the standby week strip only appeared after the first
five-minute refresh, because the first fetch ran before the connection to
Home Assistant stood. Now every stale reading reloads the moment the
connection is established.
- **A house photo stays a house.** Sending a photo of your house through the
image assistant with "Outside (energy)" as the target produced a living
room, because every prompt spoke of a room. The outside target now has its
own recipe for all five passes.
- **A green dot that tells the truth.** The image assistant showed "Connected"
as long as a credential file existed, even when the ChatGPT sign-in behind
it had long expired. The status now asks whether the sign-in still carries;
if it does not, the card says so and offers the sign-in right there. If the
machine is simply offline, nothing is claimed either way.
- **The image assistant says why it stopped.** Every failure from the image
provider read the same sentence. An expired sign-in, an exhausted quota and
a refused photo need different next steps; each reason now has its own
sentence, and it names what to do.
- **The image assistant keeps its target** while the pictures are generated,
even if the dialog is closed in between.
## [0.8.2] - 2026-09-06
### Fixed
- **The room editor opens again.** Since 0.8.0 the build ships a shared chunk
named `room-images-<hash>` next to the room-image assets, and the asset
route claimed everything starting with that prefix, answering 404. The
route now claims only the `/assets/room-images/` folder; bundle chunks are
served statically.
- The startup self-check no longer logs a bogus "0 files missing" line when
only the room-image job store failed to load.
## [0.8.1] - 2026-09-06
### Fixed
- **The App starts even when the room-image assistant's job store refuses to
load.** A single inconsistent job record used to stop the whole server, so
Home Assistant kept the App in an error state. The store stays fail-closed
(nothing is repaired or deleted), but the house now starts without the
assistant: its routes answer 503, `/api/health` reports
`selfCheck.roomImageJobStore`, and the log names the offending job and the
rule it breaks.
## [0.8.0] - 2026-09-06
### Added
- **The room picture follows the weather.** Each generated image set gains an
overcast variant, so a room shows grey window light on a rainy day instead
of the same golden afternoon. The room-image assistant asks a vision model
once per image set for the surfaces it can see (windows, floor, seats,
tables and more) and keeps them in the catalogue; rain and snow are drawn
only inside the windows. Nothing runs in the browser at start or on a room
change.
- **Weather in the standby screen.** Rain, snow and cloud pass quietly behind
the clock and the notes. Switchable under Ambient & Standby.
- **Undo instead of confirm.** After "everything off", a scene or a climate
change, a five-second toast offers Undo; the command goes out immediately.
A switch that gets no echo from Home Assistant within a second pulses once.
- **Presence and person.** A motion detector from Window & Motion can wake the
panel from standby; when every resident is away the standby goes dark; the
first person home is greeted by name with their own notes first. Residents
are mapped to Home Assistant persons, which are imported on first start.
All off by default.
- **Ambient light.** A brightness sensor in the room or in the panel dims the
interface continuously between two levels.
- **Hidden gestures.** Long-press the clock for a large date and seconds;
tap the logo three times for a diagnostics view with frame rate, connection
age, snapshot age and version.
- **Calendar moments.** Birthdays and selected fixed days from the family
calendar show a quiet morning confetti and a line in the standby; the first
snow of the season is noticed once. Fixed days are selectable in Settings.
- **Dusk in real time.** Around sunrise and sunset the room picture and the
interface tones cross-fade over the sun's elevation instead of switching.
Light cones come on quickly and fade out slowly; when the last lamp in a
room goes out the picture dims into its unlit version.
- **New default room pictures** drawn from a real household, chosen by room
name in every supported language.
- **Cameras stream live over HLS** as in Home Assistant, with still images as
the fallback.
- **Shopping list sources.** Stores can be Home Assistant to-do lists (created
from Hauser) or a Notion page.
- **Companion app pairing.** The System screen shows a one-time QR code; a
paired phone gets its own device token. The app itself is a separate
project and not part of this release.
- Standby can be switched off or given its own delay; the layout dialog uses
the same tick scale as the light dimmer.
### Changed
- **The outdoor weather is your own.** The server reads the home location
from Home Assistant and asks Open-Meteo itself; the interface no longer
carries fixed city coordinates and the response contains no coordinates
([#15](https://github.com/ralleur/hauser/issues/15)).
- **The room-image assistant is quieter.** The room is chosen up front, the
final screen is gone, progress is one plain sentence, and the notification
centre tells you when drafts, the final set or the detected surfaces are
ready. A spinning mark in the header shows the house is working.
- **Everything at once.** Weather, energy curves, camera stills and
notification rules start from a snapshot; hero images decode in a worker
and neighbouring rooms are preloaded on tap. Notes, reminders, shopping
list and the library reappear instantly after a cold start; stale snapshots
refresh when the app becomes visible or the network returns.
- **Phone: notifications flow with the content**, tab names match the panel,
and the room-image onboarding card appears once per device.
- **English without German leftovers**; a lint keeps it that way.
- **Failure states explain themselves.** The minimal shell has a reload
button and a one-line cause; the disconnected banner appears once, names the
cause and offers a retry while climate and scenes stay locked.
- **Appearance modes** separate interface tone and dusk cleanly.
- **Every read route** of the API answers repeated requests with 304 via
ETag; the server pre-computes the city map, phone variants and last week's
energy statistics overnight and reports a self-check in its health payload.
- Screen and sheet transitions share one motion system with durations and
curves from the design tokens.
### Fixed
- **Connecting no longer hangs forever.** A handshake that never completes,
for example after a resume behind a proxy, now times out after 20 s and
falls back to the normal reconnect cycle
([#15](https://github.com/ralleur/hauser/issues/15)).
- **The lamp-placement editor shows your own room picture** instead of the
bundled illustration ([#16](https://github.com/ralleur/hauser/issues/16)).
- The unlit night picture is used as soon as no lamp in the room is on, not
only when placed lamps are off; a room without known lamps stays lit.
- Room-image sets are no longer deleted when the server starts without an
asset catalogue; published sets are kept and reported.
- Assigning an image set takes effect immediately; a mouse click opens a
notification again; the falling temperature trend points down; the deep
night dimming is opaque.
### Internal
- The server is split into modules under `app/server/` (room images, hotel
mode, laundry, setup, configuration core, family data, notifications,
ambient, songs, files). `server.mjs` keeps the request dispatcher and
re-exports the public surface, so existing imports keep working.
- The HTTP API has an explicit contract (`app/server/api-contract.mjs`) with
84 routes. A generated TypeScript table and a typed browser client are
derived from it, and a test fails when a route literal in server or UI code
drifts away from the contract.
## [0.7.0] - 2026-09-02
This release documents the work that shipped alongside 0.6.3 but was left out of
its notes, together with the changes made since.
### Added
- **Notifications you configure yourself, as categories with rules.** A new
**Notifications** section under **Home** replaces the fixed set of messages
with eight categories you fill yourself. A rule names an entity, the states
that should trigger it, a delay before it counts and, where it fits, a
threshold to stay above or below. Hauser is the configurator and the display,
Home Assistant does the waiting and the triggering: every active rule becomes
an automation built from one of three Hauser blueprints, and Hauser keeps that
set in step when you save. Each category carries a colour for the border of
its tiles, chosen from the palette so light and dark both hold up. A test
send shows what a rule will look like, and the history comes from the Home
Assistant logbook.
- **Window contacts and motion detectors are really connected now.** The status
strip said "All quiet" no matter what the house was doing, because the values
behind it were never filled. Windows and presence are read live from Home
Assistant on every screen, and the strip has become a button that opens a
list with one line per sensor, its room and its state. Rooms without an
assigned sensor keep the strip as a display rather than offering a button
with nowhere to go.
- **Choose which sensors count.** Detection no longer has the last word. A new
section under **Home** shows one card per room and one switch per sensor.
Everything found is on to begin with, so deselecting is the exception. A
button returns a room to automatic assignment.
- **Choose what the energy page measures.** The energy card in
**Connections · Services** now lists every power sensor Home Assistant
reports: one source for generation, as many consumers as you want to tick,
plus "Take all". Without a saved selection Hauser uses everything it found.
- **An operate mode that locks configuration away.** A button in the middle of
the header switches between **Edit** and **Operate**. In operate mode the
long-press routes into layout, the room device editor, the scene editor and
the central climate control are closed, while every device stays fully
operable, including a long press on a light. Someone who only wants to
operate the panel cannot break anything. Under **Interface & operation** you
can set how long the panel waits before falling back to operate mode on its
own, and a PIN that protects leaving it. If a locked long-press is tried
twice within thirty seconds, a line under the button explains the way back.
- **Central climate control from anywhere.** A long press on the reading area
of the all-rooms pill opens the settings that decide what it controls, on the
panel and on the phone, from any screen. The step buttons keep switching, so
a longer press there does not open configuration.
- **Paperless is set up in the interface.** Address and API token used to live
in environment variables and the keychain only. Both are now fields in
**Connections · Services**, and the server picks them up on the next request
instead of on the next restart. The PIN that locks the documents screen stays
in the keychain, because it is not a service credential.
- **Sheets on the phone close by swiping down.** The room sheet and the more
sheet arrive from the bottom and now leave the same way. Dragging the sheet
header pulls the surface with your finger. Past a quarter of its height it
closes, below that it springs back. The gesture sits on the header so it
disturbs neither scrolling nor the sliders inside.
- **Home and Energy keep separate widths for their control areas.** The layout
dialog now adjusts the area it was opened from and names it on the slider
row. Existing installations inherit the energy width from the previous
setting, so nothing shifts when you update.
### Changed
- **The bottom navigation on phones is a floating pill.** The full-width bar
read as a foreign object below the room grid. It now floats above the
content as a rounded, translucent pill that follows the rounded corners of
the phone, and the active entry is marked by a soft highlight that glides
along instead of a line under the label.
- **One climate pill for the panel and the phone.** The all-rooms control is
the same component on both: two symmetric round buttons, one dominant target
value, a quieter range label and the measured current value behind a fine
divider. Blue and red now mark only the two directions. On the phone it
shares a single row with the off and holiday actions, which became round
buttons to fit.
- **Room tiles read as calm product cards.** The veil used to lie flat across
the whole tile and dulled the picture without forming a clear zone. It now
carries only the lower information area and is gone by about two thirds of
the height. Both themes share the same, much weaker gradient, so the
illustration keeps its depth in light mode too. Room name and status have
their own hierarchy and a halo that keeps them legible on changing pictures.
The crop is rendered at its target size, so the fine lines of the
illustrations no longer step at high pixel density.
- **The media area is off by default.** It stays in the catalogue and is
switched on under **Connections · Services**, where it is marked as
experimental. Playback targets that were found during setup remain in the
configuration, so they are there the moment you enable it.
- **The services page is arranged by module.** Home Assistant sits on top as
the foundation, and below it one block per module: Home, Energy, Calendar,
Notes, Media, Library and Documents. Each block carries the switch for its
module and the setup of the service that fills it.
- **Long device names shrink instead of being cut off.** In the control panel a
name that did not fit was truncated. It is now reduced in size until it fits
the space the tile already grants it, which turns two clipped lines into
three smaller complete ones without making the tile taller.
- **The song workshop was removed.** It did not come up in everyday use. The
screen, its tab and its search entry are gone. Existing installations that
still list it in their configuration start normally.
### Fixed
- **A switched-off module stayed in the bar until the next restart.** The
switch wrote the configuration and the message asked you to restart.
The module now disappears from the tab bar and the phone navigation
immediately, and comes back complete when you switch it on again. The saved
order of the phone entries is left untouched.
- **The camera tile stayed empty in the Home Assistant add-on.** The browser
loaded the live image directly from the built-in Home Assistant address,
which wall panels and phones without mDNS cannot reach. The image is passed
through Hauser's own server now. For generic cameras, whose stream Home
Assistant serves through ffmpeg, the stream ends without delivering a single
frame; those tiles reload the still picture instead and retry after an error
rather than staying blank.
- **A second test notification kept the old colour.** Without a Home Assistant
connection the test tile is created locally, and an existing tile with the
same id was ignored. It is replaced now, as Home Assistant does it.
- **The climate card broke out of a narrow sidebar.** The card now scales with
the width of the sidebar, and the current-value line no longer wraps.
## [0.6.3] - 2026-09-02
### Added
- **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 now
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, 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.
### Fixed
- **A panel flashed on the right before an overlay opened.** Long-pressing a
room, a light or a scene briefly showed an empty dialog on the right edge
while the overlay was still loading. The placeholder no longer draws
anything.
## [0.6.2] - 2026-09-01
### Fixed
- **The Home Assistant add-on stayed on "Connecting…" even though it was
connected.** Home Assistant may bundle several messages into a single packet,
and the add-on's connection relay discarded such bundles because a bundle
carries no message type of its own. The confirmation the app waits for to
finish subscribing arrives in exactly such a bundle, so the app kept showing
"Connecting…" while live values were already updating behind it. Bundles are
now unpacked. This only affected the add-on; installations where the browser
talks to Home Assistant directly were never impacted.
## [0.6.1] - 2026-09-01
### Added
- **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 and stored as a small monochrome image; light and dark share the
same file, and Deep Night shows no map at all. Setup offers it as an opt-out
with an example picture, and it can be turned off at any time under
**Appearance → Ambient & standby**.
- **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 your address.
### Changed
- **The app starts noticeably faster and reaches a usable state sooner.** When a
validated configuration is already known, the real interface is mounted
directly instead of a placeholder shell that is torn down again a moment later.
Independent startup requests now run in parallel, and the Home Assistant
connection no longer waits for unrelated configuration.
- **Room pictures on phones are about a fifth of their previous size.** Hauser
now derives a phone-sized variant of every room image when the image enters the
library, so a room tile shows its background in the first paint instead of
decoding a multi-megabyte file. Existing libraries are migrated automatically
on the first start after the update.
- **The offline cache shrank from roughly 17 MB to 3.5 MB**, which makes every
service worker installation faster. Full-size room pictures are fetched when
they are first shown and cached from then on.
- **A waiting update is offered, not forced.** Hauser no longer reloads itself
while you are looking at it. A quiet hint appears and applies the update when
you tap it; without a tap the running version keeps working. Wall panels still
update on their own while idle.
- **Automatic appearance follows the time of day when Home Assistant has not
reported a sun position yet**, instead of staying dark until it does.
- **Settings are easier to navigate.** "Appearance" and "Layout & controls" are
now one section, **Interface & controls**. Hotel Mode and guest access moved
into a new **Experimental** group at the end of the list.
- **Unfinished room edits survive leaving the section.** Renaming rooms,
reordering them or adding devices and then switching to another settings
section no longer discards the draft silently. A restored draft is marked as
such and can be discarded deliberately.
### Fixed
- Reconnecting after the app returns from the background no longer waits for the
next retry window; a connection that only looks alive is detected and replaced.
- Room tiles no longer decode a second set of images when Home Assistant data
arrives shortly after start.
## [0.6.0] - 2026-08-31
### Changed
- **As a Home Assistant App, Hauser no longer asks for a Home Assistant address
or a Long-Lived Access Token.** The App connects to Home Assistant Core over
the internal Supervisor endpoints, and the browser reaches live state through
a same-origin WebSocket on the Hauser server. The Supervisor token stays
inside the server process and is never written to `/data`, handed to the
browser or logged. Installations that previously stored a Long-Lived Access
Token have it removed on the first start in App mode. Docker Compose keeps its
existing setup wizard, address and token unchanged.
- **The setup wizard ends by showing the address phones and tablets use**, with
a copy action and a QR code. The same address stays available under
**System → Services**. It is the address the current session was opened
through, not a guess from the Home Assistant host name.
### Security
- The App's direct LAN port is documented as a trusted-network boundary: it
carries no separate login and no device pairing, and must not be published to
the internet.
## [0.5.3] - 2026-08-31
### Added
- **One climate control can set every thermostat.** The status bar and phone
quick actions show the shared target temperature and raise or lower all
configured climate entities together.
### Changed
- **Climate controls are clearer and more compact on phones.** Current and
target temperatures have distinct labels, the thermostat card uses the
available width more efficiently, and temperature steps consistently use
plus and minus buttons.
- Phone quick actions and optional room-editor state are loaded only when they
are needed, reducing the initial phone bundle.
### Fixed
- **Room-image generation with a ChatGPT subscription works again.** Hauser now
uses the native Codex image-edit endpoint and its JSON image result instead
of waiting for an image-generation tool result from a Responses stream.
- **Custom room images work from the direct Home Assistant App address.** The
manual upload endpoint now accepts an exact same-origin request such as
`http://homeassistant.local:4173` while continuing to reject foreign origins.
- Manual room-image upload failures follow the selected interface language
instead of exposing the server's German message.
## [0.5.2] - 2026-08-28
### Added
- **Camera feeds can become movable pop-outs.** A long press opens the camera
menu, moves the feed out of the control surface and onto the room background,
and lets it be dragged and resized. A pop-out follows its room by default or
can stay visible across room changes; its title bar can be hidden, and it can
return to the control surface at any time.
- **Room tiles per row are adjustable.** The home layout now supports one to
four room tiles in each row instead of enforcing a fixed two-column grid.
### Changed
- **Home layout editing is a live mirrored drawer.** A long press on the room
background opens an unblurred panel on the right with the same dimensions as
a control surface. The former Compact, Balanced and Wide choices are one
continuous size control, with a default action and direct preview.
- **The camera, climate and new layout controls are fully localized** in German,
English, French, Italian, Polish and Portuguese.
- The redundant **Temperature** heading above the climate card and the Safari
install hint have been removed.
### Fixed
- Saving reconfigured rooms now refreshes the active household cache before
returning to the dashboard, so the new room state appears immediately.
## [0.5.1] - 2026-08-28
### Added
- **Scenes are configurable per room.** The scene editor lists the devices a
scene drives and the state each one takes — on or off, and, where the lamp
supports it, brightness and colour temperature. Every change runs on the
lights straight away as a preview and is taken back when the editor closes,
so the room is never left in an editing state.
- **Rooms can have their own scenes.** Beside the three built-in scenes, a room
can gain its own through **Add new scene**, and every scene — built-in ones
included — can be renamed or deleted. All of it belongs to the room where it
was made: a *Movie night* in the living room does not appear in the kitchen.
- **The active scene is highlighted.** A scene lights up when the room actually
stands at its target state, whether it was tapped or the lamps were set there
by hand.
- **Advanced room settings.** A room's tile on the home screen can show
temperature, humidity, both or neither, and the sensor behind each is picked
automatically from the Home Assistant area the room maps to. Another sensor
can be chosen where several fit.
- **The room-image assistant opens from the room overlay**, next to uploading an
image and picking one from the library.
### Changed
- **Configuration overlays share one set of controls.** Reordering is a six-dot
handle that drags — with the arrow keys as the keyboard path — deleting asks
once in place of a dialog, and creating something new is a dashed tile. The
room editor's device list follows suit: the up/down chevrons are gone.
- **The room editor opens on a quick-setup grid.** Room image, scenes, lamp
placement and the new advanced view sit as four tiles above the device list.
## [0.5.0] - 2026-08-27
### Added
- **Rooms & devices is a real room list.** Every 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 — with the arrow keys as the keyboard path — and
the overflow menu keeps move, rename and delete. **New room** and **Save
changes** sit where the list ends.
- **Tapping a room's image opens the image editor.** The thumbnail in the
settings list leads straight to the room-image view of the room overlay,
where an image can be uploaded, picked from the library or removed.
- **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
- **Version numbers drop the `-beta.N` suffix.** Every release below `1.0.0` is
a beta; the version number says so on its own. `0.4.0-beta.10` is followed by
`0.5.0`.
- **Settings open on Rooms & devices.** That is the page where a home is
actually set up. Coming back within 30 seconds still returns to the section
that was open, so a quick detour costs nothing; a later visit starts fresh.
- **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 kept coming back.** Dismissing it only applied to that
one room and only until the next reload. A checkbox on the card now switches
it off for good on that device.
- **Saving room changes could be blocked by Jellyfin.** In Settings there are
no Jellyfin fields, yet an unverified sign-in disabled **Save changes**. The
first-run wizard still requires the tested sign-in.
## [0.4.0-beta.10] - 2026-08-26
### Added
- **Rooms without a background explain how to get one.** A room that has no
image set assigned showed nothing but 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 actually opened.
- **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.
- **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 entirely — the generated
sets already match the panel format exactly, so it changed nothing.
- **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.
### Fixed
- **The room-image assistant failed with a 403 in the Home Assistant app.**
Every write of the assistant — starting a ChatGPT sign-in, uploading a
photograph, creating variants — was answered with `ORIGIN_FORBIDDEN` when
Hauser ran as a Home Assistant add-on. The add-on can only configure the
loopback origins, while the browser reaches Hauser under the host's own
address, so the request never matched the static allowlist. A request whose
`Origin` matches its own effective origin — protocol, host and port,
compared exactly — is now accepted in addition to the configured list.
Foreign origins, differing ports or protocols, `null`, malformed values, a
missing origin on a write, and duplicate `Origin` headers stay rejected.
- **Room-image errors appeared in German in an English install.** The assistant,
the library and the access panel showed the server's message verbatim, and
the server writes German only. They now use the translated message for the
operation that failed.
- **A published image set could break the next server start.** The expiry pass
marked already published sets 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 left
alone.
## [0.4.0-beta.9] - 2026-08-26
### 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`, without authentication and before any configuration
exists — that is how the project meets section 13 of the AGPL. In every
image published since the license change the two fields came back empty,
because the release workflow's publish step never passed
`HAUSER_REVISION` and `HAUSER_SOURCE_URL` to the build. It also never
passed `HAUSER_RELEASE=1`, the Dockerfile's own guard that fails a release
build rather than publishing an image which cannot back its source claim,
so nothing caught the omission. The image labels
(`org.opencontainers.image.revision` and `.source`) were always correct;
only what the running container reports about itself was missing. The
publish step now passes all three, and the guard makes a repeat a build
failure. `v0.4.0-beta.7` and `v0.4.0-beta.8` are both affected.
### About v0.4.0-beta.8
`v0.4.0-beta.8` was tagged and its image published, but no release was issued
for it: the defect above was found while verifying that exact image digest.
Everything beta.8 contained is in this release; its entry below stays as the
record of what landed when. Update straight from `v0.4.0-beta.7` if you are
still on it.
## [0.4.0-beta.8] - 2026-08-26
### Added
- **Calendar and Notes are part of the generated navigation.** 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 have
customized yourself is left alone. Reported in #8.
- **An image-set library for generated room backgrounds.** Finished 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.
- **Room configuration behaves the same from everywhere.** There were two
routes into a room's configuration with different capabilities. Tapping a
room under Rooms & Devices now opens the same overlay as a long press from
the home screen; the embedded list keeps creating, deleting and reordering.
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 could not start a job over plain `http://`.**
Generating an ID used `crypto.randomUUID`, which browsers expose only in a
secure context, so 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. Pressing **Create variants** did nothing at all:
no request, no status change, no message. The assistant now falls back to
`getRandomValues`, reports unexpected failures instead of swallowing them,
and places error messages directly above the action buttons where they are
in view. The ChatGPT authorization code can be copied with a click.
- **The assistant returned photographs where it should have returned a
composition.** The composition step received the already-cropped tile rather
than the whole photograph, so the prompt discussed a framing the model never
saw, and protective wording in the first phase suppressed the free
recomposition entirely. The two candidates now differ as intended: a
realistic composition with corrected perspective, and an illustration.
- **Both clocks froze.** 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. Reported in #8.
- **Status & Updates showed invented services and updates.** The screen listed
six pending updates and five connected services from hard-coded prototype
data, none of it reflecting the connected instance — 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. Reported in #8.
- **The floating power button covered controls beneath it.** While System
settings are open, the power control now sits in the title bar even when the
floating button is the general preference — it no longer obscures the Scenes
**Reset** button. Reported in #8.
- **German text remained in the English interface.** The connection indicator,
the Safari *Add to Home Screen* hint, and the room-image assistant, its
library and its access dialog are now translated in all six languages, and
the ambient hero text keeps the selected language consistently instead of
switching between English and German across visits. Reported in #8.
- Room-image dialogs opened from the room overlay were unstyled, and the
device-move sheet appeared behind the overlay, because their styles were
loaded only by the System screen.
### 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.
- The public demo starts in English until a visitor picks a language, and it
now shows the room-image assistant and the image-set library in full, with
prepared example photographs instead of an upload. A marked note in both
dialogs states that no account and no AI service is involved.
### License
The project's license identifier is now **AGPL-3.0-only** instead of
`AGPL-3.0-or-later`. The license text in [LICENSE](LICENSE) is unchanged: it
remains the unmodified GNU Affero General Public License, version 3. What
changes is that the project no longer offers the option of using it under a
later version of the AGPL should the Free Software Foundation publish one.
Releases up to and including v0.4.0-beta.7 keep the terms they were published
under.
Contributions are made under [CLA.md](CLA.md), now at version 2. Contributors
keep the copyright in their work.
## [0.4.0-beta.7] - 2026-08-24
### License change
Starting with this release, Hauser is licensed under the GNU Affero General
Public License instead of MIT.
Everything released up to and including v0.4.0-beta.6 stays MIT licensed and can
be forked from there. This change applies going forward only; no release has
been withdrawn or retagged.
**If you run Hauser at home, nothing changes for you.** The AGPL only creates
obligations for someone who modifies Hauser and then offers it to other people
over a network — they have to make their modified source available to those
users.
The reason is straightforward: the AGPL keeps improvements to a networked
application flowing back to the people who use it, instead of disappearing into
closed forks.
Contributions now require agreement to a [CLA](CLA.md).
### Fixed
- The setup wizard's reconfigure flow (Settings → Rooms & Devices) never sent
the `If-Match` / `X-Hauser-Shared-Config-If-Match` preconditions that
`POST /api/setup/activate` requires when reconfiguring, so every reconfigure
save was rejected with `428 CONFIG_PRECONDITION_REQUIRED` before anything
was written. **Save changes** appeared to do nothing — 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. The wizard now captures both ETags on load and sends
them back on save. Reported in #7, reproduced on v0.4.0-beta.6 in #9.
## [0.4.0-beta.6] - 2026-08-21
### Fixed
- `POST /api/setup/activate` and other API routes rejected direct browser
requests with `403 SETUP_REQUEST_FORBIDDEN` whenever the App was reached
through a hostname absent from the static `HMI_ALLOWED_ORIGINS` allowlist —
for example the Home Assistant App's default `homeassistant.local:4173`.
A request is now also accepted when its Origin header exactly matches the
effective request host, independent of hostname, so installs no longer need
manual origin configuration. Reported in #8.
## [0.4.0-beta.5] - 2026-08-16
### Fixed
- The setup wizard discovered 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.
Reported in #7.
- A room 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 are discovered and exposed as a start / return-to-base control. This
path follows Home Assistant's documented `vacuum` service set and has not yet
been verified against physical hardware.
## [0.4.0-beta.4] - 2026-08-16
### Fixed
- The Home Assistant App failed to start with
`RUNTIME_DIRECTORY_NOT_WRITABLE` on `/data/assets`. The App manifest
requires that directory for generated room images, but the container
entrypoint never created it. The entrypoint now derives the directories it
prepares from `HMI_REQUIRED_WRITABLE_DIRS` — the same list the readiness
check verifies — so a deployment cannot require a directory that nothing
creates. Reported in #6.
- Startup and household-configuration diagnostics are reported in English.
### Changed
- The App manifest and the container entrypoint ship from the release
pipeline instead of being maintained by hand, and the release preflight
fails when the manifest version and the published image version drift apart.
- Tagged releases publish the plain `<version>` image tag alongside `v<version>`,
which is the tag the Home Assistant Supervisor resolves from the manifest.
## [0.4.0-beta.1] - Unreleased
This is the planned first public release. It remains a self-hosted hobby-project
beta without a support or compatibility promise beyond the documented paths.
### Added
- Source-built Docker/Compose installation with read-only root filesystem,
unprivileged runtime, health checks and persistent config, data and asset
volumes.
- Deterministic first-run and reconfiguration wizard for Home Assistant Areas,
relevant entities, room mappings and optional Jellyfin setup.
- Versioned external household configuration with fail-closed validation and
automatic schema v1-to-v2 migration backed by an exact rollback copy.
- Backup, restore, commit-bound image build and manual image rollback helpers.
- Isolated development pilot with its own synthetic Home Assistant, network and
volumes, including explicit-Area and no-Area onboarding paths.
- Six interface languages: German, English, French, Italian, Portuguese and
Polish.
- Local custom room-background upload under room editing for JPEG, PNG, WebP and
AVIF files up to 12 MiB, including replacement and restore to the project default.
- Tag-gated quality and container-image workflow. A matching version tag can
publish immutable `linux/amd64` and `linux/arm64` images to GHCR only after the
full quality job passes.
### Changed
- The Home Assistant adapter now recovers entity state correctly after a lost
and restored connection.
- Release evidence is split honestly: the isolated clean-room pilot proves the
technical beta contract; an external real-home installation remains mandatory
during beta stabilisation before the release candidate.
### Known limitations
- The clean-room pilot was operated by the maintainer and does not prove
external-user usability or compatibility with a second real device topology.
- The documented tested container path is Docker Desktop on Apple Silicon;
`linux/amd64` is built by release automation but still requires post-publish
smoke evidence.
- Jellyfin is optional. The isolated clean-room pilot exercised the disabled
path; the live integration was verified separately against the maintainer's
installation.
- Non-German and non-English translations have not been reviewed by native
speakers.