github wilbowes/EchoMuse v2.15.0
EchoMuse v2.15.0

latest release: controller-v2.23.0
4 hours ago

EchoMuse device firmware v2.15.0

The firmware half of everything the controller has shipped since v2.14.0.
Several controller settings released in 2.23.0 do nothing without this — the
jack behaviour, the clock, the echo reference and the emOS console password
are all device changes.

The 3.5mm jack

Routing is driven in both directions and at startup. Plugging in during
playback, unplugging, and booting with something already in the socket all
behave now. The silent line-out was HP Driver Gain pinned at its floor, and
the boot-with-plug-in case was edge-triggered all the way down, so a device
that started with the jack occupied never saw the edge that would have routed
it.

The codec's DAPM routes are brought up by the firmware. Android's audio
HAL had always been quietly doing this for us, so nothing here ever closed
them — which is invisible on FireOS and leaves both the microphones and the
speaker powered down on a device with no Android. Two device fixes sat behind
it and are in as well.

Knowing where it is running

The device reports which userspace it booted, on the register message
rather than the stats tick. Android-only payloads are gated on it, so an emOS
device is no longer sent a debloat script it has no package manager for — that
failure previously spent the full transfer timeout, twice, and presented as a
stalled OTA on a device that was perfectly healthy.

It rides the REGISTER message specifically because its consumer runs the
instant a device connects, about thirty seconds before the first stats report
would have carried it.

The clock

The controller tells the device the time. An Echo has no clock that
survives a power cut and boots reading 2010; under emOS nothing corrects it,
because bionic resolves through Android's property service so no bionic-linked
binary there has DNS for an NTP pool. Stepped only past 30 seconds and only
after the connection exists, so the TLS build-time clamp is untouched.

The emOS console

A password can be put in front of it, hashed by the controller before it
is stored or pushed, and written to disk by the firmware because the console
has to work when EchoMuse is not running. An idle timeout goes with it.

Bluetooth and the link

Advertisements moved off the control plane onto the data plane, negotiated
on the ack. The BLE proxy was sharing a connection with the keepalive traffic,
so the device running proxy duty had a measurably worse link than the others.

The ring shows link state, and the buttons stand down without a link
rather than appearing to work.

Fixed

The ambient light sensor was flooding the only crash channel we have. On a
board where the sensor does not bind, the retry noise filled the log that a
kernel panic has to be read out of.

All three device payloads reconcile when the device connects rather than
only during an update, so a device on the current firmware stopped drifting
from the wake-word models and scripts it should have.

Updating

OTA from the dashboard as usual. The binary is verified by md5 on the device
before the symlink moves, so a corrupt transfer is caught while the device is
still running happily on its current slot.

What's Changed

  • Give the ring to the link state, and stand the buttons down without one by @wilbowes in #415
  • Serialise firmware updates across the controller, not per device by @wilbowes in #412
  • Move BLE advertisements off the control plane, negotiated on the ack by @wilbowes in #413
  • Arbitrate a barge-in, so only one Echo answers it by @wilbowes in #414
  • Quiet aiohttp.access logging to WARNING by default by @DennisGaida in #376
  • Record the day: the OTA queue, the link-state ring, and what the stall is not by @wilbowes in #418
  • Reconcile all three device payloads on connect by @wilbowes in #419
  • Bump actions/download-artifact from 7 to 8 in the actions group across 1 directory by @dependabot[bot] in #291
  • Take the safe half of the dependency bumps, and hold numpy for #224 by @wilbowes in #420
  • Refuse to install the firmware a device is already running by @wilbowes in #422
  • Early Access 2.23.0-ea.1 by @wilbowes in #424
  • Drive the whole jack routing, in both directions and at startup by @wilbowes in #425
  • Bring up the codec's DAPM routes, and two device fixes behind them by @wilbowes in #426
  • Report which userspace the device booted, and stop debloating emOS by @wilbowes in #427
  • Move the base OS onto the register message, where its consumer can see it by @wilbowes in #428
  • Stop a shell waiter releasing the holder's lock, and fail a transfer fast by @wilbowes in #429
  • The controller tells the device what time it is by @wilbowes in #430
  • Stop the ambient light sensor flooding the only crash channel we have by @wilbowes in #431
  • Don't wait 120s for an Android service that emOS will never have by @wilbowes in #432
  • emOS 0.1: an Echo Dot that runs EchoMuse with no Amazon userspace by @wilbowes in #434
  • Put a password in front of the emOS USB console: the controller half by @wilbowes in #435
  • Provision emOS from TWRP, without ever installing Magisk by @wilbowes in #436
  • Early Access 2.23.0-ea.4 by @wilbowes in #437
  • Do not tell people to restore a device into one that will not boot by @wilbowes in #441
  • Correct the FAQ entry that told people to cause #79 by @wilbowes in #440
  • Make every wizard step verify what it inherits and what it did by @wilbowes in #443
  • Correct the claim that the permissive cmdline patch is inert by @wilbowes in #444
  • Verify the flash against the bytes written, not the next megabyte by @wilbowes in #448
  • Make the emOS console readable and give it a supplicant to talk to by @wilbowes in #449
  • Say WHERE the packer could not reproduce a boot image by @wilbowes in #456
  • Do not require a boot image's id to reproduce, and check the escrow's md5 by @wilbowes in #457
  • Reuse the reference's MTK kernel header instead of guessing its padding byte by @wilbowes in #458
  • Ask whether the device connected, and roll a bad network back by @wilbowes in #460
  • Wait for the device to REGISTER, which is not the same as connecting by @wilbowes in #461
  • Keep the network log in RAM, and bound it by @wilbowes in #462
  • Do not double the cmdline when repacking an emOS image by @wilbowes in #464
  • A console banner for emOS, and the check it constrains by @wilbowes in #465
  • Journal: 2026-09-06, the emOS wizard end to end and in-place updates by @wilbowes in #466
  • Correct the surviving 'enforce supersedes permissive' sentence in the emOS README by @wilbowes in #467
  • fix: WiFi stops reconnecting after reboot on local-only networks. by @Mr-Neutr0n in #416
  • fix: make the provisioning wizard more visually appealing by @Mr-Neutr0n in #344
  • Docs freshness pass: correct four claims the last fortnight falsified by @wilbowes in #470
  • Offer the FireOS flow beside emOS, rather than hiding it behind a query string by @wilbowes in #471
  • Say the flow is chosen in the wizard, now that it is by @wilbowes in #473
  • Say WebUSB is unavailable before a device is unboxed, not at the first click by @wilbowes in #474
  • Say what to watch on the first emOS boot, and how to reach TWRP without one by @wilbowes in #475
  • Preserve custom ONNX wake-word metadata through Home Assistant by @be-student in #442
  • Early Access 2.23.0-ea.14 by @wilbowes in #476
  • Say what ea.14 actually contains: the wake word metadata change landed after it by @wilbowes in #477
  • Ask which userspace the device booted before the OTA pushes the debloat by @wilbowes in #480
  • Give each playback its own completion waiter, not one Event per device by @wilbowes in #481
  • Record tonight's two findings where the next person will hit them by @wilbowes in #482
  • Log the emOS console out when it has been idle by @wilbowes in #484
  • docs: the wizard waits on a 163s boot, not an 86s one by @wilbowes in #487
  • Clear the console password when provisioning, and name the gate when it bites by @wilbowes in #488
  • End the turn ourselves when Home Assistant's VAD never engages (#485) by @wilbowes in #486
  • Journal 2026-09-09, and document the two faults where they will be hit by @wilbowes in #489
  • Write the 2.23.0 changelog, consolidating fifteen Early Access entries by @wilbowes in #490
  • Reach TWRP from emOS with /init recovery by @wilbowes in #491
  • Give the console idle timeout a number box, not a slider by @wilbowes in #492

New Contributors

Full Changelog: v2.14.0...v2.15.0

Don't miss a new EchoMuse release

NewReleases is sending notifications on new releases.