Meshtastic

Using serial for web client

Error observed in browser console when connecting over serial interface:

Uncaught (in promise) NetworkError: Failed to execute 'open' on 'SerialPort': Failed to open serial port.

System logs:

chromium.desktop[117807]: [117807:117807:0203/185442.188970:ERROR:components/device_event_log/device_event_log_impl.cc:198] [18:54:42.188] Serial: serial_io_handler.cc:147 Failed to open serial port: FILE_ERROR_ACCESS_DENIED
chromium.desktop[117807]: [117807:117846:0203/185445.197355:ERROR:google_apis/gcm/engine/registration_request.cc:291] Registration response error message: DEPRECATED_ENDPOINT

The user probably needs to be member of dialout group to access serial port

sudo usermod -aG dialout $USER

For this purpose, using chromium:

sudo flatpak install org.chromium.Chromium

Set the override:

flatpak override --user --filesystem=/run/udev:ro org.chromium.Chromium

Confirm change:

flatpak info --show-permissions org.chromium.Chromium

Close and re-open the browser.

https://client.meshtastic.org/

Using a local TUI

meshtui

Download and install the deb file:

https://github.com/PeterGrace/meshtui/releases

Find the serial port:

ls -la /dev/ttyACM0

Launch the program:

meshtui -s /dev/ttyACM0

Contact

Install from pypi:

pipx install contact

Launch the program:

contact -s /dev/ttyACM0

https://github.com/pdxlocations/contact?tab=readme-ov-file#commands

Meshtastic Cli

Install the tools

pipx install meshtastic

Use the tool

meshtastic -s /dev/ttyACM0 <commands>

Get node list:

meshtastic -s /dev/ttyACM0 --nodes | less -S

Send a traceroute:

meshtastic -s /dev/ttyACM0 --traceroute xxxxx

Traceroute output will look like this:

Connected to radio
Sending traceroute request to 9213c6c5 on channelIndex:0 (this could take a while)
Route traced towards destination:
!b762276c --> !9213c6c5 (9.5dB)
Route traced back to us:
!9213c6c5 --> !b762276c (5.75dB)

Send a message:

meshtastic -s /dev/ttyACM0 --dest xxxxx --sendtext "ping"

Message send output wil look lie this:

Connected to radio
Sending text message ping to 9213c6c5 on channelIndex:0 

Meshmonitor web client

Make sure docker is installed first.

sudo apt install docker.io docker-compose

the /opt/meshmonitor/compose.yml file:

services:
  serial-bridge:
    image: ghcr.io/yeraze/meshtastic-serial-bridge:latest
    container_name: meshtastic-serial-bridge
    devices:
      - /dev/ttyACM0:/dev/ttyACM0
    ports:
      - "4403:4403"
    restart: always
    logging:
      driver: "journald"
    environment:
      - SERIAL_DEVICE=/dev/ttyACM0
      - BAUD_RATE=115200
      - TCP_PORT=4403

  meshmonitor:
    image: ghcr.io/yeraze/meshmonitor:latest
    container_name: meshmonitor
    ports:
      - "8080:3001"
    volumes:
      - meshmonitor-data:/data
    environment:
      - MESHTASTIC_NODE_IP=serial-bridge
      - ALLOWED_ORIGINS=http://meshy.local:8080,http://meshy:8080
    restart: always
    logging:
      driver: "journald"
    depends_on:
      - serial-bridge

volumes:
  meshmonitor-data:

Notes: * On first run, password has to be changed from changeme to something else like meshtastic.

Edit /etc/default/grub and disable usb power management:

GRUB_CMDLINE_LINUX_DEFAULT=" ... usbcore.autosuspend=-1"

Update the initrd.

sudo update-grub

Reboot and check this output - it should be -1 instead of 2 now.

cat /sys/module/usbcore/parameters/autosuspend

Auto-update the container

#!/bin/bash
cd /opt/meshmonitor
docker compose pull
docker compose up -d

Make a systemd unit file:

/etc/systemd/system/meshmonitor-update.service

[Unit]
Description=Update 
After=network.target
StartLimitBurst=3

[Service]
Type=oneshot
Restart=on-failure
RestartSec=60s
ExecStart=/opt/meshmonitor/update.sh

Timer unit:

/etc/systemd/system/meshmonitor-update.timer

[Unit]
Description=MeshMonitor Update
After=network.target

[Timer]
OnCalendar=Daily
Persistent=true

[Install]
WantedBy=timers.target

Enable & start the timer:

sudo systemctl daemon-reload
sudo systemctl start meshmonitor-update.timer

Check the status of the timer:

systemctl list-timers

It will now run on a daily basis at midnight.

NEXT                            LEFT LAST                               PASSED UNIT                         ACTIVATES                     
Tue 2026-03-10 00:00:00 EDT 3h 32min Mon 2026-03-09 00:00:00 EDT       14h ago meshmonitor-update.timer     meshmonitor-update.service