MeshCore Ninja
← All firmwares

Meck-P4

Fork

A port of Meck (a MeshCore fork) to the LilyGo T-Display P4, targeting the ESP32-P4 main MCU. The onboard ESP32-C6 provides WiFi companion connectivity to the MeshCore app; BLE is not yet enabled. Features a full touch UI with virtual keyboard, channel messaging, repeater admin, trace route, position adverts, and private channels.

Fork of MeshCore (Official)

Maintainer
pelgraine ↗
Status
active
Maturity
alpha
Lifecycle
active
Latest version
0.6.2-patch
Released
2026-06-14
Runtime
Arduino · C++
Distribution
community
License
GPL-3.0

Capabilities

Transports

  • BLE
  • USB serial
  • Native TCP
  • Wi-Fi AP

Operations

  • Web flasher
  • OTA updates

Networking

  • Repeater
  • Room server
  • Observer
  • KISS modem

Hardware

  • GPS
  • Display
  • Sensors
  • Low-power RX

Protocol

  • MeshCore compatible

Node roles

companionrepeaterroom-server

Features

  • ESP32-P4 main MCU with ESP32-C6 WiFi companion
  • Touch UI with virtual keyboard
  • Screen-off power saving
  • Channel messaging and direct messages
  • Repeater admin and room server
  • Trace route and path view
  • Position adverts and share position
  • Private channels
  • Per-contact path editor
  • Region scope

Project signals

popularity 2026-06-21 verification 2026-06-21
GitHub stars
9
Forks
1
Watchers
1
Open issues
0
Contributors
2
Release downloads
111
Latest downloads
17
Source available
Yes
Releases available
Yes
CI builds
No

Releases

from GitHub · updated 2026-06-21
  1. v0.6.2-patch # Latest Pre-release 7 days ago · 2026-06-14 19:48 UTC

    Meck P4 v0.6.2 Pre-release (Patch): Trace and notification fixes

    Point release on top of v0.6.1. Two bug fixes, no new features. Firmware identity is now 0.6.2.

    Bug Fixes

    Multi-byte trace path parsed as single-byte

    Running a path trace in 2-byte mode returned a wrong result. The response was parsed as if it were 1-byte, so it reported twice as many hops as actually existed, each one resolved to the wrong repeater. As an example, a two-hop 2-byte trace of 3601,2198 came back as four hops (36, 01, 21, 98) matched against unrelated repeaters.

    The cause was in the trace-response handler: the hop count and hash size were taken from the wrong source. The byte length handed up from the base layer was being read with the packet-header path encoding, which collapses to 1-byte mode for any short path. The real hash size is carried separately in the trace flags.

    The handler now reads the hash size from the trace flags and computes the hop count as the path byte length divided by bytes-per-hop. 1-byte traces were already correct and are unchanged. 2-byte traces now report the right hop count and resolve to the correct repeaters.

    Custom notification sounds not playing

    Custom per-channel notification tones stopped playing as of v0.6 (they worked in v0.5). A tone could be selected and would show as set, but nothing played when a message arrived on that channel.

    The cause was the v0.6 audio rework, which split file preparation from playback start. The notification trigger prepared the tone file but never issued the start, so it sat ready and silent.

    The notification path now starts playback after preparing. The same missing start also affected the tone-picker preview and voice-message playback, both fixed by the same change.

    Files Changed

    3 files changed (MeckMesh.h, MeckUI.cpp, meck.h).

    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. correct port usage for flashing

    Flashing with the MeshCore Web Flasher (recommended)

    1. Go to https://flasher.meshcore.io/
    2. Scroll to the bottom and select Custom Firmware
    3. Select the meck-p4-0.6.2.bin file you downloaded
    4. Click OK on the merged-binary warning
    5. 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.2.bin
    

    (Replace PORT with /dev/cu.usbmodemXXXX on macOS, /dev/ttyACM0 on Linux, or COM3 on Windows.)

    Upgrading from v0.6.1 or v0.6 does not require erase_flash. This patch changes program logic only and adds no new settings, so existing prefs carry over unchanged.


    For the full feature list see the README.

    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 capt …

  2. v0.6.1-patch # Pre-release 11 days ago · 2026-06-10 03:42 UTC

    Point release on top of v0.6, adding a software LoRa antenna selector in Settings. No other functional changes. Firmware identity is now 0.6.1.

    Antenna Switch

    A new Antenna (tap to toggle) row at the top of Settings, switching the SX1262 between the two ports on the SKY13453 RF switch (XL9535 IO1 / VCTL).

    • Internal (RF1) is the default and corresponds to VCTL HIGH; External (RF2) is VCTL LOW. The internal antenna is the one in use when no external antenna is attached, so the device works out of the box without changing this.
    • The choice persists via prefs (NVS, mirrored to SD) and is re-applied at boot, so the selected port survives a reboot.
    • Tap applies live: the pin is driven immediately and the row label updates to show the active port.

    Bug Fixes

    None.

    Files Changed

    5 files changed.

    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)

    1. Go to https://flasher.meshcore.io/
    2. Scroll to the bottom and select Custom Firmware
    3. Select the meck-p4-0.6.1.bin file you downloaded
    4. Click OK on the merged-binary warning
    5. 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.1.bin
    

    (Replace PORT with /dev/cu.usbmodemXXXX on macOS, /dev/ttyACM0 on Linux, or COM3 on Windows.)

    Upgrading from v0.6 does not require erase_flash. The prefs loader tolerates the older layout, and the new antenna field comes up at its default (Internal).


    For the full feature list see the README.

    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.

  3. v0.6 # Pre-release 12 days ago · 2026-06-09 22:14 UTC

    Feature 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 .txt in a hidden .epub_cache subfolder, 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 .epub itself; 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 …
Show all 12 releases →

Device compatibility (1)

✓ 1 Supported
DeviceMCURadioStatusNotes
LilyGo T-Display P4esp32-p4Semtech SX1262✓ Supported