meshx

command module
v1.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 25, 2026 License: MIT Imports: 1 Imported by: 0

README ΒΆ

release go report card license build release powered by just conventional commits macOS go reference github commit activity hovnokod

πŸ“‘ 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:

  1. πŸ”Œ USB serial (default) β€” plug the radio in; auto-detect port
  2. 🌐 TCP β€” radios with WiFi expose port 4403, or connect to meshtasticd
  3. πŸ“± 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.

Documentation ΒΆ

Overview ΒΆ

Package main is the meshx CLI entry point. The CLI tree lives in the `cmd` package; implementation lives under `internal/meshx`.

Directories ΒΆ

Path Synopsis
Package cmd contains the meshx cobra command tree.
Package cmd contains the meshx cobra command tree.
internal
meshx
Package meshx rendering surface.
Package meshx rendering surface.
meshx/transport
Package transport handles the raw wire protocol to a Meshtastic radio β€” serial or TCP β€” and exposes a stream of decoded FromRadio envelopes plus a channel for ToRadio outbound messages.
Package transport handles the raw wire protocol to a Meshtastic radio β€” serial or TCP β€” and exposes a stream of decoded FromRadio envelopes plus a channel for ToRadio outbound messages.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL