Skip to content

Changelog

The release notes shown in the app's "What's new" dialog, newest first. Keep this file in sync with app/src/main/java/com/jimz011apps/hki7/ui/components/WhatsNewDialog.kt.

Items marked with * require the HKI 7 Cloud Component integration.

1.1.1

A Clock widget, Home Assistant's own pages inside the app, update notifications for people who did not install from Play, and a repaired number format in six languages.

  • Fixed Back alternating between a room and the Rooms list after swiping through several rooms. Navigation Compose consumed the first Back inside a room and popped the entire room pager to its underlying list before the shared history handler could run; the next Back then reopened the prior room. The room destination now gives the shared handler priority, so Rooms → Office → Bedroom → Toilet walks back as Toilet → Bedroom → Office → Rooms.
  • Fixed the embedded Home Assistant Settings, Developer tools and HACS pages turning blank or remaining on the loading splash. Home Assistant's frontend asks an embedding app for its capabilities before it requests authentication; ignoring that config/get message leaves startup waiting forever. HKI 7 now answers the external-bus configuration request, then supplies authentication through an origin-checked native bridge instead of writing tokens into browser storage. The embedded page is also the final full-screen layer, so HKI 7's bottom navigation no longer remains visible over it. Its own header now keeps Back on the left and Close on the right, while Home Assistant's redundant hamburger and sidebar are disabled. HACS opens its registered /hacs/dashboard panel and its iframe receives the real WebView height instead of a collapsed 100dvh; integration, automation, follow-up setup dialogs and phone-width picker sheets receive the same measured viewport instead of collapsing to zero height. A narrow compatibility guard also lets Add Integration reuse an already-loaded lit-virtualizer instead of aborting on its duplicate registration. Closing one of these pages now restores HKI 7 Settings, searchable Developer Tools dropdowns no longer move the whole page when the keyboard opens, the status-bar icons follow the embedded header's light or dark surface, and the entire category is visible only to Home Assistant administrators.
  • New Clock widget. Analog or digital, with seven face designs each — Classic, Minimal, Roman, Railway, Bauhaus, Neon and Skeleton for analog; Plain, Segment, Monospace, Flip, Outline, Stacked and Dots for digital — plus 12 or 24-hour time, optional seconds, and your choice of day name, date and year underneath. It follows the same width, shape, corner and visibility settings as every other widget. Tapping it shows the next alarm and opens a clock app: Android exposes only the next alarm through AlarmManager.getNextAlarmClock, with no API to list alarms or switch them on and off, so a list with toggles is not something any third-party app can offer. Which app that button opens can be pinned in the widget's settings, because ACTION_SHOW_ALARMS has no handler on a good many phones — and the app list needs <queries> entries in the manifest, without which Android 11 and later hide every other package and the button silently did nothing. Automatic mode now trusts the reported alarm owner only when it is actually a clock app, so a Samsung Routine scheduled as the next alarm no longer opens Modes and Routines instead of Clock. The widget settings scroll area also fills the stable dialog frame instead of stopping at a fixed 480dp and leaving the lower part looking cut off.
  • Home Assistant's own pages open inside HKI 7, full screen. A new Home Assistant category in Settings, above the HKI 7 one, links to your server's Settings, Developer tools and HACS. It is shown to administrators only, since those pages administer Home Assistant itself; admin status is read from Home Assistant's own auth/current_user, so protecting native administration links never depends on the HKI 7 Cloud component being installed. HACS is opened at hacs/dashboard, where it actually registers its panel — hacs is not a built-in redirect and can leave the embedded panel resolver empty. Home Assistant's sidebar is hidden, because HKI 7's own header already carries Back and Close, at opposite ends. They arrive signed in through Home Assistant's external-app authentication handshake, with only the current access token returned to the server's own origin and no refresh token copied into the page. Back walks the frontend's own history before it leaves the page, there is a reload button, and closing it returns to where you were in Settings. It is an ordinary full-screen view reached through a composition local so every way of opening Settings finds it, and script and load errors are surfaced on the page instead of leaving a blank screen to guess at.
  • HKI 7 checks GitHub for new releases once a day and notifies you about one. This is aimed at people running a sideloaded APK, who otherwise have no way to find out. Update now goes to Play for a Play install and to the GitHub release page otherwise — Play's policy forbids an app distributed through Play from updating itself by any other route, so the install source decides. Downloading and installing the APK is left to the browser rather than done in-app, which avoids requesting the install-packages permission. Turn the whole thing off in Settings › About.
  • A Next Alarm sensor joins the battery, charging and geocoded-location sensors reported to Home Assistant, matching the official companion app. It carries the alarm time as a timestamp and the package that set it, and reads unavailable when nothing is scheduled rather than inventing a time that would fire automations.
  • The wind card is a compass rather than a diagram. A graduated dial reading clockwise from north with three tick lengths, an eight-point rose, and a two-tone needle pointing the way the wind comes from. Everything is sized from the radius, so it stays legible at 72dp in a compact widget and at 160dp on the weather screen; the rose is dropped at the small end where it would collide with the needle.
  • Media players show what is playing, not only which app is open. Players disagree about which attributes they fill in — music sets the title and artist, an Android TV streaming a series sets the programme, season and episode and puts the episode name in the title, and live TV often sets only the channel — so the line is assembled from whichever of those exist, and the app name moves underneath once there is real content to show above it.
  • Back has one rule now: go to the previous page, and keep going until Home. Only from Home does it leave the app. Tabs are pages of one pager rather than back-stack entries, so the platform's own back stack only ever knew part of where you had been — and the app kept two separate histories, one for tabs and one for rooms, so back behaved differently depending on which happened to be non-empty. A tab with nothing recorded behind it fell through to the system and closed the app from the middle of it. Tabs and rooms share one history now, and it is a real stack: Rooms → a room → Rooms → a room is four steps to walk back through. Treating a revisit as "move it to the end" instead collapsed exactly the history worth keeping, which is why rooms appeared to be forgotten. Inside a room the gesture never reached that history at all: Navigation Compose installs its own back callback after the screen's, and back dispatches to the last one registered, so the nav controller popped the whole room pager to the Rooms list first. The handler is now registered inside the room destination too, where it outranks that one, and the edge panels are handled there as well so their own close behaviour still comes first. The history itself is a plain class with unit tests, having survived several confident and wrong rewrites without them.
  • Rooms remember which room you were in. Tapping the Rooms tab from another view reopens it instead of dropping you on a list you did not ask for, and the room is pushed before the tab strip animates, so the list no longer flashes up first. The remembered room is read from the history rather than tracked separately, which is what let the two disagree — the tab landing on the list while back still went to a room. Rooms are recorded per room rather than per pager page, because leaving a room and opening the same one again never moves the pager, and a page-based signal missed it entirely.
  • A Next Alarm sensor appears without anyone re-registering their device. Adding a sensor bumps the registration marker, which a telemetry run notices, but that run is on a fifteen-minute cycle — the app now triggers one at launch when the marker is stale, so the entity shows up on the next open. A server that rejects this one sensor no longer stops the other three being marked as registered.
  • Fixed damaged number formatting in six languages. Machine translation had rewritten the format specifiers themselves: %.1f came back from Greek as %.1στ and from Czech and Slovak as %.lf, both of which crash when the string is rendered, and Norwegian, Swedish and Danish had %,1f, which is a grouping flag rather than one decimal place and printed six decimals. Seventeen specifiers repaired across cs, sk, el, nb, sv and da. The existing translation check never saw these because it only inspects positional arguments like %1$s.
  • Every language is now one correctable file. translations/ holds a CSV per language — English beside the translation — so a native speaker can read their whole language and fix what reads wrong without touching Android code, and import_translations.py merges it back. Strings that are pure formatting glue are left out of those files entirely, which is both what made them readable and what would have prevented the specifier damage above.

1.1.0

Eighteen more languages, energy costs in your own currency, and support for Android 12 and 13.

  • Fifteen more parcel carriers, covering everything ha-parcel-integrations publishes: Ampère, An Post, Budbee, Delhivery, Dynalogic, Helthjem, InPost, Nova Post, Österreichische Post, Planzer, PostNord, Quickpac, Sameday, SunYou and Swiss Post, each with its brand icon vendored from its own integration. Name matching had to keep Nova Post, An Post, PostNord, PostNL and Swiss Post distinct from one another, which two tests now cover.
  • Manual add-by-tracking-number is detected at runtime instead of being hardcoded. The app asks Home Assistant which integrations expose <domain>.track_parcel, reusing the service registry the automation editor already caches, so a carrier that gains the service — or one published after this build — works without an app update. The old fixed set survives only as the fallback when the registry is unreachable.
  • A Valetudo robot vacuum is bound to its map camera during room import. Detection is by device rather than by name: Valetudo publishes the map as an MQTT camera on the same Home Assistant device as the vacuum, so matching on names alone would have picked up any camera in the room.
  • The battery widget opens a dialog instead of navigating to the battery page. It is grouped into the same Critical / Low / Watch / Good / Unknown bands the Battery screen uses, with the battery type and quantity where Battery Notes supplies them, a level bar per row and a search field. Open battery page switches to the Battery tab rather than pushing the view as a detail screen — so it has no back arrow of its own, sideways swipes keep paging, and back returns to the tab you came from. The widget reads that opener from a composition local, which let six call sites across two screens stop knowing how the Battery view is reached.
  • Tapping a room's people counter shows who is there, and the Rooms header now carries a household total that shows where everyone is. The counter did nothing before because the people indicator was built without the entity ids the tap handler requires, and resolveWholeHomeStatus had no people indicator at all. Rows show each person's Home Assistant picture, falling back to an icon only when there is none.
  • A button can be left out of a room's automatic Lights and Devices counters, for the ones that sit in a room without really belonging to it. Hiding the button would have removed the control too; this keeps it and only stops it being counted.
  • Formula 1, Parcels and Waste Collection are greyed out in the widget picker when the integration behind them is absent, with the reason shown in place of the description. Detection is deliberately generous — leaving a usable widget disabled is a worse failure than offering one that turns out empty — and Parcels reuses the same carrier matcher the widget itself uses, so the picker and the widget cannot disagree.
  • Views remember where you scrolled and never expire it, and re-tapping the tab you are already on returns that view to the top. A first attempt got this wrong in a way worth recording: the re-tap counter was read as a value rather than an event, so any view re-entering composition scrolled itself to the top — and with only the current page and its neighbours kept alive, that happened constantly for anything two tabs away.
  • The pull-down header closes when you swipe to another page, rooms included. It belongs to the page that was showing when it was opened; the first version of this only covered the tab pager, and rooms are their own navigation destination.
  • Swiping sideways no longer carries you out of a view's sub-page, and back steps through the tabs you actually visited rather than jumping to the first one. Sub-page state is reported per route because the pager keeps neighbouring pages composed — a page parked in a sub-page off-screen must not lock the one being looked at.
  • Dialog tabs are changed by tapping their chips, and by nothing else. The tab strip previously took the same horizontal drag that scrolled it, so reaching an off-screen tab dragged the page out from under you. Removing that fixed the conflict; two attempts at replacing it with a content swipe were both worse than none — deciding at a threshold moved nothing while the finger was down, and making the surface follow the drag moved the whole dialog, header and footer included, because the registration only ever exposes the frame's own nodes rather than the one slot that should slide. The registration mechanism went with it.
  • Six dialogs were plain Android dialogs rather than the app's own. Reorder cards — reachable from Climate, Energy and Security — plus the location disclosure, the room-move prompt, both room-follow sensor pickers, one Flows dialog and one half of the date/time picker, whose sibling in the same file already used the app frame. They rendered with a different shape, colour and elevation from everything around them, and with no close X, since that is supplied by the frame rather than by Material. Two of them carried hand-rolled shape and containerColor arguments approximating what the frame does properly; those are gone.
  • Climate and Security keep a scroll position per page, as Energy and Settings already did. Each of their detail pages is a separate composable, so leaving one discarded its scroll position and the overview reopened at the top every time you came back from a group.
  • Dialog buttons say the same thing for the same job. Every dialog whose only action is to dismiss now says Close; it had been split between Close and Cancel, to the point where two dialogs sharing the title "Select device" disagreed. Save and Done now follow a rule rather than a habit: Save when confirming commits something that dismissing would lose, Done when the change already took effect, Close when there is nothing to commit at all. Two dialogs were on the wrong side of it — the energy card picker said Done while holding your selection in local state until you confirmed, and the battery details panel offered Done for a read-only list.
  • The close X is one shared component rather than four copies. They had drifted to three different diameters and two different content descriptions for the same button.
  • The language picker sorts and searches. At 36 entries an addition-ordered list was no longer something you could scan, so there is a search box, and the rest sort by the English name shown beside each one. "Follow the device" and whichever language is currently active stay pinned at the top — sorting those into the run would bury the one entry someone who picked the wrong language by accident actually needs to find.
  • Creating a dashboard from Settings now asks first, then offers the same choices onboarding does. The old dialog jumped straight to two buttons, Auto Generate and Start Empty, with nothing saying what would happen to the dashboard already in use. It now confirms that the new dashboard is added alongside the current one and that nothing is overwritten, and then shows onboarding's chooser — which means a dashboard can be built from a local, Google Drive or Home Assistant backup, not only generated or left empty. Restoring into it leaves the dashboard you were using untouched, and the quick-start guide is not shown a second time.
  • Fixed the Energy view's detail pages sharing one scroll position with the overview. Scrolling down inside Electricity, Gas or Water and then going back left the overview scrolled to the same place, which read as the page having moved on its own. Each page now keeps its own position, so back returns you where you were and a detail page opens where you left it.
  • Eighteen more languages, taking the app to 36: Polish, Russian, Czech, Slovak, Hungarian, Romanian, Bulgarian, Croatian, Greek, Lithuanian, Latvian, Estonian, Danish, Thai and Hebrew, plus Austrian German, Swiss German and Mexican Spanish. Hebrew joins Arabic in laying the whole interface out right to left rather than only reversing text. Counting words follow each language's own rules rather than English's: the Slavic languages distinguish four plural categories where English has two, Latvian has a separate form for zero, and Thai has no grammatical plural at all — a category a language expects but cannot find falls back to the English resource, which would otherwise show English mid-sentence at particular counts.
  • The last three of those are regional variants rather than languages of their own, and are treated as such. Unlike European and Brazilian Portuguese, the translation service has no target for Swiss German, Austrian German or Mexican Spanish — asking for them returns plain German and plain Spanish — so they are derived from their parent locale with what genuinely differs applied on top. Today that is one rule: Swiss German has no ß, so "Straße" is written "Strasse". Android already fell back from these to their parent language on its own; what the separate locales add is the ability to name and choose them in the app's own language picker.
  • Fixed the translation tooling dropping a format argument when two of them sit next to each other in the same string. Protecting "%2$s%3$s" produced two placeholder tokens with a run of four underscores between them, which a translator would collapse — leaving the second token unrecognisable and failing the whole run. It aborted rather than writing damage, so no shipped translation was affected.

  • The pull-down header menu marks that it scrolls. When there are more buttons than fit — search, flows, edit, page settings and settings together already overflow a narrow phone — a chevron now appears at the edge, on the side that still has something to reach and only while it does. This is the affordance the navigation bar has had; both now share one implementation rather than one of them having it. Extracting it also fixed the arrows: they were fixed left and right regardless of layout direction, so in Arabic they pointed at the content already on screen instead of the content off it.

  • HKI 7 runs on Android 12 and later, where it previously required Android 14. Nothing in the app actually needed Android 14 — the floor was set higher than the code required, and a lint pass at minSdk 31 found exactly four APIs that assumed a newer platform. Each is now a branch that leaves Android 13 and 14 running the same code as before: the per-app language picker called LocaleManager, which does not exist before Android 13, and now stores the choice and applies it to the app's own configuration below that; the notification check read Android 13's POST_NOTIFICATIONS as refused rather than absent, which would have dropped every notification silently and left the onboarding card offering an Enable button that could never succeed; reverse geocoding for device-tracker addresses used the asynchronous Geocoder added in Android 13; and local Home Assistant discovery read the multi-address mDNS getter that needs a Tiramisu extension Android 12 does not carry. On Android 12 the app's own language picker is the only way to change language, since Android had no system-level per-app language screen until 13 — the app applies the choice to its own configuration, including text built outside the UI such as notifications.
  • Cost stats on the Energy view are no longer labelled with a hardcoded euro sign. The currency comes from the cost sensors themselves — Home Assistant writes the instance currency into their unit_of_measurement, normally an ISO code such as EUR or SEK — and where no sensor reports one, from the device's region. A Currency picker in Energy settings overrides both, listing every ISO currency with a live preview of how an amount will read, and stays on Automatic until you choose otherwise. The setting belongs to the Energy view as a whole, so an energy card widget with its own entity bindings follows it rather than carrying a separate answer.
  • Amounts are formatted by locale rather than concatenated after a symbol, so the symbol's position, the spacing around it, the decimal and grouping separators, and the number of decimals all follow the language the app is running in: € 12,34 in Dutch, $12.34 in US English, and ¥1234 in Japanese, where a currency with no minor unit stops showing the two decimal places it never had.

1.0.1

Four new languages, and navigation and gesture fixes — most of the latter from a first-run account of the app posted on r/homeassistant.

  • Norwegian, Swedish, Finnish and Arabic join the fourteen languages already shipped, selectable from Settings › Language or from Android's per-app language settings. Arabic mirrors the entire interface rather than only reversing text: the navigation bar runs right to left, the notification panel and home switcher slide in from the right-hand edge and are dragged back that way, the swipe that moves between tabs runs the other way round, and the strip of screen edge reserved from the system back gesture moves with the panel it belongs to. Product names — Home Assistant, Nabu Casa, Google Drive, the app's own name — are held out of translation, which is a thing worth doing centrally: left to itself the translator rendered "HKI 7" into Arabic as "Hong Kong 7" and turned "Home Assistant" into a description of one.
  • Plural wording follows each language's own rules rather than English's. Norwegian, Swedish and Finnish get singular and plural forms; Arabic gets all six categories it distinguishes, because a category a language expects but cannot find falls back to the English resource and would otherwise show English mid-sentence at particular counts.
  • Swiping between rooms is much smoother. A room screen is the heaviest page in the app, and the next one was being composed during the first frames of the drag — exactly when there is no budget for it. It is now prepared while nothing is moving, and buffered state updates are held for the duration of a swipe rather than recomposing every page the pager is holding partway through the gesture.
  • The notification panel and home switcher follow the finger instead of springing open at a fixed 24dp of travel, and settle to whichever end they were released nearest. They close the same way — pushed back towards their edge — and a tap on the panel no longer reaches the scrim behind it, which used to close the panel from anywhere on it that was not a control.
  • A horizontal scrollable inside a page no longer hands the remainder of its gesture to the pager on reaching its end, so choosing the first or last item of a mode selector, swipe row or swiping stack no longer changes the page instead.
  • Dialogs with tabs show a position indicator beside their footer, and a sideways swipe anywhere on the dialog changes tab. The gesture previously fixed its axis in the first few pixels, so a swipe that set off with the downward arc a thumb naturally makes was classed as a scroll and did nothing however far it travelled afterwards.

  • Swiping between tabs follows the finger. The pages are dragged rather than switched: they move with the gesture, a swipe can be reversed mid-drag and pulled back, and they settle where the finger lifts. The previous gesture decided at a fixed 48dp of travel and then ignored the rest of the drag — dragging back the other way without lifting could not undo it — while the animation that played afterwards was a 230ms timer on the navigation host, unconnected to the finger that started it. Tabs now live in one pager rather than as separate navigation destinations; the old routes remain registered as redirects, so dashboard buttons, badges and popups that navigate by name are unaffected.

  • The bottom bar scrolls the selected tab into view, centring it so its neighbours stay visible — which is also what tells you there are more pages either side. The bar has always scrolled when it was too narrow for every tab, but nothing ever scrolled it, so on a six-tab phone the last tabs sat off the end and selecting one left no visible indication of where you were.
  • The room swipe shows where you are: dots above the navigation bar for up to eight rooms, a count beyond that. It also stops at the last room rather than wrapping to the first, which the tab swipe never did — the same gesture behaved differently depending on which screen it was used on, with nothing to say so. Rooms hidden from a family member by an admin are now excluded from the swipe order rather than merely refused on opening, so paging can no longer land on one.
  • The pull-down header menu settles instead of snapping. It animates to the nearest resting point by which half of the travel it was released in, carries fling velocity so a flick opens it without the full drag, rubber-bands past the end, and can be caught and re-dragged while still moving. It previously assigned its position outright, so a partial pull resolved in a single frame, and anything past 400 of 450 units simply stayed wherever the finger stopped because nothing moved it the rest of the way.
  • Settings restores the scroll position of a section you return to, while still opening a sub-menu at the top. One scroll state was shared by every section and reset to zero on every change in either direction. The page settings dialog had the inverse bug — a single scroll position persisting across unrelated sub-menus — and now saves and restores the same way.
  • The notification panel is reachable from the pull-down header menu. Reaching it only by a left-edge swipe meant reserving a 28×200dp strip of the left edge from Android's back gesture, and that strip covered the corner where the on-screen back arrow sits, so back appeared broken exactly where it is most often reached for. With a button as the alternative the strip is down to 88dp tall.
  • Fixed back closing the app instead of the notification panel when pressed during the panel's opening animation: the handler was enabled only once the panel had finished opening, and in that window back fell through to the navigation host, which from the first tab meant leaving the app. Back also has a defined meaning for the tabs now — return to the first tab, then leave — where previously a tab change was a navigation entry and back retraced it inconsistently.
  • The home switcher panel implements Android's predictive back, sliding and scaling out under the gesture and returning if it is abandoned.
  • Demo mode no longer makes network requests. The demo client inherits from the real one, and twenty-six methods had never been overridden — the whole HKI 7 Cloud companion surface, plus the event timeline, camera snapshots and vacuum area mapping — so each opened a socket to a deliberately unresolvable address before it could fail. The shared-dashboard subscription retried every three seconds for as long as the demo was open, filling the connection log with failures that had nothing to tell anyone. A test now asserts that the demo overrides every network method of the real client, so the next endpoint added cannot quietly reintroduce this.
  • Restarting Home Assistant from the demo completes in a few seconds instead of showing "restarting" until it timed out two minutes later. The demo always reported Home Assistant as running, so the monitor watching for a stop-and-start transition never saw one and never finished.

1.0.0

The first stable release. Everything below was written for beta.19, which was never published — its notes ship here instead.

  • New "Events" tab in the notification drawer: a timeline of what your home has actually been doing — the front door opening, a light going off, someone arriving home — each line with the time and, where Home Assistant knows it, who caused it. An admin chooses which entities appear under Settings › Family Sharing › Events, once for the whole family rather than on each phone, which is the difference between setting this up and setting it up eleven times. It reads Home Assistant's own logbook over a logbook/event_stream subscription rather than recording anything on the device: the recorder already saw what happened overnight while HKI was closed, and a timeline whose history begins when you opened the app is missing precisely the events worth showing. Opens on the last 3 hours — a timeline answers "what just happened", and a whole day of a busy household buries that under hundreds of older rows — with 6h through 72h a tap away for when the question really is about yesterday. The subscription is only held while the tab is actually on screen. Events deliberately never touch the notification bell's unread count — a feed of doors opening would leave that badge permanently lit and drain it of any meaning. Requires HKI 7 Cloud 0.9.0.*
  • An admin can take parts of the timeline away from individual family members — a whole domain, or named entities — from the same Events tab. It's subtractive: everyone sees the full roster unless something is taken out for them, so adding someone to the household doesn't mean assembling their timeline from nothing. The filtering happens inside the HKI 7 Cloud component rather than in the app, so a restricted device is never handed the ids it's being kept away from and can't subscribe to them by ignoring a client-side filter. As with hidden views and rooms, this hides the timeline, not the entities: Home Assistant has no per-entity read permission for non-admin accounts, so anyone in the family can still read those entities through Home Assistant directly. Worth knowing before relying on it for anything that actually matters.*
  • Raw entity states are phrased rather than shown as-is, so the timeline reads as "Front door was opened" instead of "binary_sensor.front_door: on". The wording is chosen from an entity's device class first and its domain second — device class being the more specific of the two and the one carrying the meaning, since a bare binary_sensor can only manage "was triggered" while the same entity marked as a door earns "was opened". Home Assistant phrases some events itself, and those are used unchanged.
  • The event roster takes whole domains as well as named entities, so "every lock" is one choice rather than eleven. Domains are stored unexpanded and resolved against your entity list each time the timeline opens, which means a lock added next month joins the timeline on its own instead of the roster quietly meaning whatever existed the day it was set. Hiding a domain from someone hides every entity of that kind from them, including ones an admin also added by name. Because one domain can cover hundreds of entities, the roster editor shows what each one currently resolves to and warns before a subscription would exceed what a phone should carry. Requires HKI 7 Cloud 0.10.0.*
  • Events are labelled and filterable by what kind of thing they happened to — Doors, Windows, Motion, Lights, Locks — rather than only by entity. The filter row is built from what the timeline actually contains, so a household with no water sensors is never offered a Water filter that could only come back empty, and the categories are ordered by how much of the timeline each accounts for. Grouping is by device class first and domain second, since binary_sensor alone covers doors, windows, motion and smoke and would otherwise pile all of them into one heap. Days stay as the list's own headings: a timeline that reorders itself by category stops being a timeline.
  • Weather artwork now animates wherever it appears — the daily forecast, the hourly strip and the header pill included, not just the hero card. Animation below 40dp had been switched off wholesale after a dozen small Lottie icons made the weather dialog stutter mid-scroll, which caught every one of those surfaces: the pill at 20dp, the hourly strip at 34dp, the daily forecast missing the cut by 2dp.
  • Where that artwork animates is now four separate switches — header pill, weather dialog, forecast strips, weather widget — rather than riding on the entity-icon animation setting. Those two were never the same thing: one is icons glowing and spinning, the other is Lottie weather artwork, and the cost is wildly uneven between surfaces. The forecast strips run a dozen compositions side by side and are the only ones that ever made anything stutter, so switching those off need not mean losing the single small icon in the header pill. All four are on by default, and appear both in Settings › Appearance › Icons and in the header pill's own settings sheet — the same setting shown in two places, since that is where people go looking for it.
  • The 6h/12h/24h/48h/72h range selector is centred rather than left-aligned, in the event timeline and everywhere else it appears, and gains a 3h option. It still scrolls when the chips do not fit.
  • New "Connection log" at the bottom of Settings › Connection, showing what the app's connection has actually been doing — connection attempts, reconnects, sync, and subscriptions — with buttons to copy or clear it. The app was already recording all of this; nothing displayed it, so a reconnect loop or a subscription that failed to start left no trace anyone could read without plugging the phone into a computer. It is a live diagnostic rather than a history: it holds the last 300 lines and starts empty each time the app launches, since a persisted log would need a retention policy and a privacy story it does not have — the lines can name entities and Home Assistant addresses.
  • A button stack's layout options are named the same as a single button's. Both offer Standard, Square and Tile; the one shape was called "Tile" on a button and "Compact" on a stack despite being the same thing, which made them look like different features.
  • New "Centered" button layout beside Standard, Square and Tile: a square card whose icon sits in the middle of the space above the text, with the name and state centred beneath it. The icon owns whatever height the text does not need, so it stays centred on a bare icon-only button and is pushed upward rather than crowded as the text grows. A grid of these reads as a keypad, which is what makes a remote control possible.
  • A button's icon, name and state are each shown or hidden on their own, under a new "Elements" section in its settings. The old "Icon only" switch is gone — hiding both the name and the state is what it did, and these also let you keep one of them, or drop the icon and keep the text. Existing icon-only buttons, including ones arriving on a family dashboard from a phone that has not updated, keep working unchanged.
  • A button stack carries the same three switches for all of its children, so a stack of twenty buttons need not be set twenty times. They mask what the children may show: turning one off on the stack hides it on every button, and leaving it on lets each button decide for itself.
  • Fixed the button stack's settings dialog stopping about two thirds of the way down with empty space below it. The dialog reserves a card of up to 88% of the screen, but its contents capped themselves at a fixed 480dp, so everything past that was unreachable on a tall phone or a tablet. The contents now fill the card they were given.
  • Navigation bar, media players and popups moved from Settings › Appearance to Settings › Dashboard, below the dashboards themselves. They are parts of what the dashboard is made of rather than how it is styled, which is what the rest of Appearance covers.
  • Settings › Connection ends with the connection log, and the "Restart Home Assistant" control now sits below it rather than above. It is the most disruptive thing on the screen and the least often wanted.
  • The Events tab offers an admin a button straight to Settings › Family Sharing › Events when nothing is being tracked yet, instead of only naming where to go. Family members who cannot configure it are not shown a button that leads nowhere for them.
  • Entity and domain pickers list what is already selected first, so reviewing or undoing a choice does not mean hunting for it alphabetically among hundreds of entities. The order is fixed when the picker opens, so ticking something does not make it jump away from the finger that tapped it.
  • A button stack's heading now has explicit "Show name" and "Show icon" switches, plus an option to centre them. Previously the only way to get a stack with no heading was to clear the text field, which both hid that a heading-less stack was possible and meant losing the name in order to hide it.

1.0.0-beta.18

  • An admin can now change who a published family dashboard is shared with, rather than only being able to choose at the moment of publishing. Settings › Family Sharing › Dashboards now names who each published dashboard reaches, with a "Manage access" button that opens the same Everyone/per-person picker used when sharing, so access can be granted or revoked afterwards. Revoking republishes the dashboard's own stored copy with a shorter recipient list, so it works from a device that never had the dashboard locally — an admin's second phone, or the same phone after a reinstall. Until now, taking a dashboard away from one person meant deleting it for everybody.*
  • Losing access to a family dashboard now clears what was layered on top of it. The dashboard itself was already removed when an admin unpublished it or dropped someone from its recipient list, but everything that had been applied to the device around it — the rooms, widgets, pages, nav-bar order, header pill, weather entities and theme — stayed exactly where it was. The next dashboard an admin shared then landed on top of the previous one's leftovers, which read as the new dashboard failing to import in full. All of it is now removed together with the dashboard it belonged to. Home Assistant connections, profiles, notification and backup settings are deliberately untouched: losing a dashboard is not being signed out.*
  • New "Devices" tab under Settings › Family Sharing, listing which HKI version each family device is running and flagging any that are older than the one you're on, alongside the Home Assistant account it's signed in as, its device name, Android version, and when it last reported. Each install records this through the HKI 7 Cloud component, over the same connection the app already authenticates on — so it covers every signed-in device, including one with Location and Notifications both switched off, and adds nothing to Home Assistant's entity list. A device can only ever report itself: which account a record belongs to is decided by Home Assistant from the authenticated connection, never by anything the phone claims. An admin can forget a phone that's been replaced or had the app removed; one still in use simply reappears the next time its app opens. A device shows up once it has opened 1.0.0-beta.18 or newer at least once. Requires HKI 7 Cloud 0.7.0.*
  • An admin can now require the family to update. "Require everyone to be on \" in the Devices tab sets a household minimum; anyone below it gets a full-screen prompt on their next launch instead of the dashboard, with Google Play's own in-app update handling the install. There's also a per-device "Ask to update to \" for when one phone is behind rather than everyone, which clears itself as soon as that device reports a version satisfying it. No app can install a newer version of itself — silent installation needs device-owner privileges HKI doesn't have — so Play does the actual work, which also means it can only insist when Play genuinely has the update ready for that person. When Play has nothing to offer (a rollout that hasn't reached them, or a copy that didn't come from the Play Store), the prompt explains why and lets them past for that session rather than locking someone out of their own locks and alarms over an update they can't get. You can only require a version some family device already runs, so the requirement can never be one nobody is able to install. Requires HKI 7 Cloud 0.8.0.*
  • Each Family Sharing tab now says for itself when it needs a newer HKI 7 Cloud than the one installed, instead of that only appearing in the summary at the top of the screen. Parental controls, Permissions, Presence and Devices each carry the version they need, so it's clear before you configure a tab whose settings the installed component can't store yet.

1.0.0-beta.17

  • Fixed a crash that could take the whole app down during the very first connection attempt after opening it, which read as "the app won't even open". The one piece of setup that runs on every launch had no error handling of its own, so a failure there — an expired session being refreshed on a flaky network, most often — escaped as an unhandled error instead of surfacing as a connection error you could retry. It now reports the failure in the UI like any other connection problem. As a backstop, an unexpected error on a background task can no longer terminate the app at all: it's recorded and recovered from, rather than closing HKI mid-use.
  • The dashboard no longer rebuilds itself every time Home Assistant reports a state change. The home screen was tracking the complete entity list, so a single motion sensor tripping or a power meter ticking — several times a second on a busy install — invalidated the whole screen and every widget on it, even though nothing visible had changed. It now watches only what it actually draws, which removes that work from scrolling and from the dashboard sitting idle.
  • Entity icon animations no longer redo layout work on every frame they animate. The spin, pulse and glow effects were re-running the surrounding widget's composition on each animation frame instead of just redrawing the icon, so any dashboard with an active light, an open door or a recording camera paid that cost continuously. The animations look exactly the same.
  • Fixed the app becoming unresponsive — and eventually killed by Android with an "isn't responding" dialog — when opening the history of a busy entity, such as a motion sensor that logs thousands of state changes a day. Matching each history entry to who/what triggered it re-scanned and re-parsed the entire logbook's timestamps from scratch for every single entry, work that scaled with history size squared; a quiet entity never noticed, but a busy one could peg the CPU for upwards of ten seconds straight. The logbook's timestamps are now parsed once instead of once per entry, and the whole fetch runs off the main thread instead of blocking it.
  • Hardened how the app reads attributes Home Assistant sends for an entity: a value present but shaped unexpectedly (an object or array where a plain number or piece of text was expected) used to throw and crash whatever screen read it, instead of just being treated as missing. Some integrations occasionally send richer attribute payloads than Home Assistant's own schema implies, so this closes off a whole class of "one entity's unusual data breaks an otherwise generic screen" crashes.
  • Fixed "Push to family dashboard" reporting a dashboard as already up to date no matter what had actually changed. A dashboard re-imported after a reinstall is stored locally under a different id than the one the cloud copy is published under, and the push check was still looking up the local export by the cloud id — finding nothing, and silently skipping that dashboard on every push.

1.0.0-beta.15

  • The Formula 1 widget gains two new tabs and expands two existing ones. Calendar lists the season's races in order, each with its circuit and the host country's flag. Grid shows the starting grid, with each driver's move up or down from where they qualified. Standings can now show a championship prediction alongside the regular points table — current and predicted final points, for drivers or constructors — when F1 Sensor's optional F1TV Auth is set up. Live gains a proper timing list: gap to the leader, interval to the car ahead, tyre compound and stint length, and pit/retired status for every driver, plus which lap the leader is on and the race distance.
  • Fixed shared family dashboards failing to update at all once the owner added a widget type introduced in a newer app version — the To-Do List and Formula 1 widgets, for instance. A single widget type the receiving app didn't recognize used to fail to decode the entire dashboard, so a family member on an older build silently stopped receiving that dashboard's changes rather than just missing the one new widget. Unrecognized widgets are now decoded as placeholders and skipped instead, so the rest of a shared dashboard keeps working across app versions; only the unfamiliar widget itself stays invisible until that device updates.
  • The To-Do widget's square card can now feature one whole list instead of items individually flagged high priority. A new "Hero list" picker in the widget's General tab — shown once it has at least one tab — chooses which list's open items appear on the card, labelled with that list's name, so what you see at a glance is a specific list like "Chores" rather than a scattered mix of flagged items pulled from every tab. Deleting a tab that's currently the hero list clears the setting automatically.
  • Fixed the app crashing whenever it needed to reconnect to Home Assistant or the connection failed. The in-app push-notification channel ran its subscription inside a child coroutine whose completion was waited on but whose failure was never surfaced, so a dropped connection's exception skipped the surrounding error handling entirely and crashed the app outright — with nothing else in the app to catch it either, since there was no crash reporting in place. It's now the child's actual outcome that decides whether to retry, not just whether it finished. Separately, a formatting mismatch between where the app decides a reconnect is needed and where a session refresh actually reconnects meant every single reconnect immediately tore the whole sync stack down and rebuilt it a second time, racing its own freshly made connection; that key is now built in exactly one place so the two can no longer disagree.

1.0.0-beta.14

  • Settings › Family Sharing now shows which HKI 7 Cloud version is installed, and — if it's behind — exactly which family features that leaves unavailable (re-importing dashboard data, the global search Visible/Invisible lists, room following, or its launch-only mode), each labelled with the version that unlocks it. Previously the only way to find out a component was out of date was to hit a save that silently dropped part of what you configured.*
  • New "To-Do List" widget: a shared checklist or shopping list the whole family can add to. Items support an optional quantity, category, priority (low/normal/high, shown as a flag), and due date, with "Added by" and "Checked by" attribution when more than one person edits the list. Choose Manual, A–Z, Priority, or Newest-first ordering, and filter between To do / All / Done from the dialog. Editing can be limited to Everyone, specific family members (picked from the real Home Assistant user list), or Admins only, enforced the same way the rest of the app's family permissions are. It follows the same design system as every other widget — background image, icon, width, shape, corner radius — with the usual General / Permissions / Appearance / Visibility settings tabs.
  • Room following can now be set to only place someone in the right room when the app starts, without tracking them for the rest of the session. The existing "Ask before switching rooms" switch only chose between asking and switching silently — there was no way to get the one-time placement without the app continuing to follow every move afterward. A new "Keep following while the app is open" switch under each person's room-following settings turns that continued tracking off on its own, leaving "Open their room when the app starts" to do the one placement it always did.*
  • New "Formula 1" widget, for the F1 Sensor integration. The card shows the next race with a countdown to lights out, the circuit outline as its artwork and the host country's flag; opening it gives four tabs. Next race has the full session schedule — practice, sprint, qualifying and race, in the order the weekend actually runs, with past sessions dimmed — plus trackside weather. Standings covers drivers and constructors with the podium picked out. Results is the last grand prix, showing places gained or lost against the starting grid. Live only appears while a session is running, and shows the current flag and the race control messages, newest first. The widget finds its own sensors: F1 Sensor lets you rename its entities and choose their language, so matching on entity ids would break the moment anyone did either — it matches on the integration's stable internal keys through the entity registry instead. It follows the same design system as every other widget (background image, icon, width, shape, corner radius) and has the usual Data sources / Appearance / Visibility settings tabs, including which tab the dialog opens on.
  • New "Find my devices" widget: a map of your phones, watches, tags and trackers. Add any device_tracker or person entity — the ones reporting GPS coordinates appear as pins on the map, the rest are still listed with their state, so a tracker without GPS is still useful as "not home". Opening it shows the map above a device list: tick as many devices as you like to show them together, or leave nothing ticked to see everything. Three filters narrow the list — All, Devices, and People — and changing filter clears the selection, so a filter never appears to do nothing because of a tick left over from another scope. The card follows the same design system as every other widget, so background image, icon, width, shape and corner radius all behave as they do elsewhere, and the settings dialog has the same Data sources / Appearance / Visibility tabs, including per-device visibility rules.
  • Fixed room-following settings not taking effect on the very device you changed them from. Saving wrote the change to the companion component but never refreshed that device's own cached copy of its policy — and the cache is what the app actually runs from — so turning following off left it still following, and changing the dwell time left it using the old one, until the app was next started. The policy is now pulled back and applied immediately after a successful save. Separately, the dwell slider no longer offers zero seconds: at zero the very first sensor reading counts as a confirmed move, which is exactly the flapping between adjacent rooms the dwell window exists to absorb. Anything below five seconds is now treated as five, including a value written by an older build.
  • The Formula 1 card now says one thing: the next grand prix and when it is — "Today 15:00" on the day itself, otherwise the date and time, in your own timezone rather than the sensor's UTC. Track status is gone from the card, because outside a session it read "Not running", which is not what anyone glances at a card for. The status line sits in the same dark pill the camera, vacuum, waste and parcel cards use, so it lines up with the rest of the dashboard again; the circuit outline stays as a faint watermark behind it, with the host country's flag in the corner. The Live tab's "is a session running" test is now an allow-list of racing flags and explicitly-live session states — treating "anything not inactive or finished" as live is what put an empty Live tab and a "Not running" status on a Tuesday. Data sources no longer asks which F1 instance to use: the widget reads every F1 sensor it can find, whichever config entry owns it, so the dialog always has the full picture, and the settings list exactly which F1 Sensor data it reads.
  • Fixed notifications going undelivered while Home Assistant reported the device as "not connected to local push notifications", even with the app open on screen. The in-app subscription stood aside for the background connection whenever the settings said that connection should be running — but intent is not the same as reality: when Android refused to start it (a reboot on Android 15+, a killed service, a blocked start), nothing was subscribed at all. The app now checks whether that connection is genuinely holding the channel rather than whether it is meant to, subscribes in-app when it is not, and hands the channel back the moment the background connection does come up, so the same webhook is never subscribed twice and delivering duplicates.
  • Fixed the map in the person dialog overflowing the dialog on a tablet or unfolded foldable. The map was drawn as a square as wide as the dialog, so on a 620dp-wide card it became 620dp tall and pushed the address pill off the bottom. It now takes the height left over after the address instead, which also gives it more room on a phone in landscape.
  • The maps in the app no longer look like a printed atlas. HKI now draws them on the same muted CARTO basemap that Home Assistant's own map card uses, instead of the standard tile.openstreetmap.org rendering — that style is a mapper's reference render, not a background for an app UI, which is why it read as cartoonish next to the rest of HKI. It also has a proper dark variant, so the map follows your theme instead of glowing white inside a dark dialog. This is still plain raster tiles: no new dependency, no SDK, no API key. Attribution now credits both OpenStreetMap and CARTO.
  • Fixed room following doing nothing at all once "Ask before switching rooms" was turned off. That switch was being treated as a master off-switch for the whole feature in both the tracker and the navigation host, so with prompting disabled the app neither asked nor moved. It now does what it says: with prompting on you get the prompt, with it off the room simply opens, with the same guards the prompt path uses (never into a room an admin hid, never into the room already on screen). "Don't ask again until I restart the app" still stops both, since trading a prompt for a surprise jump would be worse.
  • Fixed the waste widget's settings dialog being cut off around two thirds of the way down while empty space sat below it. The dialog reserves a tall card and gives its content the leftover space, but the content capped itself at a fixed height, so the scroll area stopped short. Both the settings dialog and the waste dialog itself now use the full height.
  • The waste dialog's calendar can now look 7, 14 or 28 days ahead, and is drawn as a week grid like the calendar widget rather than a flat list: weekday columns, one row per week, and a coloured dot per collection in its fraction's colour. Tap a day to see what is collected then; it opens on the next day that has a collection. The grid shares its week-start and weekday labels with the calendar widget, so the two never disagree about which day a week begins on.
  • Parcel dialogs now say "Today" or "Tomorrow" instead of naming the weekday. The whole question a delivery date answers is how soon, and "Wednesday" on a Wednesday made you work that out yourself.
  • The "+2" bubble in the header, shown when there are more people than fit across it, now opens. Tapping it lists everyone with their name and state, and picking someone opens their detail dialog as usual. Previously it had no click handler at all, so those people were simply unreachable on a narrow header.
  • The To-Do List dialog's undo/redo and Close buttons moved from the title row down to the bottom action bar, matching every other dialog in the app instead of being the one place buttons sat next to the title.

1.0.0-beta.13

  • HKI can follow you from room to room using a room-presence sensor such as ESPresense or Home Assistant's mqtt_room platform — those publish the room name as an ordinary sensor state, so nothing in the app talks to MQTT. When the app starts it opens the room you are in, and when you move somewhere else it offers to switch views rather than yanking the view out from under you. Rooms also gain a purple counter showing how many people are in them, beside the motion and presence counters. An admin configures the whole family under Settings › Family Sharing › Presence: each person's sensor, whether it opens their room at launch, whether moving prompts, and how long a new room must hold before it counts as a move — room-presence sensors drift between adjacent rooms, and that dwell time is what stops the prompt appearing every few seconds. Sensor rooms named after your Home Assistant areas are matched automatically; only the leftovers need mapping by hand. Requires HKI 7 Cloud 0.6.0; an older component saves everything else and says which part it could not store.*
  • Notifications from Home Assistant can now carry action buttons. Add actions to a notify.mobile_app_… message and each one appears on the notification; tapping it fires the standard mobile_app_notification_action event back to Home Assistant, so automations written for the official app work unchanged. The buttons also appear on the in-app banner and on the notification in the drawer — HKI does not post a system notification while it is open, so that is where you act on them. The reserved actions behave as they do in the official app: URI opens its link and REPLY takes a typed answer, inline in the drawer or from the notification shade when the app is closed. clickAction decides what tapping the notification body does, with noAction and web links honoured and anything else opening HKI on the server that sent the notification. An action tapped while offline is delivered once the connection returns, and each notification can be actioned once.
  • New "Action button": a button that needs no entity at all. Give it a name, an icon, and whatever tap, hold, or double-tap action you like — navigate to a view or room, call a Home Assistant action, open a URL or a custom popup. Add one from the widget picker, from a button stack's Add-entity screen, or as an action badge in the badge area beside the header.
  • Icon-only buttons can now be sized. Auto shrinks the icon as a stack gains columns, which is what makes icon-only usable in the four-, five-, and six-column custom popups where a fixed-size icon used to overflow the button. A button can also be given an explicit size when it should stand out from its neighbours.
  • Button stacks can push their appearance onto every button they hold: one "Icon only for every button" switch instead of the same switch on twenty buttons, plus an icon size they all inherit. A single button can still override the size.
  • The quick start guide can be browsed by hand. Swipe the gesture preview, tap a dot, or tap any tip in the list to jump to it; it still plays through on its own until you take over, and then stops competing with you.
  • Fixed the waste widget showing the wrong icon and colour for every collection type outside Dutch. The icon and colour are chosen by looking for words like "pmd" or "gft" in the sensor name, but they were being matched against the translated label, so "PMD" shown as "Packaging" fell through to the generic grey-blue bin. PMD is orange with a recycling symbol again.
  • Fixed the room-following prompt appearing even after "Ask before switching rooms" was turned off, and appearing for the room already on screen. The prompt now also offers "Don't ask again until I restart the app", and the dwell time can be set whether or not prompting is on.
  • The "Waiting for notifications" notification now carries a Hide this notification button that goes straight to its Android channel settings, where turning the channel off hides it for good while the connection keeps running. Android does not allow a foreground service to run without a visible notification, so this is as close to muting it as the platform permits. Worth knowing: this connection also switches itself on when you have more than one Home Assistant server, since the in-app connection only covers the active one — which is why it can appear without you enabling it.
  • Flows can now express "any of these" and nested logic, not just a flat list of ANDs. The condition picker gains Any of these, All of these, and None of these; a group opens into its own list with a breadcrumb, and groups can hold groups, so "motion detected AND (after sunset OR guest mode on)" is buildable in the app. This is the same structure Home Assistant's own automation editor writes, so a flow made in HA that used OR is no longer shown as an untouchable "advanced block" — it opens and edits like anything else.
  • Thermostat dials on the Climate view no longer squeeze six across a landscape foldable. Dials hold at four per row until the window is genuinely desktop-wide, so each one keeps enough width to read. Other climate card styles are unchanged.
  • The room-switch prompt's "Don't ask again until I restart the app" option is now a proper button rather than a line of muted text under the message, so it can actually be found.
  • The vacuum widget can draw a Valetudo map itself. Choose "Valetudo map" as the button image and point it at your robot's map camera: Valetudo publishes that camera over MQTT autodiscovery and hides the whole map inside the PNG it serves — the visible pixels are blank because Valetudo deliberately does not render the map on the robot, and the real data rides along compressed in the file's zTXt chunk. HKI reads that data directly and draws the floor, walls, rooms, the robot with its heading, the dock and the path it has taken. No add-on, custom component, lovelace-valetudo-map-card, or extra Home Assistant integration is involved; decoding happens off the main thread, and the map refreshes every few seconds while the robot is cleaning and rarely when it is parked.
  • Tap a room on the Valetudo map to send the robot to clean it. Rooms use the names you gave them in Valetudo, and the room you picked is marked while the command goes out. Single-room cleaning uses Home Assistant's vacuum.clean_area action, which targets Home Assistant areas rather than robot segments, so map this robot's segments to your areas in Home Assistant once — until you do, the map says so rather than leaving a tap doing nothing. Note that vacuum.send_command does not work for Valetudo robots at all: Valetudo's MQTT autodiscovery never declares send_command among the vacuum's supported features, so Home Assistant rejects the call.
  • The vacuum settings now warn that plain "Map camera" on a Valetudo map entity shows a blank tile, since that PNG is only a container for the map data. "Valetudo map" is the mode that renders it.
  • The vacuum dialog shows a Valetudo map whenever the map camera you picked actually carries one, whatever the button image is set to — the button image only decides how the tile on the dashboard looks, the same way it works for cameras. A camera that turns out not to be a Valetudo map still shows its picture, and HKI stops re-probing once it knows, so an ordinary camera costs one extra fetch rather than one per refresh.
  • The robot image spins while the vacuum is cleaning or returning to its dock. It uses the app's existing icon-animation system, so it follows Settings › Appearance and the fans-and-vacuums group default, and a button's own animation setting still overrides it.

1.0.0-beta.12

  • Button widgets and button stacks can hold an empty, fully transparent button. It takes up a grid cell without drawing anything, so the buttons around it line up exactly where you want them. Add one from a stack's Add-entity screen or from the widget picker under Layout.
  • Buttons can show just their icon. The new "Icon only" switch under a button's Appearance settings drops the name and state and centers a larger icon on the button, in all three button styles.
  • New "Custom popup" action for buttons, badges, and dialog buttons. Point any tap, hold, or double tap at a popup you build yourself: it opens with the usual dialog title, status, history, and close controls, and you fill it with any widget the app offers. Popups are listed under Settings › Appearance › Popups, where "Edit contents" opens one ready to arrange, and they are shared, so several buttons can open the same one. Giving a popup a status entity fills its status line and enables the history view. While a popup is being arranged, a Done button sits beside Add widget to leave edit mode without closing the dialog, and stacks inside a popup can use up to six columns instead of the three a dashboard page allows.
  • Fixed the Energy detail views (Solar, Electricity, Gas, Water, City heating, Battery) drawing their cards flush against each other with their headings missing. Each card and its heading were two separate grid items, which the layout stacked on top of one another, so "Production", "Forecast", "Inverters" and the rest were hidden behind the card below them. The cards now carry their headings and the same spacing as everywhere else.
  • Fixed Parental Controls refusing to save. An out-of-date HKI 7 Cloud component rejects the Visible and Invisible lists, which previously failed the whole policy: the permissions now save regardless, and the message says the component needs updating instead of claiming nothing was saved. The Visible and Invisible lists only ever filter entity lists such as global search — a button on a family dashboard stays visible unless it is hidden for that person explicitly.*

1.0.0-beta.11

  • Rooms, Climate, Security, Energy, and Battery dashboards now make better use of tablets and foldables. Large cards follow the Home and individual-room 1/2/3-column layout, while compact tiles auto-fit without becoming cramped. Climate, Security, and Energy cards use a height-aware masonry layout on wider displays so shorter cards no longer leave large empty gaps.
  • Climate sensor/device tabs, Security groups, and every Energy detail tab now follow the same responsive one-, two-, or three-column masonry rules, including their edit and reorder layouts.
  • State-colored icons on entity buttons and header/status pills now preserve their semantic hue while automatically shifting lighter or darker when they would blend into the current theme.
  • Selecting a family dashboard during onboarding now subscribes that installation to it. Owner edits are published when Save or Done is tapped, active clients refresh immediately, and offline clients reconcile when reopened. Non-admin subscribers cannot create or duplicate dashboards unless the app is fully reset.*
  • Dashboard setup during onboarding can now restore a local, Google Drive, or Home Assistant backup. New Google Drive and Home Assistant backups use consistent, informative names containing the app version and creation date.*
  • Calendar widgets become vertically scrollable when their height is too small for every event, and hidden Home widgets are removed from the layout instead of leaving an empty space.
  • Parcel carrier cards now show the earliest expected delivery date and time for active incoming or outgoing shipments, including integrations that expose a separate next-delivery sensor.
  • Family permissions can now independently allow dashboard switching and creation. Fully restricted subscribers see a locked Dashboard settings tab; onboarding removes its placeholder dashboard when switching is denied, and a deleted family dashboard opens a permission-aware recovery screen instead of silently creating a replacement.*
  • Family permissions now also control manual re-importing. Non-admins cannot open Family Sharing settings, disabled onboarding choices explain why they are unavailable, and aesthetics-only editors see only visual controls. Their local names, icons, colors, backgrounds, styles, sizes, and layouts take priority when owner updates arrive.*
  • Aesthetics-only family editors can no longer change header-pill configuration or the dashboard's people; those functional settings remain controlled by the owner.*
  • Parental Controls now replaces manual entity-ID entry with Visible and Invisible lists. Admins can select complete Home Assistant domains or individual entities, and global search hides restricted entities and devices. Invisible entries always take precedence.*
  • Energy setup now imports SmartGateways and DSMR Reader P1 meters even when the Home Assistant Energy dashboard has not been configured and the sensors are not attached to a device — power, both import and export tariffs, per-phase power, current and voltage, and gas are recognised from their DSMR names. Related-entity discovery falls back to the integration's config entry when a device is missing, and DSMR's "delivered" is read as grid import while "returned" is read as export. Usage charts and period totals add tariff 1 and tariff 2 together when no single grid import or export sensor is set, and re-importing no longer clears device lists that Home Assistant does not provide.

1.0.0-beta.10

  • Visibility rules now work across every widget and individual widget items, with one-off or recurring time schedules, entity-state conditions, per-user visibility, and AND plus OR freely mixed in the same rule set. Admins using a family-shared dashboard can add a Person condition directly to an item; it matches the signed-in Home Assistant user, offers Visible or Hidden behavior, and shows the HKI 7 Cloud Component requirement when the integration is unavailable. The visibility editor has its own tab, and a new conditional setup starts empty so you can explicitly choose Time, Entity, or Person.
  • Room-status counter badges now reserve a consistent two-digit width instead of resizing when a count passes nine. Rooms and individual-room headers responsively fit one, two, or three counters per row, matching the home-page and person-badge behavior without pushing the title down.
  • Energy setup now recognises SmartGateways and DSMR Reader MQTT naming, including consumption/production, delivered/returned, Dutch terminology, and alternate tariff spellings. Selecting a source device refills empty sensor roles while retaining existing overrides. City heating now has separate settings, a live source tile and detail tab, accepts J/kJ/MJ/GJ/Wh/kWh/MWh readings, and shows an estimated natural-gas equivalent based on 35.17 MJ per m³.
  • Calendar widget dialogs now use the full available height, fixing agenda and settings content that previously occupied only part of the dialog or was cut off.
  • Re-import settings now use one consistently spelled and localized label across Rooms, Climate, Security, Energy, and Battery. Conditional visibility terminology was also corrected across all supported languages.
  • Fixed PostNL and the current parcel-integration parser, so incoming shipments once again show their complete tracking details and delivered state. Carrier support has also been brought up to date.
  • Added an in-app language selector with full coverage in 13 languages: Dutch, German, French, Spanish (plus Latin American Spanish), Italian, Turkish, Portuguese (plus Brazilian Portuguese), Japanese, Korean, and Chinese (Simplified and Traditional). Each language shows its native name with an English hint beneath it.
  • The reconnect status now shows the actual connection error, making Wi-Fi, mobile-data, and VPN handovers much easier to diagnose.
  • Screen rotation now follows your device's auto-rotate setting instead of staying locked to portrait.
  • The Climate "Outside" tile now shows up as soon as a weather device is linked, even without dedicated temperature/humidity/pressure sensors, counts those weather attributes in its summary, and graphs them with matching sensor colors.
  • Parcel status codes from carriers (e.g. "PARCEL_ARRIVED_AT_LOCAL_DEPOT") are now shown as normal sentences. Parcel dates and times follow the selected language and 12/24-hour preference, nearby deliveries use weekday names, the current year is omitted, and same-day windows no longer repeat the date.

1.0.0-beta.9

  • Drag to reorder cameras, thermostats, and energy cards. In edit mode the Security, Climate, and Energy views each get a "Reorder" button that opens a drag-to-sort list — cameras on Security, thermostats/AC units on Climate, and the data cards below the pinned live-source tiles (Electricity, Solar, Gas, Water, Top consumers, and more) on Energy.
  • New Climate "Outside" tile. Link a weather entity or choose outside temperature, humidity, and air-pressure sensors under Climate settings. The climate hero shows the outside temperature beneath the indoor average, and opening Outside gives each value its own history graph.
  • Hide/schedule moved onto the item itself. Instead of a separate control in the reorder list, open a button's (or header badge's) settings and use the new "Visibility" section under Appearance to hide it or schedule when it shows — one-off or recurring daily/weekly/monthly/yearly.
  • Header badges can be renamed. Give a badge a custom label instead of the entity's name, in its Appearance settings.
  • Swipe cards autoplay by default, advancing every 3 seconds.
  • Weather dialog: the Season card now autoplays (flipping every 3 seconds), a new Wind card shows a compass windrose with speed and direction, and you can add a Rain map card backed by a camera entity or embedded web page (iframe), with selectable aspect ratios and full-bleed rounded presentation. The per-card "dialog layout" settings were removed.
  • The Parcels widget has been rebuilt around your carriers. It shows bundled carrier logos, totals across every account, incoming/delivered/outgoing/mail sections, delivery estimates, and tracking history. Supported carrier integrations can also add a parcel directly by tracking number.
  • Humidifiers and dehumidifiers now get full native controls from Climate, room buttons, and header badges: power, target/current humidity, distinct mode tabs, linked fan/select speed controls, and optional tank, filter, error, PM2.5, ionizer, pump, sleep, and beep helpers. Related entities are filled automatically from the same Home Assistant device.
  • Room status counters are now interactive. Tap a counter to see the lights, switches, doors, windows, motion sensors, or other entities behind it. Visible room lights and switches are counted automatically, and controls owned by counter devices no longer clutter the room as duplicate buttons.
  • Buttons and badges backed by a completion-time entity now show a live countdown while the appliance is running, making washing machines, dryers, ovens, and similar devices easier to follow.
  • Shared dashboards now publish the owner's latest edits automatically when the app opens. Recipients get those updates on their next sync while keeping their own allowed appearance changes.
  • Header display settings — including weather/alarm/date-time pills, linked entities, and the rain map — now belong to each dashboard, so they travel correctly through backups and family sharing.
  • Camera widgets now fill their whole tile (no more black bars top and bottom) and use the same corner radius as every other widget.
  • Waste collection is easier to scan: collections on the same day use overlapping fraction icons instead of hiding one another, the widget icon styling now matches the rest of the app, and its larger dialog can be dismissed by tapping outside.
  • More visual consistency: Battery and Waste artwork use matching rounded icon tiles, camera and weather overlays follow the configured item corners, and About now shows the current HKI 7 app icon.
  • Binary sensors now use Home Assistant-style labels such as Open/Closed, Wet/Dry, Detected/Clear, and Connected/Disconnected instead of generic On/Off text.
  • Restricted (aesthetic-only) editors can no longer add, remove, or reconfigure header badges — only visual tweaks (name, icon, visibility) to existing ones.
  • Fixed: switching between Wi-Fi, mobile data, or a VPN now discards sockets tied to the old Android network and reconnects with the saved Home Assistant session, instead of unnecessarily requiring another login. While reconnecting, the connection toast now shows the actual failure reason instead of only a generic status.

1.0.0-beta.8

  • Child locks are never auto-imported. A washer, air conditioner, or valve's keypad/child-lock is a safety toggle, not a room control, so it no longer shows up among your switches.
  • Vacuums now appear in a room's badge bar. They sit on the left next to your cameras (or on their own on the left when there's no camera), and tapping one opens its controls.
  • Hide or schedule individual buttons in a multi-item widget. In a stack's "Manage items" screen, each item has a visibility button: hide it until you unhide it, or pick a date/time window for when it shows or hides — with a graphical date-and-time picker. The window can repeat daily, weekly, monthly, or yearly, so, for example, a set of Christmas buttons appears every 24–26 December without touching the year. The schedule travels with the dashboard, so cloud backups and family sharing keep it.
  • Header badges with several cameras now aggregate into one dialog you swipe through, with page dots, exactly like the blinds and vacuum stacks — and every page keeps its live stream and fullscreen button (you can page in fullscreen too).
  • Every button now picks up the icon you set in Home Assistant, not just lights. HKI now reads each entity's icon override from the Home Assistant entity registry (where HA stores it) and applies it across all buttons and badges, for every domain.
  • Family Sharing › Dashboards now lists every dashboard you've published to your family — even after reinstalling the app, because they live in the cloud. Import one to edit or re-share it, or delete it to remove it from everyone. When a shared dashboard is deleted, anyone still using it falls back to an auto-generated dashboard the next time they open the app.
  • Individual buttons within a multi-card widget can now be hidden or scheduled. In the sort menu, hide a button until you unhide it, or set a visible/hidden window — as a one-off or a recurring daily, weekly, monthly, or yearly schedule (so a set of Christmas buttons can appear every December on its own).

1.0.0-beta.7

  • Cleaner automatic room import. When a device's main purpose is a light, thermostat, blind, fan, humidifier, lock, or vacuum, HKI no longer clutters the room with the device's built-in helper controls — its own child lock, the little status light on an air conditioner or blind, and its sleep or display switches are all skipped. Genuine extras are still kept, like a ceiling fan's separate light or a standalone smart door lock.
  • Climate devices from different integrations are no longer merged together. A room that used to collapse every thermostat and AC into one combined tile now gives each integration its own control — your Tado thermostats stay together, and a Tuya AC gets its own tile — so you can operate them separately.
  • Climate devices now show an icon that matches what they actually are: air conditioners (units that cool but don't heat) get an AC icon, humidifiers and dehumidifiers get a humidifier icon, and fans recognised as air purifiers get a purifier icon — instead of everything sharing the generic thermostat or fan icon.
  • Air purifier and humidifier icons now pulse gently instead of spinning while the device is running. A spinning purifier or humidifier looked wrong, so they use the same calm pulse as other climate devices.
  • Door locks now use door-shaped icons — a closed, locked door when locked and an open door when unlocked — instead of a plain padlock, so a room's lock state is clearer at a glance.
  • Header badges that summarise several devices at once can now be reordered. Open the badge's settings to choose which entity leads — it decides the badge's icon, the state it shows, and the order of the pop-up list.
  • Animated icon effects are now on by default for new installs, so a fresh setup feels alive out of the box. Existing setups keep whatever you already chose, and you can turn effects on or off any time under Settings › Appearance › Icons.
  • Buttons and header badges can now show one of an entity's attributes instead of its state — for example a sensor's battery level or a media player's current source — and you can add a unit like °C, %, W, or kW to the shown value. Open the item's settings and pick State or one of the listed attributes. (The unused per-button Label field has been removed.)
  • You can now copy a dashboard. In Settings › Dashboards, tap the copy icon on any dashboard to create a full duplicate — every room, widget, and page setting included — as a starting point for a new layout.
  • New Settings › Family Sharing section brings parental controls, family dashboard sharing, and per-user permissions together under three tabs. Admins can set per person whether they can edit at all, whether they're limited to aesthetic changes only (icons, names, layout, wallpaper — no adding or removing widgets, buttons or rooms), and whether they see the global search and flows buttons. Everyone else sees it locked, and can choose to use a dashboard an admin shared with them — including during onboarding.
  • Shared dashboards now update automatically. When the owner pushes a change, it's pulled in the next time you open the app — while keeping your own aesthetic tweaks (icons, names, layout, wallpaper) intact.
  • Non-admin family members now get the automatic per-room Adaptive Lighting controls too (previously only admins saw them), when the HKI 7 Cloud component is installed.
  • Fixed: in light mode with the default (system) header, the header title/subtitle and the pull-down header menu labels (Edit, Home Settings, Settings) were near-white and unreadable. Their color is now taken from the surface the text actually sits on, so both the header and the pull-down menu are readable on every theme, custom color, and wallpaper.
  • The Energy view's hero card label now reads "Power" instead of "Home Power".
  • Settings › About now has "What's new" (opens the release-notes dialog) and "Full changelog" (opens the changelog on GitHub) buttons.
  • Fixed: the "Unable to connect" screen — with its Refresh and Log in again buttons — now appears reliably when Home Assistant can't be reached. In some cases, such as signing in on a trusted network and then leaving Wi-Fi, the app used to keep showing a stale dashboard instead of offering to reconnect.

1.0.0-beta.6

The notes below repeat beta.4/beta.5 so anyone updating straight from beta.3 still sees those changes.

  • Fixed: in edit mode, the Add Widget and Add Room / Floor bars no longer overlap the system navigation buttons when you use three-button navigation instead of gesture navigation.
  • The Backup and Restore screen now shows when each automatic backup last ran — both Google Drive and Home Assistant — so you can tell at a glance that your latest changes are safely saved.
  • Added a "Back up now" button to each cloud backup, so you can create an immediate backup any time without waiting for the daily schedule.
  • Fixed: the app icon looked oversized after the recent themed-icon (monochrome) update. The mark now sits with proper padding, matching other app icons on your home screen and in the themed-icon style.

1.0.0-beta.5

Icon and branding refresh only — the notes below repeat beta.4 so anyone updating straight from beta.3 still sees those changes.

  • The Backup and Restore screen now shows when each automatic backup last ran — both Google Drive and Home Assistant — so you can tell at a glance that your latest changes are safely saved.
  • Added a "Back up now" button to each cloud backup, so you can create an immediate backup any time without waiting for the daily schedule.
  • Fixed: the app icon looked oversized after the recent themed-icon (monochrome) update. The mark now sits with proper padding, matching other app icons on your home screen and in the themed-icon style.

1.0.0-beta.4

  • The Backup and Restore screen now shows when each automatic backup last ran — both Google Drive and Home Assistant — so you can tell at a glance that your latest changes are safely saved.
  • Added a "Back up now" button to each cloud backup, so you can create an immediate backup any time without waiting for the daily schedule.
  • Fixed: the app icon looked oversized after the recent themed-icon (monochrome) update. The mark now sits with proper padding, matching other app icons on your home screen and in the themed-icon style.

1.0.0-beta.3

  • Added three new icon packs alongside Material Design Icons: Simple Icons (brand & service logos like Spotify and Philips Hue), Tabler, and Phosphor. Switch packs right in the icon picker when choosing an icon for any button.
  • New: animated icons. Entity icons can gently glow, spin, or pulse while the device is active — lights glow, fans and vacuums spin, playing media and active climate pulse. Only active devices animate; turn it on and tune the effects under Settings › Appearance › Icons.
  • New: family dashboard sharing. An admin can share a dashboard with specific family members (or everyone), and they import it into their own app — no more passing backup files between phones.*
  • New: parental controls. Admins can hide certain views and rooms from specific people, keeping a dashboard simple for kids or guests (UX-level hiding, not a Home Assistant security restriction).*
  • New: automatic local cloud backup. Back up your dashboard and appearance settings to your own Home Assistant every day, and restore them any time.*
  • Media player source icons are now colored, and tapping the app logo opens the installed app — for example, if music is playing from Spotify, tapping the Spotify logo in the media player bar opens the Spotify app.
  • New widget: iFrame — embed any web page on your dashboard.
  • Fixed: Energy views now show negative values when you're exporting power.
  • Fixed: onboarding could auto-complete when tabbing out of the app before finishing.
  • Fixed: the thermostat dial's mode-selection button was too large and overlapped nearby items.
  • Many other smaller bug fixes.

1.0.0-beta.2

  • Fixed an issue with smaller displays when either the height was too small or the width too narrow (or both), the content would look bad. It now falls back to a single column design on smaller screens. This has been changed across all elements.
  • Dialog headers now show 2 rows on narrower screens so that the title no longer cuts off.
  • Fixed an issue where light sliders that have adaptive lighting feature would overlap other elements.
  • Added visual to nav bars if there is more content on the navbar than the screen can display.
  • Fixed an issue where camera's wouldn't respect screen orientation lock.
  • Fixed an issue where we could not zoom in on camera dialogs or full-screen camera's.