MeshCore Bot · Releases
from GitHub · updated 2026-06-2318 releases
v0.9.3 # 24 days ago · 2026-05-31 00:34 UTC
It was discovered that if the bot webhook was feeding a Discord channel via a webhook, sending messages to
@everyone,@here, etc. would tag all users in the Discord. This is fixed.Full Changelog: https://github.com/agessaman/meshcore-bot/compare/v0.9.2...v0.9.3
v0.9.2 # 1 month ago · 2026-05-17 21:44 UTC
What's Changed
- Fix scope handling behavior and improve logging options for packet capture service. by @agessaman in https://github.com/agessaman/meshcore-bot/pull/185
Full Changelog: https://github.com/agessaman/meshcore-bot/compare/v0.9.1...v0.9.2
v0.9.1 # 1 month ago · 2026-05-16 19:55 UTC
Highlights
This release has improvements to regions handling, fixes for a couple of deadlock issues in the scheduler that might cause the bot to become unresponsive, and bugfixes in various areas.
- Regions flood scope end-to-end: per-service config, scheduled messages, webhook body override, and correct scope on keyword/RandomLine replies.
- Scheduler overhaul: 5-field cron and
@presets (HHMM deprecated), optional per-job#scope, stagger for colliding jobs, better concurrency. - DARC MoWaS reliability: bit-identical retransmits with stable timestamps; ascending timestamps on multi-chunk sends.
- Path & test commands: optional reply prefix, gated repeater naming by bytes/hop, customizable
test/ttemplates with pipe filters.
Features
Scheduling
[Scheduled_Messages]supports cron (0 8 * * *), presets (@daily,@hourly, …); legacyHHMMstill works with a warning. (Note: APScheduler Day of Week starts on Monday unlike Vixie cron, so Monday = 0.)- Per-job regional scope:
channel:#scope:message(middle field must start with#). - Added optional
scheduled_message_max_stagger_secondsto spread out jobs that fire at the same time; scheduled sends skip globalrate_limit_seconds(channel andbot_tx_rate_limitstill apply).
Flood scope
CommandManager.resolve_channel_send_scope()with precedence: explicit arg →message.reply_scope→ sectionflood_scope→[Channels] outgoing_flood_scope_override.- Optional
flood_scopeon Weather, Earthquake, Webhook, DARC MoWaS, and related services; webhook JSON may include"flood_scope": "#scope". - Keyword and RandomLine channel replies use
send_responseso incoming regional scope is honored. #178
Commands
- Path:
reply_prefix(first chunk only when split) allows you to add@[{sender}]or similar to first reply.minimum_path_bytes(2/3) defers DB name lookup on paths with single byte path hashes, this is useful to avoid returning inaccurate information in dense meshes with highly duplicated single-byte prefixes. - Test:
[Test_Command] response_formatoverrides[Keywords] test; pipe filters (pathbytes_min,prefix_if_nonempty). This enables things like not returning values unless conditions are met. Example that only returns path distance if multibyte paths are used:
response_format = ack @[{sender}]{phrase_part} | {path}{path_distance|pathbytes_min:2|prefix_if_nonempty: | Path Dist: } | F/L Dist: {firstlast_distance} | Rec: {timestamp}Packet capture / MQTT
- Added global
jwt_ttl_secondsand per-brokermqttN_jwt_ttl_seconds/mqttN_jwt_renewal_intervalfor token lifetime vs refresh cadence. This enables JWTs with a TTL shorter than 24 hours.
DARC MoWaS
- Retransmissions reuse the original timestamp for network deduplication; chunk sends get
base + indexsecond timestamps.
Other
send_channel_message(..., timestamp=...)for bit-identical channel replays.- Service display names strip trailing underscores (e.g.
foo_Service→foo, notfoo_).
Fixes
- DM routing: responses use
sender_pubkeywhen available (avoids misrouting when display names collide). Thanks for raising this @Tigro14 in #180 - Scheduler / feeds: fire-and-forget scheduled processing; feed send lock avoids coroutine pileup; per-feed last-send tracking.
- Mesh graph:
flush_neededflag reduces redundant flush calls and a deadlock risk. - Contact adverts:
track_contact_advertisementreturns structured success/duplicate status for clearer handler logic. - DARC MoWaS / webhook: chunk timestamp ordering; webhook scope resolution cleanup.
Configuration notes
Area Action Scheduled messages Prefer cron over HHMM; usechannel:#scope:bodyfor regional sends.MQTT brokers with short-lived tokens Set jwt_ttl_secondsand renewal interval below TTL per broker.… v0.9.0 # 2 months ago · 2026-05-03 05:20 UTC
v0.9.0 Release Notes
v0.9.0 is a release focused on stability and enhancing and refining existing features. It adds features to the web dashboard, rewrites the scheduler on APScheduler for improved reliability, and introduces radio-health monitoring. It also adds versioned database migrations, multi-arch Docker images,
.debpackaging, async guard rails, and several new commands. Python 3.9 is no longer supported; the minimum is now 3.10.Thanks to @KG7QIN for the work on adding tests and working on radio reliability.
Web Viewer
- Optional authentication for the admin dashboard
- Updated live streams for packets, commands, messages, and logs.
- Admin config editor lets operators view and edit
config.inifrom the browser, with automatic password redaction and CSRF protection. - Contact management, DB backup management, maintenance tools, and an API Explorer tab are all available from the viewer.
- Zombie-radio and radio-offline banners surface hardware status on every page; channel-name validation and live update-feed controls added.
- The viewer starts with an "initializing" banner during bot startup and polls for live status without blocking the bot.
Radio Reliability
- Zombie-radio detection periodically probes the radio with a health check; unresponsive radios trigger a configurable alert and banner.
- Radio-offline fail state suppresses outbound sends until the radio reconnects, then resumes normally.
asyncio.wait_forguards wrapsend_advert,disconnect_radio, andreboot_radioto prevent event-loop lockups.- A debounce guard prevents the packet-capture service from storm-restarting during radio reconnects.
- Radio debug logging can be toggled from the web UI at runtime without a restart.
Scheduler & Database
- Scheduler rewritten on APScheduler; a new maintenance module handles housekeeping tasks independently.
- Graceful shutdown and config reload are signal-driven (
SIGTERM/SIGHUP). - Database layer migrated to
aiosqlitewithAsyncDBManagerand versioned migrations;ALTER TABLEstartup migrations run safely without data loss. - Background polling operations (feed polling, channel/radio ops) use fire-and-forget callbacks to avoid blocking the scheduler thread.
Commands
!versionreports the running bot version;!schedulelists scheduled messages and the current advert interval.!pathgains a geographic scoring toggle and corrected multibyte chart rendering.- Weather: high/low temperatures, MQTT weather source, Open-Meteo model selection, configurable default city, multi-day forecasts, and location fallback.
- Airplane results are configurable via
max_results. - Additional keyword-triggered auto-responses via the RandomLine matcher; a BSD fortune file ships as default data.
Bridges & Integrations
- Discord bridge now supports multiple webhooks per channel, configurable per channel key.
- Discord and Telegram outbound helpers added for cross-service notification delivery.
- Repeater discovery and collision alerts service with optional delivery to mesh or external notification services (Discord/Telegram).
- Inbound webhook relay accepts external HTTP POST events with bearer-token authentication and forwards them to mesh channels.
- MQTT packet publishing controls added with configurable path-length decoding.
Security & Rate Limiting
- SSRF hardening added to all outbound HTTP calls, including an explicit CGN-network check; an
allow_local_smtpflag enables opt-in local SMTP relay. - Log-injection sanitization applied to all user-supplied log lines; a CI regression check guards against regressions.
- CSRF protection added to the web viewer admin editor.
- Per-channel rate limiting and tightened per-user cooldown defaults; thread-safe rate limiter with LRU SNR/RSSI caches.
Packaging & Infrastructure
.debpackaging viascripts/build-deb.shfor systemd-based deployments.- Multi-ar …
v0.8.3 # 3 months ago · 2026-03-12 03:57 UTC
This release adds support for parsing multi-byte paths across the bot.
- Adds a
tracecommand (and its companiontracer, trace reciprocal) that enables the bot to perform traces. - Adds a new RandomLine matcher for file-based command responses. Thanks Ian!
- Adds data-retention rules for all databases and purges old records periodically.
- Added Earthquake notification service. Thanks davidkjackson54!
- Adds a Bot → Telegram bridge that enables messages from one or more channels to be posted to Telegram
- Adds a profanity and hate symbol filter to prevent bad actors on the mesh from getting your Discord banned.
- Adds support for local service plugins in a separate directory for easy backups. Thanks for the suggestion and testing davidkjackson54
- Adds a
v0.8.2.1 # 4 months ago · 2026-02-22 20:04 UTC
Small bugfix release that fixes a configparser error for users using Python 3.13+
v0.8.2 # 4 months ago · 2026-02-21 17:54 UTC
- Added a version indicator to the bottom of the Web Viewer
- Added ability to filter by packet type in Packet Capture Service.
- Improved mesh graph efficiency, added documentation for how to configure mesh graph calculations (or disable it) on lightweight nodes like Raspberry Pi Zero 2s.
- Simplify contact removal logic. Occasional errors will still occur until race condition in meshcore_py
- Improvements to documentation.
v0.8.1 # 4 months ago · 2026-02-18 18:01 UTC
A couple little fixes.
Fixed logic in multitest command to avoid having a subsequent request block both test requests. Fixed issue with per-user rate limit that prevented second message responses from commands from being sent.
v0.8 # 4 months ago · 2026-02-17 00:50 UTC
Release notes
New commands & features
- Aurora — New command for aurora/space weather (NOAA client).
- Airplanes — Aircraft tracking command.
- Reload — Admin command to reload configuration without restarting the bot.
- Command prefix — Optional prefix for bot commands (e.g.
!path). - Sub-commands & help — Commands can expose sub-commands and clearer usage/help; help respects channel restrictions and avoids truncation issues.
- Polish — Polish translation added (with thanks to the contributor).
Path & mesh
- Path command — Graph-based path validation using observed mesh links; presets:
balanced,geographic,graph. SNR integration, “prefix best location,” and improved multitest with per-user sessions and path tracking. - Mesh graph — New mesh graph logic and mesh view in the web viewer (connections, highlighting, sync).
- Contacts (web) — Time filtering, path sorting, bulk delete, starred nodes, and automatic device name updates.
Weather
- WXSIM — Support for custom WXSIM weather sources in
wx_commandand international weather. - Global weather — ZIP code geocoding and companion location features.
Configuration & behavior
- Config validation —
validate_config.pyand validation inmodules/config_validation.py; standardized command sections (e.g.[Joke_Command]withenabled); legacy*_enabledstill supported. - Rate limiting — Per-user rate limiting for bot responses.
- Channel keyword filtering — Configurable channel filtering for keyword responses.
- Banned users — Prefix (starts-with) matching for banned user entries.
- Feed manager — Dedicated
[Feed_Manager]section; optional RSS/API feeds. - Config file — UTF-8 support and quoted values for monitor channels.
Web viewer
- Mesh graph view, improved error handling and database path handling, favicons, realtime view.
- Service health checks — Optional checks and restart logic for the viewer.
Docker & deployment
- Docker — Dockerfile,
docker-compose.yml, anddocker-setup.shfor device detection, paths, and serial handling. Docs indocs/DOCKER.md. - Install script —
install-service.shsupports Python venv and clearer echo formatting. - CI — GitHub Actions for Docker build, tests, and docs;
devbranch supported.
Under the hood
- Command queuing for global cooldowns; escape sequence decoding for greetings and keyword responses; transmission and repeat tracking; unique advert packet tracking and leaderboard.
- Tests — pytest suite (commands, config validation, rate limiter, mesh graph, path resolution, etc.).
- Docs — MkDocs site and guides: getting started, configuration, path command config, upgrade, Docker, FAQ.
- Website generator —
generate_website.pywith dynamic styling and sample generation.
Upgrade
- Existing configs remain valid. See docs/UPGRADE.md for optional migrations (e.g.
[Joke_Command],[Feed_Manager],[Path_Command]) and the banned-users prefix-matching behavior.
Contributions
- Feature: Add Polish translation (pl) 80% by @smithpl2000 in https://github.com/agessaman/meshcore-bot/pull/40
- Web_Viewer: fix loading of db_path from config by @Mateusz-Krajewski in https://github.com/agessaman/meshcore-bot/pull/43
- Respond to only
wxandgwxcommand with usage. by @jeroenvermeulen in https://github.com/agessaman/meshcore-bot/pull/50
New Contributors
- @smithpl2000 made their first contribution in https://github.com/agessaman/meshcore-bot/pull/40
- @Mateusz-Krajewski made their first contribution in https://github.com/agessaman/meshcore-bot/pull/43
- @jeroenvermeulen made their first contribution in https://github.com/agessaman/meshcore-bot/pull/50
Full Changelog: https://github.com/agessaman/meshcore-bot/compare/v0.7...v0.8
v0.7 # 5 months ago · 2026-01-11 19:35 UTC
Release Notes
New Features
- Service Plugin Architecture: Implemented service plugin system for background services that run alongside the bot
- Packet Capture Service: Captures packets from MeshCore network and publishes to MQTT brokers for analyzer.letsmesh.net
- Map Uploader Service: Uploads node adverts to map.meshcore.dev with signed data authentication
- Weather Service: Scheduled weather forecasts, NOAA alert monitoring, and regional lightning detection via MQTT
- Discord Bridge: New service plugin to post channel messages to Discord with message queuing and rate limiting for webhook posts
- Command Enable/Disable: Individual commands can now be enabled/disabled via configuration
- Sports Data Clients: Added ESPN and TheSportsDB API clients for sports command functionality
- System Health Monitoring: New
/api/system-healthendpoint for system status reporting - Minimal Configuration: New
config.ini.minimal-examplefor users who only need core testing commands - Announcements Command: New command for admin triggered announcements
- Magic 8 Command: Added magic 8-ball command for fun responses (thanks @lincomatic)
- Enhanced Packet Decoding: Web viewer packet stream now supports packet analysis using
meshcore-decoder - Nix/NixOS Support: Added Nix flake infrastructure with NixOS module for declarative system-wide deployments (thanks @tbaumann)
- Web Viewer NixOS Option: Added
services.meshcore-bot.webviewer.enableoption for NixOS deployments (thanks @tbaumann)
Bug Fixes
- Segfault Prevention: Fixed potential segfaults by deep copying event payloads in ChannelManager and service plugins
- Path Decoding: Fixed path decoding logic to better handle single nodes and hex values
- Weather Emoji Truncation: Improved weather string handling to prevent emoji truncation
- Database Connections: Fixed database connection handling and timeout issues
- Keyword Reporting: Fixed keyword reporting to web viewer
- Error Handling: Improved error handling and logging across multiple modules
Improvements
- Python Packaging: Migrated to
pyproject.tomlwith proper entry points (meshcore-bot,meshcore-viewer) (thanks @tbaumann) - Code Quality: Added type hints and docstrings across modules
- Cooldown Management: Refactored to centralized cooldown tracking system in BaseCommand
- Location Resolution: Improved location name resolution from database using public keys
- Weather Data: Improved weather forecast formatting and data retrieval in international weather command
- Async Handling: Improved asyncio event loop handling to prevent deadlocks
- Internet Connectivity: Implemented thread-safe caching for internet connectivity status
- MQTT Handling: Improved non-blocking MQTT connection handling in service plugins
- Logging: Added rotating file handlers and improved error reporting
- Web Viewer: Improved stability by logging stdout/stderr to files instead of PIPE
- Database Management: Optimized database cleanup with smaller batch deletions to reduce lock contention
- Message Processing: Improved message content processing by stripping trailing whitespace
- Help Command: Added dynamic command list based on usage statistics
Configuration Changes
- Added
--configparameter support for both main bot and web viewer - New service plugin configuration sections:
[PacketCapture],[MapUploader],[Weather_Service],[Discord_Bridge] - Added
db_pathconfiguration options for web viewer - Updated JWT renewal interval to 24 hours
- Added command-specific enable/disable options
Dependencies
- Added:
urllib3>=2.0.0,paho-mqtt>=1.6.0,cryptography>=41.0.0,pynacl>=1.5.0 - Updated Python dependencies across the board
New Contributors
- @lincomatic made their first contribution in https://github.com/agessaman/meshcor …
v0.6.1 # 6 months ago · 2025-12-20 23:17 UTC
- Improved security and enhanced warnings of insecure elements. Thanks @eddieoz!
- Improved path guessing algorithm.
- Added dark mode.
- Improved service installation and added upgrade mode to update existing service integrations.
- Improvements to WebViewer stats and mobile accessibility, introduced limited channel management tool
- Improved sports command logic for game selection.
- Added path length placeholder options for test command.
- Improved reliability of NOAA weather reports.
v0.6 # 7 months ago · 2025-12-03 04:12 UTC
This version adds these new features:
- calculation of packet hashes for deduplication of nodes
- the addition of an automated greeter command with an onboarding period to avoid spamming existing active members
- improved localization of bot commands
- commands have a generic per-channel configuration, instead of requiring custom code to work outside of the standard channels, this allows per-command channels
This version adds the following improvements:
- the weather command now has better hourly updates
- improvements to score extraction in the sports command
- better installation scripts
- WebViewer UI improvements
- delete contacts from the contacts database
- override the path guessing weighting for key infrastructure nodes
- cleaned up dashboard to make stats more useful
- improve multi-test command response format
v0.5 # 7 months ago · 2025-11-22 03:39 UTC
Added localization to all commands.
Used machine translation of strings into German, British English, Spanish, French Canadian, Dutch, Portuguese and Brazilian Portuguese. Any assistance with native-speaker localization would be appreciated.
Added wx tomorrow and wx #day commands.
Implemented a globally accessible weather API using OpenMeteo, currently running as gwx. Command structure is the same as wx command.
Added command overrides. If you want to make modifications to a command, you can duplicate the file into ./modules/commands/alternatives and they will override existing commands with the same name field. If you change
name = "gwx"toname = "wx"the example global weather command will unload the standard wx command in favor of your replacement.Used path guessing logic to estimate path lengths in test messages. New placeholders are {path_distance} for the estimated total path traveled, and {firstlast_distance} for the distance between the first and last known repeater.
Fixed an issue where we weren't initiating the packet_stream table for the WebViewer integration.
Several bug fixes, and sadly probably several more bugs. This is a work in progress.
v0.4 # 8 months ago · 2025-10-22 05:13 UTC
This version does some internal clean-up on the databases. A new contact database will be populated when you launch this version for the first time.
- Added processing of all adverts and discovery events. All contact data is stored information in database
- Added repeater geolocation data in the prefix command
- Added logic in the path command to try to deconflict prefixes in path based on distance and node advert age
- Significantly speeds up channel loading during bot startup. Detects all channels now, regardless of empty slots.
- Add web viewer with dashboard that runs in a separate process and provides stats, contact information and
- Various code structure and import improvements to core bot and command modules to support integration
- Add ACL support to restrict access to sensitive commands to DMs from known public keys
- Updated example config.ini files—to use some of the new features, you will need to update your config.ini. The Web_Viewer, Path_Command, Prefix_Command, and Admin_ACL sections have been added, and are necessary for full functionality of the bot.
v0.3 # 9 months ago · 2025-10-10 04:17 UTC
- Added channels command to share common hashtag channels, configurable in config.ini
- Added option to geolocate repeaters in output of the prefix command
- Cleaned up config.ini.example to reflect recent changes
- Revised path command to improve consistency of decoding and output.
- Improved ZIP code handling for aqi command
- Added responses for emoji greetings
- Improved sports command to format soccer home/away properly
- Added dice and roll commands for increased randomness
- Improved plugin architecture so command configuration is handled in config.ini and commands code is held in individual files
v0.2 # 10 months ago · 2025-09-08 02:55 UTC
Enhanced DM Reliability with meshcore-2.1.6
- NEW: Implemented
send_msg_with_retryfor Direct Messages using meshcore-2.1.6 - NEW: Automatic ACK confirmation for all DM sends
- NEW: Configurable retry parameters with intelligent fallback
- NEW: Path optimization and flood mode fallback for failed deliveries
- NEW: Enhanced DM logging with success/failure indicators
Advanced Prefix Command System
- NEW:
prefix <XX>command to query repeater prefixes via API - NEW:
prefix refreshsubcommand to manually refresh API cache - NEW:
prefix freecommand to list available (unused) prefixes - NEW: SQLite database fallback when API is unavailable
- NEW: 1-hour in-memory caching for API responses
- NEW: Dynamic API source detection in responses
- NEW: Random selection of free prefixes for better distribution
Command Matching Precision
- FIXED:
prefixcommand now only matches at the beginning of messages - FIXED:
t_phrasecommand restricted to beginning of message (torT) - FIXED:
@command no longer triggers on "at" in middle of messages - FIXED:
repeatercommand restricted to DM-only and beginning of message - IMPROVED: All commands now use precise keyword matching
- NEW: Implemented
v0.1.1 # 10 months ago · 2025-09-06 19:14 UTC
Some additional cleanup to remove test files, etc.
v0.1 # 10 months ago · 2025-09-06 19:05 UTC
It wasn't a bot, then it was... forgive my hacking.