I've implemented this most of the way (in Lua) but figured that someone would likely spot a deficiency in my design which could be fixed before I go further.
The network consists of nodes, which each "associate" with (by default) 8 other nodes which are randomly selected, and each node also stores a list of all the nodes which it knows about in the network. Each node can receive commands from clients, and then acts upon those commands. When the command involves a change to the data, the node repeats the command to each of the 8 associated nodes. The effect should be that all the nodes will eventually know of this change.
The creation of boards and posts in the network requires the completion of a simple hashcash proof of work to reduce spam. I also want to have a mechanism to remove duplicate posts, but I haven't implemented that yet (shouldn't be too hard).
Data and boards are deleted when they become old. This is to manage the size of the database.
At startup, the node has to bootstrap. This is done by having a list of "seed" nodes, one of which is almost guaranteed to be online. The node requests a list of all known nodes from a randomly selected seed node, and selects 8 of them to associate with. These 8 nodes are verified to be online at intervals of 5 minutes and if a node goes offline it is replaced by a randomly selected one from the list of all nodes.
Clients connect to the nodes using the same protocol as the nodes use to communicate with each other. Since the client and the node are separate pieces of software, many varieties of client (CLI, TUI, GUI, web etc.) may exist but I'm only going to work on the CLI version for now.