v0.9.0
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, .deb packaging, 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-arch Docker images with SBOM and provenance attestation published on each release.
- Ncurses config TUI (
scripts/config_tui.py) for interactive configuration setup. - Bot admin HTTP server with
reload_config.shfor runtime config reloads without a full restart. - Initial automated test suite with pytest, coverage gates, and lint gates (ruff, mypy, shellcheck); Makefile bootstrap for local development.
Bug Fixes
- Upgrading
meshcoreto>= 2.3.6fixes a crash on negativeout_path_lenvalues (#126) and eliminatesKeyError('msg_hash')asyncio parser spam (#83). max_response_hopsdefault lowered from 10 to 7 to reduce mesh congestion (#161).- Shutdown sequence hardened: single stop path, viewer cleanup, MQTT log teardown, and scheduler drain before exit.
- Command aliases moved to per-command
aliases =config keys; global[Aliases]section removed. - Purging log now records
public_keyandnamefields for full audit trails. - Strict modes for restricting upload of corrupt on the wire packets to MQTT servers.
- Fixes to field persistence in the Feeds service configuration panel.