Creating the Meshtastic Listener

I've enjoyed radio dating back to my college days, but never had the chance to fully dive into the field. That was until I stumbled upon a Meshtastic video by Geerling Engineering. I did some prior research on LoRa during my master's program long before Meshtastic was a thing and it immediately sparked my interest. I picked up my first Heltec V3 in July of 2023 and got to work.

The radios sat mostly unused on my desk for several months as I waited to make first contact. I finally moved the radio to my front window and I was suddenly inundated with messages from the local mesh network. I would later join a community called Mountain Mesh where I got the idea to create my own Bulletin Board System.

GitHub

Humble Beginnings

I started laying the groundwork for the BBS after finding a repo by brad28b called meshtastic-cli-receive-text. It gave me the foundational knowledge of seeing how the Meshtastic pub/sub topic worked and getting a chance to test it out. My initial commit for the repo was on January 24, 2025

The BBS started out with only a few commands:

  • !help - print out instructions on how to use the BBS

  • !read - read all messages posted to the BBS

  • !post - post a message to the BBS

  • !reply - Tell the server to send signal metrics and hops (like traceroute, but simpler)

From SQLite3 to Postgres

The BBS started out using a SQLite3 database on the backend. This was convenient and lightweight and honestly would do just fine in production. However, viewing and modifing the data got to be a little tiresome. I had to SCP into the test node I had running to pull the .db file every time I wanted to review the node's status. I eventually migrated the backend to a Postgres instance using a docker-compose file.

I'll be the first to admit, this is HUGELY overkill for what the DB was being used for. However, I needed to learn the database for a work project and this seemed like a great opportunity to get my feet wet. That, as well as SqlAlchemy.

The main benefit from this migration is that now I can view all of the database content using my web browser using an Adminer instance in the same docker compose file.

I've also added some features including a FastAPI server to display an OpenStreetMap of all local nodes and the connections between them. Having all of the data stored in a dedicated container has been super helpful in getting this working too.

A Change in Direction

I left an early version of my BBS running on my local node as well as on an infrastructure node on a nearby mountain for several weeks. No surprise, no one used it. I also realized that there are multiple Meshtastic BBS softwares out there including the fantastic The Comms Channel BBS.

The Meshtastic Listener did continue to evolve though. I added features to periodically traceroute specific infrastructures nodes and keep an eye on channel usage. I realized pretty quickly that I was using those network monitoring and notification features far more than the BBS. I brainstormed with fellow developers and came up with some ideas including:

  • Environment monitoring (humidity and temperature)

  • Traceroute success percentages

  • Battery trends over time

  • Channel usage

What's also useful is that the radio will store and forward any direct messages to it's administrator nodes. We store all notifications in the Postgres DB and wait for any packet from an admin node. We attempt a transmission to the admin nodes a maximum of 5 times and wait for a message receipt from the node in question.

I did repurpose some of the "legacy" BBS code to allow users to send a !c comand to get the current health check of the node in question. An example output is below. The data included in this payload is summarized over the past 6 hours.

2025-06-27 00:54
CH USAGE: 2.82%
TR SENT: 55
TR ACK: 15
TEMP: 35°C
HUMIDITY: 35%