Overview Link to section: Overview

I built Tab5 OS to turn my M5Stack Tab5 into a touchscreen environment that can move between everyday tasks and electronics work. It combines storage, networking, display and touch input with tools for inspecting signals, exchanging bytes, and saving captures.

The firmware uses ESP-IDF, Espressif’s development framework, and LVGL, a graphics library for embedded interfaces. M5Stack’s board-support code connects those applications to the ESP32-P4 microcontroller and the tablet’s hardware.

Every screenshot below came from my ST7121 tablet on October 22, 2026. Its System screen identifies the firmware as Tab5 OS v0.6.0-3-g6d424a9-dirty: commit 6d424a9, three commits after the v0.6.0 tag, plus local changes. The 34-app launcher matches the newer app inventory on main; the tag and that commit alone have 24 apps. These captures show interfaces and their current states, not completed hardware validation.

Launcher and screensaver Link to section: Launcher and screensaver

The touch launcher scrolls through the apps, with a Home control in the shared header. The idle screensaver displays time, date, and weather forecasts.

Upper launcher showing Files, Notes, Counter, GPIO, Settings, AI Chat, Browser, Ebooks, Clock, System, Scope, Weather, and device tools. The upper launcher, with everyday apps followed by hardware and Bluetooth tools.

Lower launcher showing network tools, Ender 3, Electronics, Byte Lab, Modbus TCP, NTP Lab, Wake-on-LAN, Subnet Lab, UDP Console, Resistor Lab, and RTU Frames. The lower launcher includes the newer development apps.

Screensaver with a clock, Milwaukee weather, and separate hourly and daily forecast cards. The idle screen uses Open-Meteo weather data and wakes on touch.

Everyday tools Link to section: Everyday tools

Notes editor with a Save button and on-screen keyboard; personal text has been covered. Notes edits and saves a local note using the touch keyboard. Personal note text is redacted.

Counter at zero with minus one, plus one, and Reset buttons. Counter provides large increment, decrement, and reset controls.

Clock with date, internet synchronization status, and three daily alarm rows with hour and minute controls. Clock combines internet-synchronized time with persistent daily alarms and snooze; all three alarm rows are off here.

Settings with brightness, screen-off timeout, Scan, Forget, and Tools controls above an empty Wi-Fi list. Settings manages brightness, screen timeout, and Wi-Fi connections. The connected network name and IP address are redacted.

System showing development firmware, ESP-IDF version, ST7121 panel, storage and OTA diagnostics, and Install stable. System reports firmware, hardware, storage, and update state and provides Install stable. The Wi-Fi IP address is redacted.

Files and reading Link to section: Files and reading

Files root with Internal storage and SD card entries. Files browses internal storage and microSD, including viewers for saved capture graphs and serial logs. This capture shows only the storage roots.

Ebooks library listing WELCOME.TXT, ALICE.TXT, FRANK.TXT, and HOLMES.TXT. Ebooks reads text files from the SD card; these are the firmware’s welcome file and three first-run Project Gutenberg classics.

Browser with https://example.com loaded as text and Go, Back, Show keys, and Reload controls. Browser renders web pages as readable text with clickable links and HTTPS support, shown with Example Domain loaded.

Network and online Link to section: Network and online

AI Chat ready screen with an empty conversation, message field, Send, Start, New, and touch keyboard. AI Chat sends messages through an authenticated HTTPS relay and supports start/stop microphone transcription with a waveform. No conversation is present here.

Weather showing Milwaukee conditions, hourly cards, and a seven-day forecast. Weather looks up a city and shows current conditions, hourly forecasts, and a seven-day outlook; Milwaukee is the project’s public example.

HTTP Console with GET selected, example.com URL, empty headers and body fields, and no response. HTTP Tool sends web requests with optional headers and a body and displays a bounded response preview. This GET request is prepared but has no response yet.

MQTT Console with a public TLS test broker, empty credential fields, covered topic, and default message draft. MQTT publishes and subscribes to topic-based messages through a broker, shown before connecting with the default message draft. The topic text is redacted because it includes a device-derived identifier.

Network Diagnostics with covered connection details, example.com target, Look up, Ping x4, mDNS, and Refresh buttons. Network provides address lookup, four-probe ping, and local service discovery through mDNS. The network name, channel, signal strength, IP, gateway, mask, and DNS details are redacted.

Modbus TCP Inspector with the default example address, port 502, holding-register read controls, and no request sent. Modbus TCP reads coils, inputs, and registers using an industrial device protocol, with selectable interpretations for saved replies. The address is a firmware default and no request has been sent.

NTP Lab with an empty server field, port 123, Sample 4 button, and four not-sampled entries. NTP Lab compares a time server with the tablet using four exchanges to estimate delay and clock offset without setting the clock. No samples have been taken.

Wake-on-LAN with blank target MAC and destination fields, port 9, and no packet sent. Wake-on-LAN sends a confirmed wake packet to a configured device; a successful send cannot prove that it woke. The destination fields are empty here.

UDP Console with an empty peer address, example bytes 00 01 02 03, and no exchange yet. UDP Console sends one datagram, a network message, and previews one reply from the same peer within a bounded wait. This screen shows example bytes before an exchange.

Bluetooth devices Link to section: Bluetooth devices

Govee H5075 screen with Bluetooth off and empty temperature and relative-humidity readings. Govee monitors H5075 temperature and humidity broadcasts when enabled. Bluetooth is off and no readings are shown.

COLMI R12 Ring screen with Bluetooth off, Measure now, and an empty heart-rate chart. Ring connects to a COLMI R12 for wellness readings and heart-rate history. Bluetooth is off here, with no measurement displayed.

Cycling with KICKR Bluetooth off, empty power, cadence, and heart-rate readings, and Start ride. Cycling displays KICKR telemetry and supports SD ride logging. Bluetooth is off and no ride is running.

BLE GATT Explorer with Start scan and no scan results. BLE GATT explores Bluetooth Low Energy devices and their exposed services and values, with explicit connections, reads, notifications, and gated writes. No scan has been started.

Hardware and bus tools Link to section: Hardware and bus tools

GPIO screen listing EXT and M-BUS pins with levels and SET controls. GPIO, general-purpose input/output, switches pins between pulled-up input, low output, and high output.

ADC oscilloscope showing a low trace on G16 with hold, time scale, trigger, calibration, and Save CSV controls. Scope plots an analog input through the ADC, an analog-to-digital converter, with eight selectable channels, trigger and calibration controls, and SD export. This capture shows a low trace on G16.

External I2C Inspector with Scan, 100 kHz register speed, address and register controls, and no scan performed. I2C Tool inspects a two-wire peripheral bus through address scans, register reads, watch mode, SD capture, and confirmed writes. No scan or saved read is present here.

UART1 Terminal at 115200 baud with empty receive and transmit areas, capture controls, and explicit line-ending selection. Serial provides a UART or onboard RS-485 terminal with byte/text transmission, explicit line endings, logging, and captured-byte copy. The UART view is stopped with no received bytes.

SPI Master Console with mode zero, 1 MHz clock, empty transmit draft, and no completed transfer. SPI Master exchanges up to 32 bytes at a time over a clocked peripheral bus, with selectable mode and clock and received-byte copy. No transfer has been completed.

PWM and Pulse Generator with frequency, duty, and pulse-width controls and output stopped. Signal Gen produces PWM, a repeating signal with adjustable on-time, or a single pulse on G6. Output is stopped here; pulse timing is requested rather than calibrated.

Servo Toy stopped at 90 degrees with sine motion, medium range, frequency, Start, and Stop controls. Servo Toy drives selectable sine or random motion on G0 with an LED driver signal on G54. Both outputs are off in this capture.

Ender 3 Robot Controller searching on USB-A, with forward, back, left, right, Stop, and motor mapping controls. Ender 3 sends tank-style drive commands to a Marlin mainboard over USB CDC serial from the USB-A host port. It is searching for a printer here; live motion, disconnect/reconnect, and electrical checks remain open in the roadmap.

Offline engineering tools Link to section: Offline engineering tools

Electronics Calculator solving Ohm’s law for 5 volts across 1000 ohms and displaying 5 milliamps. Electronics calculates Ohm’s law, voltage dividers, LED resistors, and resistor-capacitor filters. The example computes current and power from voltage and resistance.

Byte Lab showing six example hex bytes, checksums, wire CRC byte order, and an empty shared clipboard. Byte Lab interprets and encodes bytes as text, integers, or floating-point numbers and calculates checksums to help check data integrity. This example shows six hex bytes and their checksums.

Subnet Lab showing a built-in /24 example with network, broadcast, host range, and peer membership results. Subnet Lab calculates IPv4 address ranges and checks whether a peer belongs to the same subnet. All addresses shown are built-in examples; it sends no traffic.

Resistor Lab with yellow, violet, red, and gold bands decoded as 4.7 kilohms with five percent tolerance. Resistor Lab decodes color bands and printed surface-mount markings. The four-band example shows resistance, tolerance, and its resulting range.

Modbus RTU Frames with a two-register holding-read request, empty reply field, and no decoded reply. RTU Frames builds serial Modbus read requests and validates and decodes replies offline; Serial handles actual transmission. This capture shows a generated request, with no reply decoded.

The shared byte clipboard connects Byte Lab and RTU Frames with tools such as Serial, SPI, I2C, UDP, MQTT, and BLE. It lets complete captured values move between tools without retyping; transmission still requires an explicit action in the sending app.

Hardware and display support Link to section: Hardware and display support

Tab5 OS targets the M5Stack Tab5 with ESP32-P4. M5Stack’s board-support layer accommodates the original ILI9881C display with GT911 touch and the newer ST7123/ST7121 family. These captures are from the ST7121 720×1280 panel; they do not establish coverage for the other display family.

The checked-in configuration preserves QIO flash access, 200 MHz PSRAM external memory, and L2-cache settings needed to keep display data flowing to the 720p panel.

External GPIO and I2C signals are 3.3 V only. External 5 V is off at boot, and Tab5 OS has no control to enable it. The pin-safety guide documents shared pins, power, and interface limits; Servo Toy requires separate servo power and a common ground.

Build and flash Link to section: Build and flash

Use ESP-IDF 5.4.2 in an ESP-IDF shell:

idf.py set-target esp32p4
idf.py build

The Windows build wrapper preserves the build tree for incremental work. App-only flashing writes the application; a full flash also writes the bootloader, partition table, and initial OTA metadata. Bootloader or storage-layout changes require the full path and a backup/migration plan, since changing the layout does not migrate internal files.

Read Install and recovery before choosing a flash command. The app-only wrapper always writes 0x20000 and does not detect the active slot. This tablet reports ota_0 @ 0x00420000, a legacy layout, so that wrapper must not be assumed to update its running slot. Inspect the installed partition table and active address on each tablet.

Release assets include the app binary, factory/recovery image, OTA manifest, SHA256SUMS, licenses/notices, and pinned dependency information. Verify the checksum before using a factory image; clean factory recovery erases internal settings and files.

OTA updates Link to section: OTA updates

System > Install stable installs a tagged stable release over Wi-Fi. OTA means over-the-air updating. The updater checks the manifest’s version, hardware compatibility, size, and permitted release URL, then verifies the downloaded image’s exact size, embedded version, and SHA-256 checksum before activation.

On a matching rollback-enabled bootloader and partition layout, the candidate stays pending until the interface and required storage/settings have remained healthy for 30 seconds. Rollback can return to the previous image if that validation fails. Updates preserve device settings, including device-specific chat configuration kept separate from public release binaries.

The OTA contract describes these checks and their limits. Independent release signatures and further physical install/rollback tests remain open work.

Remote-desktop capture Link to section: Remote-desktop capture

These 37 screenshots were captured over USB Serial/JTAG on October 22, 2026, around 12:52–12:59 PM CDT, using a small pyserial client on COM7. They are 720×1280 device framebuffer captures, not desktop interface renders.

The protocol sends 10-byte T5 command packets: kind 1 requests a frame, and kind 2 sends touch state and coordinates. The device replies with a 20-byte T5RD header carrying version, type, encoding, flags, dimensions, payload size, and frame number, followed by run-length pairs of a pixel count and an RGB565 color. RGB565 packs red, green, and blue into 16 bits. The repository’s remote desktop client implements this protocol and maps mouse input to touch:

python tools/remote_desktop.py --port COM7 --scale 1

Before publishing, I covered personal note text, Wi-Fi identity and address details, and MQTT’s device-derived topic with solid opaque fills. Each affected caption identifies the redaction. The images were then converted to WebP; the cover shows the upper portions of three real captures, cropped and placed side by side on a neutral background, with no added UI or device frames.

Source and current state Link to section: Source and current state

The Apache-2.0 source repository contains the applications, board integration, build tools, release workflow, and documentation. Managed dependencies are pinned, and the M5Stack and Espressif components retain their attribution.

As of this capture, v0.6.0 is the latest tagged field beta. Network, Electronics, Byte Lab, Modbus TCP, NTP Lab, Wake-on-LAN, Subnet Lab, UDP Console, Resistor Lab, and RTU Frames are the ten additional launcher entries in this development build and on main; they are not in v0.6.0.

The README, roadmap, and hardware smoke checklist distinguish implemented features from measured coverage. Open work includes the second display family, external peripheral and electrical checks, USB brownout follow-up, remaining HTTP checks, storage fault/recovery tests on hardware, repeated OTA/rollback cycles, and an eight-hour mixed-use soak. This screenshot set does not close those tests.

FAQ

Which hardware does Tab5 OS target?

Tab5 OS targets the M5Stack Tab5 with ESP32-P4. The page's device captures come from an ST7121 720×1280 panel and do not establish coverage for the other display family.

Are all the pictured apps included in v0.6.0?

No. The screenshots show a local development build with 34 apps. Ten additional launcher entries are in that build and on main but are not in the v0.6.0 field beta.

How do stable updates work?

System > Install stable downloads a tagged release over Wi-Fi. The updater checks compatibility and manifest details, then verifies the image's size, embedded version, and SHA-256 checksum before activation.

Can the external pins accept 5 V signals?

External GPIO and I2C signals are 3.3 V only. External 5 V is off at boot, and Tab5 OS has no control to enable it.