MeshCore Ninja Alpha
All software
MeshCore Bot

MeshCore Bot

Bot Stable

agessaman 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

  • Docker Compose docker compose up -d --build Open ↗
  • NixOS Flake meshcore-bot Open ↗
  • Bare metal Python / systemd sudo ./install-service.sh Open ↗
  • Source Open ↗

Releases

from GitHub · updated 2026-06-23
  1. v0.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

  2. v0.9.2 # 1 month ago · 2026-05-17 21:44 UTC

    What's Changed

    Full Changelog: https://github.com/agessaman/meshcore-bot/compare/v0.9.1...v0.9.2

  3. 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/t templates with pipe filters.

    Features

    Scheduling

    • [Scheduled_Messages] supports cron (0 8 * * *), presets (@daily, @hourly, …); legacy HHMM still 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_seconds to spread out jobs that fire at the same time; scheduled sends skip global rate_limit_seconds (channel and bot_tx_rate_limit still apply).

    Flood scope

    • CommandManager.resolve_channel_send_scope() with precedence: explicit arg → message.reply_scope → section flood_scope[Channels] outgoing_flood_scope_override.
    • Optional flood_scope on Weather, Earthquake, Webhook, DARC MoWaS, and related services; webhook JSON may include "flood_scope": "#scope".
    • Keyword and RandomLine channel replies use send_response so 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_format overrides [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_seconds and per-broker mqttN_jwt_ttl_seconds / mqttN_jwt_renewal_interval for 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 + index second timestamps.

    Other

    • send_channel_message(..., timestamp=...) for bit-identical channel replays.
    • Service display names strip trailing underscores (e.g. foo_Servicefoo, not foo_).

    Fixes

    • DM routing: responses use sender_pubkey when 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_needed flag reduces redundant flush calls and a deadlock risk.
    • Contact adverts: track_contact_advertisement returns 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; use channel:#scope:body for regional sends.
    MQTT brokers with short-lived tokens Set jwt_ttl_seconds and renewal interval below TTL per broker.
Show all 18 releases →

Project signals

popularity 2026-06-23 verification 2026-06-23
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.

Tags