partyline
A group voice application for Reticulum, built on LXST, inspired by Mumble
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
pip install partyline
For a system wide push to talk key, add the optional extra:
pip install "partyline[hotkeys]"
The graphical client uses Tk, which pip cannot install. On most OS/Distros it may already be installed by your system. If not:
On Debian or Ubuntu run
sudo apt install python3-tk, on Fedora sudo dnf install python3-tkinter.
Installing from source
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
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 kbpsopus-med- Opus voice, 8 kbpsopus-low- Opus voice, 6 kbpsc2-3200- Codec2, 3200 bpsc2-2400- Codec2, 2400 bpsc2-1200- Codec2, 1200 bpsc2-700- Codec2, 700 bpsmusic-low- Opus music, 14 kbpsmusic-med- Opus music, 28 kbpsmusic-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"}
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
Push to talk (slow link) Rooms
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.pyRNS 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
- Reticulum and LXST by Mark Qvist
- Mumble. Great software that just works. The best UI is stolen UI
- Tree, toolbar and application icons from Tabler Icons
- Sound effects from Kenney interface sounds
- Tin can telephone drawing in the logo from openclipart.org
Metadata
Release files for partyline 1.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| partyline-1.0.5.tar.gz | 313.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| partyline-1.0.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 655.1 kB
Release files / partyline-1.0.5.tar.gz
| Download URL | partyline-1.0.5.tar.gz |
|---|---|
| Size | 313.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
11a4825d77841696ab7f0f30e9d316e96ab60d7e982ca37d516ba2f4369481dc
|
|
BLAKE2b-256 checksum How to use checksums |
d183b2c27b927b0485815a97986884a59fd5a9c47f539ec133be18ae77b706e2
|
| 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.5-py3-none-any.whl
| Download URL | partyline-1.0.5-py3-none-any.whl |
|---|---|
| Size | 342.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5eb97e4de369cea97582d17fa69312bf5c3f24fc52bc35e2dea856d171bc9841
|
|
BLAKE2b-256 checksum How to use checksums |
5abf4ed58edb27dd5e076f8dfc5e8de194c97ab7562cfbfde66feab50ad03bf7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|