Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
4176 commits
Select commit Hold shift + click to select a range
54a928f
M6 shutdown and LEDs work (#9065)
jp-bennett Dec 24, 2025
e5c3eda
Fix gps pin defs for various NRF variants. (#9034)
NomDeTom Dec 24, 2025
9da4396
Multi message storage (#8182)
HarukiToreda Dec 24, 2025
b2c82bd
Upgrade trunk (#9072)
github-actions[bot] Dec 25, 2025
ef530db
Implement HAS_PHYSICAL_KEYBOARD for devices with physical keyboards (…
Xaositek Dec 26, 2025
9dc7ef6
In autoconf, don't probe Wire unless i2c device is set (#9081)
jp-bennett Dec 26, 2025
82cf2bf
action: skip trying to comment binary size change results if it is no…
Jorropo Dec 26, 2025
29c5713
Correctly set type for event_mode max() position threshold (#9083)
vidplace7 Dec 26, 2025
db2224e
pioarduino .gitignore (#9085)
vidplace7 Dec 26, 2025
33e1f58
Upgrade trunk (#9076)
github-actions[bot] Dec 26, 2025
3473c32
Fix PR#8061 SensorLib nRF ThinkNode M-series (#9084)
vidplace7 Dec 27, 2025
7dd9c8b
pass GH_TOKEN to shame's gh run download step (#9087)
Jorropo Dec 27, 2025
cbd40fa
Fix -ota.zip in manifest and build output
thebentern Dec 20, 2025
514f859
Revert "Automated version bumps (#9025)"
thebentern Dec 20, 2025
b88a8bf
In statusLEDModule, also detect isCharging (#9050)
jp-bennett Dec 23, 2025
2b977b4
Update meshtastic-esp8266-oled-ssd1306 digest to b34c681 (#9062)
renovate[bot] Dec 24, 2025
69c3c01
Upgrade trunk (#9047)
github-actions[bot] Dec 24, 2025
e899e84
Upgrade trunk (#9067)
github-actions[bot] Dec 24, 2025
4fbe535
M6 shutdown and LEDs work (#9065)
jp-bennett Dec 24, 2025
9e21521
Upgrade trunk (#9072)
github-actions[bot] Dec 25, 2025
ac93776
In autoconf, don't probe Wire unless i2c device is set (#9081)
jp-bennett Dec 26, 2025
cf03caf
Upgrade trunk (#9076)
github-actions[bot] Dec 26, 2025
9f8f447
PIN_PWR_DELAY_MS --> PERIPHERAL_WARMUP_MS (#8467)
fifieldt Dec 27, 2025
52fd362
Fix gps pin defs for various NRF variants. (#9034)
NomDeTom Dec 24, 2025
5510dae
Implement HAS_PHYSICAL_KEYBOARD for devices with physical keyboards (…
Xaositek Dec 26, 2025
2c68710
Improve sanitizeString function for Node Names (#9086)
Xaositek Dec 27, 2025
d1db443
Add menus for Smart Position, Broadcast Interval and Position Interva…
Xaositek Dec 27, 2025
759a972
GPS Menu Validation Fix - Missed in Reviews (#9093)
Xaositek Dec 27, 2025
63aadba
Use IF_SCREEN macro to guard against null screen object
jp-bennett Dec 28, 2025
757f7b6
Update meshtastic/device-ui digest to caff403 (#9104)
renovate[bot] Dec 29, 2025
9673cfb
Upgrade trunk (#9106)
github-actions[bot] Dec 29, 2025
b9a0015
chore(deps): update meshtastic/device-ui digest to d234bd9 (#9108)
renovate[bot] Dec 29, 2025
dc36f5d
Update protobufs (#9109)
github-actions[bot] Dec 29, 2025
3a723ce
Noop "download" portion of #shame (#9114)
vidplace7 Dec 29, 2025
ef30fd8
Update meshtastic/device-ui digest to 7656d49 (#9111)
renovate[bot] Dec 29, 2025
ac571d5
Upgrade trunk (#9121)
github-actions[bot] Dec 30, 2025
1b2dc10
Calculate hops correctly even when hop_start==0 (#9120)
esev Dec 30, 2025
1b83501
Revert "Upgrade all esp32 targets to NimBLE 2.X (#9003)" (#9125)
thebentern Dec 30, 2025
9058cce
Calculate hops correctly even when hop_start==0 (#9120)
esev Dec 30, 2025
1443a32
Add a welcome message for new contributors (#9119)
fifieldt Dec 31, 2025
da9d711
Add STORE_FORWARD_PLUSPLUS_APP to core portnum checks (#9127)
jp-bennett Dec 31, 2025
25acce2
Add Temporary Mute to Home frame and unbury Notification Options (#9097)
Xaositek Dec 31, 2025
eaab8f0
chore(deps): update meshtastic/device-ui digest to 940ba85 (#9129)
renovate[bot] Dec 31, 2025
4f1a56d
Rak3112 support (#8591)
ford-jones Jan 1, 2026
7fb9584
Apparently I marked board level extra on the wrong tbeam target
thebentern Jan 1, 2026
a5b2d4a
Add null check for p_encrypted before MQTT publish (#9136)
jp-bennett Jan 1, 2026
4533553
Syntax fix for first timer welcome bot. (#9144)
fifieldt Jan 1, 2026
a2ce4c7
KZ_863 is not wide lora (#9075)
fifieldt Jan 1, 2026
f9c9350
chore(deps): update meshtastic/device-ui digest to a8e2f94 (#9140)
renovate[bot] Jan 2, 2026
11b5f1a
chore(deps): update dorny/test-reporter action to v2.4.0 (#9135)
renovate[bot] Jan 2, 2026
27b522b
Merge branch 'master' into develop
thebentern Jan 2, 2026
b5e952b
Upgrade trunk (#9128)
github-actions[bot] Jan 2, 2026
75144d2
Update security policy to reflect new stage
thebentern Jan 2, 2026
caceaf4
Automated version bumps (#9030)
github-actions[bot] Jan 2, 2026
1e91414
Update protobufs (#9148)
github-actions[bot] Jan 2, 2026
0047466
Refactored some of the system menus to the new DRY method (Redux) (#9…
Xaositek Jan 2, 2026
9313d46
I think this is supposed to be extra
thebentern Jan 2, 2026
f63dadd
Add custom coding rate configuration for LoRa (#9155)
jp-bennett Jan 2, 2026
3a90781
Add support for LilyGo T-Echo Plus (#9149)
thebentern Jan 3, 2026
52907e4
Faster rotary encoder events (#9146)
brad112358 Jan 3, 2026
abab6ce
Fix link formatting in welcome message (#9163)
fifieldt Jan 3, 2026
21ca254
chore(deps): update dorny/test-reporter action to v2.5.0 (#9167)
renovate[bot] Jan 3, 2026
0d11331
add a .clang-format file (#9154)
Jorropo Jan 3, 2026
beb268f
Revert "add a .clang-format file (#9154)" (#9172)
Jorropo Jan 4, 2026
25bdefe
Fixed shouldFilterReceived function to check prev relay accoding to t…
strngr Jan 4, 2026
15f5b35
chore(deps): update meshtastic/device-ui digest to 272defc (#9166)
renovate[bot] Jan 4, 2026
17b075a
added tcxo definition to mesh-tab (#8604)
valzzu Jan 4, 2026
0c553c4
Fix zero in sp02 and Heart Rate on screen (#9174)
sergeygalkin Jan 4, 2026
37ab800
Actions: CI for feature/ branches
vidplace7 Jan 5, 2026
105d657
Merge pull request #9189 from vidplace7/actions-feature-branches
thebentern Jan 5, 2026
1669a02
BME680 on Native
jp-bennett Jan 6, 2026
e648e26
Merge pull request #9191 from meshtastic/bme-native
thebentern Jan 6, 2026
594f27c
Upgrade trunk (#9183)
github-actions[bot] Jan 6, 2026
9f5170a
Add LilyGO T-Beam 1W support (#8967)
santosvivos Jan 6, 2026
da11cc7
Added support for the new SSD1306 control panel. (#9192)
lewisxhe Jan 6, 2026
ba9d0e6
RadioInterface::getRetransmissionMsec now handles encrypted packets c…
rbreesems Jan 6, 2026
9c1d55c
Add option to Mute/Unmute Channel to BaseUI (#9194)
Xaositek Jan 6, 2026
70f909d
Fix Function + M in code (#9200)
Xaositek Jan 6, 2026
a6c4683
Upgrade trunk (#9208)
github-actions[bot] Jan 7, 2026
1a6cbb5
Migrate all of the Meshtastic API attributes into the ini as a source…
thebentern Jan 7, 2026
4d303c9
Add list of text message packet IDs, and check for dupes (#9180)
jp-bennett Jan 7, 2026
fb7af18
Add needed support bits for the Meshstick (#9042)
jp-bennett Jan 8, 2026
86326f2
Fix TSL2591 detection by adding command bit to register read (#9215)
heathdutton Jan 8, 2026
6e11078
🔧 Fix LNA/PA power control for Heltec v4, wireless tracker v2 (#9029)
weebl2000 Jan 8, 2026
29d0d5e
Upgrade trunk (#9219)
github-actions[bot] Jan 8, 2026
b4369b2
Fix screen not sleeping due to power status updates (#9216)
heathdutton Jan 8, 2026
f289b78
Fix rotary regression and tighten up playBeep (#9221)
thebentern Jan 8, 2026
c6e0704
Remove disabled gh action
thebentern Jan 8, 2026
5fab45c
Merge branch 'master' into develop
thebentern Jan 8, 2026
792e930
Trunk
jp-bennett Jan 8, 2026
390f0c8
Screenless Devices want to mute too! (#9210)
Xaositek Jan 8, 2026
489de09
Use correct name for ALT_BUTTON_PIN (#9225)
jp-bennett Jan 9, 2026
6b8e5e9
Upgrade trunk (#9229)
github-actions[bot] Jan 9, 2026
b12acba
CH341 MAC address derivation from serial and product string (#9226)
jp-bennett Jan 9, 2026
ff8d6aa
Increase default position broadcast intervals and enforce minimums fo…
thebentern Jan 9, 2026
925381e
Fix TFT_MESH settings across setting and recalling (#9234)
Xaositek Jan 9, 2026
b002844
Add Rak 6421 autoconf (#9010)
jp-bennett Jan 9, 2026
214c76c
T-Watch S3 Plus GPS support (#9235)
mverch67 Jan 9, 2026
b6512d3
Merge pull request #9237 from meshtastic/master
thebentern Jan 9, 2026
be024d8
Add copilot-instructions.md for better contextual hints
thebentern Jan 9, 2026
9e96b0a
Merge pull request #9236 from meshtastic/position-intervals-increase
thebentern Jan 10, 2026
04e755a
Update protobufs (#9242)
github-actions[bot] Jan 10, 2026
acb6eb7
Update diy_promicro platformio.ini (#9245)
mrekin Jan 10, 2026
c520d3a
Gr language specific font (#8808)
apo-mak Jan 10, 2026
c45c217
Remove a strlcpy reference (#9249)
jp-bennett Jan 11, 2026
727b1b3
Add support for sevice start wrapper (#8676)
tedwardd Jan 11, 2026
5dba5c8
Update INA226 to v0.6.6 (#9247)
renovate[bot] Jan 11, 2026
05bb431
Merge remote-tracking branch 'origin/master' into develop
thebentern Jan 11, 2026
6f62748
Update protobufs (#9254)
github-actions[bot] Jan 11, 2026
e8ddda6
Merge remote-tracking branch 'origin/master' into develop
thebentern Jan 11, 2026
8cb8540
Add release notes generation and publishing workflow (#9255)
thebentern Jan 11, 2026
bafdeb4
CI: Unified ESP32 OTA firmware + manifests (#9258)
vidplace7 Jan 11, 2026
8cf8fbb
Add unified OTA to manifest (#9261)
thebentern Jan 11, 2026
3fabd57
Merge pull request #9262 from meshtastic/develop
thebentern Jan 11, 2026
c0f60ad
chore(deps): update meshtastic/device-ui digest to 12f8cdd (#9263)
renovate[bot] Jan 11, 2026
f38b4c1
chore(deps): update meshtastic-gxepd2 digest to a05c11c (#9264)
renovate[bot] Jan 11, 2026
b6b1296
Extra pins (#9260)
jp-bennett Jan 12, 2026
f805aec
Update GxEPD2 to v1.6.5 (#9266)
renovate[bot] Jan 12, 2026
e9bdd2b
Update ArduinoJson to v6.21.5 (#9265)
renovate[bot] Jan 12, 2026
e1605d1
Fix warning and exclude powermon by default
thebentern Jan 12, 2026
d4045df
Remove INTERRUPT_ATTR from disableInterrupt methods on interfaces
thebentern Jan 12, 2026
5ce821c
Mute specific nodes (#9209)
ford-jones Jan 12, 2026
723d8ca
CI: tiny - include mt-ota in firmware zips (#9275)
vidplace7 Jan 12, 2026
f4d7dab
EXCLUDE_AUDIO on (original) ESP32 (#9276)
vidplace7 Jan 12, 2026
405c4f3
Upgrade trunk (#9270)
github-actions[bot] Jan 12, 2026
986d70d
Pioarduino preparation (#9223)
MartinEmrich Jan 12, 2026
70fa657
Update RadioLib to v7.5.0 (#9281)
vidplace7 Jan 12, 2026
3b6ea95
Enhance release notes generation by adding dependency update checks a…
thebentern Jan 12, 2026
99d9191
Merge remote-tracking branch 'origin/develop'
thebentern Jan 12, 2026
1df26c2
Renovate: Ignore lovyangfx for elecrow-panel (#9279)
vidplace7 Jan 12, 2026
cbaa588
Merge remote-tracking branch 'origin/master' into develop
thebentern Jan 12, 2026
30d6eb0
add support for uMesh Modules (#9259)
linser233 Jan 12, 2026
daad424
Update protobufs (#9291)
github-actions[bot] Jan 13, 2026
57a2000
Merge remote-tracking branch 'origin/develop'
thebentern Jan 13, 2026
f73a944
Update ESP8266SAM to v1.1.0 (#9271)
renovate[bot] Jan 13, 2026
3a0f352
BaseUI: Autosave Messages (#9269)
HarukiToreda Jan 13, 2026
ded4f57
Partition name in manifest script (#9294)
thebentern Jan 13, 2026
6f36f39
Fix up T-Beam 1W HW_MODEL
thebentern Jan 13, 2026
782ffdc
Merge branch 'develop'
thebentern Jan 13, 2026
3640e35
Upgrade trunk (#9297)
github-actions[bot] Jan 13, 2026
e99853f
SafeFile: use atomic rename-with-overwrite, rather than non-atomic de…
compumike Jan 13, 2026
dae4061
Update protobufs (#9299)
github-actions[bot] Jan 13, 2026
5610d48
Update meshtastic/device-ui digest to 5a870c6 (#9301)
renovate[bot] Jan 13, 2026
89a83d0
Upgrade trunk (#9306)
github-actions[bot] Jan 14, 2026
919f214
Fix OTA partition name matching (#9302)
thebentern Jan 14, 2026
cdbc8f4
Update protobufs (#9308)
github-actions[bot] Jan 14, 2026
552df4c
Supress reboot banner in Reboot OTA
thebentern Jan 14, 2026
d1ae131
T-Deck Pro: speed up eink force refresh (#9303)
vicliu624 Jan 14, 2026
940b3e2
fix GPS for T-Watch S3 plus (#9312)
mverch67 Jan 14, 2026
5d7d1ae
Adds Custom battery curve for thinknode m6 (#9313)
jp-bennett Jan 14, 2026
5a81403
Move PMSA003I to separate class and update AQ telemetry (#7190)
oscgonfer Jan 14, 2026
2d4f1b6
Update Adafruit BMP280 to v3 (#9307)
renovate[bot] Jan 14, 2026
fad315e
Fix rotary encoder long press (#9039)
brad112358 Jan 14, 2026
6537eea
Update pschatzmann_arduino-audio-driver to v0.2.0 (#9272)
renovate[bot] Jan 15, 2026
64e9555
Small fix in register size for SHT4X (#9309)
oscgonfer Jan 15, 2026
a6a80b0
Recover `long_name`, `short_name` from our own NodeDB entry if device…
compumike Jan 15, 2026
c0afe92
Meshtastic unified OTA (#9231)
thebentern Jan 15, 2026
5f63f91
Added I2C scanner a check for the QMC6310N. (#9305)
lewisxhe Jan 15, 2026
233e6ac
Preliminary Thinknode M4 Support (#8754)
caveman99 Jan 15, 2026
6ee52ca
Node Actions Menu Overhaul (#9287)
Xaositek Jan 15, 2026
ff8316f
Merge branch 'master' into develop
thebentern Jan 15, 2026
3605799
Trunk fmt
thebentern Jan 15, 2026
a69e439
Merge branch 'develop'
thebentern Jan 15, 2026
e8fbdb4
Upgrade trunk (#9323)
github-actions[bot] Jan 15, 2026
82735ca
ICM20948 IMU sleep (#9324)
HarukiToreda Jan 15, 2026
7e4e772
Add EByte EoRa-Hub (#9169)
vidplace7 Jan 15, 2026
b4157bd
Heltec V4 TFT metadata (#9325)
thebentern Jan 15, 2026
59bdb9b
Merge remote-tracking branch 'origin/develop'
thebentern Jan 15, 2026
3911d5f
Fix build with high / low i2c address for OLED
thebentern Jan 15, 2026
c8f0295
Cleanup
thebentern Jan 15, 2026
d493f5f
Merge branch 'master' into develop
thebentern Jan 15, 2026
64116cd
Meshtastic OTA (moar) (#9327)
thebentern Jan 15, 2026
91dd39a
Add sqlite depdendency (Cherry-picks from sfpp) (#9328)
fifieldt Jan 15, 2026
afbd9e2
Filter BLE updates that don't change pairing status (#9333)
jp-bennett Jan 16, 2026
021106d
Add support for setting API port from the config file (#8435)
tedwardd Jan 17, 2026
33ae377
toradio, fromradio OPTIONS handler: fix sending proper HTTP response.…
cpatulea Jan 18, 2026
02f24b9
Improve BaseUI Preset Change Flow (#9343)
Xaositek Jan 18, 2026
49accef
Don't Mute DMs just because we mute a channel (#9348)
Xaositek Jan 18, 2026
caa6ec0
Update meshtastic/device-ui digest to 3480b73 (#9353)
renovate[bot] Jan 19, 2026
e545897
Untangle some BME680 ifdef spaghetti
jp-bennett Jan 19, 2026
d34d694
Update protobufs (#9360)
github-actions[bot] Jan 19, 2026
ab97c01
Merge pull request #9355 from meshtastic/fix-bme
thebentern Jan 19, 2026
3e4239d
Upgrade trunk (#9330)
github-actions[bot] Jan 19, 2026
c96ebf1
Merge remote-tracking branch 'origin/master' into develop
thebentern Jan 19, 2026
5c401b8
Update protobufs (#9362)
github-actions[bot] Jan 19, 2026
ff50ba4
Remove bsec from OG ESP32 to fix DRAM overflow
thebentern Jan 19, 2026
7d4600f
Merge branch 'master' into develop
thebentern Jan 19, 2026
c38aff7
Add interrupt for external charge detection (#9332)
jp-bennett Jan 19, 2026
fc268d4
Add Meshtastic exclusion flags for webserver and paxcounter in platfo…
thebentern Jan 19, 2026
fb3bf78
Implement graduated scaling for NodeInfo send timeout based on active…
thebentern Jan 20, 2026
fb6d199
feat: Add Russell, a board designed to go Up! on a balloon (#9079)
ndoo Jan 20, 2026
eefc080
Update protobufs (#9371)
github-actions[bot] Jan 20, 2026
3e3299f
Update meshtastic/device-ui digest to 613c095 (#9383)
renovate[bot] Jan 21, 2026
d8d02cd
Implement setting TX_GAIN_LORA for portduino (#8501)
Stary2001 Jan 22, 2026
4744010
run trunk fmt -a (#9400)
Jorropo Jan 22, 2026
073eb2c
Automated version bumps (#9402)
github-actions[bot] Jan 22, 2026
bc2abf3
BaseUI: Bubbles for messages (#9365)
HarukiToreda Jan 22, 2026
73932dd
device-install: Consistently use write-flash (#8868)
tyll Jan 23, 2026
0157a76
Make BLE TX power configurable for nRF52 variants (#9232)
teizz Jan 23, 2026
6d6a073
Add pin sense to wake M6 on Solar Charge (#9416)
jp-bennett Jan 23, 2026
d407ec1
Merge remote-tracking branch 'origin/master' into develop
thebentern Jan 24, 2026
6b88d37
To fix the gps power rail issue on RAK 19007 when RAK12023+RAK12035 i…
Justin-Mann Jan 24, 2026
04d2dd3
Update GxEPD2 to v1.6.6 (#9412)
renovate[bot] Jan 24, 2026
a417760
Update meshtastic/device-ui digest to 37ad715 (#9403)
renovate[bot] Jan 24, 2026
7221fc4
Delete unused code (#9350)
EricSesterhennX41 Jan 24, 2026
5838b26
Update lewisxhe-SensorLib to v0.3.4 (#9395)
renovate[bot] Jan 24, 2026
c98f134
Update meshtastic-esp32_https_server digest to b0f3960 (#9393)
renovate[bot] Jan 24, 2026
9faf178
Update XPowersLib to v0.3.3 (#9354)
renovate[bot] Jan 24, 2026
b627fa7
Update SensorLib to v0.3.4 (#9396)
renovate[bot] Jan 24, 2026
b312f22
Cut NRF52 bluetooth power usage (#8992)
phaseloop Jan 24, 2026
6cff136
Added Minimesh variant (#9289)
uguraltinsoy Jan 24, 2026
57a3ff8
NRF52 - power management improvements (#9211)
phaseloop Jan 24, 2026
8894a0b
Consolidate LoRa params / preset logic and fix display of preset valu…
thebentern Jan 26, 2026
8a98302
Move Lora Init code into LoraInit.cpp/h (#9435)
jp-bennett Jan 26, 2026
0770f25
Merge remote-tracking branch 'origin/master' into develop
thebentern Jan 26, 2026
c038cfe
Move device code from main.cpp to earlyInitVariant (#9438)
jp-bennett Jan 26, 2026
3d58c6e
Trackball revamp (#9440)
jp-bennett Jan 26, 2026
7efc3e3
Replace strcpy with strncpy and null termination (#9436)
k3an3 Jan 26, 2026
a2e8e23
Remove the unused OCV_ARRAYs and move one to a variant.h (#9442)
jp-bennett Jan 26, 2026
63a97a5
Fix retry_delay calculation for error responses (#9443)
rcd Jan 27, 2026
90778a4
feat(GPS): Support Softsleep with WAKE-UP pin on PA1010D (#9078)
ndoo Jan 27, 2026
c8079d4
Metadata for heltec tracker v2
thebentern Jan 27, 2026
d54ae5d
InkHUD Menu improvements (#8975)
HarukiToreda Jan 27, 2026
91ad861
Add Thinknode M4 variant_shutdown() (#9449)
jp-bennett Jan 27, 2026
b6a1020
Add error handling for SPI command failures in LR11x0, RF95, and SX12…
thebentern Jan 27, 2026
d1edd38
Update meshtastic/device-ui digest to 69739b8 (#9448)
renovate[bot] Jan 27, 2026
cfda9bb
Update protobufs (#9453)
github-actions[bot] Jan 27, 2026
10b2eae
Move more code out of main-nrf52 into variant.cpp (#9450)
jp-bennett Jan 27, 2026
e1e8d61
Merge branch 'master' into develop
thebentern Jan 27, 2026
23a8b5a
Fix uMesh RF POWER configuration error (#9326)
linser233 Jan 27, 2026
fd498be
Add support for Hackaday Communicator function keys (#9444)
jp-bennett Jan 27, 2026
69a42e1
Add portduino_status, assign hardware device IDs... (#9441)
jp-bennett Jan 28, 2026
4eb4c4b
BaseUI Message Bubble Improvements (#9452)
Xaositek Jan 28, 2026
d0562e1
Add model workflows (#9462)
thebentern Jan 28, 2026
c1e3f56
Update LovyanGFX to v1.2.19 (#9405)
renovate[bot] Jan 28, 2026
a922751
External Notification - handleReceived Rewrite (#9454)
Xaositek Jan 28, 2026
fb63598
Merge remote-tracking branch 'origin/master' into develop
thebentern Jan 28, 2026
571c1ac
Initial serialModule cleanup (#9465)
jp-bennett Jan 28, 2026
f710cd6
Support fully direct request/responses (#9455)
esev Jan 28, 2026
1d219a9
Move input init to an init function in InputBroker (#9463)
jp-bennett Jan 28, 2026
4fd0a82
Just set LED_BUILTIN universally to -1, as we don't use it. (#8830)
jp-bennett Jan 28, 2026
d44ceb6
Fix NimBLE deinit null check
thebentern Jan 28, 2026
d7d6fe7
Avoid short-circuit evaluation issues in Telemetry (#9467)
oscgonfer Jan 28, 2026
6ab2f02
re-add unintentionally removed include
jp-bennett Jan 28, 2026
df40085
Undefine LED_BUILTIN where needed
jp-bennett Jan 29, 2026
b2f2f6b
Add a watchdog module to meshsolar. (#9337)
Quency-D Jan 29, 2026
415686d
Trunk
thebentern Jan 29, 2026
94d7b71
Merge branch 'develop'
thebentern Jan 29, 2026
03084f6
PRs with needs-review still should get bot labeled
thebentern Jan 29, 2026
b18742c
Update libch341-spi-userspace digest to af9bc27 (#9472)
renovate[bot] Jan 29, 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
  •  
  •  
  •  
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 && \
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
59 changes: 59 additions & 0 deletions .clusterfuzzlite/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# ClusterFuzzLite for Meshtastic

This directory contains the fuzzer implementation for Meshtastic using the ClusterFuzzLite framework.
See the [ClusterFuzzLite documentation](https://google.github.io/clusterfuzzlite/) for more details.

## Running locally

ClusterFuzzLite uses the OSS-Fuzz toolchain. To build the fuzzer manually, first grab a copy of OSS-Fuzz.

```shell
git clone https://github.com/google/oss-fuzz.git
cd oss-fuzz
```

To build the fuzzer, run:

```shell
python3 infra/helper.py build_image --external $PATH_TO_MESHTASTIC_FIRMWARE_DIRECTORY
python3 infra/helper.py build_fuzzers --external $PATH_TO_MESHTASTIC_FIRMWARE_DIRECTORY --sanitizer address
```

To run the fuzzer, run:

```shell
python3 infra/helper.py run_fuzzer --external --corpus-dir=<path-to-temp-corpus-dir> $PATH_TO_MESHTASTIC_FIRMWARE_DIRECTORY router_fuzzer
```

More background on these commands can be found in the
[ClusterFuzzLite documentation](https://google.github.io/clusterfuzzlite/build-integration/#testing-locally).

## router_fuzzer.cpp

This fuzzer submits MeshPacket protos to the `Router::enqueueReceivedMessage` method. It takes the binary
data from the fuzzer and decodes that data to a MeshPacket using nanopb. A few fields in
the MeshPacket are modified by the fuzzer.

- If the `to` field is 0, it will be replaced with the NodeID of the running node.
- If the `from` field is 0, it will be replaced with the NodeID of the running node.
- If the `id` field is 0, it will be replaced with an incrementing counter value.
- If the `pki_encrypted` field is true, the `public_key` field will be populated with the first admin key.

The `router_fuzzer_seed_corpus.py` file contains a list of MeshPackets. It is run from inside build.sh and
writes the binary MeshPacket protos to files. These files are use used by the fuzzer as its initial seed data,
helping the fuzzer to start off with a few known inputs.

### Interpreting a fuzzer crash

If the fuzzer crashes, it'll write the input bytes used for the test case to a file and notify about the
location of that file. The contents of the file are a binary serialized MeshPacket protobuf. The following
snippet of Python code can be used to parse the file into a human readable form.

```python
from meshtastic.protobuf import mesh_pb2

mesh_pb2.MeshPacket.FromString(open("crash-XXXX-file", "rb").read())
```

Consider adding any such crash results to the `router_fuzzer_seed_corpus.py` file to ensure there a isn't
a future regression for that crash test case.
71 changes: 71 additions & 0 deletions .clusterfuzzlite/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/bin/bash -eu

# Build Meshtastic and a few needed dependencies using clang++
# and the OSS-Fuzz required build flags.

env

cd "$SRC"
NPROC=$(nproc || echo 1)

LDFLAGS=-lpthread cmake -S "$SRC/yaml-cpp" -B "$WORK/yaml-cpp/$SANITIZER" \
-DBUILD_SHARED_LIBS=OFF
cmake --build "$WORK/yaml-cpp/$SANITIZER" -j "$NPROC"
cmake --install "$WORK/yaml-cpp/$SANITIZER" --prefix /usr

cmake -S "$SRC/orcania" -B "$WORK/orcania/$SANITIZER" \
-DBUILD_STATIC=ON
cmake --build "$WORK/orcania/$SANITIZER" -j "$NPROC"
cmake --install "$WORK/orcania/$SANITIZER" --prefix /usr

cmake -S "$SRC/yder" -B "$WORK/yder/$SANITIZER" \
-DBUILD_STATIC=ON -DWITH_JOURNALD=OFF
cmake --build "$WORK/yder/$SANITIZER" -j "$NPROC"
cmake --install "$WORK/yder/$SANITIZER" --prefix /usr

cmake -S "$SRC/ulfius" -B "$WORK/ulfius/$SANITIZER" \
-DBUILD_STATIC=ON -DWITH_JANSSON=OFF -DWITH_CURL=OFF -DWITH_WEBSOCKET=OFF
cmake --build "$WORK/ulfius/$SANITIZER" -j "$NPROC"
cmake --install "$WORK/ulfius/$SANITIZER" --prefix /usr

cd "$SRC/firmware"

PLATFORMIO_EXTRA_SCRIPTS=$(echo -e "pre:.clusterfuzzlite/platformio-clusterfuzzlite-pre.py\npost:.clusterfuzzlite/platformio-clusterfuzzlite-post.py")
STATIC_LIBS=$(pkg-config --libs --static libulfius openssl libgpiod yaml-cpp bluez --silence-errors)
export PLATFORMIO_EXTRA_SCRIPTS
export STATIC_LIBS
export PLATFORMIO_WORKSPACE_DIR="$WORK/pio/$SANITIZER"
export TARGET_CC=$CC
export TARGET_CXX=$CXX
export TARGET_LD=$CXX
export TARGET_AR=llvm-ar
export TARGET_AS=llvm-as
export TARGET_OBJCOPY=llvm-objcopy
export TARGET_RANLIB=llvm-ranlib

mkdir -p "$OUT/lib"

cp .clusterfuzzlite/*_fuzzer.options "$OUT/"

for f in .clusterfuzzlite/*_fuzzer.cpp; do
fuzzer=$(basename "$f" .cpp)
cp -f "$f" src/fuzzer.cpp
pio run -vvv --environment "$PIO_ENV"
program="$PLATFORMIO_WORKSPACE_DIR/build/$PIO_ENV/meshtasticd"
cp "$program" "$OUT/$fuzzer"

# Copy shared libraries used by the fuzzer.
read -d '' -ra shared_libs < <(ldd "$program" | sed -n 's/[^=]\+=> \([^ ]\+\).*/\1/p') || true
cp -f "${shared_libs[@]}" "$OUT/lib/"

# Build the initial fuzzer seed corpus.
corpus_name="${fuzzer}_seed_corpus"
corpus_generator="$PWD/.clusterfuzzlite/${corpus_name}.py"
if [[ -f $corpus_generator ]]; then
mkdir "$corpus_name"
pushd "$corpus_name"
python3 "$corpus_generator"
popd
zip -D "$OUT/${corpus_name}.zip" "$corpus_name"/*
fi
done
35 changes: 35 additions & 0 deletions .clusterfuzzlite/platformio-clusterfuzzlite-post.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""PlatformIO build script (post: runs after other Meshtastic scripts)."""

import os
import shlex

from SCons.Script import DefaultEnvironment

env = DefaultEnvironment()

# Remove any static libraries from the LIBS environment. Static libraries are
# handled in platformio-clusterfuzzlite-pre.py.
static_libs = set(lib[2:] for lib in shlex.split(os.getenv("STATIC_LIBS")))
env.Replace(
LIBS=[
lib for lib in env["LIBS"] if not (isinstance(lib, str) and lib in static_libs)
],
)

# FrameworkArduino/portduino/main.cpp contains the "main" function the binary.
# The fuzzing framework also provides a "main" function and needs to be run
# before Meshtastic is started. We rename the "main" function for Meshtastic to
# "portduino_main" here so that it can be called inside the fuzzer.
env.AddPostAction(
"$BUILD_DIR/FrameworkArduino/portduino/main.cpp.o",
env.VerboseAction(
" ".join(
[
"$OBJCOPY",
"--redefine-sym=main=portduino_main",
"$BUILD_DIR/FrameworkArduino/portduino/main.cpp.o",
]
),
"Renaming main symbol to portduino_main",
),
)
52 changes: 52 additions & 0 deletions .clusterfuzzlite/platformio-clusterfuzzlite-pre.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""PlatformIO build script (pre: runs before other Meshtastic scripts).

ClusterFuzzLite executes in a different container from the build. During the build,
attempt to link statically to as many dependencies as possible. For dependencies that
do not have static libraries, the shared library files are copied to the output
directory by the build.sh script.
"""

import glob
import os
import shlex

from SCons.Script import DefaultEnvironment, Literal

env = DefaultEnvironment()

cxxflags = shlex.split(os.getenv("CXXFLAGS"))
sanitizer_flags = shlex.split(os.getenv("SANITIZER_FLAGS"))
lib_fuzzing_engine = shlex.split(os.getenv("LIB_FUZZING_ENGINE"))
statics = glob.glob("/usr/lib/lib*.a") + glob.glob("/usr/lib/*/lib*.a")
no_static = set(("-ldl",))


def replaceStatic(lib):
"""Replace -l<libname> with the static .a file for the library."""
if not lib.startswith("-l") or lib in no_static:
return lib
static_name = f"/lib{lib[2:]}.a"
static = [s for s in statics if s.endswith(static_name)]
if len(static) == 1:
return static[0]
return lib


# Setup the environment for building with Clang and the OSS-Fuzz required build flags.
env.Append(
CFLAGS=os.getenv("CFLAGS"),
CXXFLAGS=cxxflags,
LIBSOURCE_DIRS=["/usr/lib/x86_64-linux-gnu"],
LINKFLAGS=cxxflags
+ sanitizer_flags
+ lib_fuzzing_engine
+ ["-stdlib=libc++", "-std=c++17"],
_LIBFLAGS=[replaceStatic(s) for s in shlex.split(os.getenv("STATIC_LIBS"))]
+ [
"/usr/lib/x86_64-linux-gnu/libunistring.a", # Needs to be at the end.
# Find the shared libraries in a subdirectory named lib
# within the same directory as the binary.
Literal("-Wl,-rpath,$ORIGIN/lib"),
"-Wl,-z,origin",
],
)
1 change: 1 addition & 0 deletions .clusterfuzzlite/project.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
language: c++
Loading
Loading