Delta Chat Spec Proposal: Super Groups
Terminology
semi-public group: A group that is intended to be used for more or less public interactions, its invitation link can be shared in public spaces like social media or websites. It is “semi-public” and not “public” because it is up to the members to distribute its invitation link, they could keep it private and only invite certain people or share it only in certain spaces, that is: there is no public discovery of the group inside Delta Chat.
The problem
There is a need / “market” for semi-public groups by some communities, for example influencer fan group, open source software projects’s support rooms, small communities or collectives that want to have some public invitation link in social media and/or their pages to join a room for support, feedback or interaction with the community. Existing solutions like Matrix and XMPP have several disadvantages (server and client side) and there is a need/demand for better solutions.
It is happening already that individuals and collectives are sharing invitation links to their Delta Chat groups in social media and other public spaces, even if this is officially not recommended by the Delta Chat developers. This is problematic, the existing groups feature in Delta Chat is intended for private groups usage only, this causes bad experiences due to the problems listed below and deteriorates the reputation of Delta Chat.
Existing groups don’t scale well for semi-public usage, they are not suited for more than 100-500 members, the more members the harder and slower it gets to send a message because computational overhead of encrypting for every group member’s public key.
Joining such a huge group with potential strangers also mean they can suddenly start sending you spam in private or adding you to new groups against your will.
When joining a group, it is not possible to see any chat history.
Lack of basic group administration is also a problem, anyone can modify group name and picture, add new people against their will, remove members / destroy the group, etc.
Properties of a Super Group
- Scalable: It is a symmetrically encrypted decentralized mailing list like the existing broadcast channels feature but everyone knows the member list and can write messages instead of having a single person allowed to send.
- No Spam: People don’t share their public key when joining, but participate using the group key without revealing their public key so no spammer can write to them in 1:1 or add them to other groups, if you leave the group, you forget the key and never see any message again, no one can keep spamming you just because you joined a group once
- Invitation only: Since it uses a symmetric key, people can’t add other people manually, only via invite links like with the existing Channels, that avoids getting added to super groups against your will
- [Optional] Chat History: Since the group uses a symmetric key, then it is not problem at all for the inviter to resend the chat history when adding a new member, with the existing private groups this is not possible because other people’s messages are encrypted only for the list of members at the time of sending, so if you re-send them as-is the new member can’t decrypt them.
- [Optional] Moderation: It could have an admin with something like what “Owned Group” solution proposed at New feature: Group Types - #37 by adbenitez then only admin can edit the group settings and invite or remove other members. This is necessary for the public usage to avoid the mentioned problems of lack of moderation, but could be rolled out in a next step, just with the properties of the previous points alone it is already much more useful than the existing private groups that have a big spam problem via “clone chat” etc.
Annex I: Implementing a super-group prototype today
A basic limited prototype of a pseudo-supergroup as proof of concept can be implemented with the existing Delta Chat apps and tools as follow:
- Create a bot that creates a channel and give you the channel invitation link
- When someone joins the channel:
2.1. the bot re-sends the last N messages as chat history (using existing re-send API)
2.2. the bot sends a welcome message in the 1:1 with the user explaining that any message they send there will be published in the channel (and to leave they just have to leave the channel or send /stop) - Users can use “reply privately” in the channel messages to quote-reply a message in the channel
- Distribute the channel’s invite link with users so they can join the “super-group” prototype
The obvious problems of this limited prototype are:
- It depends on a central bot
- It is slower because messages flow is
User -> Bot -> Userinstead of justUser -> User - It is too complicated to use with the separation between the channel and the bot’s 1:1 chat
- A webxdc in the channel could be used with the realtime feature, but then UI needs to be created inside the webxdc re-inventing all the features of the parent chat app and it depends on people having the app open.