Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Share your connection

spora share turns your machine into the exit for someone you trust. No port forwarding, no public IP, no configuration: the sharer registers with a relay, and the client reaches it through that relay until a direct path is punched.

spora share

Your share URL is a credential

The printed https://spora.to/s/… link is the whole secret: whoever has it can route traffic through your connection. Send it over a channel you trust, and to people you trust. If it leaks, run spora share --fresh to generate a new identity (and a new URL); the old link stops working.

The URL stays stable across restarts because the identity behind it is persisted at ~/.config/spora/identity.bin. Copy that file to move a share to another machine, or keep several identities with --identity-file.

One share serves one client at a time. If a second client connects with the same URL, it replaces the first.

The connection log

You carry someone else’s traffic, so the CLI keeps a local, private record of what your connection was used for: which client session reached which destination IP and port, when, and how much data moved. If your IP is ever implicated in something you did not do, this is your answer to “what actually happened”.

spora log query --ip 203.0.113.5 --from 2026-08-01 --to 2026-08-28
spora log sessions

The log lives at ~/.local/state/spora/connlog/<routing-key>/, keeps 90 days by default (--conn-log-retention-days), and never leaves your machine. spora log hold pins a time range against retention if you have been asked to preserve records. --no-conn-log disables logging entirely, which also means you will have no record of what clients did with your IP. --conn-log-sessions-only records who was connected and when, without per-destination detail.

Be aware of the limits: destinations are IPs, not names, and a session that stayed on the relay path never directly observes the client’s own address. The log states what kind of evidence each recorded address is.

Your client’s DNS

By default the client resolves names through you. Its queries arrive at a resolver address inside the tunnel (100.64.0.53), and the share answers them from the resolvers your own machine uses (/etc/resolv.conf; the adapters’ DNS servers on Windows), forwarding each query verbatim to one of them and the answer verbatim back. The client never learns those addresses, and it still cannot reach anything else on your LAN. Should your resolvers stop answering, the share falls back to public ones (8.8.8.8, 1.1.1.1) until they recover. spora share prints which resolvers it is forwarding to.

--dns-upstream <ip[:port]> (repeatable) forwards to these servers instead, and only to them: no public fallback. --no-dns-forwarder switches the forwarding off; the client then needs public resolvers of its own (spora use --dns).

Known limitation: if your system resolves over encrypted DNS configured in the OS itself (DNS over TLS or HTTPS on Android, macOS, iOS or Windows, as opposed to a local stub such as systemd-resolved doing it on the machine’s behalf), the share still sends the client’s queries in plain UDP to the same servers. They resolve, but not over the encrypted transport you chose. With --os-routing the forwarder is wired in through a DNAT rule, so it is unavailable under --no-nat.

Running it permanently

The share is a single foreground process, so a systemd unit is all it takes:

[Unit]
Description=Spora share
After=network-online.target

[Service]
ExecStart=/usr/local/bin/spora share
Restart=on-failure
User=spora

[Install]
WantedBy=multi-user.target

systemctl stop sends SIGTERM, which the CLI handles cleanly.

The kernel exit

By default the sharer terminates client flows in a userland network stack and re-originates them from ordinary sockets. That needs no privileges and works everywhere. On Linux you can instead let the kernel route and NAT the client’s packets through a TUN device:

sudo spora share --os-routing

This performs better under load and behaves like a router rather than a proxy. It changes the firewall (iptables) and sysctls while running and undoes those changes on exit. See spora share --help for the --tun-addr, --tun-mtu, and --no-nat knobs.