Skip to content

Kiosk Satellite next to hassmic on the screen models [stacked on #33 and athena] - #35

Closed
baudneo wants to merge 12 commits into
Gamer92000:checkersfrom
baudneo:kiosk
Closed

baudneo wants to merge 12 commits into
Gamer92000:checkersfrom
baudneo:kiosk

Conversation

@baudneo

@baudneo baudneo commented Oct 15, 2026 •

Copy link
Copy Markdown

Draft, stacked on #33 and the athena PR. This branch contains their commits and one more: review only the last commit (Kiosk Satellite next to hassmic on the screen models, ...).

Kiosk Satellite is an app that shows dashboards on the Echo Show's screen; hassmic stays the voice satellite. This is the code that makes the two work together on crown and athena, split out of the model PRs as asked, and nothing else. Everything is optional: nothing happens unless a model's device.conf names the app (KIOSK_PACKAGE), and the app itself is the user's choice, installed by hand.

What it does (docs/kiosk-satellite.md)

  • main.sh: kiosk_helper opens the app once per boot and keeps its update helper running, as the unprivileged shell user and never root; kiosk_grants gives it the permissions it would otherwise ask a person for, never the microphone; rotation_lock puts Android's rotation settings back (the app flipped the screen by itself, and the Show has no accelerometer).
  • lockdown.sh: new setting kiosk_internet (default on, page only, not exported) lets that app's uid reach the internet with one rule, for its updates and the pages it shows; and INPUT TCP 2324 (its web page) and 6053 (its ESPHome API) from private addresses only.
  • The guided setup offers Simple Keyboard (the image has no input method; checksum-checked, no network permission).

Security, so it is not a surprise. This changes two documented firewall rules, and I updated docs/SECURITY.md, DEVELOPMENT.md and CLAUDE.md to say so:

  1. Outbound: one app uid may leave the network, by default. It is the same trust as running the app at all, nothing else of Amazon's or the system's gets out through it, and the switch turns it off. If you would rather it default to off, that is a one-word change; I defaulted to on because the app cannot update itself or load an external dashboard otherwise.
  2. Inbound: TCP 2324 and 6053 are outside the 16384–32767 range. They are the app's ports, not hassmic's, admitted only from private addresses and only where KIOSK_PACKAGE is set.

Checked. Every model builds with STUBS=1, make host, make unit pass. On a real Show 8 2nd gen the app is opened at boot, its update helper starts, and the app updated itself from Home Assistant; the crown side was tried on a Show 8 1st gen. Not tried: the keyboard install in the guided setup on a clean device.

🤖 Generated with Claude Code

@baudneo
baudneo force-pushed the kiosk branch 9 times, most recently from e0b6ba1 to a5b92d1 Compare October 17, 2026 06:48
baudneo and others added 9 commits October 17, 2026 12:05
A different platform from crown: Android 9 with Treble and enforcing SELinux, rooted in place by saiyaku-athena's zip
(INSTALL=running: install-system.sh writes /system/hassmic and patches the vendor policy), the front end inside the audio
HAL (OpenSL ES, as crown), a TAS5805m amplifier, a TCS3400 light sensor.  devices/athena, docs/re-athena.md.

What the platform needed:
- the libc's accept/accept4/connect fail with EBADF (netd's fwmarkd denied on su sockets: sepolicy rule; net_accept,
  net_connect_fd and libcurl's already-connected socket stay as workarounds)
- Wi-Fi through Android 9's IWifiManager (package name argument, ParceledListSlice) in wifictl.dex, run as uid system
- ringbar.dex builds the SurfaceControl through its Builder on SDK >= 26
- IAudioService's transaction numbers differ on Android 9: setStreamVolume 7, getStreamMaxVolume 14 (the volume keys
  and Music Assistant's volume did nothing before)
- the light sensor's lux from the raw channels as stock's virtual_als does (lux.h)
- speaker gain on the TAS5805m's digital volume, up to +9 dB (listened to: a rap track's bass clips above)
- Sendspin: unpaired sessions are closed when "Music Assistant without pairing" changes
- Drop In: a quiet room's noise no longer counts as the far end talking (NEAR_MIN_DB, far_voice)
- "Download from Amazon" through the fireosdhaservice binder service

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…r's second

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s its reboot

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…d-to-reset

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The driver is named gen2 (wlan_mt76x3_sdio) but its receive path is gen4m's, so hassmic_rcpi4m.c runs with its 32-bit
defaults.  The kernel has no patch_text and read-only module text: the module falls back to set_memory_rw (kallsyms) and a
write under stop_machine.  CONFIG_MODVERSIONS is on: devices/athena/Module.symvers carries the kernel's CRCs (read out of
boot.img's Image), which the Makefile copies into the kernel tree.  Tested on a Show 8 2nd gen: RCPI 120 for unicast
(0x14009), 129 for broadcasts, the motion sensor switched on when someone walked past.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…r Wi-Fi motion

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Kiosk Satellite (the user's choice of app; docs/kiosk-satellite.md) shows dashboards on the Echo Shows while hassmic stays
the voice satellite.  Nothing happens unless the model's device.conf names the app (KIOSK_PACKAGE):
- main.sh: kiosk_helper opens the app once per boot and keeps its update helper running as the shell user (never root),
  asked again every 5 minutes; kiosk_grants gives it the permissions it would ask a person for (never the microphone);
  rotation_lock puts Android's rotation settings back (the app flipped the screen by itself)
- lockdown.sh: setting kiosk_internet (default on) lets that uid out to the internet with one rule; INPUT TCP 2324 (its
  web page) and 6053 (its ESPHome API) from private addresses only (docs/SECURITY.md, DEVELOPMENT.md, CLAUDE.md say so)
- the guided setup offers Simple Keyboard (the image has no input method)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
baudneo and others added 3 commits October 17, 2026 16:25
The page and hassmic default to on, but state/config only gets the line once the setting was saved, and lockdown.sh
looked for kiosk_internet=on: a fresh install never let the app out.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… settings file

settings get is a Java process (2 s): at every 10 s portrait showed for up to 15 s after the app started.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@baudneo baudneo closed this by deleting the head repository Oct 21, 2026
@Gamer92000

Copy link
Copy Markdown
Owner

Hey, just wandering. Was there a reason you deleted this?

@abercrombie1892

Copy link
Copy Markdown

Tested on an Echo Show 5 1st gen (checkers): hassmic + Kiosk Satellite work together 🎉

Thanks for this! I put it on my Show 5 (H23K37) yesterday and it runs nicely: hassmic is the voice satellite, Kiosk Satellite shows the dashboard.

What I ran

  • checkers branch (1c00727) plus the four Kiosk Satellite commits of this PR, cherry-picked
  • Fire OS NS65741 / 8149, rooted boot image built by install-boot.sh (03253eed…, as in the README)
  • Kiosk Satellite 2026.10.2, installed by hand, its own voice switched off

Working

  • hassmic: self test passed, wake word, ESPHome on 26053, Sendspin, Bluetooth, light band
  • kiosk_helper opens the app after boot (~80 s), and the update helper starts
  • kiosk_grants: RECORD_AUDIO is denied
  • kiosk_internet and ports 2324/6053 reachable from the LAN; Kiosk's ESPHome is added in HA with its key
  • push updates with my own key

Two changes checkers needed (same as crown)

  1. KIOSK_PACKAGE=me.jxl.kiosk_satellite in devices/checkers/device.conf
  2. app/AmazonWebView taken out of STOCK_APPS_OUT, or the app has no WebView provider

Rotation: The Show 5's panel is 480×960 (portrait), and Kiosk Satellite turned the screen upright. system/accelerometer_rotation=0 system/user_rotation=1 in ANDROID_SETTINGS keeps it in landscape, the right way up on this unit, and rotation_lock holds it.

Notes from coming from LineageOS (not the usual path, in case they help):

  • The setup has no userdata step. LineageOS' data had to go first; I wrote an empty ext4 made with AOSP's mke2fs (no metadata_csum/64bit) before writing system.
  • In TWRP 3.7.0, /sbin/dd returned nothing for skip/seek past 2 GB, while toybox dd with bs=1M worked.
  • One long adb exec-in stream of system.img stopped twice at about 2.8 GB on my setup (adb in Docker on a Linux NAS). I wrote the rest in smaller pieces; the partition's sha256 matched afterwards.

@baudneo

baudneo commented Oct 21, 2026 •

Copy link
Copy Markdown
Author

Theres no point on this end anymore:

What's new in Kiosk Satellite 2026.10.34
This release adds Panalume support, so a kiosk can show Panalume full screen as its dashboard, and every other app in the Home Assistant sidebar works the same way. It also brings Amazon's own wake word engine to the Kiosk Satellite Edition image for the Echo Dot, so the Dot can listen for Alexa, Echo, Computer, Amazon or Ziggy in 17 languages.

One of the shitty things of MIT is stuff like this. That dev has way more traction, they're stubborn and difficult to deal with and didnt even mention your contribution to it all @Gamer92000. A simple shout out would have sufficed, but thats the way it goes these days.

Sorry dude.

@baudneo

baudneo commented Oct 21, 2026

Copy link
Copy Markdown
Author

I still have it local, ill reupload and you can pull whatever you want.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants