Releases: spruceUI/oakMOSS
Release list
oakMOSS v0.4.2-beta.1
oakMOSS v0.4.2-beta.1
System card (SD1) images for three MagicX handhelds. This beta lets the system mount squashfs images compressed with gzip, LZ4 or zstd, as well as XZ and LZO. PortMaster runtimes come as squashfs images, and most of them use gzip.
Downloads
| Device | Image |
|---|---|
| MagicX Mini Zero 28 | oakmoss-zero28-v0.4.2-beta.1-sd1.img.xz |
| MagicX Zero 40 | oakmoss-zero40-v0.4.2-beta.1-sd1.img.xz |
| XU RETRO / MagicX XU20 V32 | oakmoss-xu20-v0.4.2-beta.1-sd1.img.xz |
Before you start
- Back up your stock system card. A full image of it is the only way back to stock.
- Use spruceOS v4.5.0 or a newer nightly. It goes on a second card, formatted FAT32 (exFAT won't mount).
- Your spruceOS card is not changed: games and saves stay on it.
Install
- Write the image to the system card with Raspberry Pi Imager or a similar tool (in Imager: "Use custom", then pick the
.img.xz). Leave verification on. The image replaces everything on the system card, including an earlier oakMOSS. - Once the card is ejected, put it straight into the device. On Windows, don't plug it back into the PC first: Windows can rewrite the card's partition table so it no longer boots. If that happens, write it again.
- The system card goes in the slot your stock system card came from, and the spruceOS card in the other slot.
- Power on.
What's new
- squashfs with gzip, LZ4 and zstd, all three devices. The system could mount only XZ- and LZO-compressed squashfs images. Most PortMaster runtimes are gzip, and PortMaster's 32-bit Godot 4.5 runtime is zstd. Now all five compression types mount. Tested on all three devices.
- Everything else is as in v0.4.1-beta.1.
Known limitations
- Zero 40: the screen goes black for 1-2 seconds between the boot picture and the menu.
- Zero 40: going to sleep takes about 4 seconds.
- Beta: tested on one unit of each device.
Checksums
sha256sum -c SHA256SUMS checks the downloads. Each *-BUILD-INFO.txt lists exactly what went into its image.
SHA-256 of the decompressed images
5959848052121b8c4eaf39199c879006be75b05c457c122d0532f7c171a39b78 oakmoss-zero28-v0.4.2-beta.1-sd1.img
43050e1e4b5505f5ddadaa94500db5b8d2c604c9797041e374d6067de127c7f2 oakmoss-zero40-v0.4.2-beta.1-sd1.img
b3be6d706b3385bdc41d174e62a9ec6d5370c3c8da791c15b7ecee50edde950b oakmoss-xu20-v0.4.2-beta.1-sd1.img
oakMOSS v0.4.1-beta.1
oakMOSS v0.4.1-beta.1
System card (SD1) images for three MagicX handhelds. This beta fixes touch in programs that read the touchscreen themselves, such as DraStic, and updates Bluetooth audio on the Zero 40.
Downloads
| Device | Image |
|---|---|
| MagicX Mini Zero 28 | oakmoss-zero28-v0.4.1-beta.1-sd1.img.xz |
| MagicX Zero 40 | oakmoss-zero40-v0.4.1-beta.1-sd1.img.xz |
| XU RETRO / MagicX XU20 V32 | oakmoss-xu20-v0.4.1-beta.1-sd1.img.xz |
Before you start
- Back up your stock system card. A full image of it is the only way back to stock.
- Use spruceOS v4.5.0 or a newer nightly. It goes on a second card, formatted FAT32 (exFAT won't mount).
- Your spruceOS card is not changed: games and saves stay on it.
Install
- Write the image to the system card with Raspberry Pi Imager or a similar tool (in Imager: "Use custom", then pick the
.img.xz). Leave verification on. The image replaces everything on the system card, including an earlier oakMOSS. - Once the card is ejected, put it straight into the device. On Windows, don't plug it back into the PC first: Windows can rewrite the card's partition table so it no longer boots. If that happens, write it again.
- The system card goes in the slot your stock system card came from, and the spruceOS card in the other slot.
- Power on.
What's new
- Touch in DraStic and other programs that read it themselves (Zero 40, XU20). The kernel re-sent every touch report as if the finger had just landed, so a held touch broke into a stream of taps. The touchscreens also weren't marked as touchscreens for programs that look them up. Both are fixed. Tested in DraStic (trngaje's build) and DSperate on both boards.
- Bluetooth audio on the Zero 40. The Bluetooth audio service is updated from a 2018 version to bluez-alsa 4.0.0, with later fixes added. Sound no longer cuts out for good after RetroArch's menu or a game switch, and headsets no longer play much quieter than they should. Tested with a headset.
- The Zero 28 and XU20 have no Bluetooth. Apart from touch on the XU20, they work as in v0.4.0-beta.1.
Known limitations
- Zero 40: the screen goes black for 1-2 seconds between the boot picture and the menu.
- Zero 40: going to sleep takes about 4 seconds.
- Beta: tested on one unit of each device.
Checksums
sha256sum -c SHA256SUMS checks the downloads. Each *-BUILD-INFO.txt lists exactly what went into its image.
SHA-256 of the decompressed images
18aff99e2148ef801d481d91c0e0eb18c1eafbff2cc7d5e889077e9ca22d0e35 oakmoss-zero28-v0.4.1-beta.1-sd1.img
6b241331126e07cf24fcb3a15a1c083542a63c4c16df3dfb892c0a0f42ac77b1 oakmoss-zero40-v0.4.1-beta.1-sd1.img
6eb165b4bd513db43ee28c85be2d8973aa6735b80fbc77661fc84a3db2e0e59d oakmoss-xu20-v0.4.1-beta.1-sd1.img
oakMOSS v0.4.0-beta.1
oakMOSS v0.4.0-beta.1
System card (SD1) images for three MagicX handhelds. This beta adds a charging screen and real sleep on all three, makes every button press send one code, and starts the Zero 40 and XU20 the same way as the Zero 28.
Downloads
| Device | Image |
|---|---|
| MagicX Mini Zero 28 | oakmoss-zero28-v0.4.0-beta.1-sd1.img.xz |
| MagicX Zero 40 | oakmoss-zero40-v0.4.0-beta.1-sd1.img.xz |
| XU RETRO / MagicX XU20 V32 | oakmoss-xu20-v0.4.0-beta.1-sd1.img.xz |
Before you start
- Back up your stock system card. A full image of it is the only way back to stock.
- You need spruceOS newer than v4.4.3-20260930: a later nightly or the next release, which include the MagicX update (spruceOS PR #1735). It goes on a second card, formatted FAT32 (exFAT won't mount). With v4.4.3-20260930 or older, most buttons do the wrong thing (A doesn't confirm) and sleep only turns the screen off.
- Your spruceOS card is not changed: games and saves stay on it.
Install
- Write the image to the system card with Raspberry Pi Imager or a similar tool (in Imager: "Use custom", then pick the
.img.xz). Leave verification on. The image replaces everything on the system card, including an earlier oakMOSS. - Once the card is ejected, put it straight into the device. On Windows, don't plug it back into the PC first: Windows can rewrite the card's partition table so it no longer boots. If that happens, write it again.
- The system card goes in the slot your stock system card came from, and the spruceOS card in the other slot.
- Power on.
What's new
- Charging screen, all three. Plugged in while off, the device shows a charging picture and then the battery level, instead of staying off (Zero 40, XU20) or starting up (Zero 28). The screen goes dark after 30 seconds, and any button brings it back. Press the power button while the screen is lit to start the system. Unplugging the charger switches the device off.
- Low battery. On the charger, a device with a nearly flat battery charges to a safe level before it starts. Without a charger, it shows a low-battery picture and switches off. Not yet seen on a flat battery.
- Real sleep, all three. With the matching spruceOS, a short press of the power button suspends the device and the power button wakes it. Touch works after waking.
- One code per button press. MagicX's firmware gave A (and on the XU20, B and MENU) a second code for its Android launcher, so one press read as two buttons. Each press now sends one code.
- XU20: the extra face button is Home, as on the TrimUI Smart Pro S.
- Rumble on the Zero 40 and XU20. The Zero 28 has no motor.
- Battery level: the Zero 40 and XU20 now load their own battery profile into the fuel gauge; they had the Zero 28's.
- Zero 40 and XU20 now start the same way as the Zero 28: through the Allwinner SDK's boot firmware and oakMOSS's own bootloader, instead of MagicX's. That is what makes the charging screen possible on them.
Known limitations
- Zero 40: the screen goes black for 1-2 seconds between the boot picture and the menu.
- Zero 40: going to sleep takes about 4 seconds.
- Beta: tested on one unit of each device.
Checksums
sha256sum -c SHA256SUMS checks the downloads. Each *-BUILD-INFO.txt lists exactly what went into its image.
SHA-256 of the decompressed images
cf77807acc63fe49e622d99f1b97a19c3d67b825a20e7217a073deadc828c531 oakmoss-zero28-v0.4.0-beta.1-sd1.img
c0ef5ec94e22a7554824681ef7e5af0def2c5c334226d5fb0066aca0252d345c oakmoss-zero40-v0.4.0-beta.1-sd1.img
95542ecce64b007c238888a866d7655bc31fd4b9f1e69a3a73c86a1359685339 oakmoss-xu20-v0.4.0-beta.1-sd1.img
oakMOSS v0.3.0-beta.1
oakMOSS v0.3.0-beta.1
System card (SD1) images for three MagicX handhelds. This beta moves screen rotation into the kernel on the Zero 28 and XU20, so everything is drawn the right way up without each app rotating on its own, and puts all three on one button convention.
Downloads
| Device | Image |
|---|---|
| MagicX Mini Zero 28 | oakmoss-zero28-v0.3.0-beta.1-sd1.img.xz |
| MagicX Zero 40 | oakmoss-zero40-v0.3.0-beta.1-sd1.img.xz |
| XU RETRO / MagicX XU20 V32 | oakmoss-xu20-v0.3.0-beta.1-sd1.img.xz |
Before you start
- Back up your stock system card. A full image of it is the only way back to stock.
- You need a spruceOS build with the MagicX rotation change on a second card, formatted FAT32 (exFAT won't mount). With an older spruceOS, A/B and X/Y are swapped on all three, and on the Zero 28 and XU20 the picture comes out rotated twice.
Install
- Write the image to the system card with Raspberry Pi Imager or a similar tool (in Imager: "Use custom", then pick the
.img.xz). Leave verification on. - Once the card is ejected, put it straight into the device. On Windows, don't plug it back into the PC first: Windows can rewrite the card's partition table so it no longer boots. If that happens, write it again.
- The system card goes in the slot your stock system card came from, and the spruceOS card in the other slot.
- Power on.
What's new
- The kernel rotates the screen on the Zero 28 and XU20. Menus, RetroArch, PortMaster and ports all come out the right way up, with no per-app setting.
- All three: the face buttons report their positions the way the TrimUI A133P devices do, so A, B, X and Y mean the same thing in every app.
- XU20: touch follows the rotated screen.
- Zero 28: the boot logo stays in place when the system takes over the screen.
- Zero 28: fewer dropped frames. The kernel no longer writes every log line to the serial port.
- All three: debugging tools on the system card:
strace,gdbserver,htop,i2c-tools,trace-cmd,memtester,stress-ng,iperf3,tcpdump,ethtool, and more BusyBox commands (base64,od,taskset,devmem,nproc).
Known limitations
- Sleep turns the screen off and pauses the game. Full suspend isn't supported on these devices.
- Beta: tested on one unit of each device.
Checksums
sha256sum -c SHA256SUMS checks the downloads. Each *-BUILD-INFO.txt lists exactly what went into its image.
SHA-256 of the decompressed images
341025310eabde99bca6cf556f502df093838bba60420a92daaef8651c8d7894 oakmoss-zero28-v0.3.0-beta.1-sd1.img
c650f456ac3a41b992041493080b26aa46fc3a9fbc027f5387a488e4627a382f oakmoss-zero40-v0.3.0-beta.1-sd1.img
aeb6aa698db827b92f60ee8c7abfdcf36fa6a8f4b08abfb1e87d45745588c8f2 oakmoss-xu20-v0.3.0-beta.1-sd1.img
oakMOSS v0.2.0-beta.1
oakMOSS v0.2.0-beta.1
System card (SD1) images for three MagicX handhelds. This beta adds the XU20 V32 and touch on the XU20 and Zero 40.
Downloads
| Device | Image |
|---|---|
| MagicX Mini Zero 28 | oakmoss-zero28-v0.2.0-beta.1-sd1.img.xz |
| MagicX Zero 40 | oakmoss-zero40-v0.2.0-beta.1-sd1.img.xz |
| XU RETRO / MagicX XU20 V32 | oakmoss-xu20-v0.2.0-beta.1-sd1.img.xz |
Before you start
- Back up your stock system card. A full image of it is the only way back to stock.
- You need a spruceOS nightly from after 2026-09-19 (newer than
v4.4.2-20260919) on a second card, formatted FAT32 (exFAT won't mount). Older spruceOS builds boot, but touch, sleep and brightness won't work right.
Install
The spruce installer has beta support for oakMOSS.
To install manually:
- Write the image to the system card with Raspberry Pi Imager or a similar tool (in Imager: "Use custom", then pick the
.img.xz). Leave verification on. - Once the card is ejected, put it straight into the device. On Windows, don't plug it back into the PC first: Windows can rewrite the card's partition table so it no longer boots. If that happens, write it again.
- The system card goes in the slot your stock system card came from, and the spruceOS card in the other slot.
- Power on.
What's new
- XU20 V32 support.
- Touch on the XU20 and Zero 40.
- Fixed: the XU20 and Zero 40 sometimes stuck at the boot logo.
- Fixed: rebooting from spruce powered the device off.
- The Zero 40 keeps the same WiFi address, and so the same IP, across reboots.
- New oakMOSS boot logo. On the XU20 and Zero 40, bootloader warnings and the low-battery screen now show instead of looking like a freeze.
Known limitations
- Sleep turns the screen off and pauses the game. Full suspend isn't supported on these devices.
- Beta: tested on one unit of each device.
Checksums
sha256sum -c SHA256SUMS checks the downloads. Each *-BUILD-INFO.txt lists exactly what went into its image.
SHA-256 of the decompressed images
50dd611b796c35fcf64e6943c7c0143ad302869f546d5792214a7883090cbfed oakmoss-zero28-v0.2.0-beta.1-sd1.img
2c8de76a6c05e171844959152738cf3a0ff70c1f1ff481217251e6770db7b299 oakmoss-zero40-v0.2.0-beta.1-sd1.img
59534cabe61a0f12e4984a5fb94d067a954639f6d4d9b33baff5d9917291ee4b oakmoss-xu20-v0.2.0-beta.1-sd1.img
oakMOSS v0.1.0-beta.1
oakMOSS v0.1.0-beta.1 (2026-09-16)
Base SD1 images for two MagicX boards. Each is a raw GPT card image: write it
raw to the SD1 card (Rufus in DD mode, balenaEtcher, Win32DiskImager or
Raspberry Pi Imager), eject, boot. Do not open a written card in a partition
tool: a table "repair" zeroes boot0. The system card goes in the slot the
board's own system card came from (sdc2); the user card with the spruce
payload goes in the other slot (sdc0), as FAT32.
| asset | board | chain |
|---|---|---|
oakmoss-zero28-v0.1.0-beta.1-sd1.img.xz |
MagicX Zero 28 | our full chain: SDK boot0, U-Boot, device tree, kernel 4.9.191, rootfs |
oakmoss-zero40-v0.1.0-beta.1-sd1.img.xz |
MagicX Zero 40 | the board's stock boot0 and U-Boot (MagicX release Zero40_V1) with OUR kernel 4.9.191, device tree and rootfs; panel driver recovered from the stock kernel |
Both: glibc 2.38 userland (Arm GNU Toolchain 13.3), PowerVR GE8300 DDK 1.19
GPU stack, busybox with the applets spruce needs, stock hand-off
(/usr/magicx/bin/runmagicx.sh): mounts the user card, runs its
magicx/init.sh or .tmp_update/updater, powers off if neither exists.
Known state
- Zero 28: the chain that has run spruce throughout; no diagnostic hand-off, no probe.
- Zero 40: boots spruce on our kernel (verified 2026-09-16 on one unit). The
backlight polarity fix and the radio node fix in this build are NOT yet
verified on hardware (the build before them ran with an inverted backlight
and no WiFi). Touch is not ported (axs15205). Sticks and pad map come from
the stock tree. The Android-kernel lane is not shipped: its GPU userland
cannot initialize. - XU20 V32: not in this release; its own-kernel image is blocked on the
board's verified-boot state (see the repository notes). - Both boards: exFAT user cards are unsupported; USB storage mode untested.
Verify
sha256sum -c SHA256SUMS
The *-BUILD-INFO.txt files record the exact inputs of each image (boot
chain hashes, kernel object, board tree, rootfs md5).