📖 Documentation: unseenet.org
Usenet, unseen. A decentralized, encrypted discussion network in the spirit of old Usenet and BBSes — groups and chats you can reach by running one program from a USB stick, carried between independently run nodes over Tor onion services.
Status: pre-alpha / design phase. The protocol is being written down in the UN-RFC series. The Python code here is a first working skeleton of it. Nothing is stable yet, and it has not had a security review. Do not rely on it to protect anyone yet.
The idea
In the old days, you connected to your news server. Your server exchanged articles with other servers, and before long your post had travelled around the world. Nobody owned Usenet. Anyone could run a server. You could read it with any newsreader.
Unseenet brings that model back, with what we have learned since:
- Easy access. One program, no installation, no account, no public IP, no port forwarding. Put it on a USB stick and go.
- Decentralized. Anyone can run a node — on a Raspberry Pi, a homelab container, a VPS. Nodes replicate groups to each other the way Usenet servers did. There is no central server and no company.
- Encrypted where it matters. Closed groups are end-to-end encrypted. The nodes that carry them see only ciphertext.
- Hard to seize. The client keeps everything in one encrypted vault. Nodes never hold group keys. A stolen stick or a seized server reveals as little as possible.
- Hidden. Every node is a Tor onion service. Nobody needs to know where a node is, or who is reading.
- Open protocol. Specified in numbered RFC-style documents, so others can write their own nodes and clients — exactly like in the old days.
How it works
you (USB stick) the network
+-----------+ Tor +--------+ Tor +--------+
| unseenet | <---------> | node A | <---> | node B | <---> ...
| client | ONNTP +--------+ +--------+
+-----------+ ^ ^
encrypted vault +---- node C -----+
-
Articles are signed with the author's key. Their Message-ID is a hash of their content, so they cannot be forged or altered in transit.
-
Groups are owned. A group's name includes a fingerprint of its owner's key (
dk.snak@ab3k5x7qwe2rtz4m), so nobody can hijack it, and its settings live in a signed manifest. -
Group types are chosen by the owner:
Type Read Post Encrypted openanyone anyone no moderatedanyone moderators, or with approval no channelanyone owner and chosen posters no closedmembers only members only yes -
Spam is priced, not policed: every post carries a small proof-of-work ("postage"), a fraction of a second for a person, costly in bulk.
-
Three authorities, no rulers. Group owners decide who may post in their group. Node operators decide which groups and peers they carry. Readers decide what they see.
-
Text only. No binaries. Articles are at most 64 KiB. That keeps nodes small and their operators out of trouble.
-
Standard tools. The wire protocol, ONNTP, is a strict profile of NNTP. Classic newsreaders can talk to a node.
The specification
The protocol is defined in the UN-RFC series. The documents are the authority; this code is just one implementation.
| No. | Title |
|---|---|
| 0000 | The Unseenet Request for Comments Process |
| 0001 | Architecture and Terminology |
| 0002 | Article Format |
| 0003 | Identities, Keys and Cryptographic Primitives |
| 0004 | Groups, Manifests and Access Control |
| 0005 | ONNTP: Transport and Peering over Onion Services |
| 0006 | Proof-of-Work Postage |
| 0007 | Protecting Data at Rest |
| 0008 | Chat Groups and Low-Latency Delivery (draft) |
| 0009 | Inbox Groups and Local Groups (draft) |
| 0011 | Node Information and Operator Contact (draft) |
| 0012 | Retention, Archive Nodes and History (draft) |
| 0013 | Removing Groups (draft) |
| 0014 | Group Rules (Charters) (draft) |
Want to change the protocol or build something compatible? Read UN-RFC 0000 for how.
Trying it
Portable: Windows, macOS, Linux, USB stick
Download a zip from the releases,
unzip it, and double-click Start Unseenet - the client and Tor are
inside, nothing to install. The -usb.zip has all three systems in one
folder for a stick that works anywhere. See the
portable guide.
The client with Python
Requires Python 3.11+ and the tor binary (dnf install tor / apt install tor).
pipx install "unseenet[tui]"
unseenet-tui
(or from a clone: pip install -e ".[tui]")
On first start you choose a passphrase for your vault, a display name, and
the node to connect to (its .onion address). Then:
| Key | |
|---|---|
g |
browse the node's groups and subscribe |
n / r |
new post / reply (Ctrl+S sends) |
c |
create a group (open, moderated, channel or closed) |
m |
send a private message - only the recipient can read it |
o |
your nodes: add, remove, details, write to an operator |
k |
show your key, so others can write to you or invite you |
i |
invite someone to a closed group you own |
j |
join a group by ID or unseenet:join link |
F5 |
refresh (also happens every 30 seconds) |
a |
add the author of a post as a contact; contacts get their own conversation view |
v |
switch a group between chat and threads |
? |
the group's rules and settings |
s |
edit your signature |
Ctrl+P |
command palette - every action by name |
Everything is kept in unseenet.vault, encrypted, next to where you run it,
and the posts you have fetched stay readable offline.
There is also a plain command line client, unseenet --help.
A node
On Debian or Ubuntu (a Proxmox LXC or a Raspberry Pi is plenty):
curl -fsSL https://raw.githubusercontent.com/unseenet/unseenet/main/deploy/install-node.sh | sudo bash
It installs Tor and the node as a systemd service and prints the node's
.onion address. The full guide - configuration, peering, backup,
security and troubleshooting - is in the
documentation. To peer with a friend's node, swap onion addresses and
node keys (the installer prints both), add a [[peer]] section with the
other's address and key to /home/unseenet/node.toml on both nodes,
and restart with systemctl restart unseenet-node.
For development, a node can run without Tor:
unseenet-node --no-tor --data /tmp/node --listen 127.0.0.1:1119.
Talk about Unseenet - on Unseenet
The project's groups are carried by its test nodes:
| Group | For |
|---|---|
unseenet@ph5fc5hop5232qsz |
The project: protocol, software, ideas, questions |
unseenet.test@ph5fc5hop5232qsz |
Test posts - say hello, try replies |
unseenet.announce@ph5fc5hop5232qsz |
Releases and news (a channel: read-only) |
unseenet.nodes@ph5fc5hop5232qsz |
The signed list of known nodes, for clients (UN-RFC 0010) |
Release notes and the node list are posted there automatically by GitHub
Actions, over Tor. All are owned by the project key
ed25519:det5dxevwbk36eds2indrzlazyri3fq3bgdzw6kx4ems3o267sya.
Connect to the test node
f6vnchi5p7ll4yn6yot6cz4ohzuxy3uhc3kztafuwn3zlyoup6tn64qd.onion,
press j in the TUI and paste a group ID (or g to browse).
The test nodes may be reset at any time while Unseenet is pre-alpha.
Roadmap
- Protocol drafts UN-RFC 0000–0007
- Article signing, content-derived Message-IDs, postage
- Manifests, four group types, moderation approvals, cancels
- Closed groups: epochs, member keys, sealed envelopes, E2E encryption
- Node: ONNTP server, validation, streaming feeds to peers
- Tor: own process, onion service via control port, SOCKS
- Client: encrypted vault, command line
- First real test: two nodes peering over Tor
- TUI client (first version): groups, threads, posting, closed groups, invites
- Node install script and systemd service
- Encrypted offline cache; documentation site; releases on PyPI
- Pull catch-up between nodes (UN-RFC 0017)
- Portable builds with bundled Tor for USB (Linux, Windows, macOS), Tor bridges
- Several nodes in one client; peering with node keys (UN-RFC 0016)
- Transferring group ownership (UN-RFC 0015, specified)
- Chat view, push and fast-delivery chat groups (UN-RFC 0008)
- Group rules / charters (UN-RFC 0014)
- Inbox groups: private messages and operator contact (UN-RFC 0009)
- Node information and operator contact (UN-RFC 0011)
- Moderation submissions via inbox (UN-RFC 0009 section 3)
- Archive nodes (UN-RFC 0012)
- Node discovery (UN-RFC 0010)
- Independent security review
- A second, independent implementation
Contributing
Ideas, criticism and code are welcome. Protocol changes go through the UN-RFC process; code changes through ordinary pull requests. See docs/development.md for architecture and design decisions.
På dansk
Unseenet er et decentralt og krypteret diskussionsnet i stil med det gamle Usenet og BBS'erne. Du kører én klient, gerne fra en USB-pind, kobler dig på en node over Tor, og noderne udveksler grupper med hinanden. Åbne grupper er som det gamle Usenet; lukkede grupper er end-to-end-krypterede, så noderne kun ser støj. Protokollen beskrives i RFC-lignende dokumenter, så alle kan lave kompatible noder og klienter.
License
- Code: Apache License 2.0
- Protocol specification (
rfc/) and logo (assets/): CC BY 4.0 — copy, quote and implement freely, with credit
Anyone may implement the protocol; no license is needed for that.
Metadata
Release files for unseenet 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| unseenet-0.2.0.tar.gz | 109.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| unseenet-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 203.4 kB
Release files / unseenet-0.2.0.tar.gz
| Download URL | unseenet-0.2.0.tar.gz |
|---|---|
| Size | 109.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
43a33a3b50ed8697b0accbd19f9502545294f01efb3f640d36fea8c01d1d1c2a
|
|
BLAKE2b-256 checksum How to use checksums |
49c7f9e80fd94f5092d20e5475a7cfdfe6a7414ad901aecbd2809fac7ff67049
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.
Transparency logRelease files / unseenet-0.2.0-py3-none-any.whl
| Download URL | unseenet-0.2.0-py3-none-any.whl |
|---|---|
| Size | 93.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5a5c2cee16e10d78a3138aca457d20fbf48210a9246a45155783f845d04c468f
|
|
BLAKE2b-256 checksum How to use checksums |
3ca37cc35576b504b684e4418ba1968f12b68e119230e426e7e949feb4c18292
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.
Transparency log