meshcore-irc-bridge
This is an AI-generated application. The design, code, tests, and documentation in this repository were produced by an AI coding agent (Claude), directed and reviewed by a human maintainer.
A one-way bridge: it connects to a MeshCore companion radio, listens for channel messages, and relays them into IRC channels — one mesh channel mapped to one IRC channel. It never sends anything back to the mesh; IRC messages are received and ignored.
Built on the meshcore Python package
for the radio side (BLE, serial, or TCP companion connection). The IRC side is
a small hand-rolled asyncio client with first-class
IRCv3 SASL support, a NickServ
IDENTIFY fallback (with a configurable wait before joining channels), and
support for connecting with a fully unregistered nickname.
Install
Published on PyPI as meshcore-irc-bridge.
The recommended way to install it is pipx, which puts
the meshcore-irc-bridge command on your PATH in its own isolated
environment, without touching your system Python packages:
pipx install meshcore-irc-bridge
Plain pip works too, ideally in a virtual environment:
python3 -m venv .venv
source .venv/bin/activate
pip install meshcore-irc-bridge
To install from a checkout for development instead, see Development below.
Configure
Copy config.example.yaml to config.yaml and edit it:
cp config.example.yaml config.yaml
-
mesh.connection— how to reach your companion radio:type: ble(withaddress),type: serial(withport/baudrate), ortype: tcp(withhost/port). -
irc— the IRC server and how to authenticate.irc.auth.modeis one of:sasl— authenticate withAUTHENTICATE PLAINbefore registration completes. Requiresirc.auth.sasl.username/password.nickserv— connect without SASL, wait for the welcome (001), sendPRIVMSG NickServ :IDENTIFY <password>, then waitirc.auth.nickserv.join_wait_secondsbefore joining channels (long enough for services to apply your cloak/account before you join gated channels). Requiresirc.auth.nickserv.password.none— connect with a fully unregistered nickname and join immediately.
The auth mode is fixed by config — if it fails (e.g. the server doesn't offer SASL, or the password is rejected), the bridge logs the failure and retries the same mode on reconnect rather than silently switching methods.
Secrets support
${ENV_VAR}interpolation so passwords don't need to sit in the YAML file in plaintext, e.g.password: "${IRC_SASL_PASSWORD}". -
channels— the mesh-channel-to-IRC-channel mapping, e.g.:channels: - mesh_channel: 0 irc_channel: "#mesh-general" - mesh_channel: 1 irc_channel: "#mesh-emergency"
Several mesh channels may map to the same IRC channel. When they do, each relayed line is prefixed with
[<mesh_channel>]so messages from either stay attributable once interleaved there (e.g.[0] hello,[1] hi); a mesh channel with an IRC channel all to itself is left unprefixed.
Setting up a channel on the radio itself
This bridge only reads channel messages — it never creates, renames, or
rekeys a channel on the companion radio. To set one up (or check what's
already configured), use meshcorectl,
a companion CLI for MeshCore radios:
meshcorectl create channel 0 "General" # create/rename channel 0
meshcorectl get channels # list what's configured on the radio
Run
meshcore-irc-bridge --config config.yaml
# or
python -m meshcore_irc_bridge --config config.yaml
--log-level (default INFO) controls verbosity.
Development
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest # 100% line+branch coverage enforced
ruff check .
mypy
Tests never touch real hardware or a real IRC network: the mesh side is
exercised against a hardware-free double of meshcore.MeshCore
(tests/fakes/meshcore_double.py), and the IRC client is exercised against a
real (loopback-only) asyncio TCP server that scripts IRC protocol exchanges
(tests/fakes/fake_irc_server.py).
Real end-to-end verification against an actual radio and IRC network is out of scope for the automated test suite — run the bridge against your own setup once installed to confirm it end-to-end.
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file meshcore_irc_bridge-0.1.1.tar.gz.
File metadata
- Download URL: meshcore_irc_bridge-0.1.1.tar.gz
- Upload date:
- Size: 45.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e49a6c788d7a04ffab4b97f537ce5d75ccfe28808c6e61126cfb4282e147389
|
|
| MD5 |
8267589aa41914c5252bec57c6cb0650
|
|
| BLAKE2b-256 |
b5b55ce89e22212fb7a5bcf4790bb49b12440e772beed9d74450a4a282e4df80
|
Provenance
The following attestation bundles were made for meshcore_irc_bridge-0.1.1.tar.gz:
Publisher:
publish.yml on Faradome/meshcore-irc-bridge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
meshcore_irc_bridge-0.1.1.tar.gz -
Subject digest:
2e49a6c788d7a04ffab4b97f537ce5d75ccfe28808c6e61126cfb4282e147389 - Sigstore transparency entry: 2810985653
- Sigstore integration time:
-
Permalink:
Faradome/meshcore-irc-bridge@5d7dce8606f8b56ab0c935ede61a4da46406d2e2 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Faradome
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5d7dce8606f8b56ab0c935ede61a4da46406d2e2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file meshcore_irc_bridge-0.1.1-py3-none-any.whl.
File metadata
- Download URL: meshcore_irc_bridge-0.1.1-py3-none-any.whl
- Upload date:
- Size: 26.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d77aba242352a07b5ecaa49768f01c4c5f31fcadb70c7599b6532fdbc845c7c8
|
|
| MD5 |
37412a1caf36c9d81f25d6076bb57edb
|
|
| BLAKE2b-256 |
03411f109ff42b8384dc5a2d81515555890707428170086e4472222412865e1d
|
Provenance
The following attestation bundles were made for meshcore_irc_bridge-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Faradome/meshcore-irc-bridge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
meshcore_irc_bridge-0.1.1-py3-none-any.whl -
Subject digest:
d77aba242352a07b5ecaa49768f01c4c5f31fcadb70c7599b6532fdbc845c7c8 - Sigstore transparency entry: 2810985730
- Sigstore integration time:
-
Permalink:
Faradome/meshcore-irc-bridge@5d7dce8606f8b56ab0c935ede61a4da46406d2e2 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Faradome
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5d7dce8606f8b56ab0c935ede61a4da46406d2e2 -
Trigger Event:
push
-
Statement type: