NaderLabs
Field DossierMEDIATEK MT8127REV 2026‑07‑20

NEONWIRE OS

A self-built cyberpunk operating system, hand-brought-up on an undocumented $40 white-label Android tablet — from raw eMMC to a touch UI that boots from its own neon splash, joins Wi-Fi, and synthesizes a full soundtrack in real time on its own CPU.

NEONWIRE home dashboard: system stats, WLAN0 online, Tailscale node, audio device, module launcher
The living OS at a glance — WLAN0 online, a Tailscale node reachable from anywhere, audio hw:0,5 armed, and every module one tap away. All values read live off the kernel.

What this is

The DigiLand DL7006-KB is a throwaway 7‑inch tablet built around a MediaTek MT8127. No source, no support, locked into a stale Android 7. Its one weakness: an unprotected bootloader. That crack was enough to take the whole device — dump it, boot our own Linux on it, give it a face, and keep going until it did things the vendor never shipped. The result, NEONWIRE OS, is a neon framebuffer UI drawn straight to the panel by a single static Rust binary — no X, no Android, no toolkit — that now runs Wi-Fi, SSH over Tailscale, a live camera pipeline, and an on-device music engine.

The hardware

Device
ModelDigiLand DL7006-KB
SoCMediaTek MT8127
CPU / GPU4× Cortex‑A7 · Mali‑450
RAM / eMMC1 GiB · 7.1 GiB
Panel1024×600 · command‑mode MIPI
AudioMT6323 codec · hw:0,5
Radioon‑die CONSYS Wi‑Fi
Bootloaderunprotected preloader

How it was taken — seven phases

Phase A

Own the flash

Done

Attached the unprotected preloader with mtkclient and dumped the full 7.1‑GiB eMMC — a complete, hash-verified backup and a guaranteed way back from any mistake. Nothing after this is irreversible.

Phase B

Own the boot

Done

Unpacked the MTK boot / recovery / LK images, mapped every partition offset, and built custom boot images — ADB-unlocked, setup-wizard removed. We now controlled what ran at startup.

Phase C

Self-built Linux

Done

Wrapped the stock 3.18.35 kernel around our own busybox initramfs and a USB‑ACM gadget — a real root shell over serial, eMMC + SD mounts, and a writable framebuffer. A minimal Linux we own, top to bottom.

Phase D

Give it a face

Done

A from-scratch framebuffer engine with a baked JetBrains‑Mono bitmap font, neon glow, panels and CRT scanlines — later rewritten in Rust (neonwire) as a single static ARM binary. It reverse-engineers the command-mode panel and a type-A touch driver to put a real touch UI on glass, streamed to the SD in ~2 seconds per iteration. No reflash to iterate.

Phase E

Make it the OS

Done

Embedded the UI in the initramfs so init launches it at boot — the device comes up straight into NEONWIRE, with a crash-loop guard that falls back to a recovery UI. Then reverse-engineered the MTK logo.bin format and flashed a neon boot splash over the vendor's. The entire boot chain, first frame to live OS, is ours.

Cold start into the home screen — rendered with the shell's own engine, font and glow. (The pre-kernel splash itself is drawn by the bootloader, before Linux.)
Phase F

Bring it to life

Done

The wall came down. Reverse-engineered the on-die CONSYS radio into working Wi-Fi + SSH + Tailscale — reachable from anywhere. Then a camera pipeline off a raw MIPI sensor, power management, and — the showpiece — a full audio + music stack: the tablet now computes its own soundtrack in real time. The throwaway tablet does things its vendor never shipped.

Phase G

Give it a mind

Done

Cross-compiled a whole agent runtimezeroclaw, 28 MB static armv7-musl — and ran it on the tablet, behind a local HTTP gateway the shell talks to. There's a touch app with a wake word and speech-to-text, and, running unattended, a heartbeat that reads the device's own logs every 30 minutes and writes up what it finds. The tablet stopped being only a thing we operate. It started reporting on itself.

Sound — the tablet computes its own music

The DL7006 has no audio framework — just a bare ALSA device on an MT6323 codec, no libasound, no mixer tools. NEONWIRE drives it directly: a hand-rolled raw-ioctl PCM writer on hw:0,5, and native controlC0 mixer calls to power the speaker amp. On top of that sits a port of a Strudel pattern engine — so the tablet doesn't play files, it synthesizes them: it evaluates the code of a song and renders every voice, live, on one Cortex-A7 core.

Captured off the panel — the marble machine, a dense generative piece, running live. The right half is drawn from the audio thread as it plays: event rain falling by pitch, a 1024-point spectrum, an oscilloscope, stereo VU, and an honest DSP % / voices readout. The soundtrack is the exact audio the tablet computed on one Cortex-A7 core — unmute to hear it.
PATTERN EVAL ~8 ms RENDER LOAD 10–30% of one A7 core OUTPUT 44.1 kHz stereo · S16 UNDERRUNS 0
SONGS library: foldered accordion list with the 13-track Agency OST expanded
The library. A foldered, scrolling song list — the whole Agency OST plus a beats folder — each track carrying its own liner notes from the source file.
MUSIC step sequencer: BD/SD/HH/CP lanes, preset chips, volume bar, save slots
The sequencer. A live step grid over the same synth voices — presets, Euclidean rhythms, mini-notation, a volume bar and pattern save slots, all touch-driven.

Mind — the tablet audits itself

The last thing a 2017 bargain tablet is supposed to run is an AI agent. The stock ARM builds are glibc, so this one was cross-compiled from source for armv7-musl with a lean feature set — a 28 MB static binary, built in seven minutes, that runs natively next to the shell and answers on 127.0.0.1:42617. NEONWIRE's ASSISTANT app is its face: a wake word, push-to-talk, speech-to-text, and a keyboard. But the interesting part isn't the chat — it's what runs when nobody's watching.

The ASSISTANT app: GATEWAY UP, WATCHDOG OK last tick 8m ago, and a watchdog report of the device's own logs
The watchdog reporting in. Every 30 minutes the agent wakes, reads /tmp/*.log, and files anything that looks wrong to a report the panel can show. Here it's noting Wi-Fi is still COMPLETED, that wmt_loader's exit 255 is unchanged, and that the tailscaled netlink complaints are “already filed or platform chatter” — it is deduplicating against its own earlier findings, across a reboot.

It earns its keep. In its first unattended runs it worked out that Tailscale's router integration is broken because iptables doesn't exist on this image and a 3.18 kernel can't do what the modern client asks; it correlated a network blip against one it had filed hours earlier and concluded the pattern was upstream resets rather than a stuck daemon; and it flagged wmt_loader's exit 255 as noise that would mask a real loader failure — a fair critique of our own boot script.

Then it caught us. It reported neonwire exited rc=143 after 16010s, explicitly separated it from the intentional restart it had already catalogued, and asked who sent the SIGTERM. That was us, hot-swapping the binary over SSH. The watchdog noticed the operator.

It runs deliberately declawed: supervised, thirteen read-only commands, no delegation, filesystem access limited to the log directory and its own workspace. The assistant you talk to has full privileges; the thing that wakes at 3 AM does not.

BINARY 28 MB static armv7-musl CROSS-BUILD 7 min HEARTBEAT 30 min AUTONOMY supervised · 13 read-only cmds

Hardware ghosts we exorcised

War stories
Dead touch

Taps registered internally but nothing moved. The panel is a type-A multitouch device reporting ABS_MT_POSITION frames — the release-latch stuck after the first touch. Fix: fire on the BTN_TOUCH press edge, commit on the next SYN_REPORT.

Frozen glass

The UI updated in memory but the screen sat still. The LCM is a command-mode MIPI panel — it only pushes a frame on a pan/flip, never on a plain memcpy. Fix: cycle three hardware buffers and FBIOPAN_DISPLAY every frame.

Silent amp

Music played but no sound came out. The speaker amp is a mixer control the old code toggled through a chroot's amixer — gone after a reboot. Fix: set it natively via controlC0 ioctls, decoding this kernel's 712-byte ALSA ABI struct by hand (arm32 aligns it differently than x86).

No loopback

The agent gateway refused to start with a bare Address not available. Nothing on this device had ever needed lo — every packet went out over wlan0 — so the minimal init never brought loopback up, and binding 127.0.0.1 simply failed. Fix: ifconfig lo up, now step 0 of the boot script.

The silent watchdog

The log-triage heartbeat ran for hours, then a reboot quietly killed it. The worker only exists inside the agent's daemon command; the boot script launched gateway start, which serves requests but never ticks. The fix existed — in the git repo, never copied to the device. Every surface still looked green. Fix: deploy the script, and add a liveness line that reads the daemon's own state file, because a watchdog that stops produces no logs to notice it by.

The wall we broke

Resolved

Wi-Fi. For a long time the integrated CONSYS block was the one thing that beat us — chip ID read zero, its rails and bus clock never came up, and the stock kernel ships with no way to load a driver. The break came from reverse-engineering the exact firmware-download and power-on handshake the vendor's userland performs, and replaying it from our own tools. NEONWIRE now brings the radio up on boot, joins a saved network, and runs dropbear SSH over Tailscale — the device is reachable from anywhere on Earth. wlan0 online

The stack

mtkclient · preloader dump & flash musl armv7 cross-toolchain Rust · single static ARM binary raw-ioctl ALSA PCM · no libasound Strudel pattern engine · on-device synth SD sample banks · own WAV decoder CONSYS Wi-Fi · dropbear · Tailscale raw MIPI camera pipeline ZeroClaw agent · on-device, armv7-musl busybox initramfs · MTK boot framing
NEONWIRE OS · DL-7006 · MT8127 Read the devlog · source own flash → own boot → own the whole thing