MeshCore Bot
Bot Stableagessaman bot
Extensible Python MeshCore service bot with keyword and plugin commands, weather and alert services, scheduling, rate limits, web administration and optional Discord, Telegram, MQTT, webhook and map integrations.
- Maintainer
- agessaman ↗
- Kind
- Bots
- Maturity
- Stable
- Languages
- Python JavaScript HTML
- Licensing
- Source available
- Latest version
- 0.9.3 · 2026-05-31
- Platforms
- Linux Docker NixOS Web
Capabilities
Interfaces
- ✓ Web
- ✓ TUI
- ✓ API
- ✓ Headless
Connections
- ✓ BLE
- ✓ Serial
- ✓ USB
- ✓ TCP
- ✓ MQTT
- ✓ HTTP
- ✓ WebSocket
Capabilities
- ✓ Messaging
- ✓ Contacts
- ✓ Channels
- ✓ Remote administration
- ✓ Monitoring
- ✓ Telemetry
- ✓ Packet analysis
- ✓ Automation
- ✓ Notifications
- ✓ Bridging
Node roles
- ✓ companion
- ✓ repeater
Install
Releases
from GitHub · updated 2026-06-23v0.9.3 # Latest 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.…
Project signals
- GitHub stars
- 163
- Forks
- 63
- Watchers
- 6
- Open issues
- 31
- Contributors
- 13
- Latest downloads
- 0
- Source available
- Yes
- Releases available
- Yes
- Signed releases
- No
- CI builds
- Yes
- Documentation
- Yes
- The project warns operators to avoid duplicate bots and constrain response scope to protect mesh airtime.
- The repository does not currently declare an SPDX license.