Contact - A Console UI for Meshtastic
Powered by Meshtastic.org
Install with:
pip install contact
This Python curses client for Meshtastic is a terminal-based client designed to manage device settings, enable mesh chat communication, and handle configuration backups and restores.
The settings dialogue can be accessed within the client or may be run standalone to configure your node by launching contact --settings or contact -c
Docker install
Install with Docker:
docker build -t contact .
# Change /tmp/data to a directory you'd like to persist the database in
export DATA_DIR="/tmp/contact"
mkdir -p "$DATA_DIR"
docker run -it --rm -v $DATA_DIR:/data --workdir /data --device=/dev/ttyUSB0 contact --port /dev/ttyUSB0
Message Persistence
All messages will saved in a SQLite DB and restored upon relaunch of the app. You may delete client.db if you wish to erase all stored messages and node data. If multiple nodes are used, each will independently store data in the database, but the data will not be shared or viewable between nodes.
Client Configuration
By navigating to Settings -> App Settings, you may customize your UI's icons, colors, and more!
Notification sounds
Add audio files to Contact's contact/sounds/ folder, then choose one in Settings → App Settings → Notification sound. alert.mp3 is the default selection; choose None to disable notification audio. Supported file types are MP3, WAV, OGG, AIFF, and FLAC.
Remote administration
With the Nodes pane selected, press ` or F12 and choose Remote admin for the highlighted node. Contact requests the node's settings through Meshtastic Remote Admin and displays an error if the node does not authorize your public key. Remote App Settings are intentionally unavailable because they apply only to the local Contact client.
For smaller displays you may wish to enable single_pane_mode:
Commands
CTRL+k= display a list of commands.↑→↓←= Navigate around the UI.F1/F2/F3= Jump to Channel/Messages/NodesENTER= Send a message typed in the Input Window, or with the Node List highlighted, select a node to DM`orF12= Open the Settings dialogueCTRL+p= Hide/show a log of raw received packets.CTRL+torF4= With the Node List highlighted, send a traceroute to the selected nodeF5= Display a node's infoCTRL+f= With the Node List highlighted, favorite the selected nodeCTRL+g= With the Node List highlighted, ignore the selected nodeCTRL+d= With the Channel List hightlighted, archive a chat to reduce UI clutter. Messages will be saved in the db and repopulate if you send or receive a DM from this user.CTRL+d= With the Note List highlghted, remove a node from your nodedb.ESC= Exit out of the Settings Dialogue, or Quit the application if settings are not displayed.
Search
- Press
CTRL+/while the nodes or channels window is highlighted to start search - Type text to search as you type, first matching item will be selected, starting at current selected index
- Press Tab to find next match starting from the current index - search wraps around if necessary
- Press Esc or Enter to exit search mode
Arguments
You can pass the following arguments to the client:
Connection Arguments
Optional arguments to specify a device to connect to and how.
--port,--serial,-s: The port to connect to via serial, e.g./dev/ttyUSB0.--host,--tcp,-t: The hostname or IP address to connect to using TCP, will default to localhost if no host is passed.--ble,-b: The BLE device MAC address or name to connect to.--settings,--set,--control,-c: Launch directly into the settings.--help,-h: Show usage and available options, then exit.--version,-V: Show the application version, then exit.
If no connection arguments are specified, the client will attempt a serial connection and then a TCP connection to localhost.
Choose at most one connection type. Connection options also apply to control mode,
for example contact --control --host mesh.local. The standalone
python -m contact.settings command accepts the same options. Help and version
exit with status 0; invalid arguments print an error to stderr and exit with
status 2 before starting the UI.
Example Usage
contact --port /dev/ttyUSB0
contact --host 192.168.1.1
contact --ble BlAddressOfDevice
contact --port COM3
To quickly connect to localhost, use:
contact -t
Install in development (editable) mode:
git clone https://github.com/pdxlocations/contact.git
cd contact
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
Metadata
Release files for contact 1.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| contact-1.7.0.tar.gz | 166.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| contact-1.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 345.3 kB
Release files / contact-1.7.0.tar.gz
| Download URL | contact-1.7.0.tar.gz |
|---|---|
| Size | 166.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0d36d7bdc5ddc07ac89b5429e3a0ddca196454b9d5406329c60106f241aabfeb
|
|
BLAKE2b-256 checksum How to use checksums |
14970f4265d14527a5358b9dd00c211dc75b7cc271c95884e06d7c1e156d7ad8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.
Transparency logRelease files / contact-1.7.0-py3-none-any.whl
| Download URL | contact-1.7.0-py3-none-any.whl |
|---|---|
| Size | 179.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6617cf207b82fc2fc20bd79284fc39d9b8d2e1bdc22473684e39174c1c21fe02
|
|
BLAKE2b-256 checksum How to use checksums |
6df40f5357799cff83dc2963993f6d50d60551a07305ff61ce58bd18ce69f611
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.
Transparency log