github wilbowes/EchoMuse emos-v0.4
emOS emos-v0.4

latest releases: controller-v2.23.0, v2.15.0
4 hours ago

emOS 0.4

The release the wizard needs: a device provisioned before this one gets an
init four releases stale, because the wizard fetches the init from whatever
emOS release is latest.

Reaching TWRP from the console

/init recovery reboots the device into recovery. That was the last thing
making emOS a one-way door — until now, getting a device on emOS back to TWRP
meant powering it off and holding the mute button, which is not something you
can talk somebody through over a link they are already connected on.

Amazon's /system/bin/reboot cannot do it, and cannot reboot at all: it
reaches Android's property service over a socket nothing here runs, so it
fails with ENOENT for recovery and with no argument alike. What
adb reboot recovery actually does is one syscall — RESTART2 carrying a mode
string, which MediaTek's restart handler turns into the value LK reads on the
next boot. The init owns that syscall directly, so nothing has to be pushed to
a device that has no adb.

The multi-call discriminator is getpid(), not argc: the kernel can pass
arguments to init from the boot cmdline, and a device whose bootloader
appended one would otherwise take the tool path and never boot.

The console

It logs you out when idle. 0 for never, otherwise 1-90 minutes, set from
the dashboard. console_gate() runs when init spawns the console and never
again, so before this an authenticated session survived until something ended
it — a password change could not reach a live session, and walking away left
one open on a cable. TMOUT is mksh's own, so an idle prompt exits, init
respawns the console and the gate runs again: the timeout and the password are
the same mechanism seen twice. Idle at the prompt rather than wall clock, so a
long foreground command is not killed under somebody watching it.

It opens with a banner naming the device, its serial, its address, the
controller it is actually talking to and how long it has been up — read live
rather than from stored values. Those are the four things somebody at a
console spends their first five minutes gathering, usually because something
is already wrong.

It is readable, and it has a supplicant to talk to.

Fixed

Repacking an image no longer doubles its cmdline. A rebuild appended the
boot arguments to a copy that already had them.

Notes

The init is the only part of emOS that can be published: a bootable image
carries the device's own kernel and device trees, so the image is assembled
from the boot partition each user reads off their own device.

/init recovery is confirmed on hardware. The idle timeout is not — it ships
here for the first time, and 0.3 has no TMOUT at all, so a device provisioned
before this release cannot exercise it.

What's Changed

  • 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: emos-v0.3...emos-v0.4

Don't miss a new EchoMuse release

NewReleases is sending notifications on new releases.