
π‘ Glitched-out terminal Meshtastic messenger.
An irssi-style chat client for your LoRa radio with a vintage BBS
aesthetic β maxheadroom palette, ββββ glitch borders, BitchX-style
rotating splash, mutt-grade keyboard, and ham-radio slash-commands
baked in.
β¨ Features
- π‘ Connects to your Meshtastic radio over USB serial, TCP, or Bluetooth LE (no radio needed for
meshx demo)
- π± Bluetooth LE workflow β
meshx ble scan / pair / list / connect / fav to save multiple radios by uuid or friendly name and switch between them without re-pairing
- β¨οΈ irssi-style modal UI β input always live,
Esc drops to scrollback nav
- π¬ mutt-grade message log β dense one-row-per-message, zebra-striped,
j/k walks
- π― Ham-radio slash-commands β
/cq, /73, /qth, /rs, /qrz, /sk, /mesh, + 9 more
- π₯ BitchX-style bracketed users grid β
[ @KC7XYZ ] tiles with IRC sigils
- π¨ Maxheadroom 80s-neon palette β cyan / mesh-green / magenta / pink, matches grind + tlock
- π¨ BitchX-style rotating ASCII splash β different graffiti logo every launch
- π Live
/ search across log / channels / users with n / N cycling
- π Tab completion β commands,
#channels, nicks; irssi nick-addressing quirk included
- π₯οΈ Stable tmux-pane channel tabs +
Alt+1..4 quick-hop
- β Scrollable
? help overlay β every keybinding and command, vim-scrollable
- πΎ SQLite-backed history β message log, node cache, and paired BLE devices survive restarts (
~/.meshx/meshx.db)
- π Ephemeral notices β
/whois / /ping / /config cards auto-expire after 60s with a fade; /pin or P holds them with β β corners
- π οΈ Stale-send recovery β
R resends pending or failed messages; boot sweep flips zombie rows to β so they're actionable
π¦ Install
curl -fsSL https://github.com/retr0h/meshx/raw/main/install.sh | sh
Installs to ~/.local/bin (or /usr/local/bin as root) β SHA256 checksums verified. Override with MESHX_INSTALL_DIR=/some/path or pin a version with MESHX_VERSION=1.1.1.
π¨ Build from source
git clone https://github.com/retr0h/meshx.git
cd meshx
go build -o meshx .
install -m 755 meshx ~/.local/bin/meshx
π Quick start
meshx demo # try the UI with no radio
meshx # auto-connect to a plugged-in radio (USB β saved BLE)
meshx --help # usb, tcp, ble subcommand trees
Full command + keybinding reference in docs/commands.md.
βοΈ How It Works
meshX is a Meshtastic client. It connects to a radio you already
own (T-Beam, Heltec, RAK, Station G2, etc.) over one of three
transports and reads the mesh:
- π USB serial (default) β plug the radio in; auto-detect port
- π TCP β radios with WiFi expose port 4403, or connect to
meshtasticd
- π± Bluetooth LE β
meshx ble pair <uuid> saves a device, then meshx ble connect <name> opens the TUI over Bluetooth
All three speak Meshtastic's protobuf protocol
and funnel through one Client interface, so the UI is oblivious to
which transport's carrying the packets. meshX subscribes to
FromRadio, emits ToRadio for sends, and surfaces everything in a
scrollable terminal chat UI with vim/irssi ergonomics.
meshx demo ships canned messages + fake telemetry so you can try
the UI without a radio. Every report (/rs, /ping, /tr,
/whois) pulls from node state that maps 1:1 to real Meshtastic
protobuf fields.
π‘ Inspiration
meshX sits at the intersection of three lineages:
- irssi β the input-first modal UI, the
/command dispatcher, and the stable bottom status line with channel tabs come straight from irssi. Alt+n channel hop too.
- BitchX β the rotating graffiti ASCII splash (different logo every launch), the bracketed
[ @nick ] users grid, and the unapologetic neon palette are pure BitchX. (RIP caf.)
- mutt β the dense one-row-per-message log,
j/k scrollback nav, r reply on selection, and the modal input β nav distinction come from mutt.
- vim β every window scrolls with
j/k/h/l/gg/G/Ctrl+D/Ctrl+U, Ctrl+W for window nav, / + n/N for search.
- tmux β
Ctrl+N / Ctrl+P channel cycle and the giant flash-digit pane picker.
- grind, tlock β sibling retr0h projects; meshX reuses their maxheadroom palette,
ββββ block-border language, and block-art primitives.
πΊοΈ Roadmap
- π PSK import β
/channel add <meshtastic://url> to paste a shared-channel link and join without manually typing the PSK
- πΊοΈ QR code share β
/channel share <name> emits the meshtastic:// URL as ASCII QR for phone-side scanning
- π¨ Low-color / no-truecolor fallback palette β detect
$COLORTERM / $TERM and swap the neon maxheadroom hex values for a 16-color ANSI ladder when the terminal doesn't support 24-bit color; ASCII fallback (=== / ---) for the ββββ chrome on terminals without unicode block support
π Docs
π License
The MIT License.