Skip to main content

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> text format, 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+
  • uv

Setup

git clone https://foundry.fsky.io/telepath/j2i.git
cd j2i
cp config.example.toml config.toml
$EDITOR config.toml
uv run j2i

By default, j2i looks for config.toml in the current directory. Use -c to specify a different path.

j2i [-c config.toml] [-v]

  -c, --config    Path to config file (default: config.toml)
  -v, --verbose   Enable debug logging

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; set component = true for XEP-0114 component mode
  • [[irc]] - one entry per IRC network; set relaymsg = true to enable RELAYMSG
  • [[bridge]] - one entry per MUC↔channel pair, referencing the name fields 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.

The MUC and channel are bridged together with j2i.

License

This project is released into the public domain under the Unlicense.

Project details


Download files

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

Source Distribution

j2i-1.0.0.tar.gz (20.9 kB view details)

Uploaded Source

Built Distribution

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

j2i-1.0.0-py3-none-any.whl (25.6 kB view details)

Uploaded Python 3

File details

Details for the file j2i-1.0.0.tar.gz.

File metadata

  • Download URL: j2i-1.0.0.tar.gz
  • Upload date:
  • Size: 20.9 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

Hashes for j2i-1.0.0.tar.gz
Algorithm Hash digest
SHA256 fadd22ffb31803a3b9d5f232371215dd6b21aeb5ebcc62d4c375ba9d160f0374
MD5 9e9b6358f9b5008f89c9f1b1cabba0db
BLAKE2b-256 b716f6b245d0da7cfeead2b5d6bf34c58db99082b48f66552a00cf606f3e96d5

See more details on using hashes here.

File details

Details for the file j2i-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: j2i-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 25.6 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

Hashes for j2i-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ab9f7daa063b6b48f5b01d65f4d3a33c5e31ed7e5cb35ef78af3f669def549dc
MD5 cbdea42a162105b04ec813b4b8fa016c
BLAKE2b-256 45826cdfeeeefd1fa76f465b0af6ad8e92f837f55d238217baf0984a855a9ed3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page