From 02c80b18f4387d95b24ffbd086b149aa07b19c6f Mon Sep 17 00:00:00 2001 From: quadrismegistus Date: Mon, 21 Sep 2020 09:43:49 +0100 Subject: [PATCH] updates --- README.md | 29 +++++++++++++++++++++++++---- docs/comparisons.ods | Bin 0 -> 15371 bytes komrade/constants.py | 8 ++++---- 3 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 docs/comparisons.ods diff --git a/README.md b/README.md index 50370bf..c260104 100644 --- a/README.md +++ b/README.md @@ -50,11 +50,10 @@ We present a simplified set of social media features drawn from everything that' #### Posting * Post up to 1 image and/or 1000 characters - * Post to the entire world (e.g. Twitter) + * Post to the entire world (e.g. Twitter) ✔ * Post to those you trust (e.g. Facebook) * Post to your surrounding area by a distance radius (e.g. Nextdoor) * Anonymously up-vote or down-vote posts (e.g. Reddit) - * Post anonymously or from your account #### Organizing * Host events and invite others (e.g. Facebook) @@ -62,8 +61,30 @@ We present a simplified set of social media features drawn from everything that' * Anonymously pin on a map sites of danger, like police (e.g. Waze) #### Messaging - * Message securely with encrypted contents (e.g. Signal) - * Message securely with untraceable metadata (new) + * Message securely with encrypted contents (e.g. Signal) ✔ + * Message with untraceable metadata via Tor (new) ✔ + +## How is this different from... + +### Comparison table + +| Other cool thing | What is it? | Kind of like... | Decentralized? | Anonymous? | Confidential? | Data persistence? | Identity verification? | Need invitation/server? | What data can user find? | +| --------------------------------------------- | ---------------- | ---------------- | ---------------------------- | ------------------------------------------- | ----------------------------------------- | ----------------------------------- | ------------------------------------- | -------------------------------- | ----------------------------------------- | +| *Komrade* | *Social network* | *Twitter* | *No (central server on Tor)* | ***Yes (everything routed via Tor)*** | ***Yes (100% E2EE)*** | *Minimal server (deleted ASAP)* | *Yes (central public key repository)* | ***No (works like twitter)*** | Mixed (global feed; hashtag search only) | +| [Secure Scuttlebutt](https://scuttlebutt.nz/) | Social network | Twitter/Facebook | **Fully (P2P)** | No (P2P reveals IP; friend networks public) | Partly (private E2EE, public unencrypted) | Distributed across friend networks? | Yes? (federated key exchange?) | Yes (need initial pub) | Limited (search friends-of-friends' data) | +| [Diaspora](https://diasporafoundation.org/) | Social network | Twitter | Partly (federated) | No (unless via Tor Browser) | No (unencrypted?) | ? | ? | Yes (need 'pod' server) | | +| [Mastodon](https://joinmastodon.org/) | Social network | Twitter | Partly (federated) | No (unless via Tor Browser) | No (unencrypted?) | ? | ? | Yes (need 'instance' server) | | +| [Matrix](https://matrix.org/) | Group chat | Slack | Partly (federated) | No? | **Yes? (100% E2EE)** | ? | Yes (?) | Yes (invited channels only?) | | +| [Briar Messenger](https://briarproject.org/) | Messenger | WhatsApp | **Fully (P2P)** | **Yes? (Tor)** | **Yes (100% E2EE)** | None (needs 24/7 listener) | Partly (public keys traded IRL) | Yes (need initial contact?) | | +| [Cabal Chat](https://cabal.chat/) | Chatrooms | IRC | **Fully (P2P)** | No (P2P reveals IP) 1 | Mostly (shared key, not E2EE) | Distributed Hash Table | No (?) | Not really (public chat is open) | | + +Sources: + +1. [Cabal FAQ: What kind of security is involved with Cabal?](https://cabal.chat/faq.html#:~:text=What%20kind%20of%20security%20does,is%20involved%20in%20a%20cabal) + +### In words + +1. Secure Scuttlebutt? SSB is probably the most impressive alternative social network out there. It's truly P2P, not just federated like Diaspora or Mastodon, so the content you see is coming to you via your friends and their friends: you download it directly from them. It has a great user base... ## Progress diff --git a/docs/comparisons.ods b/docs/comparisons.ods new file mode 100644 index 0000000000000000000000000000000000000000..6b13a4c2fd93ce17c603eef30179738b4b63cc0d GIT binary patch literal 15371 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