Skip to main content

partyline

partyline

A group voice application for Reticulum, built on LXST, inspired by Mumble

Screenshot from 2026-09-04 07-05-40

Features

  • Encrypted, realtime group voice and audio over any Reticulum transport capable of >6 kilobits per second
  • An easy to host lightweight server and protocol. Spin up a Partyline server in under 30 seconds.
  • Per room access and channel control. open, identified users only, allow lists of identity hashes, or a password. Servers can also require a password or an allow list
  • Dial-in: rnphone and other LXST clients such as Sideband and MeshChatX can call the server and land in a room too, when enabled
  • Rooms each with its own LXST codec configurable by the server. Opus for fast links, Codec2 down to 700 bps for slow ones.
  • GUI and terminal client with multiple language support

Installation

Requires Python 3.11 or newer, Reticulum, and LXST

git clone https://github.com/RFnexus/partyline
cd partyline
pip install .

Or install via rngit with:

git clone rns://4cf8a0651c4d73cacd0f93ac1d95e80a/public/partyline

For a system wide push to talk key, install the optional extra with:

pip install ".[hotkeys]"

This installs three commands: partyline, partyline-server and partyline-client.

Running

Start the GUI client:

partyline

Connect opens the server browser. Add a server by it's hash or use the server browser to find discovered servers from announces. Double click a room to join it. Settings has the audio devices, transmit mode, push to talk key, and UI appearance options Screenshot from 2026-09-04 07-06-15

Terminal client

partyline-client HASH --name Bob --room Lobby

Commands are: /join, /say, /poke, /who, /mute, /deaf

Type /ptt to toggle push to talk

Or as an operator: /kick, /ban, /smute, /op and /move

Server

Start a server:

partyline-server --name "My server" --profile opus-high

The server prints its destination hash for clients and with dial in enabled the number rnphone users call if configured for rooms. For rooms, access lists, operators, a server password and dial in, copy server_example.json and start with:

partyline-server --config server.json

Available --profile codecs for rooms:

  • opus-high - Opus voice, 16 kbps
  • opus-med - Opus voice, 8 kbps
  • opus-low - Opus voice, 6 kbps
  • c2-3200 - Codec2, 3200 bps
  • c2-2400 - Codec2, 2400 bps
  • c2-1200 - Codec2, 1200 bps
  • c2-700 - Codec2, 700 bps
  • music-low - Opus music, 14 kbps
  • music-med - Opus music, 28 kbps
  • music-high - Opus music, 56 kbps

See server_example.json for a full list of options. opus-high-med-low and the Codec2 modes are meant for voice, and music-high-med-low is meant for streaming music or broadcasting to a room. As a rule, use the highest bitrate your link can carry

Install as a systemd unit

To install as a systemd unit find the server command with which partyline-server then create /etc/systemd/system/partyline.service:

[Unit]
Description=Partyline voice server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=partyline
ExecStart=/usr/local/bin/partyline-server --config /home/partyline/server.json
Restart=on-failure

[Install]
WantedBy=multi-user.target

Then:

sudo systemctl daemon-reload
sudo systemctl enable --now partyline

Music/Broadcasting Rooms & Bots

Server operators can also configure broadcast-only rooms for high quality music and audio using LXST's Opus CELT profiles. The options are music-high, music-med, and music-low. Music rooms are a special type of room where only the listed identities can send audio. Add their identity hash, seperated by commas, in music

{"name": "Broadcast", "profile": "music-med", "music": ["0123456789abcdef0123456789abcdef"], "description": "Music/broadcast room. Only listed identities may talk. Uses LXSTs Opus CELT profile"}
Screenshot from 2026-09-05 17-07-35

An example Music Bot can be found under bots/music_bot.py. When Partyline is installed with pip, run it with python3 -m partyline.bots.music_bot

PTT, or slow-mode rooms, are rooms designed to work over slower links like LoRa, bare copper wire bitbashing, and packet radio. Anything with more than a steady ~3.5 kbps throughput can use a PTT room. They can co-exist with regular rooms in a Partyline server, allowing both fast and slow clients to communicate over voice.

Unlike regular rooms there is a bit of latency. PTT rooms pack outgoing audio to fill the link's MTU, sending fewer, fuller packets instead of one frame per packet, and give every listener a larger receive jitter buffer to smooth out the bursty arrival you get over radio mediums like LoRa.

Mark any room push to talk with "ptt": true. Optionally set "ptt_jitter_ms" to change the buffer depth. It's recommended to use PTT rooms with the codec2 profiles.

{"name": "LoRa 1200", "profile": "c2-1200", "ptt": true, "description": "Slow-link push to talk"}
{"name": "Packet Radio Net 700",  "profile": "c2-700",  "ptt": true, "ptt_jitter_ms": 9000}

LLM Disclosure Notice

Kimi K3 (https://www.kimi.com/en) third party hosted API was used for the following tasks:

  • I18N localization and UI gettext() implementation
  • Translation of UI elements and of eo, es, nl, and ru PO files
  • Misc debugging and creation of rnsconfig.py RNS helper utilities

UI Translation

The .po files are located in partyline/locale/

To update a translation, change the msgstr line under its English msgid

To add a language, copy partyline.pot to a new .po file and add it to LANGUAGES in partyline/i18n.py.

Run python partyline/locale/compile.py, then open a pull request with your changes or submit it to the LXMF address:

Credits

Metadata

Release files for partyline 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for partyline 1.0.0
File Size Uploaded
partyline-1.0.0.tar.gz 313.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for partyline 1.0.0
File Interpreter ABI Platform
partyline-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 654.7 kB

Release files / partyline-1.0.0.tar.gz

Download URL partyline-1.0.0.tar.gz
Size 313.0 kB
Tags Source
SHA-256 checksum
How to use checksums
b1e670d0fa1edfa06d2969f6d3049f9b9e181d9f695fbf6c9544756a2229e134
BLAKE2b-256 checksum
How to use checksums
665506bf6e066f1efc30bc53726f94a894ab4f9c3ae27880fe0674eaf844d3ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / partyline-1.0.0-py3-none-any.whl

Download URL partyline-1.0.0-py3-none-any.whl
Size 341.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e57f05f002742618fa737e351d23ed27664cf894b77455cbf5210b72640d242c
BLAKE2b-256 checksum
How to use checksums
faab6ad306ee3a825b5cab945fa1055ecd74c123bce52b7393a3d09246ceaa46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release history Release notifications | RSS feed

1.0.5

2 release files

This release

1.0.0 This release

2 release 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