Skip to main content

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
chmod 600 config.yaml

cp creates the copy with your umask's default permissions, typically world-readable -- worth locking down since the file commonly ends up holding plaintext SASL/NickServ passwords (the bridge warns at startup if it finds config.yaml still readable by group/other).

  • mesh.connection — how to reach your companion radio: type: ble (with address), type: serial (with port/baudrate), or type: tcp (with host/port).

  • irc — the IRC server and how to authenticate. irc.auth.mode is one of:

    • sasl — authenticate with AUTHENTICATE PLAIN before registration completes. Requires irc.auth.sasl.username/password.
    • nickserv — connect without SASL, wait for the welcome (001), send PRIVMSG NickServ :IDENTIFY <password>, then wait irc.auth.nickserv.join_wait_seconds before joining channels (long enough for services to apply your cloak/account before you join gated channels). Requires irc.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

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

meshcore_irc_bridge-0.1.3.tar.gz (54.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

meshcore_irc_bridge-0.1.3-py3-none-any.whl (31.3 kB view details)

Uploaded Python 3

File details

Details for the file meshcore_irc_bridge-0.1.3.tar.gz.

File metadata

  • Download URL: meshcore_irc_bridge-0.1.3.tar.gz
  • Upload date:
  • Size: 54.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for meshcore_irc_bridge-0.1.3.tar.gz
Algorithm Hash digest
SHA256 b1ab41dc9333312f5cccf73ce68f4f209a860eaa445f77b018a10537171a66fd
MD5 0afa7a14be8a476d987858faea4df8ac
BLAKE2b-256 d5ca13a79d373430a82e511ed1c77a912430663ad34c538fc2a0ae121663ef8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshcore_irc_bridge-0.1.3.tar.gz:

Publisher: publish.yml on Faradome/meshcore-irc-bridge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshcore_irc_bridge-0.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for meshcore_irc_bridge-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 e8398cbe6dfed9e60e1e0abc50e8fce9f0a0cb81c83a4509ca1b6f0596155184
MD5 b4d39de99fffef22c239d6938cbce408
BLAKE2b-256 71cc0aca8960d032da956f7f0e6c1ccabbb0b1a9dc888dc46eda0ceaf3179a95

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshcore_irc_bridge-0.1.3-py3-none-any.whl:

Publisher: publish.yml on Faradome/meshcore-irc-bridge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page