Releases: d4rkmen/plai
v2.1
Plai v2.1
New Features
Map View
- Node map view with OpenStreetMap raster tiles
- Multiple map styles — switch with
[TAB]or select default in Settings - Default map zoom set to 10
- Script to download OSM tiles for offline use (
map/download_osm_tiles.py)
Quick Messages
- Predefined message templates — press
[Q]in Nodes or Channels to send - Quick message editor — press
[Q]to customize templates
Nodes
- Sort by distance — hold
[CTRL]to see distance - Unread message nodes displayed first in the list
Chat
- Hops and SNR info in chat view — hold
[CTRL]to reveal
Settings
- MQTT related settings in LoRa config (#10)
Monitor
- MQTT flag displayed in packet details
Bug Fixes
- Fix invalid channel PSK expansion for 8-bit keys (#9)
- Fix text wrapping with emojis in chat views
- Fix emoji rendering in long node names
- Fix variable character length input in string editor (emoji etc)
- Fix watchdog timer issue in dialogs
- Fix pixel color encoding in screenshots
Improvements
- Improved keyboard layout in dialogs
- Redesigned system bar battery indicator
- Updated message info layout
- Unified delay handling across the codebase
- Refined text color rendering in Channels, Monitor, and Stats
v2.0
Plai v2.0
New Features
Emoji Support
Plai now renders Unicode emoji from PNG images stored on the SD card (/sdcard/emoji/u<HEX>.png). The last 10 emoji are cached in RAM for instant repeated rendering with zero SD card I/O. Ships with Google Noto Color Emoji pack (12×12). LovyanGFX patched to enable emoji rendering and properly skip Unicode modifier codepoints.
Neighbors
Exchange and view direct-neighbor information with any node in the mesh.
- Exchange neighbors — Press [B] on a node to send your direct neighbors and request theirs back via
NEIGHBORINFO_APP - Neighbors list — Press [Fn]+[B] to open the cached neighbor list for the selected node
- Navigation — Arrow keys, [PgUp]/[PgDown], [Fn]+[↑] Home / [Fn]+[↓] End
- Jump to node — [ENTER] selects a neighbor and focuses it in the node list
- Neighbor data stored per node on SD (
neighbors/<node_id>.dat); cleaned up when a node is deleted
Stats Enhancements
- CPU usage — Tasks tab now shows per-task CPU usage
- Broadcast countdown — Position and telemetry tabs display time remaining until next broadcast
- Layout improvements across all Stats tabs
Undelivered Packet Details
Hold [CTRL] in any chat view (DM or channel) to see error details for undelivered packets — quickly identify why a message failed.
Neighbor Info in Settings
Neighbor info exchange interval is now configurable from the Settings app.
Improvements
- Human-friendly datetime — Timestamps throughout the app now use a more readable format
- Cyrillic relay names — Small font updated to render Cyrillic characters, used in relay node display
- Channel preset names — Empty channel slots now show the modem preset name instead of a blank label
- Sound feedback — Audible confirmation when toggling favorites or ignored status on a node
- Monitor performance — Relay node info lookup uses an index for significantly faster packet list scrolling
- Heap optimization — Replaced static heap allocators with dynamic allocation, freeing memory for other tasks
- Storage refactor — Removed legacy conversation-count limit from initial testing; storage is now limited only by SD card size
- Packet sending refactor — Mesh packet sending consolidated into shared code for consistency and maintainability
- Node input refactor — Input handlers in the Nodes app cleaned up and streamlined
- Fn hint updated — Node list footer now shows accurate [Fn] key hints
Bug Fixes
- Frequency calculation — Fixed default-slot (slot 0) frequency calculation that could place the radio on the wrong channel
- Keyboard driver — Resolved TCA8418 driver issue that caused key events to stop registering
- DM scrolling — Fixed broken scroll behavior in the Direct Messages view
- Neighbor cleanup — Deleting a node now correctly removes its cached neighbor data
- Watchdog — Improved WDT feeding to prevent spurious resets during long operations
Upgrade Notes
Breaking changes to message history format. Channel and DM messages history will be cleared after update.
Copy emoji folder to SD card root for rendering emojis
v1.9
Plai v1.9
Release notes for v1.9 (changes since v1.8).
Mesh & radio
- Channel activity detection — detects activity on the channel (#3).
- Frequency slot — default slot selection now follows the primary channel name correctly.
- TX timing — reply packets use configurable TX delay; TX delay logic refactored for consistency (#3).
- Hidden clients — telemetry broadcasts are skipped for
CLIENT_HIDDENrole.
Monitor app
- Richer packet details (extra rows, improved formatting).
- Hold CTRL for additional packet information.
Nodes app
- Remembers last sort order and selected node across sessions.
- Traceroute success uses a dedicated sound.
- Channel sounds — new notification options and an extra channel alert sound.
Stats app
- System tab shows firmware version; all tabs use scroll where needed.
- Node DB tab shows online node count (nodes seen within the last hour).
- Tasks tab lists running tasks (with layout tweaks).
- Statistics use all counted packets, not only the last 50.
- Battery info on the node view; GPS tab layout fixed for the screen; node info layout fixes and color tweaks.
Settings & UI
- Derive public key from private key in settings.
- Select dialogs — restored missing hint text.
- GPS status icon hidden when there is no GPS fix.
Messages
- Timestamps use local time correctly.
Platform & maintenance
- ESP-IDF 5.5.3 toolchain / config update.
- Factory partition size adjusted (
0x170000→0x150000); Makefile/partition updates aligned with layout changes. - Unused components removed from the tree; heap usage optimized.
- Presets consolidated in one place; timers use a single macro consistently.
- Powersave (WIP) — LED driver suspend/resume around power-saving paths.
For earlier releases and full project history, see the repository commit log and README.
v1.8
Plai v1.8
Standalone Meshtastic communicator for M5Stack CardPuter ADV.
No phone. No BLE. No WiFi. LoRa mesh communication with full on-device UI.
What's New
Stats App
- New Stats app — Tabbed system and network overview at a glance
- Node tab — Node ID, long/short name, role, PKI status
- System tab — Heap (total/free/min), PSRAM, SD storage, uptime, date/time
- Radio tab — Frequency, modem preset, waveform (SF/BW/CR), TX power, RX/TX packet counts
- Node DB tab — Total nodes, favorites count, ignored count, messages sent/received
- GPS tab — Fix quality, satellites (used/in view), coordinates, altitude, HDOP
- Mesh tab — RX/TX totals, port distribution (Text, NodeInfo, Position, etc.) with percentages; CRC errors shown separately
- Tab navigation — [←][→] switch tabs; [↑][↓] scroll long content
- Auto-refresh every 2 seconds
v1.7
Plai v1.7
Standalone Meshtastic communicator for M5Stack CardPuter ADV.
No phone. No BLE. No WiFi. LoRa mesh communication with full on-device UI.
What's New
Power Saving
- Display sleep — Screen turns off when idle to save power
- Skip UI when sleeping — No UI updates while display is off; wake on keypress or radio activity
- Improved main task wait — More efficient idle handling during sleep
- Display blink fix — Fixed power-on display blink behavior
- Volume and brightness callbacks — Moved to callback-based handling for better integration
Nodes
- Persistent favorites and ignored lists (#1) — Favorites and ignored nodes stored in NodeDB, survive node database resets
- Ignore nodes — Mark nodes as ignored to filter their traffic
- Exchange position and node info — New hotkeys [P] and [N] for exchange position and node info dialogs
- Node name centering — Node names centered in chat views
- Node name helpers — Added helpers for node name display
- Initial [CTRL] state — Fixed initial state when holding CTRL in node views
- Traceroute navigation — PageUp/PageDown in traceroute log and details
- Role fix — Fixed missing role in node info display
- Config-based node rendering — Use config for our node rendering vs node_db
Mesh & Compatibility
- Meshtastic UserId alignment (#2) — UserId now uses same MAC-based scheme as Meshtastic (
!xxxx97cc) for consistent identity across firmware flashes and backups - Packet decoding fix — Fixed decoding of our packets when relayed by other nodes
- Node info response — Respond with node info only when packet was for us
- Force info broadcast — Restored logic for forcing node info broadcast on settings change
- ROUTING error codes — Added correct mesh error codes for ROUTING packets
Monitor
- Packet payload refactor — Refactored packet payload handling and display
- ROUTING error details — Extended error codes and details for ROUTING packets
- Packet payload details — Added packet payload details in monitor view
- Implicit ACK logging — Log implicit ACKs in monitor
- Keyboard control — Improved keyboard navigation in details view
Settings
- Position settings — Fixed position settings; added "location = off" option
- Scroll position — Fixed back item scroll position in settings
- Input validation — Fixed UTF-8 input string size validation (bytes vs chars) in dialogs
- Import settings fix — Apply LoRa/mesh configuration correctly after successful import
Refactoring
- Timezone apply — Refactored timezone application logic
- GPS fix — Refactored GPS fix from polling to callback-based
- Code cleanup — Added helpers to simplify code
v1.6
Plai v1.6
Standalone Meshtastic communicator for M5Stack CardPuter ADV.
No phone. No BLE. No WiFi. LoRa mesh communication with full on-device UI.
Features
- Nodes — list up to 1000 nodes, 8 sort modes, DM with delivery status, traceroute with hop/SNR detail
- Channels — up to 8 channels, per-channel notification sounds, unread counters
- Greetings & #ping reply — auto-greet new nodes and auto-reply to
#pingwith configurable macro templates (#short,#long,#hops,#snr,#rssi) - Channel invitation — send/receive channel invites via DM (
#invite name=key); warns before sending unencrypted - Monitor — live TX/RX packet feed, last 50 packets, port labels, node name resolution
- Persistent air time — channel utilization and TX air time survive reboots (saved to SD card)
- SD-backed storage — message history, node database, and profile stored on SD card; survives firmware updates
- Settings — LoRa, security, node info, position, telemetry, export/import to SD