Freechains is a permissionless social media protocol with integrated reputation.
- Local-first publish-subscribe topic-based model
- Unstructured peer-to-peer gossip dissemination
- Multiple flavors of public and private communication (
1->N
,1<-N
,N<->N
,1<-
) - Per-topic reputation system for healthiness
- Consensus via authoring reputation (human work)
- Free in all senses
(In bold we highlight what we believe is particular to Freechains.)
A user posts a message to a chain (a topic) and other users subscribed to the
same chain eventually receive the message.
Users spend reputation tokens, known as reps
, to post new messages and gain
reps
as they consolidate.
Users can like and dislike messages from other users, which transfer reps
between them.
- Main concepts:
- Commands: list of all protocol commands
- Other systems: comparison with other systems
- Google group: discussion group about Freechains
- Resources: publicly available chains, identities and peers
- Source code
- Android dashboard: manage/navigate your peers/chains
- Introductory videos: 1/3 | 2/3 | 3/3
First, you need to install java
and libsodium
:
$ sudo apt install default-jre libsodium23
Then, you are ready to install freechains
:
$ wget https://github.com/Freechains/README/releases/download/v0.10.1/install-v0.10.1.sh
# choose one:
$ sh install-v0.10.1.sh . # either unzip to current directory (must be in the PATH)
$ sudo sh install-v0.10.1.sh /usr/local/bin # or unzip to system directory
The basic API of Freechains is very straightforward:
freechains-host start ...
: starts the local peer to serve requests (execute on every restart)freechains keys ...
: creates a cryptographic keyfreechains chains join ...
: joins a chain locally to post and read contentfreechains chain post ...
: posts to a chain locallyfreechains chain get ...
: reads a post locallyfreechains chain consensus
: shows all posts in consensus orderfreechains peer send/recv ...
: synchronizes a local chain with a remote peer
Follows a step-by-step execution:
- Start host:
$ freechains-host start /tmp/myhost
-
Switch to another terminal.
-
Create an identity:
$ freechains keys shared "My very strong passphrase" # returns shared key
96700ACD1128035FFEF5DC264DF87D5FEE45FF15E2A880708AE40675C9AD039E
- Join the private chain
$chat
:
$ freechains chains join '$chat' 96700A... # type the full shared key above
C40DBB...
- Post some content:
$ freechains chain '$chat' post inline "Hello World!"
1_DE2EF0...
$ freechains chain '$chat' post inline "I am here!"
2_317441...
- Communicate with other peers:
- Start another
freechains
host. - Join the same private chain
$chat
. - Synchronize with the first host.
- Start another
$ freechains-host --port=8331 start /tmp/othost
# switch to another terminal
$ freechains --host=localhost:8331 chains join '$chat' 96700A... # type same key
C40DBB...
$ freechains --host=localhost:8330 peer localhost:8331 send '$chat'
2 / 2
The last command sends all new posts from 8330
to 8331
.
- Iterate over posts in a chain:
- Shows the consensus order of posts in the chain.
- Reads the posts payloads.
$ freechains --host=localhost:8331 chain '$chat' consensus
0_C40DBB... 1_DE2EF0... 2_317441...
$ freechains --host=localhost:8331 chain '$chat' get payload 1_DE2EF0...
Hello World!
$ freechains --host=localhost:8331 chain '$chat' get payload 1_DE2EF0...
I am here!