Open source bridge software that connects XMPP and IRC channels
Project description
j2i
A bridge between XMPP MUCs and IRC channels. Supports both basic plumbing (bot relays messages as text) and puppeteering mode (messages appear from the actual sender's nick).
Features
- Basic plumbing mode - bridge bot relays messages in
<nick> textformat, works with any XMPP and IRC server - Puppeteering - XMPP users appear on IRC with their real nick via RELAYMSG; IRC users appear in XMPP MUCs as puppet JIDs via XEP-0114 component
- Smart replies - XEP-0461 replies from XMPP become
nick:mentions on IRC; IRCv3 reply tags are preserved in the other direction - Message edits - XEP-0308 corrections are relayed to IRC as
* corrected text - Pastebin - messages exceeding a configurable line limit are uploaded to a pastebin and linked instead of flooding
- Typing indicators - XEP-0085 (XMPP) ↔ IRCv3 typing tag
- Anti-ping - zero-width space inserted into relayed nicks to avoid unwanted highlights
- Multiple networks - bridge as many XMPP/IRC connections and channel pairs as you want, each configured independently
Requirements
- Python 3.11+
- slixmpp
Installation
pip/pipx (PyPI)
You can install j2i from PyPI with pip:
pip install j2i
Or with pipx for an isolated environment:
pipx install j2i
pip/pipx (FSKY Foundry)
To download the package from FSKY Foundry instead of PyPI:
pip install j2i --pip-args="--index-url https://foundry.fsky.io/api/packages/telepath/pypi/simple --extra-index-url https://pypi.org/simple"
Or with pipx:
pipx install j2i --pip-args="--index-url https://foundry.fsky.io/api/packages/telepath/pypi/simple --extra-index-url https://pypi.org/simple"
From wheel
Download the wheel from the releases page and install with pip:
pip install j2i-*.whl
Running
Installed package
After installing, simply run:
j2i -c config.toml
Local development
Requires uv:
git clone https://foundry.fsky.io/telepath/j2i.git
cd j2i
cp config.example.toml config.toml
$EDITOR config.toml
uv run j2i -c config.toml
Docker/Podman
The image expects the config file at /config/config.toml.
docker run -v ./config.toml:/config/config.toml foundry.fsky.io/telepath/j2i:latest
Podman quadlet (systemd)
A quadlet unit file is provided in contrib/quadlet/j2i.container. It runs the container as a systemd user service with auto-update enabled and a read-only filesystem.
To install, place the unit file into .config/containers/systemd/ or /etc/containers/systemd/ and run:
systemctl --user daemon-reload
systemctl --user start j2i.service
Configuration
Copy config.example.toml and edit it. The example file has comments explaining every option.
The config has four sections:
[[xmpp]]- one entry per XMPP account or component; setcomponent = truefor XEP-0114 component mode[[irc]]- one entry per IRC network; setrelaymsg = trueto enable RELAYMSG[[bridge]]- one entry per MUC↔channel pair, referencing thenamefields above[settings]- global defaults (anti_ping,max_lines,pastebin, etc.); can be overridden per[[bridge]]
Basic plumbing mode (simple setup)
Set component = false in [[xmpp]] and relaymsg = false in [[irc]]. The bridge connects as a regular XMPP user and IRC bot and relays messages as <nick> text. No special server configuration needed.
Puppeteering mode (full setup)
IRC side: Set relaymsg = true in [[irc]]. The IRC bot must have operator status (+o) in the channel. The bridge detects RELAYMSG support on connect and falls back to basic plumbing mode if unavailable.
XMPP side: Set component = true in [[xmpp]] and configure your XMPP server with a component subdomain. Each IRC user will appear in the MUC as a puppet JID under that domain (e.g. johndoe.libera@irc.example.org). Puppet nicks on IRC get a /xmpp suffix (e.g. alice/xmpp) to distinguish them from real IRC users.
Support chatroom
If you want to ask anything or need assistance with j2i, we have a public chatroom on XMPP and IRC.
- XMPP: j2i@room.telepath.im
- IRC: #j2i on irc.telepath.im
The MUC and channel are bridged together with j2i.
License
This project is released into the public domain under the Unlicense.
Project details
Release history Release notifications | RSS feed
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 j2i-1.0.1.tar.gz.
File metadata
- Download URL: j2i-1.0.1.tar.gz
- Upload date:
- Size: 21.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8f701847b676fe7138d4262edfa11f8d36aa2cc6e85dfe6e64aca204b3b7229
|
|
| MD5 |
e9d7dbdcc868bfd3c8edf0f0bead1103
|
|
| BLAKE2b-256 |
52719252647f287b3b808c2334129ead8045cfa08790fbd93f45b6e309761bfb
|
File details
Details for the file j2i-1.0.1-py3-none-any.whl.
File metadata
- Download URL: j2i-1.0.1-py3-none-any.whl
- Upload date:
- Size: 26.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ecd8fe85ea44a38cb4bbb268cbc3c1bbcce1f47d87995a607e281d58056fb8f
|
|
| MD5 |
ef3e388a098ff4a90f0610432503c0ea
|
|
| BLAKE2b-256 |
383e8546b069cf502d681ea0894e83c1e2edc169f94df5c269edc04852ba7db1
|