Skip to content

Build your own

Unseenet is meant to be like the old internet standards: written down, so that anyone can build a node, a client or a gateway that works with everybody else's, in any language, without asking the project. This last chapter is a map for doing that: which UN-RFCs to read, in which order, for what you want to build.

How the specification works

The protocol is specified in the UN-RFC series, numbered documents in the tradition of the RFCs that once defined Usenet. They are the authority: an implementation that follows them can join the network, and where the project's own code and a UN-RFC disagree, the code has the bug.

Every UN-RFC is still a Draft while Unseenet is pre-alpha, so details can change, and there is no promise of compatibility before 1.0. A change is proposed the same way for everyone: an issue that describes the problem, then a pull request with a new draft, as UN-RFC 0000 describes. The specification is under CC BY 4.0 and the code under the Apache License 2.0.

Everyone starts here

  1. 0000 Process - how the series works, and the full index.
  2. 0001 Architecture - the parts and how they fit.
  3. 0002 Article format - what an article is, how its Message-ID is computed, and the validation every node and client runs.
  4. 0003 Identities and crypto - keys, fingerprints, signatures and encryption, by name.
  5. 0004 Groups - Group IDs, manifests, the types, bans and withdrawing posts.

With those five you understand what everything else builds on.

A client that reads

The smallest useful client connects to a node over Tor, reads groups and checks everything itself. It needs:

The one rule not to skip: check every signature, manifest and withdrawal yourself, as section 4 of 0004 says. A client that trusts its node can be fooled by it.

A client that writes

To post, a client also needs:

Or build on the core

You do not have to implement all of that. A program in Python can use the project's client core, Session, which already does keys, the vault, Tor, postage, ripening and every check; a front end in any other language can talk to the same core through the local client API on 127.0.0.1. Either way your client behaves like the others from the first day. See Write a client.

A node

A node needs the client's reading list from 0002 to 0006, the ripening check of 0025, and:

A gateway or an entrance

Testing against the network

  • The project's test nodes and the group unseenet.test are there to be posted in by new software. Test nodes may be reset.
  • The project's own code is the reference: when your implementation and it disagree, check the UN-RFC - and if the UN-RFC is unclear, that is worth an issue.
  • A classic newsreader such as tin can read a node's open groups over Tor, which is a quick way to see what a node serves.

When something you build works, say so in the group unseenet - every independent implementation makes the network stronger, and shows that the specification says what it means.