Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
4618 commits
Select commit Hold shift + click to select a range
1e34c1e
Remove "x" permission bits from some source files (#9794)
ldoolitt Mar 3, 2026
85be596
Upgrade trunk (#9795)
github-actions[bot] Mar 3, 2026
eb2f3ce
Update protobufs (#9797)
github-actions[bot] Mar 3, 2026
3601eab
Improve resource cleanup on connection close (and make server API a u…
thebentern Mar 3, 2026
deb45e4
spelling fixes (#9801)
ldoolitt Mar 4, 2026
0d46943
chore(deps): update docker/login-action action to v4 (#9806)
renovate[bot] Mar 4, 2026
8d73d67
chore(deps): update docker/setup-qemu-action action to v4 (#9807)
renovate[bot] Mar 4, 2026
153ab81
Deb: Handle offline builds more gracefully (#9791)
vidplace7 Mar 4, 2026
1fad7fa
Upgrade trunk (#9805)
github-actions[bot] Mar 4, 2026
f7f356e
chore(deps): update arduinojson to v6.21.6 (#9788)
renovate[bot] Mar 4, 2026
90742fc
chore(deps): update dorny/test-reporter action to v2.6.0 (#9796)
renovate[bot] Mar 4, 2026
b7bf251
Scaling tweaks (#9653)
NomDeTom Mar 4, 2026
5ced739
Add heltec-v4.3 board (#9753)
Quency-D Mar 4, 2026
3972fe1
Merge remote-tracking branch 'origin/master' into develop
thebentern Mar 4, 2026
65bf163
Add some lora parameter clamping logic to coalesce to defaults and en…
thebentern Mar 4, 2026
7ea28d3
Add back FEM LNA mode configuration for LoRa (#9809)
thebentern Mar 4, 2026
6bbdfe1
Merge remote-tracking branch 'origin/develop'
thebentern Mar 4, 2026
66161da
spelling fixes in .md files (#9810)
ldoolitt Mar 4, 2026
1626836
fix: add ROUTER_LATE to infrastructure init and config preservation (…
h3lix1 Mar 5, 2026
a8fed32
fix: add ROUTER_LATE to telemetry impolite role check (#9819)
h3lix1 Mar 5, 2026
935b050
Update protobufs (#9825)
github-actions[bot] Mar 5, 2026
6ba82ed
fix: prevent router-like roles from auto-favoriting DM peers (#9821)
h3lix1 Mar 5, 2026
42075da
Upgrade trunk (#9823)
github-actions[bot] Mar 5, 2026
fe4e75e
fix: add ROUTER_LATE and TAK_TRACKER to congestion scaling exemption …
h3lix1 Mar 5, 2026
22031c5
fix: treat ROUTER_LATE like ROUTER for power management and defaults …
h3lix1 Mar 5, 2026
58736f5
fix: add ROUTER_LATE to rebroadcast integrity checks (#9816)
h3lix1 Mar 5, 2026
20f838a
Add explicit dependency on mklittlefs. (#9708)
cpatulea Mar 5, 2026
afd5e29
More RAK6421 work (#9813)
jp-bennett Mar 5, 2026
9e40c88
Don't double-blink Thinknode-M1 Power LED while charging (#9829)
jp-bennett Mar 6, 2026
fdd17ac
chore(deps): update docker/metadata-action action to v6 (#9833)
renovate[bot] Mar 6, 2026
5cf3652
chore(deps): update docker/build-push-action action to v7 (#9832)
renovate[bot] Mar 6, 2026
3f5828c
chore(deps): update docker/setup-buildx-action action to v4 (#9824)
renovate[bot] Mar 6, 2026
969aefa
Cardputer Kit (#9540)
caveman99 Mar 6, 2026
cb28c38
fix(t1000e): reclassify P0.04 as sensor power enable GPIO (#9826)
weebl2000 Mar 6, 2026
4ec59ce
Upgrade trunk (#9835)
github-actions[bot] Mar 6, 2026
3d524be
Update Heltec Tracker v2 to version KCT8103L. (#9822)
Quency-D Mar 6, 2026
5b94f58
PPA: Remove Ubuntu 25.04, Add 26.04 (#9789)
vidplace7 Mar 6, 2026
5b1ea92
InkHUD: Nodelist cleanup (#9737)
HarukiToreda Mar 6, 2026
20db5fd
Fix WisMesh Tap V2 env mess (#9734)
thebentern Mar 6, 2026
86dad90
Fix nRF52 AsyncUDP multicast TX/RX race condition causing garbled pac…
PhilipLykov Mar 6, 2026
0ed537a
Add json file rotation option (#9783)
jp-bennett Mar 6, 2026
ffe6f70
Merge remote-tracking branch 'origin/develop'
thebentern Mar 6, 2026
b941dab
Add APIPort to native config (#9840)
pdxlocations Mar 6, 2026
6658ec2
chore(deps): update neopixel to v1.15.4 (#9839)
renovate[bot] Mar 7, 2026
393cd96
Merge remote-tracking branch 'origin/develop'
thebentern Mar 7, 2026
398d1ad
chore(deps): update meshtastic-esp32_https_server digest to b78f12c (…
renovate[bot] Mar 7, 2026
5d12edb
Add convenience userpref for disabling lora during development and te…
thebentern Mar 7, 2026
f185abb
Debian: Extend sourcedeb cache expiration (#9858)
vidplace7 Mar 8, 2026
6cbb9ab
Gate chatty smart broadcast debug message behind GPS_DEBUG
thebentern Mar 8, 2026
391928e
Add include directive for mbedtls error handling in build flags
thebentern Mar 9, 2026
a79b75a
Update ESP8266Audio dependency to Meshtastic fork for compatibility (…
thebentern Mar 9, 2026
0797378
chore(deps): update meshtastic/device-ui digest to 622b034 (#9864)
renovate[bot] Mar 9, 2026
0668b82
Upgrade trunk (#9868)
github-actions[bot] Mar 9, 2026
d7d08a4
Upgrade trunk (#9877)
github-actions[bot] Mar 10, 2026
d9e2b12
Experiment: C++17 support (#9874)
thebentern Mar 11, 2026
429cf51
Upgrade trunk (#9883)
github-actions[bot] Mar 11, 2026
421f9af
Automated version bumps (#9886)
github-actions[bot] Mar 11, 2026
60730a7
Initialize LoRaFEMInterface with default fem_type
thebentern Mar 11, 2026
b155a63
pioarduino Heltec v4: fix build due to LED_BUILTIN compile error. (#9…
cpatulea Mar 10, 2026
3ef7a15
Update GxEPD2 to v1.6.8 (#9918)
renovate[bot] Mar 16, 2026
5275092
Upgrade trunk (#9893)
github-actions[bot] Mar 17, 2026
fe8bfa0
Add new RAK 13302 power curve (#9929)
jp-bennett Mar 17, 2026
b7379f1
Update protobufs (#9930)
github-actions[bot] Mar 17, 2026
39aefde
chore(deps): update pnpm/action-setup action to v5 (#9926)
renovate[bot] Mar 17, 2026
aebcb34
Upgrade trunk (#9923)
github-actions[bot] Mar 18, 2026
4fbd5c9
Ensure infrastructure role-based minimums are coerced since they don'…
thebentern Mar 18, 2026
d369825
chore(deps): update meshtastic/device-ui digest to f36d2a9 (#9940)
renovate[bot] Mar 18, 2026
6f5448f
rotated MUI (#9938)
mverch67 Mar 19, 2026
458e46b
Upgrade trunk (#9943)
github-actions[bot] Mar 19, 2026
344fe2f
hexDump: Add const to the buf parameter in hexDump. (#9944)
fw190d13 Mar 19, 2026
76b6eaa
BaseUI: Emote Refactoring (#9896)
HarukiToreda Mar 18, 2026
7404228
Fix: Traceroute through MQTT misses uplink node if MQTT is encrypted …
domusonline Mar 16, 2026
3673af4
Remove GPS Baudrate locking for Seeed Xiao S3 Kit (#9374)
fifieldt Mar 16, 2026
58fee80
Add spoof detection for UDP packets in UdpMulticastHandler (#9905)
NomDeTom Mar 15, 2026
e282491
Remove a bunch of warnings in SEN5X (#9884)
oscgonfer Mar 12, 2026
286bc85
T-mini Eink S3 Support for both InkHUD and BaseUI (#9856)
HarukiToreda Mar 9, 2026
e1d238b
Remove early return during scan of BME address for BMP sensors (#9935)
NomDeTom Mar 19, 2026
ea3386f
fix(tlora-pager): Remove SDCARD_USE_SPI1 so SX1262 and SD card can sh…
ndoo Mar 19, 2026
e4c5bfd
Fix NodeInfo suppression logic to ensure suppression only applies to …
thebentern Mar 19, 2026
532a63e
Enable LNA by default for Heltec v4.3 (#9906)
weebl2000 Mar 19, 2026
2aefd38
Fix RAK4631 Ethernet gateway API connection loss after W5100S brownou…
PhilipLykov Mar 19, 2026
1fe9a41
Fix for preserving pki_encrypted and public_key when relaying UDP mul…
niklaswall Mar 19, 2026
139b970
Upgrade trunk (#9961)
github-actions[bot] Mar 21, 2026
d09433e
Update protobufs (#9972)
github-actions[bot] Mar 22, 2026
948c28a
fix: MQTT settings silently fail to persist when broker is unreachabl…
rcatal01 Mar 19, 2026
e30294b
Fixes #9792 : Hop with Meshtastic ffff and ?dB is added to missing ho…
domusonline Mar 20, 2026
8fa5b4f
Fix: Enable touch-to-backlight on T-Echo (not just T-Echo Plus) (#9953)
okturan Mar 22, 2026
c77b10a
Add LED_BUILTIN for variant tlora_v1 (#9973)
RobertSasak Mar 22, 2026
5a8ce60
add heltec_mesh_node_t096 board. (#9960)
Quency-D Mar 22, 2026
723209b
Fixes #9850: Double space issue with Cyrillic OLED font (#9971)
dev-nightcore Mar 23, 2026
5716aeb
Cleanup GH Actions
vidplace7 Mar 23, 2026
0ad1b66
Update dorny/test-reporter action to v3 (#9981)
renovate[bot] Mar 23, 2026
450f2ad
Remove unneeded GH perms
vidplace7 Mar 23, 2026
2e2993f
Add gnu++17 standard to nRF52840 build flags
thebentern Mar 24, 2026
163c548
fix: Cardputer-Adv I2S sound (#9963)
mverch67 Mar 24, 2026
d693fd4
Exclude accelerometer on new MESHTASTIC_EXCLUDE_ACCELEROMETER flag (#…
thebentern Mar 25, 2026
3b079c9
T5-4.7-S3 Epaper Pro support (#6625)
mverch67 Mar 25, 2026
b9bdc87
Update External Notifications with a full redo of logic gates (#10006)
Xaositek Mar 25, 2026
c4bac04
Exclude web server, paxcounter and few others from original ESP32 gen…
thebentern Mar 25, 2026
5a00988
Deps: Cleanup LewisHe library references (#10007)
vidplace7 Mar 25, 2026
e7e34e8
Dependencies: Remove all fuzzy-matches, spot-add renovate (#10008)
vidplace7 Mar 26, 2026
3b29eea
Update Adafruit_BME680 to v2.0.6 (#10009)
renovate[bot] Mar 26, 2026
3d4f0b8
Upgrade trunk (#9978)
github-actions[bot] Mar 27, 2026
993c242
Supporting STM32WL is like squeezing blood from a stone (#10015)
Stary2001 Mar 27, 2026
068f5af
Add meshtasticd config metadata (#10001)
vidplace7 Mar 27, 2026
99abfeb
Fix TransmitHistory to improve epoch handling (#10017)
thebentern Mar 27, 2026
aec98b6
MUI: WiFi map tile download: heltec V4 adaptations (#10011)
mverch67 Mar 27, 2026
844f5b4
Update meshtastic/device-ui digest to 7b1485b (#10023)
renovate[bot] Mar 29, 2026
80763ca
Move core lib_deps to github zips
vidplace7 Mar 29, 2026
976d201
Hack: Use re-uploaded framework-arduinoespressif32 on ESP32c6
vidplace7 Mar 29, 2026
29d7085
Renovate: Run once daily (not upon EVERY change)
vidplace7 Mar 29, 2026
1983398
Upgrade trunk (#10033)
github-actions[bot] Mar 30, 2026
2955c12
Configure NFC pins as GPIO for older bootloaders (#10016)
NomDeTom Mar 30, 2026
870ba80
wio-sdk-wm1110: inherit build_unflags (#10034)
vidplace7 Mar 30, 2026
0abd3cd
ESP32: Take away "tbeam" boards PSRAM to reclaim iram (#10036)
vidplace7 Mar 30, 2026
33d526f
Set t5s3_epaper_inkhud to `extra` (#10037)
vidplace7 Mar 30, 2026
4e05f20
Renovate: Don't update branches outside the schedule (daily) (#10039)
vidplace7 Mar 30, 2026
8fe12e9
Fix W5100S socket exhaustion blocking MQTT and additional TCP clients…
PhilipLykov Mar 30, 2026
3ad80b8
MUI: WiFi map tile download: heltec V4 adaptations (#10011)
mverch67 Mar 27, 2026
9e61c44
fix(routing): prevent licensed users from rebroadcasting packets to o…
NomDeTom Mar 22, 2026
90befee
Add timeout to PPA uploads (#9989)
vidplace7 Mar 24, 2026
8c90542
Fix rak_wismeshtag low‑voltage reboot hang after App configuration (#…
Ethan-chen1234-zy Mar 27, 2026
c7feef0
Update meshtastic/device-ui digest to 7b1485b (#10044)
renovate[bot] Mar 31, 2026
fc6c89a
Upgrade trunk (#10041)
github-actions[bot] Mar 31, 2026
8dc3c05
feat: Mesh-tab wifi map + exclude screen fix (#10038)
mverch67 Apr 1, 2026
98efb25
Thinknode_m5 minor fixes (#10049)
jp-bennett Apr 2, 2026
d5fe7dc
Update meshtastic/device-ui digest to dfdcf00 (#10050)
renovate[bot] Apr 2, 2026
7f0cd70
Align 920–925 MHz limits as per NBTC in Thailand (27 dBm, 10% duty cy…
hereismeaw Apr 2, 2026
934c3fa
Upgrade trunk (#10047)
github-actions[bot] Apr 3, 2026
9ba44bf
Set T-LoRA pager audio board volume to 75%
thebentern Apr 5, 2026
1370b23
Add build flag to exclude web server in MUI build for Wismesh Tap V2
thebentern Apr 5, 2026
d967700
meshtasticd: Add configs for luckfox-lyra-zero-w (mPWRD-OS) (#10085)
vidplace7 Apr 5, 2026
6628c9e
Upgrade trunk (#10091)
github-actions[bot] Apr 6, 2026
9896321
Automated version bumps (#10092)
github-actions[bot] Apr 6, 2026
2dd9c5e
Fix Linux Input enable logic (#10093)
jp-bennett Apr 6, 2026
12f0a74
Sync up custom metadata
thebentern Apr 7, 2026
16cf962
Update protobufs (#10104)
github-actions[bot] Apr 8, 2026
7fdee35
Update meshtastic-esp32_https_server digest to 0c71f38 (#10081)
renovate[bot] Apr 9, 2026
2c633b6
Upgrade trunk (#10096)
github-actions[bot] Apr 9, 2026
216655f
Update meshtastic-st7789 digest to 222554e (#10121)
renovate[bot] Apr 10, 2026
839cf55
meshtasticd: Add configs for ebyte-ecb41-pge (mPWRD-OS) (#10086)
vidplace7 Apr 10, 2026
3cd3fd3
Update actions/github-script action to v9 (#10122)
renovate[bot] Apr 10, 2026
ae5019b
meshtasticd: Add configs for forlinx-ok3506-s12 (mPWRD-OS) (#10087)
vidplace7 Apr 10, 2026
48ae4b6
Update meshtastic-st7789 digest to 7228c49 (#10131)
renovate[bot] Apr 11, 2026
e7c7af4
Update meshtastic-st7789 digest to 4d957e7 (#10134)
renovate[bot] Apr 12, 2026
a50cbdc
Docker: Pull images from Google/AWS during build
vidplace7 Apr 12, 2026
381cefa
PPA: Use SFTP method for uploads (#10138)
vidplace7 Apr 12, 2026
0f2d224
Switch PlatformIO deps from PIO Registry to tagged GitHub zips (#10142)
vidplace7 Apr 12, 2026
a1d6c6d
Fix display method to use const qualifier for previousBuffer pointer …
vidplace7 Apr 13, 2026
a9acd50
Update softprops/action-gh-release action to v3 (#10150)
renovate[bot] Apr 13, 2026
323830c
Update pnpm/action-setup action to v6 (#10132)
renovate[bot] Apr 13, 2026
eeb95d6
Update meshtastic-st7789 digest to a787bee (#10147)
renovate[bot] Apr 13, 2026
1972263
fix(native): implement BinarySemaphorePosix with proper pthread synch…
iannucci Apr 13, 2026
7527233
Enhance release notes generation with commit range comparison
thebentern Apr 13, 2026
e42ff35
fix last cppcheck issue (#10154)
caveman99 Apr 13, 2026
96dd647
Fix heap blowout on TBeams (#10155)
thebentern Apr 13, 2026
47e129f
Automated version bumps (#10159)
github-actions[bot] Apr 14, 2026
c1bee82
Update platform-native digest to 71ed55b (#10165)
renovate[bot] Apr 15, 2026
e7b6628
Merge branch 'master' into master
thebentern Apr 16, 2026
edf660c
Update variants/esp32s3/t-deck-pro-v1_1/variant.h
thebentern Apr 16, 2026
5cae9e0
Update src/platform/extra_variants/t_deck_pro/variant.cpp
thebentern Apr 16, 2026
7d957f8
Update variants/esp32s3/t-deck-pro-v1_1/platformio.ini
thebentern Apr 16, 2026
d5af07e
Update src/main.cpp
thebentern Apr 16, 2026
79e7ed3
Update src/graphics/EInkDisplay2.cpp
thebentern Apr 16, 2026
23f92c1
Add comprehensive guides for new module, sensor, and hardware variant…
thebentern Apr 16, 2026
9226385
Update protobufs (#10184)
github-actions[bot] Apr 17, 2026
f14ef12
Update meshtastic-st7789 digest to 92bae2e (#10182)
renovate[bot] Apr 17, 2026
8e55a6e
Update meshtastic/device-ui digest to 5305670 (#10183)
renovate[bot] Apr 17, 2026
c48b5ab
Merge branch 'master' into master
thebentern Apr 17, 2026
2c8dec2
Update meshtastic/device-ui digest to 56e1da4 (#10195)
renovate[bot] Apr 18, 2026
d31d0f8
Added compatibility with LilyGo T-Deck-Pro V1.1
lewisxhe Jan 21, 2026
d0cd8ec
Update variants/esp32s3/t-deck-pro-v1_1/variant.h
thebentern Apr 16, 2026
2beebea
Update src/platform/extra_variants/t_deck_pro/variant.cpp
thebentern Apr 16, 2026
84bb909
Update variants/esp32s3/t-deck-pro-v1_1/platformio.ini
thebentern Apr 16, 2026
9e26cc3
Update src/main.cpp
thebentern Apr 16, 2026
a277108
Update src/graphics/EInkDisplay2.cpp
thebentern Apr 16, 2026
e589de2
Tronk
thebentern Apr 18, 2026
8fd0a7f
Merge branch 'master' into master
thebentern Apr 18, 2026
6b15571
Add MCP server for interacting with meshtastic devices and testing fr…
thebentern Apr 18, 2026
de23e51
Add USB camera and uhubctl support for new test suite. Also included …
thebentern Apr 19, 2026
8627bce
Upgrade trunk (#10125)
github-actions[bot] Apr 20, 2026
eba74fa
Update GxEPD2 to v1.6.9 (#10212)
renovate[bot] Apr 21, 2026
84ce1ea
SX126x: re-apply 0x8B5 register in resetAGC() to preserve RX sensitiv…
nightjoker7 Apr 21, 2026
5d9a256
fix(nodedb): force null-terminate name fields in UserLite/User conver…
jaime-roldan Apr 21, 2026
e1f5043
Delete PointerQueue::dequeuePtrFromISR, unused since commit db766f1 (…
cpatulea Apr 10, 2026
23321c4
Reduce key duplication by enabling hardware RNG (#8803)
Komzpa Apr 13, 2026
f5be09c
Add Luckfox Pico Max Waveshare Pico LoRa config (#10175)
Ruledo Apr 16, 2026
25febfd
More cleanly remove LED_BUILTIN (#10179)
jp-bennett Apr 16, 2026
d8e4389
No longer need undefines, thanks to #10179 (#10180)
jp-bennett Apr 17, 2026
a8a5315
Upgrade trunk (#10221)
github-actions[bot] Apr 21, 2026
5f836cd
Added support for Spreading Factors 5 and 6 on compatible radios (#10…
derpyspike Apr 14, 2026
d7ba178
Fix: prompt markdownlint md040 fix for new prompts. (#10199)
h3lix1 Apr 18, 2026
76dea77
Add authoring guide for native unit tests in README.md (#10201)
NomDeTom Apr 19, 2026
68383c8
Add encryption overview to agent instructions in AGENTS.md (#10207)
thebentern Apr 19, 2026
9361b85
feat(t5s3-epaper): add InkHUD port for LilyGo T5 E-Paper S3 Pro (#10211)
giannoug Apr 21, 2026
2b5daf2
T watch pinfix (#10231)
jp-bennett Apr 22, 2026
fb1de11
Update LovyanGFX to v1.2.20 (#10232)
renovate[bot] Apr 22, 2026
a710841
Upgrade trunk (#10236)
github-actions[bot] Apr 22, 2026
d8b11f0
Improve options to align to names of UI options (#10240)
Xaositek Apr 22, 2026
6171ad8
Remove duplicate GPIO init block in setup() from bad merge in PR #9378
thebentern Apr 23, 2026
92c0133
Finish evil merge cleanup (#10253)
jp-bennett Apr 23, 2026
7c27f4e
Revert "Update LovyanGFX to v1.2.20 (#10232)" (#10269)
caveman99 Apr 23, 2026
48747ee
Upgrade trunk (#10266)
github-actions[bot] Apr 23, 2026
031f332
We have HardwareRNG, let's use it! (#10274)
jp-bennett Apr 23, 2026
2cc13a1
Sane sanitization
thebentern Apr 23, 2026
56c897e
Can't LOG when we don't have logging set up yet in the native test suite
thebentern Apr 23, 2026
5ea3d14
Update meshtastic-esp8266-oled-ssd1306 digest to 6bfd1f1 (#10277)
renovate[bot] Apr 24, 2026
8e65312
Upgrade trunk (#10284)
github-actions[bot] Apr 24, 2026
04b819a
Remove incorrect LED_STATE_ON definition for t-beam-s3 (#10280)
jp-bennett Apr 24, 2026
d47301d
Add PortduinoSetOptions to overwrite the realhardware bool (#10157)
jp-bennett Apr 14, 2026
439b87b
Detach power interrupts for sleep (#10230)
jp-bennett Apr 22, 2026
55f1507
Update protobufs (#10295)
github-actions[bot] Apr 25, 2026
7347091
Add script to show unmerged commits from develop to master
thebentern Apr 25, 2026
fb678b9
Update platform-native digest to 135b91e (#10300)
renovate[bot] Apr 25, 2026
554188e
Fix main function to setup and loop for Unity test framework
thebentern Apr 25, 2026
7800dc3
Enhance UTF-8 sanitization logic and add delays in test setup for rel…
thebentern Apr 25, 2026
aec0805
Trying another guard approach
thebentern Apr 25, 2026
4ccdd80
Add search duration check for exceeding 15 minutes (#10293)
jp-bennett Apr 26, 2026
87f1f9d
fix(Router): localize p_encrypted to prevent recursive-overwrite leak…
nightjoker7 Apr 27, 2026
47a6c4c
Upgrade trunk (#10317)
github-actions[bot] Apr 27, 2026
126861f
Native MacOS hello world (#10309)
thebentern Apr 27, 2026
4234fe6
Update meshtastic/device-ui digest to 7289329 (#10313)
renovate[bot] Apr 27, 2026
048e518
Update platform-native digest to 4ea5e09 (#10314)
renovate[bot] Apr 27, 2026
d7db0f5
add heltec-v4-r8 board (#10268)
Quency-D Apr 27, 2026
c0425d7
Actions: Build MacOS binary (#10319)
vidplace7 Apr 27, 2026
9c72767
macOS: enable CH341 LoRa-hardware path (fix serial truncation, docume…
thebentern Apr 28, 2026
8d8ff21
Add clamping logic for milliseconds conversion and unit tests (#10326)
thebentern Apr 29, 2026
11df30a
Upgrade trunk (#10324)
github-actions[bot] Apr 29, 2026
c0e52e6
Update meshtastic/device-ui digest to 1ddcc9d (#10328)
renovate[bot] Apr 29, 2026
22a9346
Debian: Correctly fail upon failure (#10341)
vidplace7 Apr 29, 2026
9ec63b5
Upgrade trunk (#10336)
github-actions[bot] Apr 29, 2026
7be5426
Do not FACTORY_INSTALL on ARCH_PORTDUINO (#10343)
vidplace7 Apr 29, 2026
089af76
Replace FSCom.format() with FSCom.rmDir() for directory cleanup in No…
thebentern Apr 29, 2026
195f42a
Doesn't FSCom
thebentern Apr 29, 2026
ad23c42
Update meshtastic/device-ui digest to 4bf593a (#10346)
renovate[bot] Apr 30, 2026
478444e
Docker-Alpine: Align version between build/main stages (#10347)
vidplace7 Apr 30, 2026
3a87fc8
Add documentation for macOS support in Copilot and Agent instructions
thebentern Apr 30, 2026
24d64a0
Docker: Build for riscv64 (#10345)
vidplace7 Apr 30, 2026
83adfd4
Upgrade trunk (#10354)
github-actions[bot] Apr 30, 2026
173ac58
Update protobufs (#10357)
github-actions[bot] Apr 30, 2026
21cef8c
Add TCP support for Meshtastic MCP interface / tests and update docs …
thebentern Apr 30, 2026
7066abb
Fix MAC_from_string to use input parameter instead of global config f…
thebentern Apr 30, 2026
4ee9598
Docker: Install grpcio-tools from distro (#10358)
vidplace7 Apr 30, 2026
90744ee
Update PhoneAPI.cpp to reduce chattiness (#10367)
Xaositek May 1, 2026
55f40ec
Add ulfius webserver support to macos native target (#10366)
thebentern May 1, 2026
c0fcf80
MacOS: Correct pkg-config name `openssl` for ulfius. (#10369)
vidplace7 May 1, 2026
0240a00
MacOS: Re-Add Orcania/Yder
vidplace7 May 1, 2026
7cb071c
Update platform-native digest to cab4b21 (#10372)
renovate[bot] May 1, 2026
2d761f6
Upgrade trunk (#10364)
github-actions[bot] May 2, 2026
41f5317
Use OBS instead of launchpad (#10375)
thebentern May 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
49 changes: 49 additions & 0 deletions .claude/commands/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Claude Code slash commands for the mcp-server test suite

Three AI-assisted workflows wrapping `mcp-server/run-tests.sh` and the meshtastic MCP tools. Each one has a twin in `.github/prompts/` for Copilot users.

| Slash command | What it does | Copilot equivalent |
| --------------------- | ------------------------------------------------------------------------- | ---------------------------------------- |
| `/test [args]` | Runs the test suite (auto-detects hardware) and interprets failures | `.github/prompts/mcp-test.prompt.md` |
| `/diagnose [role]` | Read-only device health report via the meshtastic MCP tools | `.github/prompts/mcp-diagnose.prompt.md` |
| `/repro <test> [n=5]` | Re-runs one test N times, diffs firmware logs between passes and failures | `.github/prompts/mcp-repro.prompt.md` |

## Why two surfaces

The Claude Code commands and Copilot prompts cover the same three workflows but each speaks its host's idiom:

- **Claude Code** (`/test`) uses `$ARGUMENTS` for pass-through, has direct access to Bash + all MCP tools registered in the user's settings, and runs in the terminal context.
- **Copilot** (`/mcp-test`) runs in VS Code's agent mode; it has terminal + MCP access too but typically asks the operator to confirm inputs interactively.

A contributor using either IDE gets equivalent assistance. Keep the two in sync when behavior changes — the diff of intent should be minimal.

## House rules

- **No destructive writes without explicit operator approval.** Skills that could reflash, factory-reset, or reboot a device must describe the action and stop — the operator authorizes.
- **Interpret failures, don't just echo them.** The skill body should pull firmware log lines from `mcp-server/tests/report.html` (the `Meshtastic debug` section, attached by `tests/conftest.py::pytest_runtest_makereport`) and classify the failure.
- **Keep MCP tool calls sequential per port.** SerialInterface holds an exclusive port lock; two parallel tool calls on the same port deadlock.
- **Never speculate about root cause.** If the evidence doesn't support a classification, say "unknown" and list what you'd need to disambiguate.

## Adding a new command

1. Write the Claude Code version at `.claude/commands/<name>.md` with YAML frontmatter:

```yaml
---
description: one-line purpose (used for auto-invocation by the model)
argument-hint: [optional-hint]
---
```

2. Write the Copilot equivalent at `.github/prompts/mcp-<name>.prompt.md` with:

```yaml
---
mode: agent
description: ...
---
```

3. Add the row to the table above. Cross-link in both bodies.

4. Smoke-test on Claude Code first (`/<name>` should appear in autocomplete), then in VS Code Copilot (`/mcp-<name>` in Chat).
62 changes: 62 additions & 0 deletions .claude/commands/diagnose.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
description: Produce a device health report using the meshtastic MCP tools (device_info, list_nodes, get_config, short serial log capture)
argument-hint: [role=all|nrf52|esp32s3|<port>]
---

# `/diagnose` — device health report

Call the meshtastic MCP tool bundle and format a structured health report for one or all detected devices. Zero guesswork for the operator.

## What to do

1. **Enumerate hardware.** Call `mcp__meshtastic__list_devices(include_unknown=True)`. For each entry where `likely_meshtastic=True`, capture `port`, `vid`, `pid`, `description`.

2. **Filter by `$ARGUMENTS`**:
- No args, `all` → every likely-meshtastic device.
- `nrf52` → only devices with `vid == 0x239a`.
- `esp32s3` → only devices with `vid == 0x303a` or `vid == 0x10c4`.
- A `/dev/cu.*` path → only that one port.
- Anything else → treat as a substring match against the `port` string.

3. **For each selected device, in sequence (NOT parallel — SerialInterface holds an exclusive port lock):**
- `mcp__meshtastic__device_info(port=<p>)` — captures `my_node_num`, `long_name`, `short_name`, `firmware_version`, `hw_model`, `region`, `num_nodes`, `primary_channel`.
- `mcp__meshtastic__list_nodes(port=<p>)` — count of peers, which ones have `publicKey` set, SNR/RSSI distribution.
- `mcp__meshtastic__get_config(section="lora", port=<p>)` — region, preset, channel_num, tx_power, hop_limit.
- Optionally, if the device seems unhappy (fails to connect, `num_nodes==1` when ≥2 are plugged in, missing firmware*version), open a short firmware log window: `mcp__meshtastic__serial_open(port=<p>, env=<inferred-env>)`, wait 3s, `serial_read(session_id=<s>, max_lines=100)`, `serial_close(session_id=<s>)`. The env should be inferred from the VID map in `mcp-server/run-tests.sh` (nrf52 → rak4631, esp32s3 → heltec-v3) unless `MESHTASTIC_MCP_ENV*<ROLE>` is set.

4. **Hub health** (call once, not per-device): `mcp__meshtastic__uhubctl_list()` — enumerates every USB hub the host can see. Note which hubs advertise `ppps=true` and which hub hosts each Meshtastic device (cross-reference by VID). Flag it in the report if:
- No hub advertises PPPS → `tests/recovery/` can't run on this setup; hard-recovery via `uhubctl_cycle` isn't available.
- A Meshtastic device is on a non-PPPS hub → note it; operator may want to move the device to a PPPS hub to unlock auto-recovery.
- `uhubctl_list` raises `ConfigError: uhubctl not found` → just say `uhubctl not installed` in the report; don't treat as a fault.

5. **Render per-device report** as:

```text
[nrf52 @ /dev/cu.usbmodem1101] fw=2.7.23.bce2825, hw=RAK4631
owner : Meshtastic 40eb / 40eb
region/band : US, channel 88, LONG_FAST
tx_power : 30 dBm, hop_limit=3
peers : 1 (esp32s3 0x433c2428, pubkey ✓, SNR 6.0 / RSSI -24 dBm)
primary ch : McpTest
hub : 1-1.3 port 2 (PPPS, uhubctl-controllable)
firmware : no panics in last 3s; NodeInfoModule emitted 2 broadcasts
```

Keep it scannable. If a field is missing or abnormal (no pubkey for a known peer, region=UNSET, num_nodes inconsistent with the hub, device on non-PPPS hub), flag it inline with a short `⚠︎ <one-line reason>`.

6. **Cross-device correlation** (only when >1 device is inspected):
- Do both sides see each other in `nodesByNum`? If one does and the other doesn't, that's asymmetric NodeInfo — flag it.
- Do the LoRa configs match? (region, channel_num, modem_preset should all agree; mismatch = no mesh)
- Do the primary channel NAMES match? Mismatch = different PSK = no decode.

7. **Suggest next actions only for specific, recognisable failure modes**:
- Stale PKI pubkey one-way → "run `/test tests/mesh/test_direct_with_ack.py` — the retry + nodeinfo-ping heals this in the test path."
- Region mismatch → "re-bake one side via `./mcp-server/run-tests.sh --force-bake`."
- Device unreachable, reachable via DFU → `touch_1200bps(port=...)` + `pio_flash`. If not even DFU responds AND the device is on a PPPS hub, escalate to `uhubctl_cycle(role=..., confirm=True)`.
- CP2102-wedged-driver on macOS → see the note in `run-tests.sh`.

## What NOT to do

- No writes. No `set_config`, no `reboot`, no `factory_reset`. This is a read-only diagnostic skill — if the operator wants to change state, they'll ask explicitly.
- No `flash` / `erase_and_flash`. Those are separate escalations.
- No holding SerialInterface across tool calls — open, query, close; next device. The port lock is exclusive.
66 changes: 66 additions & 0 deletions .claude/commands/repro.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
description: Re-run a specific test N times in isolation to triage flakes, diff firmware logs between passes and failures
argument-hint: <test-node-id> [count=5]
---

# `/repro` — flakiness triage for one test

Re-run a single pytest node ID N times in isolation, track pass rate, and surface what's _different_ in the firmware logs between the passing attempts and the failing ones. Turns "it's flaky, I guess" into "it fails when X, passes when Y."

## What to do

1. **Parse `$ARGUMENTS`**: first token is the pytest node id (e.g. `tests/mesh/test_direct_with_ack.py::test_direct_with_ack_roundtrip[nrf52->esp32s3]`); second token is an integer count (default `5`, cap at `20`). If the first token doesn't look like a test path (no `::` and no `tests/` prefix), treat the whole `$ARGUMENTS` as a `-k` filter instead.

2. **Sanity-check the hub first** (so we're not measuring "nothing plugged in" N times): call `mcp__meshtastic__list_devices`. If the test name contains `nrf52` or `esp32s3` and the matching VID isn't present, stop and report — re-running won't help.

3. **Loop N times**. For each iteration:

```bash
./mcp-server/run-tests.sh <test-id> --tb=short -p no:cacheprovider
```

Capture: exit code, duration, and (on failure) the `Meshtastic debug` firmware log section from `mcp-server/tests/report.html`. `-p no:cacheprovider` suppresses pytest's `.pytest_cache` writes so iterations don't influence each other.

4. **Track a small structured tally**:

```text
attempt 1: PASS (42s)
attempt 2: FAIL (128s) ← firmware log 200-line tail captured
attempt 3: PASS (39s)
attempt 4: FAIL (121s)
attempt 5: PASS (41s)
--------------------------------------
pass rate: 3/5 (60%) | mean duration: 74s
```

5. **On mixed outcomes**: diff the firmware log tails between a representative passing attempt and a representative failing attempt. Focus on:
- Error-level lines only present in failures (`PKI_UNKNOWN_PUBKEY`, `Alloc an err=`, `Skip send`, `No suitable channel`)
- Timing around the assertion event — did a broadcast go out, was there an ACK, did NAK fire?
- Device state fields that changed (nodesByNum entries, region/preset, channel_num)

Surface the top 3 differences as a "passes when / fails when" table. Don't dump full logs — pull specific lines with uptime timestamps.

6. **Classify the flake** into one of:
- **LoRa airtime collision** → pass rate improves with fewer concurrent transmitters; propose a `time.sleep` gap or retry bump in the test body.
- **PKI key staleness** → fails on first attempt, passes after self-heal; existing retry loop in `test_direct_with_ack.py` handles this.
- **NodeInfo cooldown** → `Skip send NodeInfo since we sent it <600s ago` in fail-only logs; needs `broadcast_nodeinfo_ping()` warmup.
- **Hardware-specific** (one direction fails, other passes; one device's firmware is older; driver wedged) → specific recovery pointer. For a device that's wedged past `touch_1200bps`, the next escalation is `uhubctl_cycle(role=..., confirm=True)` to hard-power-cycle its hub port (requires `uhubctl` installed).
- **Device went dark mid-run** → fails from some attempt onward, never recovers, firmware log stops arriving. Almost always hardware: a Guru crash + frozen CDC. Hard-power-cycle via `uhubctl_cycle(role=..., confirm=True)` before the next iteration; if that also fails, escalate to replug.
- **Genuinely unknown** → say so; don't invent a root cause.

7. **Report back** with:
- Pass rate and mean duration.
- Classification + evidence (the specific log lines that support it).
- A suggested next step (re-run with specific args, open `/diagnose`, edit a specific test file, nothing).

## Examples

- `/repro tests/mesh/test_direct_with_ack.py::test_direct_with_ack_roundtrip[esp32s3->nrf52] 10` — runs 10 times, diffs firmware logs.
- `/repro broadcast_delivers` — no `::`, no `tests/`, so interpreted as `-k broadcast_delivers`; runs every matching test the default 5 times.
- `/repro tests/telemetry/test_device_telemetry_broadcast.py 3` — shorter run for a slow test.

## Constraints

- Don't exceed `count=20` per invocation — airtime and USB wear add up. If the user asks for 50, negotiate down.
- Don't rebuild firmware as part of triage; flakes that only reproduce under different firmware belong in a separate session.
- If the FIRST attempt fails AND the rest all pass, that's a classic "state leak from a prior test" → say so and suggest running with `--force-bake` or starting from a clean state rather than chasing the first failure.
47 changes: 47 additions & 0 deletions .claude/commands/test.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
description: Run the mcp-server test suite (auto-detects devices) and interpret the results
argument-hint: [pytest-args]
---

# `/test` — mcp-server test runner with interpretation

Run `mcp-server/run-tests.sh` and make sense of the output so the operator doesn't have to.

## What to do

1. **Invoke the wrapper.** From the firmware repo root, run:

```bash
./mcp-server/run-tests.sh $ARGUMENTS
```

The wrapper auto-detects connected Meshtastic devices, maps each to its PlatformIO env, exports the required `MESHTASTIC_MCP_ENV_*` env vars, and invokes pytest. If the user passed no arguments, the wrapper supplies a sensible default set (`tests/ --html=tests/report.html --self-contained-html --junitxml=tests/junit.xml -v --tb=short`). A `--report-log=tests/reportlog.jsonl` arg is always appended (unless the operator passed their own). `--assume-baked` is deliberately NOT in the defaults — `test_00_bake.py` has its own skip-if-already-baked check and runs the ~8 s verification by default. Operators can opt into the fast path with `--assume-baked`, or force a reflash with `--force-bake`.

2. **Read the pre-flight header.** First ~6 lines print the detected hub (role → port → env). If that line reads `detected hub : (none)`, the wrapper will narrow to `tests/unit` only — say so explicitly in your summary so the operator knows hardware tiers were skipped.

3. **On pass**: one-line summary of the form `N passed, M skipped in <duration>`. Don't enumerate the test names — the user can read those. Do mention any SKIPPED tests and name the cause:
- `"role not present on hub"` → device unplugged; operator knows to reconnect.
- `"firmware not baked with USERPREFS_UI_TEST_LOG"` → tests/ui skipped because the macro isn't in firmware yet; suggest `--force-bake`.
- `"uhubctl not installed"` → tests/recovery + peer-offline skipped; suggest `brew install uhubctl` / `apt install uhubctl`.
- `"no PPPS-capable hubs detected"` → tests/recovery skipped because the hub doesn't support per-port power; the tier will never run on that setup.
- `"opencv-python-headless is not installed"` → tests/ui auto-deselected by run-tests.sh; suggest `pip install -e 'mcp-server/.[ui]'`.

4. **On failure**: for every FAILED test, open `mcp-server/tests/report.html` and extract the `Meshtastic debug` section for that test. pytest-html embeds the firmware log stream + device state dump there; the 200-line firmware log tail is usually enough to explain the failure. Summarise: which test, one-line assertion message, the firmware log lines that matter (things like `PKI_UNKNOWN_PUBKEY`, `Skip send NodeInfo`, `Error=`, `Guru Meditation`, `assertion failed`). For UI-tier failures also glance at `mcp-server/tests/ui_captures/<session>/<test>/transcript.md` — it records each step's frame + OCR.

5. **Classify the failure** as one of:
- **Transient/flake**: LoRa collision, timing-sensitive assertion, first-attempt NAK + successful retry pattern. Propose `/repro <test_node_id>` to confirm.
- **Environmental**: device unreachable, port busy, CP2102 driver wedged. Suggest the specific recovery in escalation order: (a) replug USB, (b) `touch_1200bps(port=...)` + `pio_flash` for nRF52 DFU, (c) `uhubctl_cycle(role="nrf52", confirm=True)` when a device is fully wedged past DFU (needs `uhubctl` installed — `baked_single`'s auto-recovery hook does this once automatically). Also check `git status userPrefs.jsonc`.
- **Regression**: same assertion fails repeatedly, firmware log shows a new/unusual error. Surface the diff between expected and observed, identify the module likely responsible.

6. **Never run destructive recovery automatically.** If a failure looks like it needs a reflash, factory*reset, `uhubctl_cycle`, or USB replug, \_describe what to do* — don't execute. The operator decides.

## Arguments handling

- No args → wrapper's defaults (full suite).
- `$ARGUMENTS` passed verbatim to the wrapper, which passes them to pytest.
- Common operator invocations: `/test tests/mesh`, `/test tests/mesh/test_direct_with_ack.py::test_direct_with_ack_roundtrip`, `/test --force-bake`, `/test -k telemetry`.

## Side-effects to mention in summary

- The session fixture snapshots `userPrefs.jsonc` at session start and restores at teardown (plus on `atexit`). After a clean run, `git status userPrefs.jsonc` should be empty. If the wrapper's pre-flight printed a warning about a stale sidecar, call that out — means a prior session crashed.
- `mcp-server/tests/report.html` and `junit.xml` are regenerated on every run; the HTML is self-contained (shareable).
52 changes: 52 additions & 0 deletions .clusterfuzzlite/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# This container is used to build Meshtastic with the libraries required by the fuzzer.
# ClusterFuzzLite starts the container, runs the build.sh script, and then exits.

# As this is not a long running service, health-checks are not required. ClusterFuzzLite
# also only works if the user remains unchanged from the base image (it expects to run
# as root).
# trunk-ignore-all(trivy/DS026): No healthcheck is needed for this builder container
# trunk-ignore-all(checkov/CKV_DOCKER_2): No healthcheck is needed for this builder container
# trunk-ignore-all(checkov/CKV_DOCKER_3): We must run as root for this container
# trunk-ignore-all(trivy/DS002): We must run as root for this container
# trunk-ignore-all(checkov/CKV_DOCKER_8): We must run as root for this container
# trunk-ignore-all(hadolint/DL3002): We must run as root for this container

FROM gcr.io/oss-fuzz-base/base-builder:v1

ENV PIP_ROOT_USER_ACTION=ignore

# trunk-ignore(hadolint/DL3008): apt packages are not pinned.
# trunk-ignore(terrascan/AC_DOCKER_0002): apt packages are not pinned.
RUN apt-get update && apt-get install --no-install-recommends -y \
cmake git zip libgpiod-dev libbluetooth-dev libi2c-dev \
libunistring-dev libmicrohttpd-dev libgnutls28-dev libgcrypt20-dev \
libusb-1.0-0-dev libssl-dev pkg-config libsqlite3-dev libsdl2-dev && \
apt-get clean && rm -rf /var/lib/apt/lists/* && \
pip install --no-cache-dir -U \
platformio==6.1.16 \
grpcio-tools==1.68.1 \
meshtastic==2.5.9

# Ugly hack to avoid clang detecting a conflict between the math "log" function and the "log" function in framework-portduino/cores/portduino/logging.h
RUN sed -i -e 's/__MATHCALL_VEC (log,, (_Mdouble_ __x));//' /usr/include/x86_64-linux-gnu/bits/mathcalls.h

# A few dependencies are too old on the base-builder image. More recent versions are built from source.
WORKDIR $SRC
RUN git config --global advice.detachedHead false && \
git clone --depth 1 --branch 0.8.0 https://github.com/jbeder/yaml-cpp.git && \
git clone --depth 1 --branch v2.3.3 https://github.com/babelouest/orcania.git && \
git clone --depth 1 --branch v1.4.20 https://github.com/babelouest/yder.git && \
git clone --depth 1 --branch v2.7.15 https://github.com/babelouest/ulfius.git

COPY ./.clusterfuzzlite/build.sh $SRC/

WORKDIR $SRC/firmware
COPY . $SRC/firmware/

# https://docs.platformio.org/en/latest/envvars.html
ENV PLATFORMIO_CORE_DIR=$SRC/pio/core \
PLATFORMIO_LIBDEPS_DIR=$SRC/pio/libdeps \
PLATFORMIO_PACKAGES_DIR=$SRC/pio/packages \
PLATFORMIO_SETTING_ENABLE_CACHE=No \
PIO_ENV=buildroot
RUN platformio pkg install --environment $PIO_ENV
Loading
Loading