Chat client for Meshtastic LoRa mesh networks in Emacs

andros1 pts0 comments

andros/meshtastic.el: Chat client for Meshtastic LoRa mesh networks in Emacs - meshtastic.el - Andros's repositories

This website requires JavaScript.

andros/meshtastic.el

Watch

Star

Fork

You've already forked meshtastic.el

Code

Issues

Pull Requests

Actions

Packages

Projects

Releases

Wiki

Activity

10 Commits

1 Branch

0 Tags

main

Add File

New File

Upload File

Apply Patch

Code

Clone

HTTPS

Tea CLI

Open with VS Code

Open with VSCodium

Open with Intellij IDEA

Download ZIP<br>Download TAR.GZ<br>Download BUNDLE

andros

f295b959b1

Add test instructions to README and ignore melpazoid artifacts

2026-05-20 17:19:54 +02:00

tests

Fix two bugs found in API doc review

2026-05-20 16:52:21 +02:00

.gitignore

Add test instructions to README and ignore melpazoid artifacts

2026-05-20 17:19:54 +02:00

.pre-commit-config.yaml

Fix channel send crash, add tests, pre-commit and uv setup

2026-05-20 16:48:48 +02:00

LICENSE

Initial release of meshtastic.el

2026-05-14 15:40:19 +02:00

meshtastic-bridge.py

Fix two bugs found in API doc review

2026-05-20 16:52:21 +02:00

meshtastic.el

Show Connecting... status and auto-refresh statistics on connect

2026-05-20 17:11:50 +02:00

pyproject.toml

Fix channel send crash, add tests, pre-commit and uv setup

2026-05-20 16:48:48 +02:00

README.md

Add test instructions to README and ignore melpazoid artifacts

2026-05-20 17:19:54 +02:00

uv.lock

Fix channel send crash, add tests, pre-commit and uv setup

2026-05-20 16:48:48 +02:00

README.md

meshtastic.el

Chat client for Meshtastic LoRa mesh networks in Emacs, inspired by ERC and rcirc.

Requires Emacs 28.1 or later and the meshtastic Python package.

Connects directly to a Meshtastic device over USB serial. No server or intermediate proxy required.

How it works

LoRa Radio Python bridge Emacs<br>+-----------+ +-------------------+ +---------------+<br>| Meshtastic|| meshtastic-bridge || meshtastic.el |<br>| Device | USB | .py (subprocess) | JSON | (this package)|<br>+-----------+ +-------------------+ +---------------+<br>Physical Reads/writes serial Chat buffers<br>device Emits JSON events Send / receive

A Meshtastic device sends and receives messages over LoRa radio.

meshtastic-bridge.py connects to the device via serial, forwards received messages as JSON lines to stdout, and accepts JSON commands on stdin.

meshtastic.el spawns the bridge as a subprocess, parses its output, and provides chat buffers.

Buffers

Welcome screen (M-x meshtastic)

Meshtastic

Connection<br>Port: /dev/ttyUSB0<br>Status: Connected<br>Node: Hilltop Relay (!a1b2c3d4)

Statistics<br>Nodes: 12<br>Channels: 2

[c] Channels [n] Nodes<br>[g] Refresh [q] Quit

Channel list (M-x meshtastic-channels)

ID Name Role<br>0 LongFast Primary<br>1 HikingGroup Secondary

Node list (M-x meshtastic-nodes)

Hops Name Node ID Last heard<br>0 🟢 Hilltop Relay !a1b2c3d4 now<br>1 🟢 Solar Node 7 !d4e5f6a7 12m<br>2 🟢 BaseStation K9 !b8c9d0e1 5m<br>3 ⚫ Mountain Peak !f2a3b4c5 1h

Chat buffer (channel or DM)

[08:15] Good morning mesh!<br>[08:20] Morning! Signal is great today<br>[08:21] Copy that, 3 hops from here<br>[08:45] Anyone near the trailhead?<br>[09:02] I can see 12 nodes from up here<br>[09:05] Confirmed ✓<br>[09:30] Just set up a new repeater<br>#LongFast> _

Features

Channel list : browse available Meshtastic channels.

Node list : browse all mesh nodes sorted by hop count, with online indicator and last-heard time.

Chat buffers : read and send messages with an ERC-like prompt interface.

Direct messages : open a DM chat with any node by pressing RET in the node list.

Message buffer : messages received since the bridge started are kept in memory and shown when a chat buffer opens.

Delivery indicator : sent messages show · (sent to bridge), ✓ (bridge confirmed send) or ✗ (failed).

Desktop notifications : get notified when new messages arrive in background buffers.

Input history : navigate previous inputs with M-p / M-n.

Traceroute : press t on a node to send a traceroute via the CLI.

Keymap

Channel and node list buffers

Key<br>Description

RET<br>Open channel chat or DM with node

0-7<br>Open channel by number (channels)

Send traceroute to node (nodes)

Refresh list from device

Quit buffer

Chat buffers

Key<br>Description

RET<br>Send message

M-p<br>Previous input from history

M-n<br>Next input from history

C-c C-l<br>Reload buffered messages

Requirements

Emacs 28.1+

Python 3 with the meshtastic package:

pip install meshtastic

A Meshtastic device connected via USB serial.

Installation

MELPA

M-x package-install RET meshtastic RET

use-package with :vc (Emacs 29+)

(use-package meshtastic<br>:vc (:url "https://git.andros.dev/andros/meshtastic.el"<br>:rev :newest)<br>:config<br>(setq meshtastic-serial-port "/dev/ttyUSB0"))

use-package with :load-path

(use-package meshtastic<br>:load-path "/path/to/meshtastic.el"<br>:config<br>(setq meshtastic-serial-port "/dev/ttyUSB0"))

Manual

Clone the repository and place the files on your load-path:

git clone https://git.andros.dev/andros/meshtastic.el.git

Add to your init...

meshtastic chat node channel send andros

Related Articles