George 25ada1023d fix: correct traceroute path orientation when building graph edges (#162)
* fix: correct traceroute path orientation when building graph edges

A completed traceroute is observed as a response packet, whose from/to are
reversed with respect to the path being traced: `to` is the node that started
the traceroute and `from` is the node that answered. Meshview assembled paths
as [from, *route, to], so both endpoint-adjacent edges were wrong for every
completed traceroute with at least one intermediate hop. Because the false
edges always attach to the endpoints, a busy initiator or gateway accumulated
false direct links to every remote target it ever traced.

Confirmed against TraceRouteModule::alterReceivedProtobuf, which renders a
response as printRoute(r, p.to, p.from, false), against the meshtastic python
CLI, which starts the forward path at p["to"] and the return path at p["from"],
and against real recorded traceroutes where a request's route[] is a prefix of
the matching response's route[].

Add meshview/traceroute.py and use it from /api/edges, /api/traceroute and
graph_traceroute, which had three separate copies of this logic that had all
drifted. /api/traceroute also gains initiator/target so the traceroute page
stops re-deriving the endpoints itself, which is where a fourth copy lived.

While in /api/edges, skip the NODENUM_BROADCAST placeholders that
insertUnknownHops() writes into route[] (they became a pseudo-node hub in the
graph) and guard against the (gateway, gateway) self edge that
graph_traceroute already guarded against.

* fix: do not invent links across unknown hops or unfinished returns

Review of becf4a8 found two remaining path errors.

Dropping NODENUM_BROADCAST from route[] during assembly joined the nodes
either side of it, so A -> B -> ? -> C -> D became A -> B -> C -> D and a
lone unknown hop collapsed into a false direct A -> D. Keep the placeholder
in the path and skip the edges that touch it instead. On a 2660 row sample
this removes 10 links that do not exist.

done=True only means a response was observed, not that it arrived. A gateway
usually reports one still travelling home with route_back holding just the
hops so far, so always appending the initiator claimed a final link that was
never seen. Append it only when the response reached the initiator, which the
spare snr_back entry from SNRonly=isToUs() marks. Note this is rare in
practice: 2 of 303 real responses, since the entry is added by the initiator
and gateways see packets in flight.

The deduplicated unique_forward_paths and unique_reverse_paths carry no
per-observation provenance, so the traceroute page can no longer tell which
of them reached the far endpoint. It now adds only the adjacent endpoint.

* fix: treat a response as proof the forward path reached the target

Winning path selection required return hops, so a response observed before
its first return hop contributed nothing and the page fell back to the
deduplicated reported paths, which cannot tell which of them reached the
target. A response with route=[B,C] and no route_back rendered A > B > C,
losing the target and the last link.

Select winning paths from response observations instead. A response only
exists because the request arrived, whatever its return trip went on to do.
Dropping the non-empty forward_hops guard at the same time means a zero hop
response contributes its real direct link, so a fully direct traceroute and a
completed direct return are no longer excluded from the graph.

Mark reported forward paths that some response reported, so the page can
close those on the target and they deduplicate against the winning path
instead of drawing a shorter copy underneath it.
2026-09-08 10:30:27 -07:00
2026-05-25 09:07:59 -07:00
2026-05-29 13:39:04 -07:00
2025-06-03 10:37:26 -07:00
2026-05-29 13:39:04 -07:00
2026-05-12 15:51:10 -07:00
2025-09-24 20:13:28 -07:00
2026-01-25 13:34:26 -08:00
2026-06-04 17:16:11 -07:00
2024-05-09 20:00:00 -07:00
2026-05-29 13:39:04 -07:00
2026-01-15 14:42:18 -08:00
2026-02-09 21:17:22 -08:00
2026-06-11 16:16:08 -07:00

Meshview

Start Page

The project serves as a real-time monitoring and diagnostic tool for the Meshtastic mesh network. It provides detailed insights into network activity, including message traffic, node positions, and telemetry data.

Version 3.0.7 — May 2026

  • Reliability report: added a dedicated reliability page for checking how well a selected node is heard across the mesh, including heard/missed status, packet counts, hop counts, gateway tables, and a map view.
  • Node list/map UX: added node list filtering for wider active-node ranges, included all database nodes where appropriate, and made map node colors persistent across reboots.
  • QR/API fixes: corrected QR code generation when a node role is missing or unavailable.
  • Database cleanup: removed stored node public key data and added the Alembic migration to drop node.public_key.
  • Protobufs: refreshed Meshtastic protobuf Python modules to upstream commit
  • Tooling: improved the protobuf updater so it supports raw commit SHAs, the newer upstream meshtastic/*.proto layout, generated .pyi stubs, and the vendored nanopb/serial_hal outputs.

Version 3.0.6 — March 2026

  • Daily snapshots: added the daily_snapshot table, scheduled snapshot capture, and /api/snapshots/daily for historical node, packet, and gateway counts.
  • Stats/UI: expanded stats views with snapshot data and added channel filters to Chat and Firehose.
  • Map/node fixes: corrected node location handling, map popup behavior, packet page display, and node list sorting.
  • Ingestion/API reliability: improved duplicate PacketSeen handling, guarded invalid node info packets, and made traceroute/edge APIs more tolerant of decode failures.
  • Language support: added Russian translations.

Version 3.0.5 — February 2026

  • IMPORTANT: the predicted coverage feature requires the extra pyitm dependency. If it is not installed, the coverage API will return 503.
    • Ubuntu install (inside the venv): ./env/bin/pip install pyitm
  • Coverage: predicted coverage overlay (Longley‑Rice area mode) with perimeter rendering and documentation.
  • UI: added QR code display for quick node/app access.
  • Gateways: persistent gateway tracking (is_mqtt_gateway) and UI indicators in nodes, map popups, and stats.
  • Map UX: deterministic jitter for overlapping nodes; edges follow jittered positions.
  • Tooling: Meshtastic protobuf updater script with --check and UPSTREAM_REV.txt tracking.

Version 3.0.4 — Late January 2026

  • Database: multi‑DB support, PostgreSQL scripts, WAL config for SQLite, cleanup query timing fixes, removal of import time columns, and various time‑handling fixes.
  • UI/UX: extensive updates to node.html, nodelist.html, top.html, and packet.html (paging, stats, distance, status/favorites), plus net view changes to 12‑hour window.
  • API/logic: weekly mesh query fix, node list performance improvement, backwards‑compatibility and other bug fixes.
  • MQTT reader: configurable skip‑node list and secondary decryption keys.
  • Docs/ops: multiple documentation updates, updated site list, container workflow fixes/tests, README updates.

Version 3.0.2 — January 2026

  • Changes to the Database to will make it so that there is a need for space when updating to the latest. SQlite requires to rebuild the database when droping a column. ( we are droping some of the old columns) so make sure you have 1.2x the size of the db of space in your environment. Depending on how big your db is it would take a long time.

Version 3.0.1 — December 2025

🌐 Multi-Language Support (i18n)

  • New /api/lang endpoint for serving translations
  • Section-based translation loading (e.g., ?section=firehose)
  • Default language controlled via config file language section
  • JSON-based translation files for easy expansion
  • Core pages updated to support data-translate-lang attributes

🛠 Improvements

  • Updated UI elements across multiple templates for localization readiness
  • General cleanup to support future language additions

Version 3.0.0 update - November 2025

Major Infrastructure Improvements:

  • Database Migrations: Alembic integration for safe schema upgrades and database versioning
  • Automated Backups: Independent database backup system with gzip compression (separate from cleanup)
  • Development Tools: Quick setup script (setup-dev.sh) with pre-commit hooks for code quality
  • Docker Support: Pre-built containers now available on GitHub Container Registry with automatic builds - ogarcia

New Features:

  • Traceroute Return Path: Log and display return path data for traceroute packets - jschrempp
  • Microsecond Timestamps: Added import_time_us columns for higher precision time tracking

Technical Improvements:

  • Migration from manual SQL to Alembic-managed schema
  • Container images use uv for faster dependency installation
  • Python 3.13 support with slim Debian-based images
  • Documentation collection in docs/ directory
  • API routes moved to separate modules for better organization
  • /version and /health endpoints added for monitoring

See README-Docker.md for container deployment and docs/ for technical documentation.

Version 2.0.7 update - September 2025

  • New database maintenance capability to automatically keep a specific number of days of data.
  • Added configuration for update intervals for both the Live Map and the Firehose pages.

Version 2.0.6 update - August 2025

  • New Live Map (Shows packet feed live)
  • New API /api/config (See API documentation)
  • New API /api/edges (See API documentation)
  • Adds edges to the map (click to see traceroute and neighbours)

Version 2.0.4 update - August 2025

  • New statistic page with more data.
  • New API /api/stats (See API documentation).
  • Inprovement on "See Everything" and "Conversation" pages.
  • Tracking of replies with links to original message.

Version 2.0.3 update - June 2025

  • Moved more graphs to eCharts.
  • Addedd smooth updating for "Conversations" and "See everything" sections.
  • Now you can turn on and off "Quick Links".
  • Network graphs are now dynamically generated depending on your mesh and the presets in use.
  • Download node's packet information for the last 3 days to .csv file.
  • Display distance traveled by packet.

Key Features

  • Live Data Visualization: Users can view real-time data from the mesh network, including text messages, GPS positions, and node information.

  • Interactive Map: The site offers an interactive map displaying the locations of active nodes, helping users identify network coverage areas.

  • Mesh Graphs: Visual representations of the network's structure and connectivity are available, illustrating how nodes are interconnected.

  • Packet Analysis: Detailed information on individual data packets transmitted within the network can be accessed, including payload content and transmission paths.

  • Node Statistics: Users can explore statistics related to network traffic, such as top contributors and message volumes.

Samples of currently running instances:

Area URL Version Nodes Last Updated
Polski Mesh https://meshview.format.ovh 3.0.6 (65386be) 4,827 4/1/2026, 12:12:25 PM
Poland https://meshview.szastan.pl 3.0.5 (unknown) 4,194 4/1/2026, 12:12:39 PM
Spain https://meshview.meshtastic.es 3.0.5 (unknown) 2,466 4/1/2026, 12:11:17 PM
San Francisco Bay Area https://meshview.bayme.sh 3.0.5 (bdf70da) 1,983 4/1/2026, 12:11:08 PM
Southern California https://meshview.socalmesh.org 3.0.5 (unknown) 1,205 4/1/2026, 12:11:50 PM
Oregon (USA) https://meshview.meshoregon.com 3.0.5 (bdf70da) 1,167 4/1/2026, 12:11:41 PM
Australia/ New Zeland https://my.meshview.world/anz plus 1.0.0 1,165 4/1/2026, 12:11:59 PM
Hessen - Germany https://meshview.lsinfra.de 3.0.5 (unknown) 1,082 4/1/2026, 12:11:30 PM
New York City https://meshview.nyme.sh 3.0.5 (bdf70da) 984 4/1/2026, 12:11:26 PM
Salt Lake City (USA) https://meshview.freq51.net — 801 4/1/2026, 12:11:36 PM
Salzburg / Austria https://meshview-salzburg.jmt.gr — 748 4/1/2026, 12:11:21 PM
North Georgia / East Tennessee - USA https://view.mtnme.sh 3.0.3 (ff30623) 730 4/1/2026, 12:11:33 PM
Canada https://mv.canadaverse.org 3.0.1 (unknown) 674 4/1/2026, 12:12:06 PM
Pioneer Valley, Massachusetts (USA) https://meshview.pvmesh.org 3.0.4 (018e16e) 560 4/1/2026, 12:11:44 PM
Western Pennsylvania (USA) https://map.wpamesh.net 3.0.5 (unknown) 447 4/1/2026, 12:11:38 PM
Great Britan https://my.meshview.world/gb plus 1.0.0 421 4/1/2026, 12:12:03 PM
Chicago (USA) https://meshview.chicagolandmesh.org 3.0.5 (unknown) 420 4/1/2026, 12:12:41 PM
Georgia (USA) https://meshview.gamesh.net 3.0.1 (unknown) 384 4/1/2026, 12:11:45 PM
Brazil https://my.meshview.world/brazil plus 1.0.0 364 4/1/2026, 12:12:01 PM
Mexico https://my.meshview.world/mexico plus 1.0.0 268 4/1/2026, 12:11:59 PM
Northeast Ohio https://meshview.neomesh.org 3.0.5 (unknown) 264 4/1/2026, 12:11:52 PM
South Africa https://my.meshview.world/za plus 1.0.0 263 4/1/2026, 12:12:07 PM
Argentina https://my.meshview.world/argentina plus 1.0.0 258 4/1/2026, 12:12:00 PM
Northwest Indiana (USA) https://meshview.nwimesh.net 3.0.5 (2cc53dc) 219 4/1/2026, 12:12:08 PM
Louisiana (USA) https://meshview.louisianamesh.org — 78 4/1/2026, 12:11:51 PM
Chile https://my.meshview.world/chile plus 1.0.0 58 4/1/2026, 12:12:06 PM
Colombia https://meshview.meshcolombia.co 3.0.5 (2cc53dc) 55 4/1/2026, 12:11:46 PM
Croatia https://map.cromesh.eu — 0 4/1/2026, 12:11:45 PM
Saint Louis (USA) https://meshview.meshstl.org 3.0.5 (2cc53dc) 0 4/1/2026, 12:11:51 PM
Southwest Louisiana (USA) https://www.swlamesh.com — 0 4/1/2026, 12:11:46 PM

Updating from 2.x to 3.x

We are adding the use of Alembic. If using GitHub Update your codebase by running the pull command

cd meshview
git pull origin master

Install Alembic in your environment

./env/bin/pip install alembic

Start your scripts or services. This process will update your database with the latest schema.

Installing

The easiest way to run MeshView is using Docker. Pre-built images are available from GitHub Container Registry.

See README-Docker.md for complete Docker installation and usage instructions.

Manual Installation

Requires python3.13 or above.

Clone the repo from GitHub:

git clone https://github.com/pablorevilla-meshtastic/meshview.git
cd meshview

Run the development setup script:

./setup-dev.sh

This will:

  • Create Python virtual environment
  • Install all requirements
  • Install development tools (pre-commit, pytest)
  • Set up pre-commit hooks for code formatting
  • Create config.ini from sample

Manual Setup

Create a Python virtual environment:

python3 -m venv env

Install the environment requirements:

./env/bin/pip install -r requirements.txt

Install graphviz on MacOS or Debian/Ubuntu Linux:

sudo apt-get install graphviz

Copy sample.config.ini to config.ini:

cp sample.config.ini config.ini

Edit config.ini to match your MQTT and web server settings:

nano config.ini

Note

On MacOS set the bind configuration line to

bind = 127.0.0.1

Example:

# -------------------------
# Server Configuration
# -------------------------
[server]
# The address to bind the server to. Use * to listen on all interfaces.
bind = *

# Port to run the web server on.
port = 8081

# Path to TLS certificate (leave blank to disable HTTPS).
tls_cert =

# Path for the ACME challenge if using Let's Encrypt.
acme_challenge =


# -------------------------
# Site Appearance & Behavior
# -------------------------
[site]
# The domain name of your site.
domain =

# Select language (this represents the name of the json file in the /lang directory)
language = es

# Site title to show in the browser title bar and headers.
title = Bay Area Mesh

# A brief message shown on the homepage.
message = Real time data from around the bay area and beyond.

# Starting URL when loading the index page.
starting = /chat

# Enable or disable site features (as strings: "True" or "False").
nodes = True
conversations = True
everything = True
graphs = True
stats = True
net = True
map = True
top = True

# Map boundaries (used for the map view).
# Defaults will show the San Francisco Bay Area
map_top_left_lat = 39
map_top_left_lon = -123
map_bottom_right_lat = 36
map_bottom_right_lon = -121

# Updates intervals in seconds, zero or negative number means no updates
# defaults will be 3 seconds
map_interval=3
firehose_interval=3

# Weekly net details
weekly_net_message = Weekly Mesh check-in. We will keep it open on every Wednesday from 5:00pm for checkins. The message format should be (LONG NAME) - (CITY YOU ARE IN) #BayMeshNet.
net_tag = #BayMeshNet

# -------------------------
# MQTT Broker Configuration
# -------------------------
[mqtt]
# MQTT server hostname or IP.
server = mqtt.bayme.sh

# Topics to subscribe to (as JSON-like list, but still a string).
topics = ["msh/US/bayarea/#", "msh/US/CA/mrymesh/#", "msh/US/CA/sacvalley"]

# Port used by MQTT (typically 1883 for unencrypted).
port = 1883

# MQTT username and password.
username = meshdev
password = large4cats


# -------------------------
# Database Configuration
# -------------------------
[database]
# SQLAlchemy async connection string.
# Examples:
#   sqlite+aiosqlite:///packets.db
#   postgresql+asyncpg://user:pass@host:5432/meshview
connection_string = sqlite+aiosqlite:///packets.db


# -------------------------
# Database Cleanup Configuration
# -------------------------
[cleanup]
# Enable or disable daily cleanup
enabled = False
# Number of days to keep records in the database
days_to_keep = 14
# Time to run daily cleanup (24-hour format)
hour = 2
minute = 00
# Run VACUUM after cleanup
vacuum = False


# -------------------------
# Logging Configuration
# -------------------------
[logging]
# Enable or disable HTTP access logs from the web server
# When disabled, request logs like "GET /api/chat" will not appear
# Application logs (errors, startup messages, etc.) are unaffected
# Set to True to enable, False to disable (default: False)
access_log = False
# Database cleanup logfile location
db_cleanup_logfile = dbcleanup.log

NOTE (PostgreSQL setup)**

If you want to use PostgreSQL instead of SQLite:

Install PostgreSQL for your OS.
Create a user and database:

`CREATE USER meshview WITH PASSWORD 'change_me';`
`CREATE DATABASE meshview OWNER meshview;`

Update config.ini example:

`connection_string = postgresql+asyncpg://meshview:change_me@localhost:5432/meshview`

Running Meshview

Start the database manager:

./env/bin/python startdb.py

Start the web server:

./env/bin/python main.py

Note


You can specify a custom config file with the --config flag:

./env/bin/python startdb.py --config /path/to/config.ini
./env/bin/python main.py --config /path/to/config.ini

Open in your browser: http://localhost:8081/


Running Meshview with mvrun.py

  • mvrun.py starts both startdb.py and main.py in separate threads and merges the output.
  • It accepts several command-line arguments for flexible deployment.
./env/bin/python mvrun.py

Command-line options:

  • --config CONFIG - Path to the configuration file (default: config.ini)
  • --pid_dir PID_DIR - Directory for PID files (default: .)
  • --py_exec PY_EXEC - Path to the Python executable (default: ./env/bin/python)

Examples:

# Use a specific config file
./env/bin/python mvrun.py --config /etc/meshview/config.ini

# Store PID files in a specific directory
./env/bin/python mvrun.py --pid_dir /var/run/meshview

# Use a different Python executable
./env/bin/python mvrun.py --py_exec /usr/bin/python3

Setting Up Systemd Services (Ubuntu)

To run Meshview automatically on boot, create systemd services for startdb.py and main.py.

Note


You need to change the "User" and "/path/to/meshview" for your instance of the code on each service.

1. Service for startdb.py

Create:

sudo nano /etc/systemd/system/meshview-db.service

Paste:

[Unit]
Description=Meshview Database Initializer
After=network.target

[Service]
Type=simple
WorkingDirectory=/path/to/meshview
ExecStart=/path/to/meshview/env/bin/python /path/to/meshview/startdb.py --config /path/to/meshview/config.ini
Restart=always
RestartSec=5
User=yourusername

[Install]
WantedBy=multi-user.target

2. Service for main.py

Create:

sudo nano /etc/systemd/system/meshview-web.service

Paste:

[Unit]
Description=Meshview Web Server
After=network.target meshview-db.service

[Service]
Type=simple
WorkingDirectory=/path/to/meshview
ExecStart=/path/to/meshview/env/bin/python /path/to/meshview/main.py --config /path/to/meshview/config.ini
Restart=always
RestartSec=5
User=yourusername

[Install]
WantedBy=multi-user.target

3. Enable and start the services

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable meshview-db
sudo systemctl enable meshview-web
sudo systemctl start meshview-db
sudo systemctl start meshview-web

4. Check status

systemctl status meshview-db
systemctl status meshview-web

TIP
After editing .service files, always run:

sudo systemctl daemon-reload

5. Database Maintenance

Database maintnance can now be done via the script itself here is the section from the configuration file.

  • Simple to setup
  • It will not drop any packets
# -------------------------
# Database Cleanup Configuration
# -------------------------
[cleanup]
# Enable or disable daily cleanup
enabled = False
# Number of days to keep records in the database
days_to_keep = 14
# Time to run daily cleanup (24-hour format)
hour = 2
minute = 00
# Run VACUUM after cleanup
vacuum = False

# -------------------------
# Logging Configuration
# -------------------------
[logging]
# Enable or disable HTTP access logs from the web server
access_log = False
# Database cleanup logfile location
db_cleanup_logfile = dbcleanup.log

Once changes are done you need to restart the script for changes to load.

Alternatively we can do it via your OS (This example is Ubuntu like OS)

  • Create and save bash script below. (Modify /path/to/file/ to the correct path)
  • Name it cleanup.sh
  • Make it executable.
#!/bin/bash

DB_FILE="/path/to/file/packets.db"

# Stop DB service
sudo systemctl stop meshview-db.service
sudo systemctl stop meshview-web.service

sleep 5
echo "Run cleanup..."
# Run cleanup queries
sqlite3 "$DB_FILE" <<EOF 
DELETE FROM packet
WHERE import_time_us IS NOT NULL
  AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
SELECT 'packet deleted: ' || changes();
DELETE FROM packet_seen
WHERE import_time_us IS NOT NULL
  AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
SELECT 'packet_seen deleted: ' || changes();
DELETE FROM traceroute
WHERE import_time_us IS NOT NULL
  AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
SELECT 'traceroute deleted: ' || changes();
DELETE FROM node
WHERE last_seen_us IS NULL
   OR last_seen_us < (strftime('%s','now','-14 days') * 1000000);
SELECT 'node deleted: ' || changes();
VACUUM;
EOF

# Start DB service
sudo systemctl start meshview-db.service
sudo systemctl start meshview-web.service

echo "Database cleanup completed on $(date)"

  • If you are using PostgreSQL, use this version instead (adjust credentials/DB name):
#!/bin/bash
set -euo pipefail

DB="postgresql://meshview@localhost:5432/meshview"
RETENTION_DAYS=14
BATCH_SIZE=100

PSQL="/usr/bin/psql"

echo "[$(date)] Starting batched cleanup..."

while true; do
  DELETED=$(
    $PSQL "$DB" -At -v ON_ERROR_STOP=1 <<EOF
WITH cutoff AS (
  SELECT (EXTRACT(EPOCH FROM (NOW() - INTERVAL '${RETENTION_DAYS} days')) * 1000000)::bigint AS ts
),
old_packets AS (
  SELECT id
  FROM packet, cutoff
  WHERE import_time_us IS NOT NULL
    AND import_time_us < cutoff.ts
  ORDER BY id
  LIMIT ${BATCH_SIZE}
),
ps_del AS (
  DELETE FROM packet_seen
  WHERE packet_id IN (SELECT id FROM old_packets)
  RETURNING 1
),
tr_del AS (
  DELETE FROM traceroute
  WHERE packet_id IN (SELECT id FROM old_packets)
  RETURNING 1
),
p_del AS (
  DELETE FROM packet
  WHERE id IN (SELECT id FROM old_packets)
  RETURNING 1
)
SELECT COUNT(*) FROM p_del;
EOF
  )

  if [[ "$DELETED" -eq 0 ]]; then
    break
  fi
  
  sleep 0.1
done

echo "[$(date)] Packet cleanup complete"

echo "[$(date)] Cleaning old nodes..."

$PSQL "$DB" -v ON_ERROR_STOP=1 <<EOF
DELETE FROM node
WHERE last_seen_us IS NOT NULL
  AND last_seen_us < (
    EXTRACT(EPOCH FROM (NOW() - INTERVAL '${RETENTION_DAYS} days')) * 1000000
  );
EOF

echo "[$(date)] Node cleanup complete"

$PSQL "$DB" -c "VACUUM (ANALYZE) packet_seen;"
$PSQL "$DB" -c "VACUUM (ANALYZE) traceroute;"
$PSQL "$DB" -c "VACUUM (ANALYZE) packet;"
$PSQL "$DB" -c "VACUUM (ANALYZE) node;"

echo "[$(date)] Cleanup finished"
  • Schedule running the script on a regular basis.
  • In this example it runs every night at 2:00am.

Open scheduler:

sudo crontab -e

Add schedule to the bottom of the file (modify /path/to/file/ to the correct path):

0 2 * * * /path/to/file/cleanup.sh >> /path/to/file/cleanup.log 2>&1

Check the log file to see it the script run at the specific time.


Technical Documentation

For more detailed technical documentation including database migrations, architecture details, and advanced topics, see the docs/ directory.

S
Description
This project watches a MQTT topic for meshtastic messages, imports them to a database and has a web UI to view them.
Readme AGPL-3.0
10 MiB
0 Stars 1 Watchers 0 Forks
Languages
Python 57.4%
HTML 41.2%
Shell 0.5%
JavaScript 0.4%
Dockerfile 0.4%