Releases: panel-assistant/android
Release list
v0.9.8-rc1
Recommended installation
Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.
From macOS, Linux, Git Bash, or WSL, run:
curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.8-rc1/ha-paneld-installer-v0.9.8-rc1.sh | bashThe ha-paneld-v0.9.8-rc1-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.
This release candidate lets Panel Assistant 0.3.0 show each panel's own web interface inside the Home Assistant sidebar, and adds the panel side of Panel Assistant's optional native transport. Documentation has moved to panel-assistant.io. The changes below are since v0.9.7.
Added
-
The web interface works inside the Panel Assistant sidebar. Panel Assistant 0.3.0 shows each connected panel's own web interface in the Home Assistant sidebar. Embedded, it hides the header and panel switcher, follows the Home Assistant user's language and theme, and loads its styles and scripts through the sidebar. Panels on v0.9.7 or earlier show an unstyled page there, so update them to use the Panel Assistant 0.3.0 sidebar.
-
The panel side of Panel Assistant's native transport. When the
native_entitiesoption is enabled in Panel Assistant, a panel can report state and accept commands over its own authenticated Home Assistant connection instead of MQTT. Commands follow the same order and approval rules as MQTT commands, and sensitive commands still need approval on the panel's screen. While Panel Assistant holds a panel's entities, the panel withdraws its MQTT discovery entities, and it announces them again when the integration releases them or its entry is removed.GET /api/v1/panel-assistant/transportreports the current state, andPOST /api/v1/panel-assistant/transport/releasehands a panel back to MQTT when no integration can; in Hardened mode a remote release needs approval on the panel. Without the option, MQTT stays in charge as before. -
Groundwork for approving sidebar changes on Hardened panels. A panel can now accept a routine change from the Panel Assistant sidebar without waiting for approval on its screen when the request is signed with a key Panel Assistant holds for that session. Operations such as exporting secrets still need approval on the panel's own screen, and unsigned requests still wait for approval as before. Panel Assistant 0.3.0 does not sign its requests yet, so with 0.3.0 nothing changes.
Changed
- Documentation now lives at panel-assistant.io. The pages under
docs/point there, the README and the web interface link to the site, and the translated copies of the documentation have been removed.
v0.9.7
Recommended installation
Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.
From macOS, Linux, Git Bash, or WSL, run:
curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.7/ha-paneld-installer-v0.9.7.sh | bashThe ha-paneld-v0.9.7-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.
0.9.7 makes panels get back to their dashboards faster, recover from Home Assistant outages by themselves and explain what they are waiting for when they cannot. It adds Home Assistant update entities, local discovery, proximity calibration wizard, a nine-language interface and camera streaming, and makes installs and rooted upgrades far easier to diagnose.
Added
-
Proximity can be calibrated and used from the panel itself. Guided setup separates presence from wave detection, calibrated presence can drive auto sleep, and a single hand approach can wake the display. Panels without usable proximity hardware do not show these actions.
-
The interface is available in nine languages. English, German, French, Italian, Spanish and Simplified Chinese, plus early-access Dutch, Polish and Ukrainian. Automatic follows the browser or panel language, with English fallback where a string is not translated. The translations are machine-drafted.
-
Camera streaming and snapshots. An off-by-default Camera setting serves a video-only H.264 stream at
rtsp://<panel>:8554/liveand a JPEG snapshot. Enabling it from Home Assistant needs approval on the panel, the camera stays closed unless a client is reading it, and a mandatory on-screen or LED indicator shows whenever it is open. -
Sign-in and reauthentication can be handed to a phone with a code that opens the panel's own sign-in setting.
-
Network diagnostics. Runtime diagnostics,
/api/v1/statusand/api/v1/diagreport Home Assistant response time separately from the network path, the IPv4 or IPv6 family in use, whether the built-in dashboard connected and why it failed, and a 24-hour Wi-Fi outage count. No addresses or network names are included. -
Native Android navbar support on panels with a verified native navbar, currently the Electron WF1589T.
-
Hardware support. ZHICAI SMT1019 screen off, temperature, humidity and experimental proximity; an import-only community profile for the Portworld YC-SM10P; updated Lenovo ThinkSmart View and Raspberry Pi 4 KonstaKANG wake profiles; and the NSPanel Pro firmware index now includes 4.8.0.
-
Specific dashboard tabs. Choose a tab path in guided setup or Configure. Scripted installs can set the dashboard with
--home-dashboardand the entity filter with--entity-filterbefore the first load.
Changed
-
Faster dashboard startup and recovery. With the account default dashboard, the built-in renderer reopens the last verified dashboard while it checks Home Assistant's dashboard list in the background. Temporary failures retry with a visible countdown; problems that need a new sign-in or an update still wait for you.
-
Home Assistant restart status. The built-in renderer shows when Home Assistant is stopping, starting or offline and clears the message when it is ready again.
-
Automatic IPv4 and IPv6 fallback. MQTT and the Home Assistant WebSocket try the other address family when the first route does not connect, under the existing
Automatic,Prefer IPv4andForce IPv4setting. -
Clearer status and recovery screens. Startup, setup and error pages identify themselves as ha-paneld, fit 480×480 panels, and say whether a problem will retry by itself or needs a repair in Configure, Entities, Home Assistant or Android System WebView.
-
A useful auto-brightness Sensitivity range. Existing values are converted automatically, and the auto-brightness minimum can be set as high as 99%.
Fixed
-
Dashboard entity filters survive upgrades, dashboard changes and restarts. Filters saved before this release keep working, pins and exclusions survive a dashboard switch, and a panel that starts before Home Assistant retries its dashboard check instead of waiting for you. Issue #113
-
Android System WebView problems can be repaired without reinstalling ha-paneld. An updated WebView is picked up by restarting the renderer, a panel with a pinned known-good WebView can reinstall it, and the screens name the fix that actually works.
-
Rooted upgrades and helper replacements say exactly what failed. The installer checks the target before replacing the helper, stops a helper that will not exit, verifies the helper belongs to the APK, and reports that nothing changed when an upgrade did not start. Issue #120
-
Installation is more reliable across computers and panels. Git Bash on Windows keeps panel-side paths literal and finds Android Build-Tools, the newest usable build-tools are preferred, slow package managers are no longer refused, a missing Java runtime is reported as such, and a time-zone mismatch between panel and computer is warned about. Issue #24
-
Screen and navbar. A redundant Screen On no longer dims a lit panel, the reload button returns to your dashboard again, and the
Always onnavbar can be switched off again on newer Android panels. Issue #137 -
Smaller fixes. Reboot requests are verified and fall back to the next method; temporary database-busy errors no longer leave storage marked failed; database maintenance can return unused pages to the filesystem; Smatek S9E relay and button-LED commands respond promptly;
auto_brightness_sensitivityis accepted again byPOST /api/v1/config; entity search reports its matches Issue #114; sandboxed panels get root-helper guidance; and the Wi-Fi stability row and diagnostics dump agree.
v0.9.6
Recommended installation
Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.
From macOS, Linux, Git Bash, or WSL, run:
curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.6/ha-paneld-installer-v0.9.6.sh | bashThe ha-paneld-v0.9.6-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.
0.9.6 is a substantial update centred on guided onboarding, Home Assistant-native dashboard integration, presence-aware sleep, safer upgrades and backups, and better diagnosis and recovery for always-on panels. Existing v0.9.5 installations can update in place without resetting configuration or cleaning up Home Assistant entities.
Added
-
Guided first-run setup is available on the panel or at
/setupfrom another device. It covers renderer readiness, Home Assistant browser sign-in, dashboard selection and entity filtering before the first dashboard load, and blocks incompatible browser engines with recovery guidance instead of showing a broken dashboard. -
Auto sleep can combine touch and proximity activity with selected Home Assistant presence devices. It learns suitable delays and shows the reason for its current decision. You might get a better outcome with an automation written in Home Assistant, but this low-configuration panel-side solution might work for many users. The panel and Home Assistant sensors should share the same Home Assistant area.
-
Remote panel control. You can now simulate panel taps from the web UI, but only in Relaxed security mode, for obvious reasons. Click the screenshot in the Dashboard tab to access remote control. This is useful for navigating dashboard tabs remotely while trying to exercise full coverage of the entity filter. It is not designed to be a real-time, interactive, multi-touch terminal.
-
Use Home Assistant's native dashboard interface. I discovered during the 0.9.6 work that Home Assistant has a new external-bus interface that covers authentication and dashboard lifecycle capabilities we had previously built ourselves. For future compatibility, I chose to use Home Assistant's native interface where possible. This means the built-in renderer now requires Home Assistant 2026.4.2 or newer.
-
Storage, SQLite and Android power-safety monitoring now identify conditions that could leave a panel unreliable. The Dashboard, diagnostics, Home Assistant and installer surface actionable warnings. Android power settings can be repaired with verification where the platform permits it, with specific manual guidance otherwise.
Changed
-
The built-in renderer is now the default. Automatic renderer selection now prefers the built-in renderer because the performance gains over the Home Assistant Companion app are so transformative for most users that the remaining feature gap (multi-server support, Assist, notifications) is mostly irrelevant.
-
Dashboard entity filtering now understands more of what modern Home Assistant dashboards load. It follows dynamic and custom-card dependencies more accurately, warns when a dependency cannot be resolved safely, and avoids claiming a filter is complete when it may hide something the dashboard needs.
-
Log shipping now supports syslog over TCP or UDP and HTTP, with destination testing and clearer failure reporting. Fresh configurations and an explicit legacy
syslogselection use TCP, while upgraded configurations that never stored a transport retain their previous UDP behaviour. If you relied on implicit defaults, review Configure after upgrading. -
Configuration and recoverable application state now use a more durable SQLite-backed model. Upgrade directly from v0.9.5; installations older than v0.9.5 must first upgrade to v0.9.5 if their configuration must be preserved. New complete backups can include settings, profiles, eligible Companion login data and eligible same-panel durable application state, but entity catalogs and learned proximity or ambient histories are rebuilt after restore, so create a fresh
.hpbafter upgrading. An encrypted backup download is withheld if its sensitive temporary plaintext archive cannot be removed. -
Ordinary upgrades now use defense-in-depth recovery. The installer always attempts an automatic settings export; with a usable root route it also requests an orderly shutdown and verifies one coherent database copy, with one legacy SQLite fallback for older builds. On unrooted panels, only the settings export can be copied off-panel automatically. An unavailable or invalid automatic copy is removed and reported prominently while package replacement continues with existing app data preserved; these automatic copies are not substitutes for a user-verified backup.
-
Local
--apkprovisioning and fleet installs now require Android Build-Tools withapksignerandaaptoraapt2. Fleet mode rejects--reset-config,--export,--idand device-scoped--restorebefore starting workers;--restore-fleetremains supported for portable fleet configuration. -
--reset-configis deliberately irreversible and creates no backup. It requires the user to typeRESETas confirmation, erases settings together with learned entity, proximity, ambient and revision state, and leaves the app, helper and unrelated applications installed. Fleet updates refuse this option. Create and verify a complete.hpb, or run a separate--export FILEwhen settings alone are sufficient, before resetting.
Fixed
-
Failed settings writes no longer appear successful or replace working configuration. A setting becomes visible only after durable storage succeeds, while a failed save leaves the previous value and active behaviour intact.
-
LAN discovery now recovers from silently stalled mDNS responders and network addresses that arrive late during boot. Recovery uses bounded retries and reports when automatic repair is exhausted instead of requiring an unexplained app or network restart.
-
Dashboard and Configure pages remain stable on small panels. Restored Dashboard placement no longer drifts to the wrong cards, narrow-screen headers no longer jump shortly after loading, and automatic-sleep refreshes preserve controls, focus, chart position and scroll state.
-
Provisioning recovers more reliably from slow first starts, Android-stopped applications and interrupted rooted upgrades. It waits within documented bounds, avoids configuration writes or Home Assistant token creation before the app answers, recovers cleanly when a rooted upgrade is interrupted and no longer rejects viable APK updates because of fixed storage margins or optional housekeeping copies.
v0.9.5
Recommended installation
Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.
From macOS, Linux, Git Bash, or WSL, run:
curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.5/ha-paneld-installer-v0.9.5.sh | bashThe ha-paneld-v0.9.5-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.
ha-paneld is easier to sign into, adapts better to each panel’s environment and recovers more reliably from routine changes. It also makes sensitive maintenance safer without taking control away from existing installations.
Added
-
Sign a panel in to Home Assistant from a remote browser — Configure creates a short-lived link that can be opened normally or copied into a private window for another user, avoiding credential entry on the panel keyboard. Fresh installations print the next-step URL, and Configure shows the connected user’s display name.
-
Auto-brightness adapts to each room — it learns from up to seven days of panel or Home Assistant light readings, follows the normal daylight pattern and responds to changes such as a room light switching on. You can set the minimum automatic level, preview sensitivity changes and pause automatic control after a manual brightness change.
-
Proximity sensors now set themselves up automatically — ha-paneld learns empty-room and approaching-person readings, including whether the sensor rises or falls. Once it has enough reliable readings, Home Assistant receives occupancy and a 0–100 proximity level. A guided three-wave setup can teach it immediately, while brief fluctuations are ignored.
-
Optional Hardened security mode requires approval on the panel for sensitive remote actions — software changes, credential export or restore, profile activation, reboot and other sensitive maintenance wait for a one-time approval in the Android app. They cannot be approved remotely. Existing installations remain in Relaxed security mode unless Hardened security mode is deliberately enabled on the panel.
-
You can measure whether dashboard filtering makes a panel faster — a comparison records the same dashboard with filtering off and on, so you can compare response time rather than relying on how it feels. It can still collect useful results if the dashboard becomes unresponsive. Discussion #10
-
Obsolete learned dashboard entities can be cleared from the Entities tab — a confirmed reset clears learned and manually included or excluded entities while the current filter continues working until a fresh scan completes. Issue #50
-
The software navigation bar has a dedicated Dashboard action — it opens the configured dashboard without reloading it. Reload remains available separately if recovery is needed. Issue #43
-
NSPanel Pro Zigbee joining can be requested from Configure — once joining is enabled in ZHA or Zigbee2MQTT, an unjoined panel can try joining again without a restart.
-
Advanced setup no longer requires cloning the repository — the signed release installer can configure, verify, back up or restore a panel using
install.sh --provision.
Changed
-
Kiosk-enabled panels go directly to their dashboard during routine startup — the built-in renderer shows the QR/configuration screen once after each ha-paneld version change, while a launchable external renderer goes directly to its dashboard. Admin Launcher and recovery states still retain the configuration screen. Issue #31
-
Configure and Install are easier to use on compact panels — related settings use shorter cards, Save changes appears only after a setting has changed, and setup tools such as display sizing, vendor packages and backup/restore are grouped on Install.
-
Wake on wave now requires a deliberate gesture — the display wakes only after a complete wave towards and then away from the panel. Setup, testing and standing near the panel no longer wake it accidentally; touch-to-wake remains available while it is learning.
-
Editable YAML files now define all hardware profiles — the editor suggests valid choices, prevents profiles for different hardware from being activated, and keeps unofficial reflashed-device profiles in the community catalog rather than presenting them as built-in support. Issue #28
-
Dashboard diagnostics identify busy Home Assistant entities more clearly — they show which three entities sent the most updates and data during the past hour.
-
Panel information is more useful — runtime diagnostics report app storage plus verified-boot and bootloader status without configured names; profile views show clearer processor details and useful reference links.
Fixed
-
Panels are less likely to become unavailable after settings, network or helper changes — replaced tasks and MQTT connections now shut down cleanly, and losing privileged screen control no longer leaves ha-paneld permanently unresponsive.
-
LED and button-backlight controls now reach the hardware reliably — controls no longer return to off while brightness is changing, and button-backlight entities use Home Assistant’s normal light icon.
-
Installer progress and failures are clearer — named stages show what is happening, backups are checked before connecting, stalled downloads and installs time out cleanly, and panels with insufficient system space receive a clear explanation. Issue #44, Issue #46
-
Adaptive-brightness settings are validated before saving — unreadable, missing or non-numeric Home Assistant light entities leave the current source and other pending settings unchanged, while invalid values show the supported range and an actionable error.
-
Wake on wave can be taught before a proximity sensor has identified how it works — simple on/off and graduated sensors can complete guided learning, while missing or unknown sources remain safely disabled. Relearning or changing the sensor no longer leaves wake-on-wave incorrectly enabled after a restart.
-
Ethernet-connected panels no longer expose unavailable Wi-Fi diagnostics — Wi-Fi network and signal entities appear only while Wi-Fi is the active connection, and stale values are removed when it changes to Ethernet. Issue #21
-
Restoring a backup no longer changes untouched vendor Zigbee settings, including when an older backup is restored. Issue #48
-
Hardened security mode no longer reuses credentials after a Home Assistant or MQTT server change — enter credentials for the new server or the old secret is cleared.
-
Install and Configure report the real outcome without discarding newer edits — failed display-size changes are no longer shown as successful, and settings appear only where they apply.
-
CPU and temperature sensors explain when the installed helper is too old instead of silently disappearing. Issue #21
-
Disabled features stop consuming resources while temporarily unavailable sensors retry at a controlled rate and repeated diagnostic requests share one refresh.
-
Live Sensors shows brightness as a percentage while retaining the 0–255 value for diagnostics. Issue #30
-
Panel capability lists omit hardware known to be absent while Generic profiles retain discovery guidance for unknown hardware.
Upgrade notes
- Existing panels remain in Relaxed security mode. Enable Hardened security mode only from the Android app’s Configure toolbar on the panel after disabling classic network ADB and Android Wireless debugging; remote tap injection remains unavailable until the panel returns to Relaxed security mode.
v0.9.4
Recommended installation
Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.
From macOS, Linux, Git Bash, or WSL, run:
curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.4/ha-paneld-installer-v0.9.4.sh | bashThe ha-paneld-v0.9.4-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.
ha-paneld can now help explain why a built-in Home Assistant dashboard feels slow. New and updated cards on the Dashboard tab measure interaction delay, main-thread blocking, Home Assistant state traffic and renderer instability, then report a conservative likely cause. This helps distinguish an overloaded dashboard from excessive entity updates, memory pressure or another busy process on the panel.
Installation now uses the panel's active hardware profile in a single pass. The one-line installer starts ha-paneld during the installation run so the app can identify the panel before setup finishes. It then verifies the profile-specific access, helper and software requirements, while clearly reporting any optional or on-panel steps instead of silently applying them.
Added
- Built-in dashboard performance diagnostics — interaction timing is separated into input delay, event handling and presentation alongside state-update rate, payload volume, main-thread occupancy, long frames and renderer reloads. These measurements do not require root or WebView debugging when using the built-in renderer.
- Persistent performance history — content-free, minute-level dashboard measurements are retained for up to seven days and available through the API for before-and-after comparisons across page reloads and app restarts.
- NSPanel Pro Zigbee gateway health reporting and runaway protection — ha-paneld reports gateway state, join status, CPU use, restart history and containment results. An unjoined gateway with sustained high CPU, or a configured gateway on a supported layout that repeatedly restarts, can be switched off automatically after a startup grace period; a joined gateway is never stopped merely for high CPU use.
- Profile-aware installation in one pass — the one-line installer starts the app, waits for it to identify the panel profile, then verifies the access, helper and software requirements for that hardware before reporting the installation complete.
Changed
- Full panel backups now preserve more recoverable state — backups include configuration, custom profiles and entity-filter choices, with optional Home Assistant Companion login data. Supplying a passphrase creates an encrypted
.hpbbackup; creating an unencrypted.ziprequires explicit acknowledgement. - Persistent application state is consolidated into a local database — existing settings and learned entity data migrate automatically on first start, providing a common durable store for configuration, profiles and performance history.
- Root-helper upgrades are authenticated and recoverable — the installer verifies that the helper matches the release and retains the previous working installation until the app and replacement helper have both been verified.
- Custom profiles now use schema 2 — provisioning recommendations are separated from hardware capabilities and runtime configuration. Existing schema 1 revisions remain available for inspection and export but cannot be activated; ha-paneld falls back to a compatible bundled profile or Generic until the profile is updated.
- Profile recommendations no longer make optional system changes automatically — ordinary and fleet installation report recommended vendor-package changes instead. Existing package controls explicitly selected by the user continue to work and reapply at boot.
Fixed
- Dashboard screenshots remain visible while refreshing — returning to Dashboard shows the last successful capture immediately and replaces it only after a fresh screenshot has loaded; a slow or failed capture no longer blanks the card.
- Panel capability reporting is easier to interpret — the effective WebView rendering engine leads over stale package-reported versions, helper-backed root capability is not presented as a failure, and operational details such as state convergence, MQTT authentication timing and audio playback are separated from core panel information.
- Successful installation is no longer reported as failed because a later optional recommendation could not be completed — required installation and startup failures still fail the run, while optional actions are reported separately.
- Configuration changes and shutdown no longer leave duplicate or stale background operations running — superseded work is collapsed or cancelled once its result is no longer relevant.
- WF1589T LED ownership is reported accurately — the conflicting vendor LED service is presented as an optional, reversible package-control recommendation rather than being changed automatically.
- Large backups and Companion login restores use bounded file-backed processing — backup, encryption, upload, validation and restore no longer need to hold the complete archive in memory.
Upgrade notes
- Custom profiles created for schema 1 must be updated to schema 2 before they can be activated.
- Existing settings and learned entity data should migrate automatically, but an explicit panel backup is recommended before installing this release.
- Unencrypted backups now use
.zip; encrypted backups continue to use.hpb. - Profile-recommended vendor-package changes are no longer applied automatically. Review the post-install guidance if a hardware feature depends on one.
v0.9.3
Recommended installation
Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.
From macOS, Linux, Git Bash, or WSL, run:
curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.3/ha-paneld-installer-v0.9.3.sh | bashThe ha-paneld-v0.9.3-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.
Device support is no longer limited to profiles shipped by the ha-paneld project. Panel owners and hardware vendors can create, edit, validate, import, activate, export and share panel profiles without rebuilding the app. Profiles remain declarative and limited to capabilities already implemented by ha-paneld, so extending hardware support cannot introduce executable code or arbitrary privileged operations.
This release also strengthens dependency and release verification, updates the shipped MQTT networking stack to security-patched versions and adds optional enhanced access for genuinely unrooted panels.
Added
- Panel support can be added or refined through validated YAML profiles — the new Profile page can inspect the active bundled profile, edit or import a profile, preview validation, activate a revision, return to automatic selection and roll back to the last working revision. Profiles select bounded drivers and curated artifacts supported by ha-paneld; they cannot introduce shell commands, arbitrary paths, credentials or executable code. An unknown panel can also create a conservative draft from passive diagnostics for refinement and sharing, while bundled profiles include comments explaining how important values were established.
- Optional Shizuku enhanced access is available for genuinely unrooted panels — after the checksum-pinned Shizuku manager is installed and its service started, the user can approve ha-paneld locally to gain display sizing, screenshots, key and tap input, and signer-verified ha-paneld or minimal Home Assistant Companion installs. It does not provide root or the root-only hardware, system and private-data capabilities. The approval cannot be enabled remotely, and a service started through ADB normally needs rearming after a reboot.
- Provisioning can prepare the optional Shizuku path without hiding the remaining on-panel step —
provision.sh --shizukuverifies or installs the pinned manager, starts its ADB service and points to the local approval screen. A trusted same or newer manager is retained on a repeated run.
Changed
- Dependency and release inputs now have stronger supply-chain controls — Gradle artifacts are locked and checksum or signature verified, npm tools use exact lockfiles without dependency lifecycle scripts, GitHub Actions use full commit pins and publishing tools use hash-locked dependencies. Separately scoped CycloneDX inventories describe the Android/Gradle and embedded profile-editor runtimes, while curated Shizuku and WebView APKs require their recorded checksum as well as the expected package and signer.
- The shipped MQTT networking stack has been updated to security-patched versions — the HiveMQ client now uses the updated Netty transport line while retaining the existing MQTT connection and recovery model.
- Release validation is more resilient and precise — software inventories carry stable document identities, security analysis uses high-precision queries, and an external attestation outage no longer prevents an otherwise signed and verified release from being published.
- Fleet imports now fail closed for new settings — a setting is copied between panels only after it has been explicitly classified as portable. Shared endpoints and common behaviour preferences remain portable, while credentials, renderer and dashboard state, calibration, display tuning, update policy and logging stay with their original panel.
Fixed
- A configured dashboard returns to the foreground reliably after startup — once Android's home-screen state has been reconciled, ha-paneld opens a ready built-in or explicitly selected external renderer instead of leaving the admin launcher visible. Interrupted built-in-renderer preparation remains retryable. (#31)
- The admin launcher's Dashboard tile opens the configured renderer — it now selects a ready built-in renderer, an explicitly selected external renderer or the existing automatic Companion fallback without showing unusable or duplicate targets. (#32)
- Restoring a Home Assistant Companion login repairs a blank internal server URL before it goes live — ha-paneld applies and verifies the repair in the staged database before entering the rollback-capable live transaction. A failed repair leaves the existing Companion data untouched instead of restoring a login that opens Home Assistant's “Missing Host header” error.
- Credential backup and HTTPS audio handling are safer — Android's implicit app backup and device-transfer path is disabled and excludes credential preferences, while HTTPS audio downloads use Android's normal certificate and hostname verification.
- Embedded browser and local navigation targets are more tightly constrained — embedded browser views reject file and content-provider access, release links accept only GitHub HTTPS destinations, peer navigation targets are validated before use and screenshot hydration stays on its fixed same-origin endpoint.
Docs
- The NSPanel Pro firmware index now includes the omitted 4.5.3 files — the monitor also verifies each indexed download's size and its documentation now matches the daily seven-day availability history.
v0.9.2
Recommended installation
Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.
From macOS, Linux, Git Bash, or WSL, run:
curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.2/ha-paneld-installer-v0.9.2.sh | bashThe ha-paneld-v0.9.2-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.
Home Assistant dashboards that seemed too demanding for a low-powered wall panel can now be made far more responsive. A large Home Assistant installation may send thousands of entity states and updates to a panel even when its dashboard displays only a small fraction of them, causing delayed taps and sluggish navigation. The built-in renderer can now learn what the dashboard uses and ask Home Assistant to send only those states. Automatic filtering remains experimental, opt-in and exclusive to the built-in renderer, but it no longer requires a hand-maintained entity list. For installations using a second Home Assistant instance, filtering proxy or similar workaround solely to reduce panel load, the built-in filter may allow that extra infrastructure to be retired.
Added
- Automatic dashboard entity filtering for the built-in renderer — ha-paneld examines the configured dashboard, observes the states it uses while running and builds a focused Home Assistant subscription. A dedicated Entities page shows what was found, explains why each entity is included and allows manual additions or exclusions before filtering is enabled.
- Potentially unsafe dashboard rules are identified before filtering — broad or dynamic rules that ha-paneld recognizes are shown with their source and a suggested correction. Users can fix the dashboard, deliberately continue without the uncertain entities or leave filtering disabled; ignored warnings remain visible and can be restored later. Custom cards and behavior that automatic learning has not observed may still require manual review.
- Learned entity choices persist without making backups unnecessarily large — ha-paneld retains the user's manual choices, discards old observations automatically and can rebuild the rest of the catalog when needed. Existing exact entity lists remain supported through
/api/v1/dashboard/entity-filterfor controlled or externally managed setups. - Built-in dashboard performance is now measurable on every panel — the Performance page and
/api/v1/perfshow how long a cold or warm dashboard load takes to become usable and how often the renderer has reloaded unexpectedly in the past 24 hours. These measurements do not require root and make it easier to see whether a renderer or configuration change actually helped. - Two newly reported panel types now identify correctly — preliminary profiles give the Amazon Echo Show 5 Gen 2 running LineageOS and the unbranded ZX-SMT156/RK3566_T cautious defaults based on their submitted diagnostics. Follow-up diagnostic reports also collect the remaining hardware details needed to refine support without a long manual adb session.
- Dashboard startup now shows what the panel is waiting for — if networking is still coming up after a reboot, the built-in dashboard shows whether it is waiting for network services, a link, an address or a connection instead of looking broken. It learns the panel's typical startup time to give more useful progress on later boots and disappears entirely when networking is already ready.
Changed
- Changes made on the panel now stay in sync with Home Assistant — screen power, brightness, volume, relays, LEDs and proximity could become stale or briefly jump back after a local or external change. ha-paneld now reports the latest confirmed panel state and keeps pending updates in order.
- Installing the APK alone is clearly identified as incomplete setup — releases now lead with the installer that handles permissions, startup, configuration and verification. The APK remains available for on-device sideloading and manual setups.
- The unfinished remote-control page is withheld — the Test tab and its screenshot tap-control workflow are hidden while the feature is reviewed for reliability. Existing screenshot, action, input and audio APIs remain available, and old
/testbookmarks return to Dashboard.
Fixed
- Panels recover automatically from a temporary MQTT login rejection — a rejected connection could leave a panel offline or start overlapping reconnect attempts. ha-paneld now starts a fresh connection and retries at a controlled pace, while diagnostics show what happened and when the next attempt will run.
- Home Assistant entities no longer become stale after a failed MQTT update — a missed state update could block later changes or trigger repeated retries. ha-paneld now keeps the latest panel state, limits the retry rate and continues sending pending updates.
- Home Assistant now shows the screen's real power state — on panels such as the TPA10, switching off the backlight could leave Home Assistant showing the screen as on because the stored brightness remained non-zero. ha-paneld now reads whether the backlight itself is powered. The updated app and helper daemon must be installed together on affected panels.
- Settings changes and restarts no longer mix old and new behaviour — work already underway during a settings change, MQTT reconnect or service restart could finish using the previous configuration, allowing an old connection, dashboard, audio request or status update to reappear after the change. ha-paneld now discards anything that belongs to the previous setup once its replacement begins.
- Home Assistant no longer shows hardware changes that did not happen — if an LED, relay or display command failed or was overtaken by a newer command, Home Assistant could still show the requested state even though the panel had not applied it. ha-paneld now publishes changes only after the hardware confirms them and prevents older commands from replacing newer ones.
- Interrupted maintenance tasks no longer look successful — an upload, download, software installation or uninstall that stopped part-way could still be reported as complete, while a failed update check could leave an old result looking current. ha-paneld now keeps these failures visible and reports success only when the full operation finishes.
- A reboot no longer shows two connection errors before the dashboard appears — if networking was not ready, the built-in dashboard could first show Chromium's offline error and then Home Assistant's 60-second connection-failed countdown. It now waits for the network and opens the dashboard directly; genuine later failures still retry.
- “Silence boot chime” now also silences startup notification sounds — on panels with separate ring and notification volumes, startup could still play a notification sound even when Silence boot chime was enabled. The setting now mutes both streams and uses a silent notification channel.
- “Open in Home Assistant” follows the panel's current server and device — changing the Home Assistant server or panel identity no longer leaves the button pointing at an obsolete device or a device on the previous server.
- Display information no longer presents Android's base logical density as native DPI — the logical density used to size the interface is labelled separately from the screen's physical pixels per inch, which is shown only for device profiles where it is known reliably.
- Helper-backed panels no longer claim that working privileged controls are unavailable — diagnostics now distinguish direct app access to
sufrom actions routed through the helper daemon, such as reboot and reload on the TPA10.
v0.9.1
Added
- Opt-in System WebView auto-update — a new "WebView auto-update" switch (off by default; shown only where ha-paneld pins a recommended WebView for the panel) keeps the system WebView on that pinned build, installing a newer one over root on the update check. Note that the first swap between two different WebView vendors on a signature-locked panel is still a one-time manual step — see the panel's hardware guide.
- Dashboard sizing matches the Companion app — the built-in renderer now scales the page the same way the Home Assistant Companion app does, so a panel switched over from the Companion keeps its dashboard layout instead of rendering more compact. A new "Dashboard zoom" setting tunes it per panel (100% = Companion default); pinch-to-zoom stays off, since a fixed panel wants a deliberate zoom, not an accidental one. Switching a panel to the built-in renderer also carries over the zoom you had chosen in the Companion app's "Page zoom" setting — and on a rooted panel, if the zoom isn't 100%, ha-paneld points you at the panel display-density control (a crisper way to size the dashboard) with a one-tap reset.
- "App Configuration" in the dashboard sidebar — the built-in renderer now adds the same sidebar entry the Companion app does; tapping it opens ha-paneld's own configuration page on the panel.
- Panel-appropriate defaults on first run — a panel running the built-in renderer now starts with the sidebar hidden and background connections kept alive (so it stays responsive when idle), values most people never think to set. These are applied once and remain changeable afterwards.
Changed
- TPA10-class panels now recommend LineageOS WebView 150 instead of Cromite. LineageOS is a newer, maintained, vanilla-Chromium build that — unlike Cromite — leaves autoplay enabled, so Home Assistant camera-card (WebRTC) streams start without a tap. Cromite remains available as a fallback.
- The built-in renderer no longer bounces on overscroll — dragging past the top or bottom of the dashboard used to show Android's elastic stretch (or edge glow on older panels), which looks out of place on a wall panel that rarely scrolls, so it is now off by default. A
dashboard_overscrollsetting restores the native effect for anyone who wants it (settable over the API). - Smoother LED effect animations — the pulse (breathing) effect now runs at a higher frame rate along a smooth curve, so it glides rather than steps, and no longer flashes white at the dim end of each breath.
Fixed
- The soft navbar no longer swallows taps at the bottom of the built-in renderer — in "Swipe reveal" mode ha-paneld armed a full-width overlay strip that consumed every touch in the bottom ~48dp band (re-injecting non-swipe taps via a slow root call, and dropping them entirely on panels without root). The built-in renderer now detects the reveal swipe within the dashboard activity instead, so taps and scrolls at the bottom edge reach the dashboard with no latency, while a genuine upward edge-swipe still reveals the bar.
- Pull-to-refresh no longer fires from a drag inside the dashboard — the built-in renderer's refresh gesture now arms only for a drag that starts at the very top edge of the screen and pulls down into it. Previously any downward drag on the dashboard content could trigger it, because the Home Assistant frontend scrolls inside the page and the stock gesture check therefore always believed the view was at the top. Scrolling views and dragging card controls now never start a refresh, regardless of scroll position. (#29)
- LED effects now stop reliably — an effect (strobe, blink or pulse) stops the moment the light is turned off or the effect is changed. Previously an effect could keep running after the light was turned off, and occasionally get stuck flashing until the app was restarted. (#16)
Full Changelog: v0.9.0...v0.9.1
v0.9.0
Headline: ha-paneld can now render the Home Assistant dashboard itself. 0.9 changes the project's stance: previously a headless agent that always deferred dashboard rendering to the HA Companion app, ha-paneld now offers its own built-in renderer (experimental, off by default) so a panel can run as a single-app appliance. The Companion app remains today's default and a permanently supported path. Everything below is cumulative since v0.8.7.
Added
- Built-in dashboard renderer (experimental) — ha-paneld renders the HA dashboard in its own WebView: authenticated with the same
external_authcontract the Companion uses, provisioned with zero typing on the panel (provision.sh --builtin --ha-urlwith--ha-tokenor--ha-user/--ha-pass), and integrated with the watchdog/kiosk machinery as a first-class dashboard target. Engineered for weeks-long unattended uptimes: the page freezes while the screen is off (~70% renderer CPU saved), a handshake watchdog reloads a dashboard that fails to actually connect (with backing-off retries and a clean "Reconnecting…" screen instead of a browser error page), memory is bounded by invisible screen-off reloads, renderer crashes are contained and rate-limited (falling back to the admin launcher rather than churning), and a definitively revoked login latches with on-panel fix instructions instead of retrying forever. - Renderer quality-of-life — camera streams autoplay (with fullscreen video and native confirm/alert handling), instant pull-to-refresh (drag down re-navigates the live frontend; double-pull for a full reload), an optional idle return-to-home, an edge-to-edge fullscreen mode (bars revealed by an edge swipe), a "Clear renderer storage" remote heal, and private-CA HTTPS support (user-installed CAs are trusted, matching the Companion).
- Light/dark theming across every surface — the web UI follows each viewing browser's light/dark preference (with a
?theme=light|darkoverride for testing); a "Dark mode" toggle on the Display card themes ha-paneld's own screens and sets the built-in dashboard's default colour scheme on panels without a system dark-mode setting (Android 9 and older); a theme picked inside HA always wins. - The Configure page follows settings changed outside it — an open Configure tab auto-reloads when the panel's settings change via the API, an HA entity, or another browser; unsaved edits are never destroyed (a banner offers the reload instead).
- Honest handling of features that need root — on a panel without root, the features that require it are shown greyed with a lock note (never hidden) so you can see what's unavailable and why; the no-root Install picker offers a Download APK link for a manual update, and the installer states plainly at provision time which capability tier your panel is in.
- One-click switch from the Companion — picking the built-in renderer borrows an installed Companion's sign-in automatically (root panels), so trying it is a single picker change.
- LED effects —
strobe,blinkandpulsethrough HA's native lighteffectselector. - MQTT over TLS —
ssl:///mqtts://broker URLs connect over TLS with the default trust store (CA-signed brokers validate; port defaults to 8883). --prereleaseinstall channel —install.sh … | bash -s -- --prerelease(andprovision.sh --prerelease) installs the newest release-candidate instead of the latest stable, for testing pre-release builds.
Changed
- Dashboard settings get their own Configure card with a known-renderers-only picker, and Configure cards carry maturity badges ("skunk-works" / "experimental") so pre-release surfaces are labelled.
- The performance page attributes cost honestly — sampling is far lighter, the sampler's own probe cost is shown as its own row, and the built-in renderer's hosting cost is labelled as such.
- Companion auto-update settings step back when there's no Companion — hidden from the form and their HA entities withdrawn on Companion-less panels; listed after ha-paneld's own update settings.
Fixed
- A cumulative pass of renderer and platform fixes shipped across the rcs, highlights: a renderer crash-loop can no longer churn the panel all night; a revoked login is recoverable from the Configure tab; kiosk/watchdog returns no longer reload a healthy dashboard; switching an existing panel to the built-in renderer reclaims the HOME role from the Companion; the soft navbar's Reload could force-stop ha-paneld itself on a builtin panel; settings side-effects (fullscreen, dark mode) now truly apply on save; a stale "Companion update available" notice can no longer outlive an uninstall; the Rockchip
/dev/ledjniRGB-LED driver is labelled accurately for non-rk3576 SoCs;provision.shlogin failures explain themselves and credentials with special characters work; vendor-tamed panels bring the dashboard up promptly after taming the vendor home launcher.
Full Changelog: v0.8.7...v0.9.0
v0.8.7
This release includes a large amount of work to improve the reliability of the install and provisioning scripts (install.sh, provision.sh, and the root-daemon installer) across the supported panels — su-dialect probing, adb preflighting, honest self-verification, and clear, classified failure reporting. If you still hit an install or provisioning problem, please report it so it can be fixed.
Beyond that, panel telemetry is more reliable across the fleet, the Tuya TPA10 gains room temperature/humidity sensors, and the :8888 header is now responsive on narrow panels.
Added
- Room temperature & humidity on the Tuya TPA10 — the onboard CHT8305 chip is exposed as opt-in Room temperature / Room humidity sensors in Home Assistant, read through the root helper daemon (proper temperature/humidity device classes, off by default), with a per-panel calibration offset for panel self-heating.
Changed
- Provisioning is much more robust —
provision.shand the root-daemon installer now probe each panel'ssudialect (join-style vs exec-style,su 0/su root/su -c, or root-adbd with nosu), preflight the adb connection and fail fast (~12s) with specific recovery steps instead of hanging, classify install failures (signature mismatch, downgrade, out-of-storage) with how to recover, and degrade gracefully when a vendor build refuses adb-side permission grants. The daemon installer's exit code now reflects whether the daemon is actually running. - Diagnostic sensors populate on more panels — CPU usage and SoC temperature fall back to the root helper daemon when the app can't read them directly, so they no longer show "Unknown" on sandboxed panels. All OS-sourced telemetry — the diagnostic sensors and the
:8888performance view — now flows through one shared reader instead of two paths that could disagree. - Responsive
:8888header — a sticky top bar that never scrolls away; on a narrow or single-column panel the tab bar collapses to a hamburger menu and header items progressively hide instead of wrapping, so the header never overflows. - Config & controls polish — the "expose to Home Assistant" control is now a link / broken-link icon toggle, and the Controls action buttons collapse to icons when the row would otherwise wrap. The low-value instrumentation master switch is gone (the performance sampler stays gated by page views, the real cost control).
Fixed
/api/v1/diagresponds instantly — it serves the last-known panel snapshot and refreshes in the background instead of re-running the full probe suite (which can take >12s on an NSPanel Pro).provision.shself-verify and--persist-adbwork reliably — verify no longer always ended "re-run to finish",--persist-adbis confirmed by read-back, and provisioning can no longer clobber other accessibility services if it can't read the current list.- "Open in Home Assistant" is more reliable — it falls back to the URL the HA Companion already uses when the panel's own HA device-page URL can't resolve.
- On the Tuya TPA10, the room-temperature calibration offset saves from the web UI (a posted value was previously accepted but silently dropped), and the older
temperature/humiditysensors — which never streamed a live value on this chip — are retired in favour of the daemon-readroom_temp/room_humidity.
Docs
- The root-daemon install step (
helper/install-daemon.sh) is now linked from the provisioning guide.
Full Changelog: v0.8.6...v0.8.7