diff --git a/.clusterfuzzlite/build.sh b/.clusterfuzzlite/build.sh
index 10a2db0bd..86ab775f9 100644
--- a/.clusterfuzzlite/build.sh
+++ b/.clusterfuzzlite/build.sh
@@ -51,7 +51,7 @@ 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/program"
+ program="$PLATFORMIO_WORKSPACE_DIR/build/$PIO_ENV/meshtasticd"
cp "$program" "$OUT/$fuzzer"
# Copy shared libraries used by the fuzzer.
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 30af24bd2..f546d4cfd 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -1,7 +1,7 @@
# trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue
# trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions
# trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions
-FROM mcr.microsoft.com/devcontainers/cpp:1-debian-12
+FROM mcr.microsoft.com/devcontainers/cpp:2-debian-13
USER root
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index bf1c50982..e3f076ce0 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -8,7 +8,7 @@
"features": {
"ghcr.io/devcontainers/features/python:1": {
"installTools": true,
- "version": "latest"
+ "version": "3.14"
}
},
"customizations": {
diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml
index f7bf95f83..f79e4fdb5 100644
--- a/.github/actionlint.yaml
+++ b/.github/actionlint.yaml
@@ -2,4 +2,5 @@
self-hosted-runner:
# Labels of self-hosted runner in array of strings.
labels:
+ - arctastic
- test-runner
diff --git a/.github/actions/build-variant/action.yml b/.github/actions/build-variant/action.yml
index f611908ee..c048b7ac2 100644
--- a/.github/actions/build-variant/action.yml
+++ b/.github/actions/build-variant/action.yml
@@ -76,7 +76,7 @@ runs:
done
- name: PlatformIO ${{ inputs.arch }} download cache
- uses: actions/cache@v4
+ uses: actions/cache@v5
with:
path: ~/.platformio/.cache
key: pio-cache-${{ inputs.arch }}-${{ hashFiles('.github/actions/**', '**.ini') }}
@@ -100,9 +100,9 @@ runs:
id: version
- name: Store binaries as an artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
- name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }}
overwrite: true
path: |
${{ inputs.artifact-paths }}
diff --git a/.github/actions/setup-base/action.yml b/.github/actions/setup-base/action.yml
index f6c1fd80c..80f5c6855 100644
--- a/.github/actions/setup-base/action.yml
+++ b/.github/actions/setup-base/action.yml
@@ -5,7 +5,7 @@ runs:
using: composite
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
diff --git a/.github/workflows/build_debian_src.yml b/.github/workflows/build_debian_src.yml
index 7f3f8b672..de114be1c 100644
--- a/.github/workflows/build_debian_src.yml
+++ b/.github/workflows/build_debian_src.yml
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: recursive
path: meshtasticd
@@ -64,7 +64,7 @@ jobs:
PKG_VERSION: ${{ steps.version.outputs.deb }}
- name: Store binaries as an artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
overwrite: true
diff --git a/.github/workflows/build_firmware.yml b/.github/workflows/build_firmware.yml
index b62729332..d384540a4 100644
--- a/.github/workflows/build_firmware.yml
+++ b/.github/workflows/build_firmware.yml
@@ -18,11 +18,12 @@ permissions: read-all
jobs:
pio-build:
name: build-${{ inputs.platform }}
- runs-on: ubuntu-24.04
+ # Use 'arctastic' self-hosted runner pool when building in the main repo
+ runs-on: ${{ github.repository_owner == 'meshtastic' && 'arctastic' || 'ubuntu-latest' }}
outputs:
artifact-id: ${{ steps.upload.outputs.artifact-id }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
@@ -55,15 +56,31 @@ jobs:
ota_firmware_source: ${{ steps.ota_dir.outputs.src || '' }}
ota_firmware_target: ${{ steps.ota_dir.outputs.tgt || '' }}
+ - name: Job summary
+ env:
+ PIO_ENV: ${{ inputs.pio_env }}
+ run: |
+ echo "## $PIO_ENV" >> $GITHUB_STEP_SUMMARY
+ echo "Manifest
" >> $GITHUB_STEP_SUMMARY
+ echo '' >> $GITHUB_STEP_SUMMARY
+ echo '```json' >> $GITHUB_STEP_SUMMARY
+ cat release/firmware-*.mt.json >> $GITHUB_STEP_SUMMARY
+ echo '' >> $GITHUB_STEP_SUMMARY
+ echo '```' >> $GITHUB_STEP_SUMMARY
+ echo " " >> $GITHUB_STEP_SUMMARY
+
- name: Store binaries as an artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
id: upload
with:
- name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}.zip
+ name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}
overwrite: true
path: |
+ release/*.mt.json
release/*.bin
release/*.elf
release/*.uf2
release/*.hex
- release/*-ota.zip
+ release/*.zip
+ release/device-*.sh
+ release/device-*.bat
diff --git a/.github/workflows/build_one_arch.yml b/.github/workflows/build_one_arch.yml
deleted file mode 100644
index 9c57f8b7d..000000000
--- a/.github/workflows/build_one_arch.yml
+++ /dev/null
@@ -1,176 +0,0 @@
-name: Build One Arch
-
-on:
- workflow_dispatch:
- inputs:
- # trunk-ignore(checkov/CKV_GHA_7)
- arch:
- type: choice
- options:
- - esp32
- - esp32s3
- - esp32c3
- - esp32c6
- - nrf52840
- - rp2040
- - rp2350
- - stm32
- - native
-
-permissions: read-all
-
-env:
- INPUT_ARCH: ${{ github.event.inputs.arch }}
-
-jobs:
- setup:
- runs-on: ubuntu-24.04
- steps:
- - uses: actions/checkout@v5
- - uses: actions/setup-python@v6
- with:
- python-version: 3.x
- cache: pip
- - run: pip install -U platformio
- - name: Generate matrix
- id: jsonStep
- run: |
- TARGETS=$(./bin/generate_ci_matrix.py $INPUT_ARCH --level extra)
- echo "Name: $GITHUB_REF_NAME Base: $GITHUB_BASE_REF Ref: $GITHUB_REF"
- echo "selected_arch=$TARGETS" >> $GITHUB_OUTPUT
- outputs:
- selected_arch: ${{ steps.jsonStep.outputs.selected_arch }}
-
- version:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v5
- - name: Get release version string
- run: |
- echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
- id: version
- env:
- BUILD_LOCATION: local
- outputs:
- long: ${{ steps.version.outputs.long }}
- deb: ${{ steps.version.outputs.deb }}
-
- build:
- if: ${{ github.event_name != 'workflow_dispatch' }}
- needs: [setup, version]
- strategy:
- fail-fast: false
- matrix:
- build: ${{ fromJson(needs.setup.outputs.selected_arch) }}
- uses: ./.github/workflows/build_firmware.yml
- with:
- version: ${{ needs.version.outputs.long }}
- pio_env: ${{ matrix.build.board }}
- platform: ${{ matrix.build.arch }}
-
- build-debian-src:
- if: ${{ github.repository == 'meshtastic/firmware' && github.event_name != 'workflow_dispatch' || inputs.arch == 'native' }}
- uses: ./.github/workflows/build_debian_src.yml
- with:
- series: UNRELEASED
- build_location: local
- secrets: inherit
-
- package-pio-deps-native-tft:
- if: ${{ inputs.arch == 'native' }}
- uses: ./.github/workflows/package_pio_deps.yml
- with:
- pio_env: native-tft
- secrets: inherit
-
- test-native:
- if: ${{ !contains(github.ref_name, 'event/') && github.event_name != 'workflow_dispatch' || !contains(github.ref_name, 'event/') && inputs.arch == 'native' }}
- uses: ./.github/workflows/test_native.yml
-
- gather-artifacts:
- permissions:
- contents: write
- pull-requests: write
- strategy:
- fail-fast: false
- matrix:
- arch:
- - esp32
- - esp32s3
- - esp32c3
- - esp32c6
- - nrf52840
- - rp2040
- - rp2350
- - stm32
- runs-on: ubuntu-latest
- needs: [version, build]
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
- with:
- ref: ${{github.event.pull_request.head.ref}}
- repository: ${{github.event.pull_request.head.repo.full_name}}
-
- - uses: actions/download-artifact@v5
- with:
- path: ./
- pattern: firmware-${{inputs.arch}}-*
- merge-multiple: true
-
- - name: Display structure of downloaded files
- run: ls -R
-
- - name: Move files up
- run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
-
- - name: Repackage in single firmware zip
- uses: actions/upload-artifact@v4
- with:
- name: firmware-${{inputs.arch}}-${{ needs.version.outputs.long }}
- overwrite: true
- path: |
- ./firmware-*.bin
- ./firmware-*.uf2
- ./firmware-*.hex
- ./firmware-*-ota.zip
- ./device-*.sh
- ./device-*.bat
- ./littlefs-*.bin
- ./bleota*bin
- ./Meshtastic_nRF52_factory_erase*.uf2
- retention-days: 30
-
- - uses: actions/download-artifact@v5
- with:
- name: firmware-${{inputs.arch}}-${{ needs.version.outputs.long }}
- merge-multiple: true
- path: ./output
-
- # For diagnostics
- - name: Show artifacts
- run: ls -lR
-
- - name: Device scripts permissions
- run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
-
- - name: Zip firmware
- run: zip -j -9 -r ./firmware-${{inputs.arch}}-${{ needs.version.outputs.long }}.zip ./output
-
- - name: Repackage in single elfs zip
- uses: actions/upload-artifact@v4
- with:
- name: debug-elfs-${{inputs.arch}}-${{ needs.version.outputs.long }}.zip
- overwrite: true
- path: ./*.elf
- retention-days: 30
-
- - uses: scruplelesswizard/comment-artifact@main
- if: ${{ github.event_name == 'pull_request' }}
- with:
- name: firmware-${{inputs.arch}}-${{ needs.version.outputs.long }}
- description: "Download firmware-${{inputs.arch}}-${{ needs.version.outputs.long }}.zip. This artifact will be available for 90 days from creation"
- github-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/build_one_target.yml b/.github/workflows/build_one_target.yml
index 15b3fdba9..9cc0bac78 100644
--- a/.github/workflows/build_one_target.yml
+++ b/.github/workflows/build_one_target.yml
@@ -15,7 +15,6 @@ on:
- rp2040
- rp2350
- stm32
- - native
target:
type: string
required: false
@@ -42,10 +41,9 @@ jobs:
- rp2040
- rp2350
- stm32
-
runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: 3.x
@@ -60,13 +58,13 @@ jobs:
echo "Arch: ${{matrix.arch}}" >> $GITHUB_STEP_SUMMARY
echo "Ref: $GITHUB_REF" >> $GITHUB_STEP_SUMMARY
echo "Targets:" >> $GITHUB_STEP_SUMMARY
- echo $TARGETS >> $GITHUB_STEP_SUMMARY
+ echo $TARGETS | jq -r 'sort_by(.board) |.[] | "- " + .board' >> $GITHUB_STEP_SUMMARY
version:
if: ${{ inputs.target != '' }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
@@ -87,25 +85,6 @@ jobs:
pio_env: ${{ inputs.target }}
platform: ${{ inputs.arch }}
- build-debian-src:
- if: ${{ github.repository == 'meshtastic/firmware' && inputs.arch == 'native' }}
- uses: ./.github/workflows/build_debian_src.yml
- with:
- series: UNRELEASED
- build_location: local
- secrets: inherit
-
- package-pio-deps-native-tft:
- if: ${{ inputs.arch == 'native' }}
- uses: ./.github/workflows/package_pio_deps.yml
- with:
- pio_env: native-tft
- secrets: inherit
-
- test-native:
- if: ${{ !contains(github.ref_name, 'event/') && github.event_name != 'workflow_dispatch' || !contains(github.ref_name, 'event/') && inputs.arch == 'native' && inputs.target != '' }}
- uses: ./.github/workflows/test_native.yml
-
gather-artifacts:
permissions:
contents: write
@@ -114,12 +93,12 @@ jobs:
needs: [version, build]
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
path: ./
pattern: firmware-*-*
@@ -132,7 +111,7 @@ jobs:
run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
- name: Repackage in single firmware zip
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: firmware-${{inputs.target}}-${{ needs.version.outputs.long }}
overwrite: true
@@ -140,7 +119,7 @@ jobs:
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
- ./firmware-*-ota.zip
+ ./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
@@ -148,7 +127,7 @@ jobs:
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
pattern: firmware-*-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -160,14 +139,14 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{inputs.target}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: debug-elfs-${{inputs.target}}-${{ needs.version.outputs.long }}.zip
overwrite: true
diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml
index 26a9cff18..8d19af894 100644
--- a/.github/workflows/docker_build.yml
+++ b/.github/workflows/docker_build.yml
@@ -47,7 +47,7 @@ jobs:
runs-on: ${{ inputs.runs-on }}
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
diff --git a/.github/workflows/docker_manifest.yml b/.github/workflows/docker_manifest.yml
index 20b9ceee6..396ddb68e 100644
--- a/.github/workflows/docker_manifest.yml
+++ b/.github/workflows/docker_manifest.yml
@@ -83,7 +83,7 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
diff --git a/.github/workflows/hook_copr.yml b/.github/workflows/hook_copr.yml
index 2204cc02c..eb4ebc57b 100644
--- a/.github/workflows/hook_copr.yml
+++ b/.github/workflows/hook_copr.yml
@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{ github.ref }}
diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml
index 02a4c23b8..d7bde7bc5 100644
--- a/.github/workflows/main_matrix.yml
+++ b/.github/workflows/main_matrix.yml
@@ -35,7 +35,7 @@ jobs:
- check
runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: 3.x
@@ -59,7 +59,7 @@ jobs:
version:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
@@ -77,16 +77,21 @@ jobs:
fail-fast: false
matrix:
check: ${{ fromJson(needs.setup.outputs.check) }}
-
- runs-on: ubuntu-latest
+ # Use 'arctastic' self-hosted runner pool when checking in the main repo
+ runs-on: ${{ github.repository_owner == 'meshtastic' && 'arctastic' || 'ubuntu-latest' }}
if: ${{ github.event_name != 'workflow_dispatch' && github.repository == 'meshtastic/firmware' }}
steps:
- - uses: actions/checkout@v5
- - name: Build base
- id: base
- uses: ./.github/actions/setup-base
+ - uses: actions/checkout@v6
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Check ${{ matrix.check.board }}
- run: bin/check-all.sh ${{ matrix.check.board }}
+ uses: meshtastic/gh-action-firmware@main
+ with:
+ pio_platform: ${{ matrix.check.platform }}
+ pio_env: ${{ matrix.check.board }}
+ pio_target: check
build:
needs: [setup, version]
@@ -163,12 +168,12 @@ jobs:
needs: [version, build]
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
path: ./
pattern: firmware-${{matrix.arch}}-*
@@ -177,19 +182,17 @@ jobs:
- name: Display structure of downloaded files
run: ls -R
- - name: Move files up
- run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
-
- name: Repackage in single firmware zip
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: |
+ ./firmware-*.mt.json
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
- ./firmware-*-ota.zip
+ ./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
@@ -197,7 +200,7 @@ jobs:
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -209,16 +212,16 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
- name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: ./*.elf
retention-days: 30
@@ -236,18 +239,14 @@ jobs:
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
needs:
+ - setup
- version
- gather-artifacts
- build-debian-src
- package-pio-deps-native-tft
steps:
- name: Checkout
- uses: actions/checkout@v5
-
- - name: Setup Python
- uses: actions/setup-python@v6
- with:
- python-version: 3.x
+ uses: actions/checkout@v6
- name: Create release
uses: softprops/action-gh-release@v2
@@ -261,14 +260,14 @@ jobs:
Autogenerated by github action, developer should edit as required before publishing...
- name: Download source deb
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src
merge-multiple: true
path: ./output/debian-src
- name: Download `native-tft` pio deps
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -284,10 +283,25 @@ jobs:
- name: Display structure of downloaded files
run: ls -lR
- - name: Add Linux sources to GtiHub Release
+ - name: Generate Release manifest
+ run: |
+ jq -n --arg ver "${{ needs.version.outputs.long }}" --argjson targets ${{ toJson(needs.setup.outputs.all) }} '{
+ "version": $ver,
+ "targets": $targets
+ }' > firmware-${{ needs.version.outputs.long }}.json
+
+ - name: Save Release manifest artifact
+ uses: actions/upload-artifact@v6
+ with:
+ name: manifest-${{ needs.version.outputs.long }}
+ overwrite: true
+ path: firmware-${{ needs.version.outputs.long }}.json
+
+ - name: Add sources to GitHub Release
# Only run when targeting master branch with workflow_dispatch
if: ${{ github.ref_name == 'master' }}
run: |
+ gh release upload v${{ needs.version.outputs.long }} ./firmware-${{ needs.version.outputs.long }}.json
gh release upload v${{ needs.version.outputs.long }} ./output/meshtasticd-${{ needs.version.outputs.deb }}-src.zip
gh release upload v${{ needs.version.outputs.long }} ./output/platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip
env:
@@ -311,14 +325,14 @@ jobs:
needs: [release-artifacts, version]
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -329,15 +343,15 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
- name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./elfs
@@ -366,19 +380,26 @@ jobs:
esp32,esp32s3,esp32c3,esp32c6,nrf52840,rp2040,rp2350,stm32
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- - uses: actions/download-artifact@v5
+ - name: Get firmware artifacts
+ uses: actions/download-artifact@v7
with:
pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./publish
+ - name: Get manifest artifact
+ uses: actions/download-artifact@v7
+ with:
+ pattern: manifest-${{ needs.version.outputs.long }}
+ path: ./publish
+
- name: Publish firmware to meshtastic.github.io
uses: peaceiris/actions-gh-pages@v4
env:
diff --git a/.github/workflows/merge_queue.yml b/.github/workflows/merge_queue.yml
index e8c3d3450..bd3f6d4eb 100644
--- a/.github/workflows/merge_queue.yml
+++ b/.github/workflows/merge_queue.yml
@@ -17,7 +17,7 @@ jobs:
- check
runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: 3.x
@@ -40,7 +40,7 @@ jobs:
version:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Get release version string
run: |
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
@@ -62,7 +62,7 @@ jobs:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'workflow_dispatch' }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Build base
id: base
uses: ./.github/actions/setup-base
@@ -142,12 +142,12 @@ jobs:
needs: [version, build]
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
path: ./
pattern: firmware-${{matrix.arch}}-*
@@ -160,7 +160,7 @@ jobs:
run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
- name: Repackage in single firmware zip
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
@@ -168,7 +168,7 @@ jobs:
./firmware-*.bin
./firmware-*.uf2
./firmware-*.hex
- ./firmware-*-ota.zip
+ ./firmware-*.zip
./device-*.sh
./device-*.bat
./littlefs-*.bin
@@ -176,7 +176,7 @@ jobs:
./Meshtastic_nRF52_factory_erase*.uf2
retention-days: 30
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -188,16 +188,16 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
- name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: ./*.elf
retention-days: 30
@@ -221,12 +221,7 @@ jobs:
- package-pio-deps-native-tft
steps:
- name: Checkout
- uses: actions/checkout@v5
-
- - name: Setup Python
- uses: actions/setup-python@v6
- with:
- python-version: 3.x
+ uses: actions/checkout@v6
- name: Create release
uses: softprops/action-gh-release@v2
@@ -240,14 +235,14 @@ jobs:
Autogenerated by github action, developer should edit as required before publishing...
- name: Download source deb
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src
merge-multiple: true
path: ./output/debian-src
- name: Download `native-tft` pio deps
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -290,14 +285,14 @@ jobs:
needs: [release-artifacts, version]
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
@@ -308,15 +303,15 @@ jobs:
- name: Device scripts permissions
run: |
- chmod +x ./output/device-install.sh
- chmod +x ./output/device-update.sh
+ chmod +x ./output/device-install.sh || true
+ chmod +x ./output/device-update.sh || true
- name: Zip firmware
run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
- name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./elfs
@@ -345,14 +340,14 @@ jobs:
esp32,esp32s3,esp32c3,esp32c6,nrf52840,rp2040,rp2350,stm32
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- - uses: actions/download-artifact@v5
+ - uses: actions/download-artifact@v7
with:
pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }}
merge-multiple: true
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index f26073ec4..045e94895 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -14,7 +14,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Trunk Check
uses: trunk-io/trunk-action@v1
@@ -31,7 +31,7 @@ jobs:
pull-requests: write # For trunk to create PRs
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Trunk Upgrade
uses: trunk-io/trunk-action/upgrade@v1
diff --git a/.github/workflows/package_obs.yml b/.github/workflows/package_obs.yml
index 4c547eadc..63f1fe8a0 100644
--- a/.github/workflows/package_obs.yml
+++ b/.github/workflows/package_obs.yml
@@ -34,7 +34,7 @@ jobs:
needs: build-debian-src
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: recursive
path: meshtasticd
@@ -58,7 +58,7 @@ jobs:
id: version
- name: Download artifacts
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
merge-multiple: true
diff --git a/.github/workflows/package_pio_deps.yml b/.github/workflows/package_pio_deps.yml
index d8ff6e631..82ffe66e9 100644
--- a/.github/workflows/package_pio_deps.yml
+++ b/.github/workflows/package_pio_deps.yml
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: recursive
ref: ${{github.event.pull_request.head.ref}}
@@ -56,7 +56,7 @@ jobs:
PLATFORMIO_CORE_DIR: pio/core
- name: Store binaries as an artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: platformio-deps-${{ inputs.pio_env }}-${{ steps.version.outputs.long }}
overwrite: true
diff --git a/.github/workflows/package_ppa.yml b/.github/workflows/package_ppa.yml
index aece730a0..9a463dbea 100644
--- a/.github/workflows/package_ppa.yml
+++ b/.github/workflows/package_ppa.yml
@@ -32,7 +32,7 @@ jobs:
needs: build-debian-src
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: recursive
path: meshtasticd
@@ -60,7 +60,7 @@ jobs:
id: version
- name: Download artifacts
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src
merge-multiple: true
diff --git a/.github/workflows/pr_enforce_labels.yml b/.github/workflows/pr_enforce_labels.yml
index 543e23558..d60c9c8ca 100644
--- a/.github/workflows/pr_enforce_labels.yml
+++ b/.github/workflows/pr_enforce_labels.yml
@@ -17,7 +17,7 @@ jobs:
with:
script: |
const labels = context.payload.pull_request.labels.map(label => label.name);
- const requiredLabels = ['bugfix', 'enhancement', 'hardware-support', 'dependencies', 'submodules', 'github_actions', 'trunk'];
+ const requiredLabels = ['bugfix', 'enhancement', 'hardware-support', 'dependencies', 'submodules', 'github_actions', 'trunk', 'cleanup'];
const hasRequiredLabel = labels.some(label => requiredLabels.includes(label));
if (!hasRequiredLabel) {
core.setFailed(`PR must have at least one of the following labels before it can be merged: ${requiredLabels.join(', ')}.`);
diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml
index 4e285852d..6306d777f 100644
--- a/.github/workflows/pr_tests.yml
+++ b/.github/workflows/pr_tests.yml
@@ -40,7 +40,7 @@ jobs:
checks: write
pull-requests: write
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
submodules: recursive
@@ -50,9 +50,9 @@ jobs:
- name: Download test artifacts
if: needs.native-tests.result != 'skipped'
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
- name: platformio-test-report-${{ steps.version.outputs.long }}.zip
+ name: platformio-test-report-${{ steps.version.outputs.long }}
merge-multiple: true
- name: Parse test results and create detailed summary
diff --git a/.github/workflows/release_channels.yml b/.github/workflows/release_channels.yml
index d5d642db4..badbb31d4 100644
--- a/.github/workflows/release_channels.yml
+++ b/.github/workflows/release_channels.yml
@@ -60,7 +60,10 @@ jobs:
shell: bash
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
+ with:
+ # Always use master branch for version bumps
+ ref: master
- name: Setup Python
uses: actions/setup-python@v6
@@ -99,7 +102,7 @@ jobs:
PIP_DISABLE_PIP_VERSION_CHECK: 1
- name: Create Bumps pull request
- uses: peter-evans/create-pull-request@v7
+ uses: peter-evans/create-pull-request@v8
with:
base: ${{ github.event.repository.default_branch }}
branch: create-pull-request/bump-version
diff --git a/.github/workflows/sec_sast_semgrep_cron.yml b/.github/workflows/sec_sast_semgrep_cron.yml
index 2059fde2c..d93449d6d 100644
--- a/.github/workflows/sec_sast_semgrep_cron.yml
+++ b/.github/workflows/sec_sast_semgrep_cron.yml
@@ -21,7 +21,7 @@ jobs:
steps:
# step 1
- name: clone application source code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
# step 2
- name: full scan
@@ -33,7 +33,7 @@ jobs:
# step 3
- name: save report as pipeline artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: report.sarif
overwrite: true
diff --git a/.github/workflows/sec_sast_semgrep_pull.yml b/.github/workflows/sec_sast_semgrep_pull.yml
index e93b2ae8b..e9b4108a1 100644
--- a/.github/workflows/sec_sast_semgrep_pull.yml
+++ b/.github/workflows/sec_sast_semgrep_pull.yml
@@ -13,7 +13,7 @@ jobs:
steps:
# step 1
- name: clone application source code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
fetch-depth: 0
diff --git a/.github/workflows/stale_bot.yml b/.github/workflows/stale_bot.yml
index b528f80b2..fc0702bd8 100644
--- a/.github/workflows/stale_bot.yml
+++ b/.github/workflows/stale_bot.yml
@@ -17,10 +17,10 @@ jobs:
steps:
- name: Stale PR+Issues
- uses: actions/stale@v10.1.0
+ uses: actions/stale@v10.1.1
with:
days-before-stale: 45
stale-issue-message: This issue has not had any comment or update in the last month. If it is still relevant, please post update comments. If no comments are made, this issue will be closed automagically in 7 days.
close-issue-message: This issue has not had any comment since the last notice. It has been closed automatically. If this is incorrect, or the issue becomes relevant again, please request that it is reopened.
- exempt-issue-labels: pinned,3.0
- exempt-pr-labels: pinned,3.0
+ exempt-issue-labels: pinned,3.0,triaged,backlog
+ exempt-pr-labels: pinned,3.0,triaged,backlog
diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml
index 9cf1c9e53..cabe0dd97 100644
--- a/.github/workflows/test_native.yml
+++ b/.github/workflows/test_native.yml
@@ -14,7 +14,7 @@ jobs:
name: Native Simulator Tests
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
@@ -40,7 +40,7 @@ jobs:
- name: Integration test
run: |
- .pio/build/coverage/program -s &
+ .pio/build/coverage/meshtasticd -s &
PID=$!
timeout 20 bash -c "until ls -al /proc/$PID/fd | grep socket; do sleep 1; done"
echo "Simulator started, launching python test..."
@@ -59,10 +59,10 @@ jobs:
id: version
- name: Save coverage information
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
if: always() # run this step even if previous step failed
with:
- name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }}.zip
+ name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }}
overwrite: true
path: ./coverage_*.info
@@ -70,7 +70,7 @@ jobs:
name: Native PlatformIO Tests
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
@@ -94,9 +94,9 @@ jobs:
- name: Save test results
if: always() # run this step even if previous step failed
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
- name: platformio-test-report-${{ steps.version.outputs.long }}.zip
+ name: platformio-test-report-${{ steps.version.outputs.long }}
overwrite: true
path: ./testreport.xml
@@ -108,10 +108,10 @@ jobs:
sed -i -e "s#${PWD}#.#" coverage_tests.info # Make paths relative.
- name: Save coverage information
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
if: always() # run this step even if previous step failed
with:
- name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }}.zip
+ name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }}
overwrite: true
path: ./coverage_*.info
@@ -127,7 +127,7 @@ jobs:
- platformio-tests
if: always()
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
@@ -137,22 +137,22 @@ jobs:
id: version
- name: Download test artifacts
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
- name: platformio-test-report-${{ steps.version.outputs.long }}.zip
+ name: platformio-test-report-${{ steps.version.outputs.long }}
merge-multiple: true
- name: Test Report
- uses: dorny/test-reporter@v2.1.1
+ uses: dorny/test-reporter@v2.3.0
with:
name: PlatformIO Tests
path: testreport.xml
reporter: java-junit
- name: Download coverage artifacts
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
- pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }}.zip
+ pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }}
path: code-coverage-report
merge-multiple: true
@@ -163,7 +163,7 @@ jobs:
genhtml --quiet --legend --prefix "${PWD}" code-coverage-report/coverage_src.info --output-directory code-coverage-report
- name: Save Code Coverage Report
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
- name: code-coverage-report-${{ steps.version.outputs.long }}.zip
+ name: code-coverage-report-${{ steps.version.outputs.long }}
path: code-coverage-report
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 942659348..241f2cd10 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -20,9 +20,9 @@ jobs:
runs-on: test-runner
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- # - uses: actions/setup-python@v5
+ # - uses: actions/setup-python@v6
# with:
# python-version: '3.10'
@@ -47,9 +47,9 @@ jobs:
pio upgrade
- name: Setup Node
- uses: actions/setup-node@v5
+ uses: actions/setup-node@v6
with:
- node-version: 22
+ node-version: 24
- name: Setup pnpm
uses: pnpm/action-setup@v4
diff --git a/.github/workflows/trunk_annotate_pr.yml b/.github/workflows/trunk_annotate_pr.yml
index 23dcf8d09..59ab25c28 100644
--- a/.github/workflows/trunk_annotate_pr.yml
+++ b/.github/workflows/trunk_annotate_pr.yml
@@ -18,7 +18,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Trunk Check
uses: trunk-io/trunk-action@v1
diff --git a/.github/workflows/trunk_check.yml b/.github/workflows/trunk_check.yml
index 41731d491..874374fe0 100644
--- a/.github/workflows/trunk_check.yml
+++ b/.github/workflows/trunk_check.yml
@@ -16,7 +16,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Trunk Check
uses: trunk-io/trunk-action@v1
diff --git a/.github/workflows/trunk_format_pr.yml b/.github/workflows/trunk_format_pr.yml
index 51082fc5f..8fa0cc1eb 100644
--- a/.github/workflows/trunk_format_pr.yml
+++ b/.github/workflows/trunk_format_pr.yml
@@ -15,7 +15,7 @@ jobs:
pull-requests: write
steps:
- name: Checkout repository
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml
index c06e06b0a..d9ef98194 100644
--- a/.github/workflows/update_protobufs.yml
+++ b/.github/workflows/update_protobufs.yml
@@ -11,7 +11,7 @@ jobs:
pull-requests: write
steps:
- name: Checkout code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
submodules: true
@@ -31,7 +31,7 @@ jobs:
./bin/regen-protos.sh
- name: Create pull request
- uses: peter-evans/create-pull-request@v7
+ uses: peter-evans/create-pull-request@v8
with:
branch: create-pull-request/update-protobufs
labels: submodules
diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
index 8c981850d..20ba0d944 100644
--- a/.trunk/trunk.yaml
+++ b/.trunk/trunk.yaml
@@ -4,31 +4,31 @@ cli:
plugins:
sources:
- id: trunk
- ref: v1.7.2
+ ref: v1.7.4
uri: https://github.com/trunk-io/plugins
lint:
enabled:
- - checkov@3.2.473
- - renovate@41.132.5
- - prettier@3.6.2
- - trufflehog@3.90.8
+ - checkov@3.2.495
+ - renovate@42.57.1
+ - prettier@3.7.4
+ - trufflehog@3.92.3
- yamllint@1.37.1
- - bandit@1.8.6
- - trivy@0.67.0
+ - bandit@1.9.2
+ - trivy@0.68.1
- taplo@0.10.0
- - ruff@0.13.3
- - isort@6.1.0
- - markdownlint@0.45.0
- - oxipng@9.1.5
+ - ruff@0.14.9
+ - isort@7.0.0
+ - markdownlint@0.47.0
+ - oxipng@10.0.0
- svgo@4.0.0
- - actionlint@1.7.7
+ - actionlint@1.7.9
- flake8@7.3.0
- hadolint@2.14.0
- shfmt@3.6.0
- shellcheck@0.11.0
- - black@25.9.0
+ - black@25.12.0
- git-diff-check
- - gitleaks@8.28.0
+ - gitleaks@8.30.0
- clang-format@16.0.3
ignore:
- linters: [ALL]
diff --git a/README.md b/README.md
index a53fe9646..f34bf1839 100644
--- a/README.md
+++ b/README.md
@@ -37,4 +37,3 @@ Join our community and help improve Meshtastic! 🚀
## Stats

-
diff --git a/alpine.Dockerfile b/alpine.Dockerfile
index 0469874e4..b3b384101 100644
--- a/alpine.Dockerfile
+++ b/alpine.Dockerfile
@@ -8,7 +8,8 @@ ARG PIO_ENV=native
ENV PIP_ROOT_USER_ACTION=ignore
RUN apk --no-cache add \
- bash g++ libstdc++-dev linux-headers zip git ca-certificates libgpiod-dev yaml-cpp-dev bluez-dev \
+ bash g++ libstdc++-dev linux-headers zip git ca-certificates libbsd-dev \
+ libgpiod-dev yaml-cpp-dev bluez-dev \
libusb-dev i2c-tools-dev libuv-dev openssl-dev pkgconf argp-standalone \
libx11-dev libinput-dev libxkbcommon-dev \
&& rm -rf /var/cache/apk/* \
@@ -27,7 +28,7 @@ RUN bash ./bin/build-native.sh "$PIO_ENV" && \
# ##### PRODUCTION BUILD #############
-FROM alpine:3.22
+FROM alpine:3.23
LABEL org.opencontainers.image.title="Meshtastic" \
org.opencontainers.image.description="Alpine Meshtastic daemon" \
org.opencontainers.image.url="https://meshtastic.org" \
@@ -40,8 +41,8 @@ LABEL org.opencontainers.image.title="Meshtastic" \
USER root
RUN apk --no-cache add \
- shadow libstdc++ libgpiod yaml-cpp libusb i2c-tools libuv \
- libx11 libinput libxkbcommon \
+ shadow libstdc++ libbsd libgpiod yaml-cpp libusb \
+ i2c-tools libuv libx11 libinput libxkbcommon \
&& rm -rf /var/cache/apk/* \
&& mkdir -p /var/lib/meshtasticd \
&& mkdir -p /etc/meshtasticd/config.d \
diff --git a/arch/nrf52/nrf52832.ini b/arch/nrf52/nrf52832.ini
deleted file mode 100644
index ce94283b1..000000000
--- a/arch/nrf52/nrf52832.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[nrf52832_base]
-extends = nrf52_base
-
-build_flags = ${nrf52_base.build_flags}
-
-lib_deps =
- ${nrf52_base.lib_deps}
diff --git a/bin/analyze_map.py b/bin/analyze_map.py
new file mode 100644
index 000000000..99997c703
--- /dev/null
+++ b/bin/analyze_map.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python3
+"""Summarise linker map output to highlight heavy object files and libraries.
+
+Usage:
+ python bin/analyze_map.py --map .pio/build/rak4631/output.map --top 20
+
+The script parses GNU ld map files and aggregates section sizes per object file
+and per archive/library, then prints sortable tables that make it easy to spot
+modules worth trimming or hiding behind feature flags.
+"""
+from __future__ import annotations
+
+import argparse
+import collections
+import os
+import re
+import sys
+from typing import DefaultDict, Dict, Tuple
+
+
+SECTION_LINE_RE = re.compile(r"^\s+(?P\S+)\s+0x[0-9A-Fa-f]+\s+0x(?P[0-9A-Fa-f]+)\s+(?P