// set up a node
Running a Reticulum node is the step beyond an ordinary client. You set up a background process that manages interfaces, keeps track of paths and routes traffic. Below is the minimum you need.
There are two main flavours: the original Python stack (RNS) and the Rust stack (rsReticulum, used by Ratspeak). Both speak the same protocol and work together on the same network.
| Stack | Installation | Config location | Daemon |
|---|---|---|---|
| Python (RNS) | pip install rns | ~/.reticulum/config | rnsd |
| Rust (rsReticulum) | cargo build --release | ~/.rsReticulum/config | rnsd-rs |
The examples on this page use the Python stack (rnsd, rnstatus). The Rust equivalents are called rnsd-rs, rnstatus-rs, etc.
On the first start, rnsd automatically generates an identity and a config file. After that you adjust the config to your situation and start it again.
# First start: generates config
rnsd
# Stop (Ctrl+C), edit config
nano ~/.reticulum/config
# Start again
rnsd &
rnstatus
The config file roughly consists of two parts: a [reticulum] section with general settings and an [interfaces] section with one or more interface definitions.
# ~/.reticulum/config
[reticulum]
enable_transport = no
share_instance = yes
shared_instance_port = 37428
[interfaces]
# Add your interfaces here
[[ReticulumNet]]
type = TCPClientInterface
enabled = yes
target_host = voorbeeld.nl
target_port = 4242
| Setting | What it does | Default |
|---|---|---|
| enable_transport | Forwards traffic for other nodes (transport node) | no |
| share_instance | Lets local apps (Ratspeak, MeshChat) connect to this daemon | yes |
| shared_instance_port | Port for local app connections | 37428 |
Only turn on enable_transport = yes if you have an always-on machine that should forward traffic for others. For normal use (sending and receiving messages) it is not needed.
If you run a node for others, you pick from two roles. They are separate processes that can also run on the same machine.
| Role | Process | What it does |
|---|---|---|
| Transport node | rnsd (or rnsd-rs) | Forwards packets between interfaces. Enables multi-hop reachability. The backbone of the mesh. |
| Propagation node | lxmd -p (or lxmd-rs) | Stores LXMF messages for offline recipients. Delivers them when they come back. Similar to a mail server. |
# Both running on the same machine
rnsd &
lxmd -p &
A transport node does not store messages and a propagation node does not route packets. If you want both, run both processes.
| Command | Function |
|---|---|
| rnstatus | Show interfaces, paths and status of the running daemon |
| rnpath <hash> | Inspect, request or refresh a path to a destination |
| rnprobe <hash> | Test whether a destination is reachable (similar to ping) |
| rncp <file> <hash> | Copy a file over a Reticulum resource (encrypted) |
| rnsh <hash> | Open an encrypted remote shell on another node |
| rnid | Create, inspect, import or export identities |
A Raspberry Pi 4 or Pi Zero 2 W as a headless node is a very common setup. Run rnsd as a systemd service so it restarts automatically after a reboot. Optionally attach a LoRa radio over USB for off-grid coverage.
# /etc/systemd/system/rnsd.service
[Unit]
Description=Reticulum Network Daemon
After=network.target
[Service]
Type=simple
User=kel
ExecStart=/usr/local/bin/rnsd
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable rnsd
sudo systemctl start rnsd
Use /dev/serial/by-id/... paths in your interface config if you have a USB radio. Device numbers are not stable after a reboot. Want to set up a network for a group? See build a network. For a larger network with multiple operators, see community mesh.