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 recoveryby @wilbowes in #491 - Give the console idle timeout a number box, not a slider by @wilbowes in #492
New Contributors
- @be-student made their first contribution in #442
Full Changelog: emos-v0.3...emos-v0.4