Apps included
Everything fits 8 MB RAM and 16 MB flash with no MMU. Romfs text runs execute-in-place and costs no RAM; SD card binaries are loaded whole before main(). The set is meant to be usable: shell, editor, file manager, browser, mail, and a C compiler on the board.
Screenshots below are HDMI captures at native 640×480, the same signal the master scans out.

Shell and editing #
| App | Where | Role |
|---|---|---|
| mksh | flash | Login shell — NOMMU port with arrays, [[ ]], brace expansion, PIPESTATUS, namerefs |
| BusyBox | flash | Coreutils and networking helpers (hush remains available) |
| nano | flash | Full editor (not the tiny build), patched for NOMMU |
You log in as root to mksh on the HDMI console (USB CDC stays up for debug). Edit with nano; navigate the tree with mc.
Files and the console UI #
Midnight Commander lives on the SD card (/data/apps) with a /bin/mc wrapper. It is shipped whole rather than split: mc compares widget callback pointers, and FDPIC descriptors are not unique across libraries. With the kernel execute-in-place, the 512 kB allocation it needs is affordable.

glib stays in flash and is shared execute-in-place, so mc pays for its own text only.
Web, mail and scripting #
| App | Where | Role |
|---|---|---|
| lynx | card | Text web browser over HTTPS (wolfSSL + CA bundle) |
| mutt | card | Mail client with IMAP/POP — split into small FDPIC objects for NOMMU load |
| perl | card | Full perl 5.40 — split; largest Unicode table stays XIP in flash |
| Lua 5.4 | flash | Interpreter (32-bit), with lua-cjson and luafilesystem on the card |
| MicroPython | flash | Interpreter |
Large card programs are sized for a busy machine, not a fresh boot. Wrappers in /bin exec them from /data/apps and fail clearly if the card is missing.
Compile on the board #
| App | Where | Role |
|---|---|---|
| tcc | flash | Thumb-2 Tiny C Compiler — tcc -run compiles and runs in memory |
| make | flash | On-target builds with tcc |
| frankman | card (/data/opt) | Pac-Man clone shipped as source; the board builds it with tcc |
tcc -run sidesteps writing an FDPIC ELF the loader would accept: it compiles into RAM and calls the code. Floating point goes through AEABI soft-float helpers.


The framebuffer path (/dev/fb0, 320×240 8-bit) is what frankman and other graphics programs use; closing the device returns the text console with scrollback intact.
Networking and transfer #
| App | Where | Role |
|---|---|---|
| pppd | flash | PPP client for the ESP-01 netcard (NOMMU package) |
| Dropbear | flash | Small SSH client |
| wolfSSL | flash | TLS (OpenSSL-compat API) for lynx and friends |
| ca-certificates | flash | So SSL_VERIFY_PEER can succeed |
| iperf3 | card opt | Link throughput |
| lrzsz | card opt | rz / sz (X/Y/ZMODEM) down the console |
| pv | card opt | Progress for long transfers |
Storage tools (/data/opt) #
Unpacked at install; on PATH via profile.d.
| Package | Provides |
|---|---|
| exfatprogs | fsck.exfat, mkfs.exfat |
| dosfstools | fsck.fat, mkfs.fat |
| e2fsprogs | e2fsck (boot repair for /data) |
| file | file(1) with a trimmed magic set |
| bzip2 | Compression (BZIP2=-1 default) |
| tcc libc headers | Behind /usr/share/tcc/libc |
Sizing rule of thumb #
Without an MMU, every loadable segment is one physically contiguous allocation. Cap is effectively ~512 kB per object. Prefer flash (XIP) for large read-only text; split card programs into smaller shared objects; leave huge read-only tables in the image. Details: docs/apps-on-the-card.md in the repository.