Self-hosting a server
remora-server is what makes ID connections work across networks. It's small: it keeps a list of which ID is online, introduces peers to each other so they can connect directly, and relays traffic only when a direct path fails.
Sessions are end-to-end encrypted between the two computers. The server learns which IDs are online and their IP addresses, but never passwords, screen content or keystrokes, even when it relays.
Requirements
- Any machine both computers can reach: a small Linux VPS is the usual choice. Remora's needs are tiny unless many sessions are relayed.
- TCP and UDP on port
21116open. UDP is used to set up peer-to-peer connections; without it everything still works, but always through the relay.
Run it
On the server, build and start it:
cargo build --release -p remora-server
./target/release/remora-server --bind 0.0.0.0:21116
Open the port in the firewall, for example with ufw:
sudo ufw allow 21116/tcp && sudo ufw allow 21116/udp
Also listen on port 443
Strict networks (offices, hotels) often block everything except web ports. Repeat --bind to listen on several ports at once:
./target/release/remora-server --bind 0.0.0.0:21116 --bind 0.0.0.0:443
Clients configured with :21116 automatically retry on :443 when their port is blocked, and then keep using whichever port worked, including for peer-to-peer setup. Binding port 443 on Linux needs root or the CAP_NET_BIND_SERVICE capability.
Keep it running with systemd
Create /etc/systemd/system/remora-server.service:
[Unit]
Description=Remora rendezvous and relay server
After=network-online.target
[Service]
ExecStart=/usr/local/bin/remora-server --bind 0.0.0.0:21116
Restart=always
DynamicUser=yes
[Install]
WantedBy=multi-user.target
Then copy the binary to /usr/local/bin and enable the service:
sudo systemctl enable --now remora-server
Point the apps at it
In every Remora app, open Settings → ID / relay server, enter your-server:21116, and click Save changes. The sidebar shows Online once the app is registered.
How it behaves
| Behavior | Detail |
|---|---|
| State | Kept in memory only. Restarting the server forgets online hosts; apps re-register within seconds. |
| Heartbeats | Hosts send one every 15 s; a host that is silent for 45 s is considered offline. |
| IDs | The first device to register an ID owns it while online. The same public IP can re-claim it after a reconnect. |
| Relay tokens | Random 128-bit tokens, valid for 30 s, created per connection attempt. |
| Logs | Set RUST_LOG=debug for more detail. Relayed sessions log their duration and bytes transferred. |