Meck P4 v0.6 Pre-release: Web reader, Notes, and EPUB books
Pre-releaseFeature release building on v0.5, adding a reader-mode web browser over the ESP32-C6, a Notes app, EPUB book support in the reader, a Cyrillic keyboard layout, optional M5Stack CardKB hardware-keyboard support, and a portrait/landscape orientation toggle, alongside several bug fixes. Firmware identity is now 0.6.
Web Reader
A lightweight reader-mode web browser on the new Web home tile, running over the onboard ESP32-C6. It drives the C6 directly over ESP-AT, building its HTTP and TLS requests by hand, so it shares the WiFi companion's C6 link but uses its own request path. The C6 must be connected to WiFi for it to fetch anything.
- Landing menu with Enter URL, a DuckDuckGo Lite search, Bookmarks, and History.
- Reader view: pages are parsed to readable text with a status line. Headings render in dark red; link markers show as a muted grey
[N]and are followed from the Links panel. - HTTPS support, confirmed against DuckDuckGo Lite.
- GET form fill: an orange Forms (N) button opens a picker (duplicate forms collapsed), then a fill modal with a labelled field per text or password input. Submitting builds the
action?name=value&...query and loads it through the normal page path, so history and status stay correct. - Bookmarks (added from the reader view with a confirmation toast) and History.
- This is a work in progress: an amber notice appears for a few seconds each time the Web tile is opened. See Known Limitations below and the README for the full list.
EPUB Reading
The reader now opens EPUB (.epub) files in addition to plain text. The file list shows folders, .txt, and .epub items.
- Tapping an EPUB converts it to plain text the first time it is opened. A Converting ... to txt screen is shown while the book is decoded.
- The result is cached as a
.txtin a hidden.epub_cachesubfolder, so re-opening the same EPUB later loads straight from the cache and the conversion only runs once. - You only ever see and tap the
.epubitself; the cached text stays hidden from the browser.
Notes
A Notes app on the Notes home tile. Notes are plain UTF-8 .txt files stored under /sdcard/notes, so they live on the removable card, survive a reflash, and can be read or edited on a computer. The folder is created automatically on first run.
- Browser modelled on the reader's: folder navigation, an up-one-level button, and a breadcrumb, rooted at
/sdcard/notes. A green + New Note row sits at the top of every folder. - Create and edit with the on-screen keyboard (which honours the KB Theme and KB Layout settings). New notes are named by date and time when the clock is synced (
note_YYYYMMDD_HHMM.txt), or sequentially (note_NNN.txt) otherwise. - Read view reuses the reader's paging: left third of the screen turns back, right two-thirds turns forward, with a progress percentage and a saved-position bookmark.
- Long-press a note for an action menu with Rename, Delete (with confirmation), and Cancel.
Cyrillic Keyboard
A fourth on-screen keyboard layout, ЙЦУКЕН (Cyrillic), added to the Settings > KB Layout cycle alongside QWERTY, AZERTY, and QWERTZ.
- Standard Russian arrangement, also commonly used by Bulgarian users. The top three rows carry twelve letters each, with ё on the third row.
- The control keys keep their Latin labels (ABC / abc / 1#) so case and number switching still work.
- Ukrainian and Serbian letter sets are not included. The Settings row shows "ЙЦУКЕН" when this layout is active.
Physical Keyboard (M5Stack CardKB)
Optional support for the M5Stack CardKB, a small I2C QWERTY keyboard, as an alternative to the on-screen keyboard for typing messages. Gated behind the MECK_CARDKB build flag (a build-from-source option).
- Connects to the board's P1 connector (the 1x4 header) as a software-I2C bus on SDA = GPIO 48 and SCL = GPIO 47, at 10 kHz, address 0x5F. Probed for at boot; if absent the device runs normally on the on-screen keyboard.
- When a message composer is open, typing writes straight into the field and the first keypress hides the on-screen keyboard so the message list reclaims its space. Enter sends, Esc cancels, Backspace deletes, and Left / Right move the cursor.
- Wired to the message composers only for now; whole-UI arrow-key navigation is not yet implemented.
Screen Orientation
A Portrait / Landscape toggle in Settings > Orientation.


- Applies live: the display rotation is switched (0 degrees portrait, 90 degrees landscape), every screen is torn down and rebuilt at the new logical resolution, and you are returned to the home screen.
- The choice persists via NVS and is re-applied on the next boot before any screen is drawn.
- The home navigation grid adapts (2 columns by 5 rows in portrait, 5 columns by 2 rows in landscape) and the on-screen keyboard height scales with the panel.
Bug Fixes
- Long-press message regression: fixed a regression in the long-press behaviour on message bubbles.
- Audio fast-forward / seek: fixed a bug where fast-forward or seek could restart the file from the beginning. The resume position is now captured and restored.
- Clock and battery: fixed the clock and battery percentage not populating promptly after certain screen transitions.
Other Changes
- Four new Twemoji glyphs added to the inline emoji set (including the light blue heart, U+1FA75).
- Debug logs now print the firmware name/version and screen type in the session header, and ESP-IDF
ESP_LOGxoutput is captured to the on-device debug log alongsideprintf.
Known Limitations
- Web reader ships as a work in progress:
- Throughput is roughly 1.5 KB/s over the AT link, and a single fetch is capped (about 32 KB of captured text plus a receive-time ceiling), so large pages truncate with a "Page too large to load fully." notice. Light, text-heavy pages such as DuckDuckGo Lite work well; large portals do not.
- No redirect following (301 / 302 show the server's short "moved" body), which affects apex-to-www and http-to-https hops.
- A URL of the form
host?querywith no path slash folds the query into the hostname; use a form with a path (host/path?query). - No TLS certificate verification (no protection against a man-in-the-middle).
- The
Meck-P4user agent is bot-flagged, so Cloudflare-gated sites do not load yet. - No cookies, Referer, POST, gzip, or chunked transfer, so no logins or session-gated sites.
- The IRC client (upstream Meck web reader Stage 6) is not yet ported.
- CardKB support is build-flag gated (
MECK_CARDKB), is wired to the message composers only, and does not yet provide whole-UI arrow-key navigation. - Landscape orientation: a few secondary screens (the audio player, maps, and the reader) are still laid out at the fixed portrait dimensions and do not yet re-flow in landscape.
Files Changed
56 files changed, 27,178 additions, 930 deletions.
First-Time Flashing: Read This First
Meck-P4 ships as a single merged binary (bootloader + partition table + application combined). One file, flash at offset 0x0.
An SD card is recommended. With a FAT32-formatted card inserted, every saved setting, channel message, DM, room post, and note is mirrored or stored on the card, notification tones have somewhere to live, and the device recovers gracefully from a wiped NVS. Without an SD card the device still works but loses message history on reboot, and the Reader, Notes, and notification sounds have no storage.
Ensure you use the right-side USB-C port (the data port), not the high-speed charger port, to flash.

Flashing with the MeshCore Web Flasher (recommended)
- Go to https://flasher.meshcore.io/
- Scroll to the bottom and select Custom Firmware
- Select the
meck-p4-0.6.binfile you downloaded - Click OK on the merged-binary warning
- Click Flash, pick your device in the popup, and click Connect
Flashing with esptool.py
pip install esptool
esptool.py --chip esp32p4 -p PORT write_flash 0x0 meck-p4-0.6.bin
(Replace PORT with /dev/cu.usbmodemXXXX on macOS, /dev/ttyACM0 on Linux, or COM3 on Windows.)
Upgrading from v0.5 does not require erase_flash. The prefs loader tolerates the older layout, and new fields (such as the orientation toggle) come up at their defaults.
For the full feature list (Direct Messaging, Repeater Admin, Room Servers, Maps, Audio Player, Reader, Notes, Web Reader, Custom Radio settings, Region Scope, Custom Notification Sounds, and more) see the [README](https://github.com/pelgraine/Meck-P4/blob/main/README.md).
Reporting Issues
The Meck-P4 channel on the MeshCore Discord is the fastest path. GitHub Issues on the Meck-P4 repo also work for anything reproducible. Include the serial log if you can: Settings > Debug Logs > Start captures it to SD if a serial monitor isn't practical.
License
MIT for Meck-specific code. The combined firmware binary links libraries with mixed licensing including GPL-3.0 and LGPL-2.1 (Codec2) and is effectively GPL-3.0 when distributed.