Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
e73c254
Implement handshake and rolling buffers in TCP proxy for multi-client…
Feb 12, 2026
0610e25
Refine TcpProxy buffering: reduce handshake size, add pacing for repl…
Feb 12, 2026
5b20701
Fix TCP Proxy: Implement packet framing to ensure stream integrity an…
Feb 12, 2026
538e6f0
Fix syntax error in tcp_proxy.py
Feb 12, 2026
fec6b4b
Fix duplicate messages in TCP Proxy: implement client ready states an…
Feb 12, 2026
032a965
Fix message sending: remove client ready states to prevent dropped AC…
Feb 12, 2026
c180175
Fix NoneType crash and improve connection stability: implement 2s rep…
Feb 12, 2026
c7ca99b
Improve Proxy stability: enable TCP Keep-Alives and implement paced o…
Feb 13, 2026
9a91662
Fix proxy sync: disconnect all clients on radio loss to force re-sync…
Feb 13, 2026
42938e1
Fix node timestamp bug and implement non-blocking proxy reconnection …
Feb 14, 2026
295cf3d
Fix: Respect ENABLE_FEATURE_NODE_TOTALS setting for connection-time r…
Feb 14, 2026
138321b
Fix: Add missing environment variables to docker-compose.yaml and imp…
Feb 14, 2026
db330ed
Add configurable node report frequency via FREQUENCY_OF_NODE_REPORTS …
Feb 14, 2026
78bf240
Add detailed logging for Storage API troubleshooting
Feb 16, 2026
0ffb8cf
Log Storage API responses at INFO level
Feb 16, 2026
b3d3554
Fix 404 errors by adding guards for uninitialized node ID
Feb 16, 2026
f8ea101
Fix watchtower Docker API version mismatch
Feb 17, 2026
357d950
Fix Meshflow API compatibility, update MTEK IP, and resolve NoneType …
Feb 17, 2026
611059c
Enhance proxy heartbeat to log client IPs
Feb 17, 2026
dcb5183
Fix onResponseTraceRoute signature for newer meshtastic library
Feb 17, 2026
b174aa0
Refine onResponseTraceRoute to handle dictionary packets
Feb 17, 2026
2c1ebdc
Add timeout notification for traceroute requests
Feb 17, 2026
c5e38b1
Add verbose connection/disconnection logging to proxy
Feb 18, 2026
4722b83
Add support for targeted traceroute via !tr <shortname>
Feb 19, 2026
14fd1d5
Fix traceroute hang by supporting multiple concurrent requesters per …
Feb 19, 2026
cbdf8b0
Add debug logging to diagnose message receipt issues after traceroute
Feb 19, 2026
3af6b70
Fix bot hang by making traceroute callback defensive against NoneType…
Feb 19, 2026
cd091da
Add processing reaction and improve timeout responsiveness
Feb 19, 2026
0f9830c
Improve traceroute data extraction and diagnostic logging
Feb 19, 2026
9b5c768
Fix traceroute data extraction by checking 'traceroute' key
Feb 19, 2026
c5443cb
Further improvements to traceroute stability and diagnostics
Feb 19, 2026
ffe63b0
Offload blocking command and traceroute processing to threads to prev…
Feb 19, 2026
0768928
Small cleanup of redundant import in bot.py
Feb 19, 2026
8496cc8
Cumulative stability fixes: formatting, robust ID detection, and bett…
Feb 19, 2026
f7939e0
FIX: Restore missing methods in bot.py
Feb 19, 2026
9fd858c
Reduce congestion and improve traceroute result delivery by setting w…
Feb 20, 2026
f4ddada
Silence watchtower errors and increase radio settle time for tracerou…
Feb 20, 2026
231513b
Append target/local node to traceroute output for full path visibility
Feb 20, 2026
0186cb4
FIX: Correct indentation in bot.py and ensure full traceroute path vi…
Feb 20, 2026
ccb07ab
Update README to document targeted traceroute feature
Feb 20, 2026
6d10ea7
Update traceroute command description in README
Mitchcom Feb 20, 2026
68770f0
Ensure traceroute always sends two messages (TO and FROM) even for di…
Feb 20, 2026
c1af6c9
Merge branch 'Extended-TR' of https://github.com/Mitchcom/meshtastic-…
Feb 20, 2026
141a0eb
Update README: add (outbound & inbound) to targeted traceroute descri…
Feb 20, 2026
6d18611
feat: implement !nodes totals subcommand and fix tests
Feb 21, 2026
f73467c
perf: optimize node sync to reduce redundant logs and storage writes
Feb 21, 2026
60dec91
Fix TcpProxy deadlock: Implement RLock and synchronized snapshots. Ad…
Feb 21, 2026
54c555f
Fix TcpProxy socket blocking: Implement 10s timeouts for all sockets …
Feb 21, 2026
84a25ca
Fix redundant 30 minute timeout response on !tr
Mar 4, 2026
7180994
Expose TCP proxy port 4403 on remote compose
Mar 4, 2026
324202f
Refactor Core Services: Asyncio Proxy, Thread-Safe DBs, Narrowed Errors
Mar 5, 2026
38f486b
Fix emoji reaction protobuf type mismatch: expect int instead of bool
Mar 5, 2026
5cfa693
Add detailed traceroute debugging logs
Mar 5, 2026
9f3215d
Add more traceroute debugging logs
Mar 5, 2026
8c778e2
Enable INFO logging for core interfaces
Mar 5, 2026
fa7ce24
Add packet ID and request ID tracking for traceroute
Mar 5, 2026
2e9d95f
Force full traceroute even for 0-hop nodes and add logging
Mar 5, 2026
4144600
Final cleanup: Revert log levels and restore Zero Hops optimization
Mar 5, 2026
2a7038b
Consolidate traceroute response into a single message for reliability
Mar 5, 2026
0ec15d7
Optimize traceroute response for 200 char limit
Mar 5, 2026
fa7b265
Fix combined_response variable error
Mar 5, 2026
8d3f226
Permanently remove Zero Hops shortcut to force real trace verification
Mar 5, 2026
e3a4a48
Fix traceroute response context and enable ACKs for reliability
Mar 5, 2026
80e75cc
Add hop counts to consolidated traceroute message
Mar 5, 2026
c2e1a67
Update traceroute to reply in DM only and use thumbs up for public re…
Mar 5, 2026
e3bb6a1
Ignore ROUTING_APP in StorageAPI to prevent backend API errors
Mar 5, 2026
266c9b9
chore: add macos files to .gitignore
pskillen-nes Mar 5, 2026
fc359e0
ci: run unit tests on more modern python versions
pskillen-nes Mar 5, 2026
d150741
Enhance logging output and documentation updates
Mar 6, 2026
0d3c3be
Update README with new logging formats
Mar 6, 2026
a6f77d8
Add undocumented commands to README
Mar 6, 2026
7bcbaa4
ci: bump dorny to v2
pskillen-nes Mar 6, 2026
17fa017
chore: add github pr template
pskillen-nes Mar 6, 2026
f7301a0
feat: add admin command to help menu
Mar 9, 2026
1af5980
Merge pull request #50 from pskillen/paddy/chores
pskillen Mar 11, 2026
5856d3f
chore: add tmp/ and temp/ to .gitignore
pskillen-nes Mar 11, 2026
2fa1ad8
docs: add AGENTS.md for Meshtastic Bot project structure and key conc…
pskillen-nes Mar 11, 2026
f9c1725
build(local): add vscode launch.json file
pskillen-nes Mar 12, 2026
d9fe8e8
feat: implement WebSocket client for Meshflow API commands
pskillen-nes Mar 12, 2026
506a1b4
Merge pull request #52 from pskillen/bot-49/paddy/api-websocket-commands
pskillen Mar 12, 2026
04bc77d
feat: implement exponential backoff and improved logging in TcpProxy
Mar 12, 2026
dfaad66
feat: run traceroute command in a separate thread to prevent blocking
pskillen-nes Mar 12, 2026
25eff01
Merge pull request #53 from pskillen/bot-49/paddy/non-blocking-tr-com…
pskillen Mar 12, 2026
ad031a4
chore: bump github action versions
pskillen-nes Mar 11, 2026
fab8e64
Merge pull request #54 from pskillen/chore/bump-gha-versions
pskillen Mar 12, 2026
07bf607
build: update Dockerfile and GitHub workflows for improved image buil…
pskillen-nes Mar 12, 2026
87c8387
ci: add dev workflow and refactor docker build process
pskillen-nes Mar 13, 2026
533f094
Merge pull request #56 from pskillen/api-74/paddy/refactor-docker-build
pskillen Mar 13, 2026
f8cbdbe
ci: refactor Docker build workflow for multi-architecture support
pskillen-nes Mar 13, 2026
883a5d2
ci: cancel other PR builds on push
pskillen-nes Mar 13, 2026
44941b3
Merge pull request #57 from pskillen/api-74/paddy/refactor-docker-build
pskillen Mar 13, 2026
a512489
feat: add support for ignoring specific portnums in API submissions
pskillen-nes Mar 13, 2026
b875dc3
fix: enhance error handling and logging in StorageAPI and MeshtasticBot
pskillen-nes Mar 13, 2026
74c9eb7
Merge pull request #58 from pskillen/paddy/ignore-pornums
pskillen Mar 13, 2026
9fd5af4
ci: fix docker tag on release
pskillen-nes Mar 13, 2026
040d47d
Merge pull request #59 from pskillen/paddy/fix-ci
pskillen Mar 13, 2026
48fd9d9
feat: add TR_HOPS_LIMIT env var
pskillen-nes Mar 13, 2026
e05fc70
feat: add TEXT_MESSAGE_MAX_HOPS env var
pskillen-nes Mar 13, 2026
a25fbba
Merge pull request #60 from pskillen/paddy/fix-tr-high-failures
pskillen Mar 13, 2026
a7a4d78
feat: implement rate limiting for traceroute requests
pskillen-nes Mar 13, 2026
cfd08c2
Merge pull request #61 from pskillen/paddy/fix-tr-high-failures
pskillen Mar 13, 2026
ef277b2
feat: make TCP proxy cache sizes configurable via env vars
Mar 14, 2026
c5bc107
Merge upstream/main: resolved conflicts in main, bot, factory and res…
Mar 18, 2026
b25cc8f
Fix UnboundLocalError in StorageAPI response handling
Mar 18, 2026
5513938
Fix SQLite connection leak and improve IGNORE_PORTNUMS matching
Mar 18, 2026
84276c7
Merge branch 'main' into merge-upstream-preserve-features
maattm Mar 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
# The IP address of your Meshtastic node
MESHTASTIC_IP=192.168.123.123
ADMIN_NODES='!aae8900d'

# The root URL of the Meshflow API
STORAGE_API_ROOT='http://localhost:8000'
STORAGE_API_TOKEN=...

# Features
ENABLE_TCP_PROXY=true
# Handshake Cache size for TCP proxy (how many historical packets to cache to allow new clients to catch up quickly)
PROXY_HANDSHAKE_CACHE_SIZE=100
# Rolling Cache size for TCP proxy (how many recent packets to keep in the rolling buffer)
PROXY_ROLLING_CACHE_SIZE=100
ENABLE_FEATURE_NODE_TOTALS=true
FREQUENCY_OF_NODE_REPORTS=3
CHANNEL_FOR_NODE_TOTAL_BROADCAST=2

# Commands
ENABLE_COMMAND_PING=true
Expand All @@ -17,3 +25,25 @@ ENABLE_COMMAND_WHOAMI=true
ENABLE_COMMAND_PREFS=true
ENABLE_COMMAND_ADMIN=true
ENABLE_COMMAND_STATUS=true

# API Version (usually 1 or 2)
STORAGE_API_VERSION=2

# Use these if you want to upload to a second API (usually used during testing)
# STORAGE_API_2_ROOT=...
# STORAGE_API_2_VERSION=2
# STORAGE_API_2_TOKEN=...

# Use this if you want to receive commands from the Meshflow server (e.g. traceroute)
MESHFLOW_WS_URL=ws://localhost:8000

# Comma-separated portnums to skip when submitting packets to the API (e.g. custom or rejected portnums)
IGNORE_PORTNUMS=345,ROUTING_APP

# Traceroute config (for WebSocket commands)
TR_HOPS_LIMIT=5
# Min seconds between traceroutes (firmware enforces ~30s; we rate-limit client-side)
TR_MIN_INTERVAL_SEC=30

# Max hops for text messages sent by the bot (1-7, default 5)
TEXT_MESSAGE_MAX_HOPS=5
26 changes: 26 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Summary

<!--
Describe the change for the benefit of the reviewer, and for someone
who may be writing release notes

Make sure to mention any breaking changes or manual steps which need
to be performed when shipping to pre-prod or prod
-->

<!--
## Background
You can optionally add a Background section here if the change requires
more context
-->

## Testing performed

<!--
you don't need to evidence testing, but any testing relating
to this change shold be described

e.g.
* updated unit/integration tests
* manually verified in pre-prod
-->
4 changes: 2 additions & 2 deletions .github/workflows/armv7-docker-base-image-build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ jobs:

steps:
- name: Checkout Repository
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Log in to GitHub Container Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
Expand Down
34 changes: 34 additions & 0 deletions .github/workflows/dev.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: dev

on:
push:
branches:
- dev

permissions:
contents: read
packages: write

jobs:
extract-dev-tag:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v6

- name: Get short SHA
id: get_sha
run: |
SHORT_SHA=$(echo $GITHUB_SHA | cut -c1-7)
echo "VERSION_LABEL=dev-$SHORT_SHA" >> "$GITHUB_OUTPUT"

outputs:
VERSION_LABEL: ${{ steps.get_sha.outputs.VERSION_LABEL }}

build:
needs:
- extract-dev-tag
uses: ./.github/workflows/docker-build.yaml
with:
VERSION_LABEL: ${{ needs.extract-dev-tag.outputs.VERSION_LABEL }}
ENVIRONMENT: dev
144 changes: 93 additions & 51 deletions .github/workflows/docker-build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,88 +3,130 @@ name: docker-build-and-push
on:
workflow_call:
inputs:
VERSION_TAG:
VERSION_LABEL:
required: true
type: string
IS_LATEST:
required: false
type: boolean
default: false
IS_PRERELEASE:
required: false
type: boolean
default: false
ENVIRONMENT:
required: true
type: string
description: "dev | preprod | prod"

env:
IMAGE: ghcr.io/${{ github.repository }}

permissions:
contents: read
packages: write


jobs:
build-and-push:
runs-on: ubuntu-latest

build:
strategy:
fail-fast: false
matrix:
platform: [ linux/amd64, linux/arm/v7, linux/arm64 ]
include:
- platform: linux/amd64
base_image: "python:3.12"
- platform: linux/arm/v7
base_image: "ghcr.io/pskillen/meshtastic-bot-armv7-base:py3.12"
runner: ubuntu-latest
artifact: linux-amd64
- platform: linux/arm64
base_image: "arm64v8/python:3.12"
runner: ubuntu-24.04-arm
artifact: linux-arm64
runs-on: ${{ matrix.runner }}

steps:
- name: Checkout Repository
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Log in to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Log in to GitHub Container Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
context: .
platforms: ${{ matrix.platform }}
outputs: type=image,name=${{ env.IMAGE }},push-by-digest=true,name-canonical=true,push=true
build-args: |
VERSION=${{ inputs.VERSION_LABEL }}
cache-from: type=gha,scope=${{ github.ref_name }}-meshtastic-bot
cache-to: type=gha,mode=max,scope=${{ github.ref_name }}-meshtastic-bot

- name: Setup vars
- name: Export digest
run: |
PLATFORM_TAG=$(echo "${{ matrix.platform }}" | sed 's|/|-|g')
echo "PLATFORM_TAG=$PLATFORM_TAG" >> $GITHUB_ENV
mkdir -p ${{ runner.temp }}/digests
echo "${{ steps.build.outputs.digest }}" | sed 's/^sha256://' | xargs -I{} touch "${{ runner.temp }}/digests/{}"

- name: Build and Push Docker Image
run: |
docker buildx build \
--platform ${{ matrix.platform }} \
--build-arg BASE_IMAGE=${{ matrix.base_image }} \
-t ghcr.io/${{ github.repository }}:${{ inputs.VERSION_TAG }}-${{ env.PLATFORM_TAG }} \
--push .
- name: Upload digest artifact
uses: actions/upload-artifact@v4
with:
name: digests-${{ matrix.artifact }}
path: ${{ runner.temp }}/digests/*
retention-days: 1

create-manifest:
merge:
needs: build
runs-on: ubuntu-latest
needs:
- build-and-push

steps:
- name: Log in to GitHub Container Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Create and Push Multi-Arch Manifest
run: |
docker buildx imagetools create \
-t ghcr.io/${{ github.repository }}:${{ inputs.VERSION_TAG }} \
ghcr.io/${{ github.repository }}:${{ inputs.VERSION_TAG }}-linux-amd64 \
ghcr.io/${{ github.repository }}:${{ inputs.VERSION_TAG }}-linux-arm-v7 \
ghcr.io/${{ github.repository }}:${{ inputs.VERSION_TAG }}-linux-arm64

- name: Tag as Latest or RC
if: ${{ inputs.IS_LATEST == true }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4

- name: Download digest artifacts
uses: actions/download-artifact@v4
with:
path: ${{ runner.temp }}/digests
pattern: digests-*
merge-multiple: true

- name: Create and push multi-arch manifest
working-directory: ${{ runner.temp }}/digests
run: |
if [[ "${{ inputs.IS_PRERELEASE }}" == "true" ]]; then
DIGEST_REFS=$(printf "${{ env.IMAGE }}@sha256:%s " *)
if [ "${{ inputs.ENVIRONMENT }}" = "dev" ]; then
docker buildx imagetools create -t ${{ env.IMAGE }}:latest-dev ${DIGEST_REFS}
elif [ "${{ inputs.ENVIRONMENT }}" = "preprod" ]; then
docker buildx imagetools create \
-t ghcr.io/${{ github.repository }}:latest-rc \
ghcr.io/${{ github.repository }}:${{ inputs.VERSION_TAG }}
-t ${{ env.IMAGE }}:${{ inputs.VERSION_LABEL }} \
-t ${{ env.IMAGE }}:latest-rc \
${DIGEST_REFS}
else
VERSION="${{ inputs.VERSION_LABEL }}"
MAJOR=$(echo "${VERSION}" | cut -d. -f1)
MINOR=$(echo "${VERSION}" | cut -d. -f2)
docker buildx imagetools create \
-t ghcr.io/${{ github.repository }}:latest \
ghcr.io/${{ github.repository }}:${{ inputs.VERSION_TAG }}
-t ${{ env.IMAGE }}:${VERSION} \
-t ${{ env.IMAGE }}:latest \
-t ${{ env.IMAGE }}:${MAJOR} \
-t ${{ env.IMAGE }}:${MAJOR}.${MINOR} \
${DIGEST_REFS}
fi

cleanup:
runs-on: ubuntu-latest
needs:
- build
- merge
if: always() && !cancelled() && needs.merge.result == 'success'
steps:
- name: Delete untagged images
uses: Chizkiyahu/delete-untagged-ghcr-action@v6.1.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository_owner: ${{ github.repository_owner }}
package_name: meshtastic-bot
owner_type: user
untagged_only: true
34 changes: 34 additions & 0 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Release main

on:
push:
branches:
- main

permissions:
contents: read
packages: write

jobs:
extract-dev-tag:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v6

- name: Get short SHA
id: get_sha
run: |
SHORT_SHA=$(echo $GITHUB_SHA | cut -c1-7)
echo "VERSION_LABEL=main-$SHORT_SHA" >> "$GITHUB_OUTPUT"

outputs:
VERSION_LABEL: ${{ steps.get_sha.outputs.VERSION_LABEL }}

build:
needs:
- extract-dev-tag
uses: ./.github/workflows/docker-build.yaml
with:
VERSION_LABEL: ${{ needs.extract-dev-tag.outputs.VERSION_LABEL }}
ENVIRONMENT: dev
29 changes: 0 additions & 29 deletions .github/workflows/manual-release.yaml

This file was deleted.

4 changes: 4 additions & 0 deletions .github/workflows/pull-request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ name: pull request
on:
pull_request:

concurrency:
group: pr-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
UnitTest:
uses: ./.github/workflows/unit-tests.yaml
Loading
Loading