I’ve been working on Axon, a decentralized friend-to-friend network for private file sharing and chat. Everything runs over Tor Hidden Services (v3), so there’s no port forwarding, no VPN setup, and no central servers.
Why I built it:
I wanted a persistent, private way to share large files and datasets with people I know — something that doesn’t expose an IP address and doesn’t rely on temporary, single-use transfer tools. Just a small mesh behind NATs that stays reachable and does its job.
What made it interesting:
Tor’s great for privacy, but the latency and bandwidth limits force you to rethink how a system like this communicates. Rather than pushing around giant file lists, I wanted Axon to be able to scale to large libraries without choking Tor. Here’s what I ended up building:
Bloom Filter Indexing:
Instead of exchanging full file lists, peers trade a compressed ~64KB Bloom Filter. This keeps discovery bandwidth tiny and gives Axon room to grow into very large libraries if needed.
Swarm Downloading:
When multiple peers have a file, Axon pulls chunks from all of them at once. It keeps the line busy and avoids the “single slow peer” bottleneck Tor can introduce.
Smart Resume:
Tor circuits vanish all the time, so Axon tracks progress in 512KB chunks. You can close the app, reopen it whenever, and it resumes without losing anything.
SQLite + WAL:
Using modernc.org/sqlite (pure Go) with Write-Ahead Logging keeps reads and writes from blocking each other, so the UI stays responsive even during heavy activity.
Stack:
Go
Tor Hidden Services (v3) via cretz/bine
Ed25519 for identity
X25519 for end-to-end encrypted chat
SQLite
Axon is in Alpha (v0.9.37). I’d love feedback on the swarm logic and on whether the Bloom Filter approach feels solid for long-term scaling.
SarahRoseLives•26m ago
I’ve been working on Axon, a decentralized friend-to-friend network for private file sharing and chat. Everything runs over Tor Hidden Services (v3), so there’s no port forwarding, no VPN setup, and no central servers.
Repo: https://github.com/SarahRoseLives/Axon
Website: https://axonmesh.net/
Why I built it: I wanted a persistent, private way to share large files and datasets with people I know — something that doesn’t expose an IP address and doesn’t rely on temporary, single-use transfer tools. Just a small mesh behind NATs that stays reachable and does its job.
What made it interesting: Tor’s great for privacy, but the latency and bandwidth limits force you to rethink how a system like this communicates. Rather than pushing around giant file lists, I wanted Axon to be able to scale to large libraries without choking Tor. Here’s what I ended up building:
Bloom Filter Indexing: Instead of exchanging full file lists, peers trade a compressed ~64KB Bloom Filter. This keeps discovery bandwidth tiny and gives Axon room to grow into very large libraries if needed.
Swarm Downloading: When multiple peers have a file, Axon pulls chunks from all of them at once. It keeps the line busy and avoids the “single slow peer” bottleneck Tor can introduce.
Smart Resume: Tor circuits vanish all the time, so Axon tracks progress in 512KB chunks. You can close the app, reopen it whenever, and it resumes without losing anything.
SQLite + WAL: Using modernc.org/sqlite (pure Go) with Write-Ahead Logging keeps reads and writes from blocking each other, so the UI stays responsive even during heavy activity.
Stack:
Go
Tor Hidden Services (v3) via cretz/bine
Ed25519 for identity
X25519 for end-to-end encrypted chat
SQLite
Axon is in Alpha (v0.9.37). I’d love feedback on the swarm logic and on whether the Bloom Filter approach feels solid for long-term scaling.
Thanks for checking it out!