Meck P4 v0.5 Pre-release: Text reader, inline emoji, and repeater admin
Pre-releaseFeature release building on v0.4, adding a plain-text reader, inline colour emoji with a picker, over-the-mesh repeater administration from the companion app, audio player fixes, and draft message saving. Firmware identity is now 0.5.
Text Reader
- New plain-text (.txt) reader, opened from the home grid's Reader tile. Folder browser rooted at
/sdcard/bookswith subfolder navigation, a breadcrumb, and an up-one-level button. - Windowed, page-at-a-time rendering: the reader never loads the whole book, so memory and layout cost stay fixed to one screen regardless of file size. LVGL's own layout finds each page boundary at a clean line break.
- Per-book resume across reboots via a
.possidecar, plus page-back through the pages visited in the current session. - Percentage progress through the file.
- Reading-view taps: the left third turns back a page, the right two-thirds turns forward. Back returns to the browser; the browser's Back goes up a folder, or home at the
/sdcard/booksroot. - Honours the Settings font-size preference.
Inline Emoji
- Inline colour emoji across the UI. A per-size LVGL image-font (
lv_imgfont) is attached as the fallback of eachmeck_montserrat_*font, so emoji codepoints the text font can't draw are rendered from baked-in Twemoji images instead of a missing-glyph box. RequiresCONFIG_LV_USE_IMGFONT=y. - Emoji picker: a modal scrollable grid opened from the emoji key on the message-composer keyboards, inserting the chosen emoji as UTF-8. Dark-theme aware.
- Expanded emoji set.
- The emoji key moved to the right side of the space bar on the composer keyboards.
- VS-16 presentation selector and the AU-flag regional indicators are handled so trailing combiners don't render as boxes.
Repeater Admin (Companion App)
Over-the-mesh repeater administration from the MeshCore app. The app's session state is kept separate from the on-device Repeater Admin screen, so the two can't capture each other's responses.
- CMD_SEND_LOGIN (26): log in to a repeater from the app (force-flood for the login itself,
out_pathrestored afterwards,sync_sincereset for room contacts). - CMD_SEND_STATUS_REQ (27): request a repeater's status block; matched back to the app by tag.
- CMD_HAS_CONNECTION (28): query whether a keep-alive session is active for a contact.
- CMD_LOGOUT (29): end the keep-alive session for a contact.
- CMD_SEND_BINARY_REQ (50): generic binary request (GET_NEIGHBOURS, ACL queries, owner info, and so on), forwarded verbatim and matched by tag. This is the path behind the app's neighbours command.
- Push notifications: login success (0x85), login fail (0x86), status response (0x87), and binary response (0x8C). CLI text replies are queued to the app through the existing offline-message path (
TXT_TYPE_CLI_DATA). Frame layouts mirror upstream byte-for-byte, so the app parses them with no protocol-version negotiation. - Pushes are delivered to both the BLE and WiFi companions.
Audio Player
- Track-skip fix: fixed a cascade where an entire album would skip through in under a second. The end-of-track flag was being set on every player IDLE event, including the internal stop that fires when advancing to the next track, so each advance immediately triggered another. The flag is now set only on a genuine track completion.
- Bookmarks scoped to audiobooks: resume bookmarks are kept only for files under
/sdcard/audio/audiobooks. Music and other audio always start from the beginning, so finishing a short track no longer leaves a near-end position that made it skip on reopen, and no stray bookmark files are written for music. - Tappable now-playing indicator: the
>>now-playing indicator in the header returns you to the currently-playing track when tapped, without restarting it. Previously, tapping the track name in the browser re-opened the file from the beginning. - The
>>indicator now also appears in the audio and reader file explorers while audio is playing. - Resume indicator glyph: the per-row "saved position" marker changed from a tick (which read as "done") to a play glyph, on both the audio and reader browsers.
Draft Messages
- Optional draft saving for channel messages: an unsent channel message is kept and restored when you re-enter that channel. The on/off setting lives in Settings (off by default); the drafts themselves are held in RAM.
UI and Bug Fixes
- Reader folder glyphs: folder, file, and up-level icons in the reader browser now render correctly (routed through the stock symbol font that contains them) instead of as missing-glyph boxes.
- Emoji picker scroll: fixed the composer keyboard dismissing when scrolling the picker.
- Emoji picker focus: fixed a focus bug where opening the picker pulled focus off the composer textarea and left the keyboard layout out of sync.
- DM inbox clock: fixed the header clock position on the DM inbox screen.
Known Limitations
- The reader handles plain text (.txt) only; EPUB import is a later stage that will produce a .txt the reader then opens.
- Reader page-back covers the pages visited in the current session, not pages before the resume point.
- Audiobook resume applies only to files under
/sdcard/audio/audiobooks. - Inline emoji and the picker require
CONFIG_LV_USE_IMGFONT=y(menuconfig). - The now-playing
>>indicator is shown, and so tappable, only while audio is actively playing, not while paused. - BLE companion support remains compiled out by default (
MECK_BLE_ENABLED=0); WiFi is the primary companion transport.
Files Changed
38 files changed, 53,397 additions, 24 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, and room post is mirrored automatically, 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 notification sounds won't be available.
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.3.8-merged.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.3.8-merged.bin
(Replace PORT with /dev/cu.usbmodemXXXX on macOS, /dev/ttyACM0 on Linux, or COM3 on Windows.)
Upgrading from v0.3.6 does not require erase_flash. The prefs loader tolerates older shorter-blob layouts (new fields come up at defaults), and persistence formats are transparently migrated.
For the full feature list (Direct Messaging, Repeater Admin, Room Servers, Maps, Audio Player, Custom Radio settings, Region Scope, Custom Notification Sounds, etc.) 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 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.