termtastic is a feature-rich handmade Meshtastic® console client written in Rust.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| Project is under active development, things could be changed completely without notice. |
- Vibecode-free fully handwritten code
- Dependency-free single-binary application
- Fully asynchronous (Tokio channels-based)
- Optimized for small screens (down to 80x24 characters)
- Respects the user terminal colors (no fancy opinionated TrueColor schemes)
- Keyboard-centric UI navigation
- Minimum use of emoji/non-ascii characters in UI
- Small memory footprint (~20KB)
- Supports multiple connection protocols (TCP, BLE, Serial)
- Could discover devices automatically: BLE paired devices, TCP devices via mDNS, Serial devices
- Uses standard system directories for storing configuration, database and logs
Note
Unchecked items are not implemented yet.
- Scrollable channels list (Primary, Secondary)
- Direct conversations
- Display the last message for each channel
- Purge channel chat feature
- Storing messages in local DB
- Scrollable chat screen
- Display the short and long names of node
- Display the SNR/RSSI for direct nodes
- Display the number of hops for retranslated messages
- Display the time of messages
- Display the reactions (emojis)
- Display the routing info for the retranslated messages and reactions
- Ability to see detailed info about reactions
- Ability to see node info of the selected message author
- Ability to send broadcast messages to the channels
- Ability to send direct messages to the nodes
- Ability to reply to the messages
- Ability to send the reactions (emojis)
- Limiting the message length to 200 chars (with counter)
- Storing nodes in local DB
- Scrollable nodes list
- Ability to start direct conversation with the selected node
- Display the short and long names of node
- Display the SNR/RSSI for direct nodes
- Display the number of hops for the routed nodes
- Display the ID of the nodes
- Display the humanized last heard time of the nodes
- Sort nodes by different fields: last heard, hop count, distance, etc.
- Nodes fuzzy search
- Nodes filtering by special tokens
- Ability to see node info of the selected node
- Display node detailed info
- Copy public key to clipboard
- Delete node feature
- Traceroute feature
- Ignore feature
- Add to Favorite feature
- Position info
- Telemetry info
- TBD
- Loading device configuration (generic feature)
- Saving device configuration (generic feature)
- Import configuration from the link
- UI
- LoRa
- Channels
- Security
- User
- Device
- Position
- Power
- Display
- Bluetooth
- Network
- MQTT
- Serial
- External Notification
- Store & Forward
- Range Test
- Telemetry
- Canned Message
- Neighbor Info
- Ambient Lighting
- Detection Sensor
- Scrollable devices list (TCP, BLE, Serial)
- Connection via TCP
- Connection via BLE
- Connection via Serial
- Device configuration loading during the connection process and storing it into state
- Storing TCP connections into a config file
- Discovering of BLE and Serial devices feature
- Discovering TCP devices through mDNS
- Reconnection feature with exponential backoff timeouts
- Ability to set a name for the device
- Writing logs into files using a daily rolling strategy
- Mirroring logs into the log list with scroll
- Ability to expand the single log record (useful for long logs)
- Ability to copy log record into clipboard
- RX indicator
- Online/Total nodes counter
| Feature | Library |
|---|---|
| TUI: Framework | Ratatui |
| TUI: Backend | crossterm |
| TUI: Inputs | ratatui-textarea |
| TUI: Lists | tui-widget-list |
| Interaction with Meshtastic | meshtastic |
| Clipboard functionality | arboard |
| Bluetooth devices discovery | bluest |
| TCP devices discovery | mdns-sd |
| Logging | tracing |
| Async/Channels | tokio |
| Configuration | confy, etcetera |
| Errors | anyhow, thiserror |
| Datetime | chrono |
| Emoji selector | emoji |
| Local DB | native_db |
✅ – tested, 🔬 – untested, ❌ – not working
| Feature | 🐧 Linux | 🍏 macOS | 🪟 Windows |
|---|---|---|---|
| BLE devices discovery | ✅ | ✅ | 🔬 |
| Serial devices discovery | ✅ | ✅ | ✅ |
| TCP devices discovery (mDNS) | ✅ | ✅ | ✅ |
| Copy to clipboard | ✅ | ✅ | ✅ |
| Source | Link |
|---|---|
| Manual download | Releases |
| Debian PPA | 🏗️ TBA |
| Arch Linux AUR | 🏗️ TBA |
| macOS Brew | 🏗️ TBA |
| Windows Chocolatey | 🏗️ TBA |
To run an unsigned application on macOS, you need to dequarantine it using the command below:
xattr -d com.apple.quarantine ./path/to/termtasticTo use Bluetooth on macOS Big Sur (11) or later, you need to enable the Bluetooth permission for your terminal. You can
do it by going to System Preferences → Security & Privacy → Privacy → Bluetooth, clicking the '+'
button, and selecting Terminal (or iTerm or whichever terminal application you use).
If you are using foot terminal try to add these lines into your foot.ini config:
[tweak]
grapheme-width-method=wcswidthThe same named option exists in other terminals too. Check your terminal docs.
Unfortunately, Windows Terminal cannot display some compound emoji such as 1️⃣, 2️⃣, 3️⃣, etc. There is an issue in Github: microsoft/terminal#9708














