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.

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 21116 open. 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:

bash
cargo build --release -p remora-server
bash
./target/release/remora-server --bind 0.0.0.0:21116

Open the port in the firewall, for example with ufw:

bash
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:

bash
./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:

ini
[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:

bash
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

BehaviorDetail
StateKept in memory only. Restarting the server forgets online hosts; apps re-register within seconds.
HeartbeatsHosts send one every 15 s; a host that is silent for 45 s is considered offline.
IDsThe first device to register an ID owns it while online. The same public IP can re-claim it after a reconnect.
Relay tokensRandom 128-bit tokens, valid for 30 s, created per connection attempt.
LogsSet RUST_LOG=debug for more detail. Relayed sessions log their duration and bytes transferred.