Early-stage software. Shurli is experimental and built with AI assistance. It will have bugs. Not recommended for production or safety-critical use. Read the disclaimer.
Managing Your Network

Managing Your Network

Your relay is secured and peers are connected. This guide covers daily operations: who can do what, how to manage peers, and what to do when things go wrong.

Roles: admin vs member

Every authorized peer has a role. The first peer to join a fresh relay is automatically promoted to admin.

AdminMember
Connect and use the relayYesYes
Use proxied servicesYesYes
Create pairing codesYesOnly if invite policy is “open”
Create invite depositsYesOnly if invite policy is “open”
Seal/unseal the vaultYesNo
Remote unsealYesNo
Authorize/deauthorize peersYesNo
Change invite policyYes (config file)No

Auto-promotion: When the relay starts with zero admins in authorized_keys, the first peer to pair is automatically promoted to admin. After that, new peers join as members.

Viewing your peers

From the relay server

# Full peer list with roles, groups, and verification status
shurli relay list-peers

Example output:

1. [admin]  12D3KooWLqK4ab...  home-node
2. [member] 12D3KooWRtP7cd...  laptop    group=family  [UNVERIFIED]
3. [member] 12D3KooWXyZ9ef...  phone     group=family  [verified=2026-03-01]

3 authorized peers (1 admin, 2 members)

From any device

# Uses the local config to find the authorized_keys file
shurli auth list

The output shows:

  • Short peer ID (first 16 characters)
  • Role badge: [admin] or [member]
  • Comment (the name you gave when pairing)
  • Group affiliation (if set)
  • Verification status: [UNVERIFIED] or [verified=DATE]

Changing roles

Promote a member to admin

shurli auth add 12D3KooWRtP7cd... --role admin

If the peer is already authorized, this updates their role without removing their other attributes.

Demote an admin to member

shurli auth add 12D3KooWRtP7cd... --role member

Caution: Don’t demote yourself unless another admin exists. A relay with zero admins can’t create invites, unseal the vault remotely, or manage peers.

Removing peers

# From a client device
shurli auth remove 12D3KooWXyZ9ef...

# From the relay server
shurli relay deauthorize 12D3KooWXyZ9ef...

What happens when you remove a peer:

  1. The peer ID is deleted from authorized_keys
  2. Existing connections from this peer continue until they disconnect (TCP keepalive timeout)
  3. When the peer tries to reconnect, the connection gater rejects them
  4. The peer needs a new invite to rejoin

Relay server note: shurli relay authorize and shurli relay deauthorize apply immediately if the relay is running (live reload via admin socket). If the relay is stopped, changes take effect on next start.

Adding peers manually

Sometimes you have a peer ID but don’t want to go through the invite flow (e.g., adding your own new device):

# On the relay server
shurli relay authorize 12D3KooWNewDevice... my-new-laptop

# On a client device
shurli auth add 12D3KooWNewDevice... --comment "my-new-laptop" --role member

Relay info

See your relay’s identity, addresses, and connection details:

shurli relay info

Example output:

Peer ID: 12D3KooWRelay...
Connection gating: enabled
Authorized peers: 3

Public addresses:
  /ip4/203.0.113.50/tcp/7777/p2p/12D3KooWRelay...
  /ip4/203.0.113.50/udp/7777/quic-v1/p2p/12D3KooWRelay...
  /ip6/2001:db8::1/tcp/7777/p2p/12D3KooWRelay...

Quick setup:
  shurli relay add 203.0.113.50:7777 --peer-id 12D3KooWRelay...

If qrencode is installed, it also displays a QR code for easy mobile setup.

Validating your auth file

Check for syntax errors or malformed peer IDs:

shurli auth validate

Or validate a specific file:

shurli auth validate /etc/shurli/relay_authorized_keys

Output shows the count of valid peer IDs and any errors with line numbers.

Configuration reference

Key configuration fields for network management:

relay-server.yaml (relay side)

KeyTypeDefaultWhat it does
security.invite_policystring"admin-only"Who can create invites: admin-only or open
security.vault_filestring""Path to sealed vault JSON (empty = no vault)
security.auto_seal_minutesint0Auto-reseal timeout (0 = manual only)
security.require_totpboolfalseForce TOTP for all unseal operations
security.enable_connection_gatingbooltrueReject unauthorized peers
security.authorized_keys_filestring"relay_authorized_keys"Path to the peer allowlist

shurli.yaml (client side)

KeyTypeDefaultWhat it does
security.authorized_keys_filestring"authorized_keys"Path to the peer allowlist
relay.addresseslist[]Relay server multiaddrs
namesmap{}Peer name to ID mappings

Common operations quick reference

TaskCommand
List peersshurli auth list or shurli relay list-peers
Add peershurli auth add <peer-id> --comment "name"
Remove peershurli auth remove <peer-id>
Promote to adminshurli auth add <peer-id> --role admin
View relay infoshurli relay info
Add relay to configshurli relay add <addr> --peer-id <id>
Remove relayshurli relay remove <addr>
List relaysshurli relay list
Validate auth fileshurli auth validate
Set peer attributeshurli auth set-attr <peer-id> <key> <value>
Limit peer bandwidthshurli auth set-attr <peer-id> bandwidth_budget 1GB
Unlimited peer bandwidthshurli auth set-attr <peer-id> bandwidth_budget unlimited
Create pairing codeshurli relay pair --count N --ttl 2h
Create invite depositshurli relay invite create --ttl 86400
List invitesshurli relay invite list
Seal vaultshurli relay seal
Unseal vaultshurli relay unseal
Remote unsealshurli relay unseal --remote <addr>
Vault statusshurli relay seal-status
Remote list peersshurli relay list-peers --remote <addr>
Remote authorizeshurli relay authorize <peer-id> [comment] --remote <addr>
Remote deauthorizeshurli relay deauthorize <peer-id> --remote <addr>
Set MOTDshurli relay motd set "message"
Set goodbyeshurli relay goodbye set "message"
Recover identityshurli recover
Change passwordshurli change-password
Lock daemonshurli lock
Unlock daemonshurli unlock

Per-peer attributes

Control individual peer behavior with shurli auth set-attr:

AttributeValuesEffect
roleadmin, memberPeer privileges
groupany stringOrganize peers
verifiedfingerprint prefixIdentity verification status
bandwidth_budgetunlimited, 500MB, 1GB, etc.Hourly transfer limit for this peer
# Limit a peer to 1GB per hour
shurli auth set-attr 12D3KooW... bandwidth_budget 1GB

# Remove the limit (use global default)
shurli auth set-attr 12D3KooW... bandwidth_budget ""

The bandwidth budget priority chain: LAN peers (always exempt) > per-peer attribute > config file bandwidth_budget > default (100MB/hr). Config accepts human-readable values like "500MB" or "unlimited".

Remote relay management

All relay admin commands support --remote for management over encrypted P2P:

# Manage vault remotely
shurli relay vault unseal --remote my-relay
shurli relay seal-status --remote my-relay

# Manage peers remotely
shurli relay list-peers --remote my-relay
shurli relay authorize 12D3KooW... home-node --remote my-relay
shurli relay deauthorize 12D3KooW... --remote my-relay

# Manage invites remotely
shurli relay invite list --remote my-relay
shurli relay invite create --caveat "role=member" --remote my-relay

# MOTD and goodbye
shurli relay motd set "Planned maintenance Saturday" --remote my-relay
shurli relay goodbye set "Migrating to new relay" --remote my-relay

Only admin-role peers can use remote management. The connection uses the /shurli/relay-admin/1.0.0 protocol over the same encrypted P2P tunnel as regular traffic.

Operator announcements

MOTD (message of the day)

Set a short message shown to peers when they connect:

shurli relay motd set "Maintenance window: Saturday 2am-4am UTC"
shurli relay motd status    # Show current MOTD and goodbye
shurli relay motd clear     # Remove MOTD

Goodbye (relay decommission)

Notify all peers that the relay is shutting down:

# Set goodbye (pushed to all connected peers immediately)
shurli relay goodbye set "This relay shutting down March 15. Please migrate."

# Changed your mind? Retract it
shurli relay goodbye retract

# Send goodbye and shut down the relay
shurli relay goodbye shutdown "Relay decommissioned."

Goodbyes are persistent: clients cache them and display on reconnect attempts. All messages are signed by the relay’s Ed25519 key and verified by clients.

Security note: MOTD and goodbye messages are sanitized before display. URLs, email addresses, and non-ASCII characters are stripped. This is defense-in-depth against phishing: a compromised relay cannot use announcements to redirect users to malicious sites.

TaskCommand
Set MOTDshurli relay motd set "message"
Clear MOTDshurli relay motd clear
Set goodbyeshurli relay goodbye set "message"
Retract goodbyeshurli relay goodbye retract
Goodbye + shutdownshurli relay goodbye shutdown "message"
Check statusshurli relay motd status

Troubleshooting

IssueCauseSolution
Peer can’t connectNot in authorized_keysshurli relay authorize <peer-id> (applies immediately if relay is running)
“vault is sealed” on inviteVault lockedUnseal: shurli relay unseal
TOTP code rejectedClock skewSync your device clock (NTP). TOTP allows +/- 30 seconds
Remote unseal failsNot an admin, or wrong addressCheck role with shurli auth list, verify address with shurli relay info
“permanently blocked” on unseal11+ failed attemptsSSH to relay and unseal locally: shurli relay unseal
Peer shows [UNVERIFIED]SAS not confirmedCompare emojis and run: shurli verify <peer>
Invite deposit “not found”Typo in ID, or expiredCheck with shurli relay invite list
Can’t create invites (member)Invite policy is admin-onlyAsk an admin, or change policy to “open” in config
Relay address changedServer IP changedUpdate clients: shurli relay remove <old> then shurli relay add <new>
Auth file has errorsMalformed peer IDsRun shurli auth validate to find the problem
Remote admin rejectedNot an admin peerCheck role with shurli auth list
MOTD not showingClient dedup (24h)Same MOTD only shown once per 24h per relay
Goodbye cached after retractClient not reconnectedRetract is pushed; offline peers clear on next connect

Next step: ZKP Privacy Setup - enable zero-knowledge proof authentication so peers can prove authorization without revealing their identity.