Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
4311 commits
Select commit Hold shift + click to select a range
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
334a4f0
Fix logic for rak12035 sensor default config and improve messaging (#…
Justin-Mann Jan 29, 2026
31bf51b
Add support for the hardware buttons on Bluetooth Nugget device (#9468)
treysis Jan 29, 2026
1f7ed68
feat(stm32): Add Milesight GS301 Bathroom Odor Detector (#9359)
ndoo Jan 29, 2026
8af9e7f
enable long interleaving mode for LR11x0 and SX128x (#9399)
Jorropo Jan 29, 2026
61b39ac
Add initial Nix shell (#8530)
agustinmista Jan 29, 2026
45fbc0f
Remove stale variant.h defines (#9470)
jp-bennett Jan 29, 2026
dbded86
More variant.h cleanup. LED_NOTIFICATION, remove dead code, etc (#9477)
jp-bennett Jan 29, 2026
eeb7373
Remove errant symbol
jp-bennett Jan 29, 2026
5dd06ed
Add ledOff if not defined
jp-bennett Jan 29, 2026
28b4f37
Revert "Update libch341-spi-userspace digest to af9bc27 (#9472)" (#9483)
thebentern Jan 30, 2026
e08c050
Add custom ringtone definition for RAK4631 and enable buzzer pin (#9481)
thebentern Jan 30, 2026
6f5a767
Update pschatzmann_arduino-audio-driver to v0.2.1 (#9398)
renovate[bot] Jan 30, 2026
2261707
Update meshtastic/device-ui digest to 63967a4 (#9475)
renovate[bot] Jan 30, 2026
68733a6
Fix issue triage workflow by clarifying device log requirements and i…
thebentern Jan 30, 2026
ad4b1d9
re-enable RTC support on THINKNODE M3 and M6
jp-bennett Jan 30, 2026
4cf01e7
Adjust pin poweroff for Thinknode M6
jp-bennett Jan 30, 2026
c19fc62
Merge pull request #9492 from meshtastic/master
thebentern Jan 30, 2026
200e79e
You get an RTC, and you get an RTC! (delete HAS_RTC as it wasn't actu…
jp-bennett Jan 30, 2026
caae6bc
Change canned message recipient's previous page to send page (#9227)
scobert969 Jan 30, 2026
7bbfe99
Add on-screen keyboard to InkHUD (#9445)
scobert969 Jan 30, 2026
8f630bf
Fix typo in LED state comment
jp-bennett Jan 30, 2026
004179c
Fix OTA filename determination to use unified format for ESP32 (#9488)
thebentern Jan 30, 2026
7b03980
Refuse to send legacy DMs simply because the remote public key is unk…
jp-bennett Jan 30, 2026
e9d4485
Merge remote-tracking branch 'origin/develop'
thebentern Jan 30, 2026
1d30342
Don't ever define PIN_LED or BLE_LED_INVERTED (#9494)
jp-bennett Jan 31, 2026
9d06c1b
Add StatusMessage module and config overrides (#9351)
jp-bennett Jan 31, 2026
0022148
Missed in reviews - fixing send bubble (#9505)
Xaositek Feb 2, 2026
f514bc2
Prefer EXT_PWR_DETECT pin over chargingVolt to detect power unplugged…
jp-bennett Feb 3, 2026
644fa5b
Power off control pin on Thinknode m5 during deepsleep and add RTC (#…
jp-bennett Feb 3, 2026
0703e0e
Make sure we always return a value in NodeDB::restorePreferences() (#…
EricSesterhennX41 Feb 3, 2026
c8a9cdc
Make sure we always return a value in NodeDB::restorePreferences() (#…
EricSesterhennX41 Feb 3, 2026
b008c7a
Fix config.display.use_long_node_name not saving (#9522)
Xaositek Feb 3, 2026
b7db220
Inkhud battery icon improvements. (#9513)
Vortetty Feb 4, 2026
538a5f0
Add reply bot module with DM-only responses and rate limiting (#9456)
mattatat25 Feb 4, 2026
bfc3eeb
HotFix for ReplyBot - Modules.cpp included and moved configuration.h …
Xaositek Feb 4, 2026
be5f0a9
Implement UDP multicast handler start/stop to ensure proper lifecycle…
thebentern Feb 4, 2026
89df5ef
Undefine LED_BUILTIN (#9531)
mrekin Feb 4, 2026
ac611c4
Add agc reset attempt (#8163)
jp-bennett Feb 4, 2026
94b7149
Remove unused hmx variable (#9529)
EricSesterhennX41 Feb 4, 2026
b238744
Update Adafruit MPU6050 to v2.2.7 (#9525)
renovate[bot] Feb 4, 2026
74ea620
Update NeoPixel to v1.15.3 (#9530)
renovate[bot] Feb 4, 2026
5df5ab2
Update Adafruit MPU6050 to v2.2.8 (#9534)
renovate[bot] Feb 4, 2026
a324c4a
Update meshtastic-esp8266-oled-ssd1306 digest to 21e484f (#9533)
renovate[bot] Feb 5, 2026
2361776
Rename LED_PIN to LED_POWER, move handling out of main to dedicated m…
jp-bennett Feb 5, 2026
11bb2ee
Upgrade trunk (#9368)
github-actions[bot] Feb 5, 2026
f73d183
Upgrade trunk (#9547)
github-actions[bot] Feb 6, 2026
779e446
Fix hop_limit upgrade detection (#9550)
rcd Feb 6, 2026
4a4b1f4
meshtasticd: Fix install on Fedora 43 (#9556)
vidplace7 Feb 7, 2026
e2cf401
Update meshtastic/device-ui digest to 6c75195 (#9553)
renovate[bot] Feb 7, 2026
ba016fd
Fix hop_limit upgrade detection (#9550)
rcd Feb 6, 2026
5280caf
Update protobufs (#9559)
github-actions[bot] Feb 7, 2026
39139cc
RPM: Include meshtasticd-start.sh (#9561)
vidplace7 Feb 7, 2026
53231ae
Added toggable config and default for larger screens to enable / hide…
thebentern Feb 7, 2026
a60e7cf
Add Slash Key to VirtualKeyboard (#9563)
Xaositek Feb 8, 2026
eb145f8
Add support for CW2015 LiPo battery fuel gauge (#9564)
jp-bennett Feb 8, 2026
4ce554e
Make LED_POWER blip even in critical battery (#9545)
jp-bennett Feb 8, 2026
7cbab48
Feat/add sen5x (#7245)
oscgonfer Feb 8, 2026
bb3d6d5
Fix embedded null byte truncation in ATAK strings (#9570)
niccellular Feb 8, 2026
73adeee
Enable FORTIFY and SP for native builds (#9537)
EricSesterhennX41 Feb 9, 2026
579a0af
feat: Add SCD4X (#7198)
oscgonfer Feb 9, 2026
28c4acf
chore(deps): update gxepd2 to v1.6.7 (#9577)
renovate[bot] Feb 9, 2026
b12cac3
Merge branch 'master' into develop
thebentern Feb 9, 2026
0df8719
Temporarily un-renovate libch341 (#9587)
jp-bennett Feb 9, 2026
139e45d
Update protobufs (#9588)
github-actions[bot] Feb 9, 2026
af18f06
Merge remote-tracking branch 'origin/master' into develop
thebentern Feb 9, 2026
df0ee74
Add battery curve for T-Beam 1 watt (#9585)
jp-bennett Feb 9, 2026
927a4e4
Update built-in documentation for current method of implementation (#…
Xaositek Feb 10, 2026
a092f6b
Refactor logging in ProtobufModule to ensure message details are logg…
NomDeTom Feb 10, 2026
6df0449
Upgrade trunk (#9581)
github-actions[bot] Feb 10, 2026
65adfa8
Automated version bumps (#9604)
github-actions[bot] Feb 11, 2026
44941b7
Add missing openocd_target to custom nrf52 boards (#9603)
Stary2001 Feb 11, 2026
6b73ac3
Upgrade trunk (#9599)
github-actions[bot] Feb 11, 2026
75f3d12
Add sdl libs for native builds (#9595)
jp-bennett Feb 11, 2026
e047397
Add missing openocd_target to custom nrf52 boards (#9603)
Stary2001 Feb 11, 2026
4954723
Automated version bumps (#9604)
github-actions[bot] Feb 11, 2026
f96a859
fix some random compiler warnings (#9596)
caveman99 Feb 11, 2026
5b03b1f
fix some random compiler warnings (#9596)
caveman99 Feb 11, 2026
648148a
Modify the dependency library of v4-tft (#9507)
Quency-D Feb 11, 2026
21d5a34
Update protobufs (#9605)
github-actions[bot] Feb 11, 2026
0adcadb
Modify the dependency library of v4-tft (#9507)
Quency-D Feb 11, 2026
c366e53
Merge branch 'master' into develop
thebentern Feb 11, 2026
97983d8
BaseUI: Favorite Screen Signal Quality improvement (#9566)
HarukiToreda Feb 11, 2026
31fe15b
ExternalNotification and StatusLED now call AmbientLighting to update…
jp-bennett Feb 11, 2026
6d299ea
Fixes on SCD4X admin comands (#9607)
oscgonfer Feb 11, 2026
15297cb
feat/add sfa30 (#9372)
oscgonfer Feb 11, 2026
640dd5f
Upgrade trunk (#9615)
github-actions[bot] Feb 12, 2026
f862915
chore(deps): update adafruit mpu6050 to v2.2.9 (#9611)
renovate[bot] Feb 12, 2026
bfbce2e
Log rxBad PacketHeaders with more info (id, relay_node) like printPac…
compumike Feb 12, 2026
8137200
chore(deps): update sensirion core to v0.7.3 (#9613)
renovate[bot] Feb 12, 2026
bcc2470
chore(deps): update neopixel to v1.15.4 (#9616)
renovate[bot] Feb 12, 2026
38c7ad0
Exclude status message module
thebentern Feb 12, 2026
1a7f560
fix: zero entire public key array instead of only first byte (#9619)
weebl2000 Feb 12, 2026
f10d786
Update protobufs (#9621)
github-actions[bot] Feb 12, 2026
b6e5534
Merge branch 'master' into develop
thebentern Feb 12, 2026
c332177
Xiao NRF - define suitable i2c pins for the sub-variants (#8866)
NomDeTom Feb 12, 2026
d5bde83
Upgrade trunk (#9631)
github-actions[bot] Feb 13, 2026
947f817
Update src/detect/ScanI2C.cpp
thebentern Feb 13, 2026
3d649d5
Update src/modules/Telemetry/Sensor/SFA30Sensor.cpp
thebentern Feb 13, 2026
c79e192
Update src/modules/Telemetry/Sensor/SFA30Sensor.cpp
thebentern Feb 13, 2026
71edf2f
Update src/modules/Telemetry/Sensor/SFA30Sensor.cpp
thebentern Feb 13, 2026
d770ef2
Update src/mesh/NodeDB.cpp
thebentern Feb 13, 2026
c8ff02c
Merge branch 'master' into develop
thebentern Feb 14, 2026
df14561
convert GPS global and some new in gps.cpp to unique_ptr (#9628)
Jorropo Feb 14, 2026
e1f9ccd
replace delete in RedirectablePrint.cpp with std::unique_ptr (#9642)
Jorropo Feb 14, 2026
aed2c7c
replace delete in EInkDynamicDisplay.{cpp,h} with std::unique_ptr (#9…
Jorropo Feb 14, 2026
184e4dd
Undefine LED_BUILTIN for Heltec v2 variant (#9647)
ericbarch Feb 14, 2026
ff485d5
replace delete in RadioInterface.cpp with std::unique_ptr (#9645)
Jorropo Feb 14, 2026
167bcf2
fix typo in PIN_GPS_SWITCH (#9648)
Jorropo Feb 14, 2026
b0bd3df
replace delete in CryptoEngine.{cpp,h} with std::unique_ptr (#9649)
Jorropo Feb 14, 2026
dbef1de
workaround NCP5623 and LP5562 I2C builds (#9652)
Jorropo Feb 14, 2026
545826d
replace delete in AudioThread.h with std::unique_ptr (#9651)
Jorropo Feb 15, 2026
778823e
Add USB_MODE=1 for Station G2 (#9660)
h3lix1 Feb 16, 2026
32db700
InkHUD: Favorite Map Applet (#9654)
HarukiToreda Feb 16, 2026
56fd9c7
fix a lot of low level cppcheck warnings (#9623)
caveman99 Feb 16, 2026
57268bf
Feat/add scd30 (#9609)
oscgonfer Feb 16, 2026
321ccbf
Upgrade trunk (#9661)
github-actions[bot] Feb 16, 2026
0cbf53b
fix: respect DontMqttMeBro flag regardless of channel PSK (#9626)
weebl2000 Feb 16, 2026
5feba46
our firmware action is too clever
caveman99 Feb 16, 2026
6b44b57
fix detection of SCD30 by checking if the size of the return from a 2…
caveman99 Feb 16, 2026
a227fd7
#9623 resolved a local shadow of next_key by converting it to int. (#…
caveman99 Feb 16, 2026
a4ba312
zip a few gitrefs down (#9672)
caveman99 Feb 17, 2026
3ca68e7
InkHUD: Allow non-system applets to subscribe to input events (#9514)
Vortetty Feb 17, 2026
f94c01b
Upgrade trunk (#9671)
github-actions[bot] Feb 17, 2026
4fccda2
Concurrency: Modern Periodic wrapper class. (#9501)
harry-iii-lord Feb 17, 2026
357a33f
chore(deps): update actions/stale action to v10.2.0 (#9669)
renovate[bot] Feb 17, 2026
178c311
Fake IAQ values on Non-BSEC2 platforms like Platformio and the origin…
caveman99 Feb 17, 2026
5408e81
Upgrade trunk (#9683)
github-actions[bot] Feb 18, 2026
86986d6
ULED_BUILTIN for 9m2ibr_aprs_lora_tracker (#9685)
mrekin Feb 19, 2026
d0cf79a
Upgrade trunk (#9692)
github-actions[bot] Feb 19, 2026
4c91bee
Develop to master (#9618)
thebentern Feb 19, 2026
2b6d8f6
Merge branch 'develop'
thebentern Feb 19, 2026
a77ac21
Trunk
thebentern Feb 19, 2026
15460c8
Update meshtastic-GxEPD2 digest to c7eb4c3 (#9694)
renovate[bot] Feb 19, 2026
6bc3e31
Upgrade trunk (#9696)
github-actions[bot] Feb 20, 2026
8f81b19
BLE Pairing fix (#9701)
HarukiToreda Feb 20, 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 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
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