Memory for the Mesh, in conversation.
rift.pw · github.com/datton/TheRift · Change log
Built for delay. Designed for survival.
RiftChat is a Reticulum-native messenger that works without the internet.
It carries messages, voice notes, and file attachments across whatever transport is available — LoRa radio, Bluetooth Low Energy, WiFi Direct, Ethernet, packet radio, or plain internet TCP — because Reticulum was built for exactly that. When the internet is up, it's just another pipe. When it isn't, the mesh keeps moving.
There is no central server. There is no account to create. There is no domain to own. Your identity is a cryptographic key on your device. Every message is encrypted end-to-end with Curve25519 + AES-256 and Perfect Forward Secrecy. The closest thing to a "server" is whichever peer on the mesh is online and willing to relay a packet — your laptop, a Raspberry Pi 200 km away, a friend's phone, a Citadel running in a rack in Frankfurt. Whichever is reachable, your message gets there.
RiftChat speaks LXMF on the wire. That means it interoperates natively with Sideband, Nomad Network, and other LXMF clients on the same protocol. Your contacts can be on any of them.
curl -fsSL https://apt.rift.pw/install/riftchat | sudo bash
sudo systemctl enable --now riftchatOpen http://localhost:8111 from any browser on the same network.
A single Architecture: all .deb works on both amd64 (x86_64) and arm64 (Pi 4/5, Apple Silicon Linux VMs, AWS Graviton). Native Python wheels for aiohttp / cryptography / peewee resolve per-architecture at install time.
The install creates a riftchat system user, sets up a venv at /opt/riftchat/.venv, seeds a Reticulum config with three Rift Citadels + four geographically-diverse community hubs so the node joins the mesh on first boot without manual setup. systemd lifecycle is wired via deb-systemd-helper — install enables and starts, upgrade does a try-restart, remove stops cleanly, purge nukes state.
Want unattended upgrades? sudo sed -i 's/AUTO_UPDATE=false/AUTO_UPDATE=true/' /etc/default/riftchat.
git clone https://github.com/datton/RiftChat
cd RiftChat
python3 -m venv .venv && source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
npm install && npm run build-frontend # compiles Vue + Tailwind into public/
python meshchat.py --host 0.0.0.0 --port 8111 --headlessUI at http://localhost:8111.
docker compose up -dUses the upstream Dockerfile and docker-compose.yml — Rift branding still applies through the frontend.
| Joins the Rift mesh on first boot | Three Rift Citadels (a.citadel.rift.pw, b.citadel.rift.pw, connect.rift.pw on port 4242) + four geographically-diverse community Reticulum hubs (Amsterdam, Sydney, BetweenTheBorders, dismail.de) pre-seeded into the default Reticulum config. No RNode hardware required. |
| LXMF messaging | Wire-compatible with Sideband, NomadNet, upstream Reticulum MeshChat, and any future LXMF client. |
| Voice notes | codec2 + Opus encoding works over LoRa-grade bandwidth. |
| Files, images, attachments | Inline previews, downloadable from either side. |
| LXMF Propagation Nodes | Messages addressed to you while offline arrive on next connection — discovered automatically via Reticulum announces. |
| Multi-transport routing | Reticulum opens all configured interfaces in parallel; whichever has reachability wins. LoRa, BLE, WiFi Direct, Ethernet, packet radio, plain TCP — same routing layer. |
| systemd readiness probe | systemctl start riftchat only reports active once the UI actually answers on port 8111. |
| Operator-friendly | Weekly opt-in auto-upgrades, dialout group for RNode USB, security-hardened systemd unit, journal-aware logging. |
These govern every decision in the codebase:
- Works without the internet. Reticulum is the substrate, not TCP/IP. The thesis is the WAN-cable demo: yank the Ethernet, the conversation keeps flowing over LoRa or BLE.
- Derived from MeshChat (MIT). Not derived from Sideband (CC BY-NC-SA, forbidden). RiftChat is a respectful Rift-branded fork of Liam Cottle's work, not Sideband or anything else.
- No censorship-circumvention transports inside RiftChat. Tor and I2P need internet and add operational complexity. Both live on Rift Citadels for operators who deliberately run them — not in the user-facing app. The thesis is offline-first, not internet-circumventing.
- Reticulum-native. Official Python
rns+lxmffrom reticulum.network, nothing else. No Rust port (reticulum-rsis non-interoperable). No custom implementations. - Rift brand uniform. Matches
hub.rift.pw— Void Black background, IBM Plex Mono + Space Grotesk, operational-console chrome. See the Brand Style Guide.
For LoRa coverage where there's no LAN and no internet:
- Plug an RNode into USB.
- Add yourself to the
dialoutgroup:sudo usermod -aG dialout $USER && newgrp dialout. - In RiftChat's UI: Network → Interfaces → Add → RNodeInterface, point at
/dev/serial/by-id/....
You're now talking to anyone with another RNode within radio range — typically 5–15 km in line-of-sight, with no internet in the chain.
| Concern | Where |
|---|---|
| Reticulum interfaces (TCP hubs, RNodes, BLE, …) | /var/lib/riftchat/reticulum/config, or the UI's Network → Interfaces page |
| Web UI bind host/port | ExecStart= line in /lib/systemd/system/riftchat.service, or a systemd drop-in at /etc/systemd/system/riftchat.service.d/override.conf |
| Unattended weekly upgrades | /etc/default/riftchat — set RIFTCHAT_AUTO_UPDATE=true |
| Display name, propagation node, themes, ACLs | RiftChat UI → Settings |
Files under /etc/ and /var/lib/riftchat/ are conffiles — operator edits survive apt upgrade.
RiftChat/
├── meshchat.py Python entry point (RiftChat-branded)
├── src/frontend/ Vue UI source — Rift palette, Plex Mono + Space Grotesk
├── public/ Compiled frontend (generated by `npm run build-frontend`)
├── packaging/debian/ .deb sources: control, postinst, prerm, postrm, conffiles,
│ copyright, systemd unit, /etc/default, weekly cron, wrapper
├── electron/ Electron desktop wrapper (upstream)
├── docker-compose.yml Docker recipe (upstream)
├── requirements.txt Python deps: rns, lxmf, aiohttp, peewee, websockets
├── RIFT-FORK.md Living change log + brand-pass roadmap
└── LICENSE MIT (Liam Cottle 2024 + Rift contributors 2026)
The brand-pass and Debian packaging are tracked in RIFT-FORK.md. The broader Rift project's plan and strategy docs live in the parent worktree: apps/riftchat/PLAN.md, docs/ADOPTION_STRATEGY.md, and the Brand Style Guide.
- Reticulum MeshChat by Liam Cottle — MIT-licensed Vue + Python chat client. RiftChat is a fork. Liam's work made this possible in weeks rather than months.
- Reticulum + LXMF by Mark Qvist — the wire protocol that makes any of this work, including over LoRa, BLE, and disconnected mesh.
rmap.world+directory.rns.recipes— community-maintained directories of public Reticulum hubs. The default community hubs seeded into RiftChat's config come from these.
We stand on their shoulders.
RiftChat is the messaging face of the broader Rift project — sovereign, post-IP infrastructure built on Reticulum:
- github.com/datton/TheRift — the protocol stack, Citadel service architecture, ecosystem apps.
- rift.pw — entry hub + install index.
rift-citadel— Python service stack for Citadel operators (settlement, name service, hardware market, gateway).- RiftChat — this repo. The user-facing messenger.
The brand is shared. The wire protocol is shared. The mesh is shared.
The fork tracks upstream MeshChat. Pull requests welcome — especially fixes and improvements that generalize, which we'll PR back to Liam's repo. Rift-specific changes (palette, Citadel presets, default config, packaging) stay here.
git clone https://github.com/datton/RiftChat
cd RiftChat
git remote add upstream https://github.com/liamcottle/reticulum-meshchat
git fetch upstreamPeriodically git fetch upstream && git merge upstream/master to pick up Liam's improvements.
See RIFT-FORK.md for the full change log and the brand-pass roadmap.
MIT. Both the upstream MeshChat code (© 2024 Liam Cottle) and the Rift additions (© 2026 Rift Contributors). See LICENSE.
The MIT choice is deliberate — it keeps RiftChat F-Droid friendly and allows commercial use. Sideband is CC BY-NC-SA; we explicitly do not derive from Sideband source for that reason.
There is no cloud.
There is no master.
There is only The Rift.