Merge 77bb8b049a into e9f0f31d27
commit
a86980d023
@ -0,0 +1,293 @@
|
||||
# MSC3639: Matrix for the social media use case
|
||||
|
||||
Matrix is currently mainly used for chats, however, recent projects
|
||||
have shown that it is possible to use it for social media.
|
||||
|
||||
This proposal is to formally specify this usage and ensure
|
||||
a compatibility between the different social media projects.
|
||||
|
||||
## The idea
|
||||
|
||||
This MSC tries to cover those following social media cases:
|
||||
|
||||
* **'Regular'** social media like Circles or MinesTRIX
|
||||
* **'Art'** social media like Matrix Art
|
||||
|
||||
## The proposal
|
||||
|
||||
To cover those use case, we will separate our proposal in two part.
|
||||
|
||||
* **Room types**: the container which will store the events.
|
||||
* **Special events types**: to differentiate post and comment from room messages.
|
||||
|
||||
|
||||
### Room
|
||||
|
||||
Social media generally allow the user to have a profile where he can
|
||||
post content visible to all his followers. Others allow also creating
|
||||
groups which allow the same things without being owned by a specific
|
||||
user. This is the two functions that we want to add.
|
||||
|
||||
Therefore, we propose two room types. Types are defined according to
|
||||
[MSC1772 - Matrix spaces](https://github.com/matrix-org/matrix-doc/pull/1772).
|
||||
|
||||
* `m.social.profile`
|
||||
* `m.social.group`
|
||||
|
||||
Those two rooms will act as a container for events of different types, which
|
||||
will be displayed only on a specific client. The type is used to set the
|
||||
general purpose of the room.
|
||||
|
||||
#### Social media : The user profile
|
||||
|
||||
```
|
||||
m.social.profile
|
||||
```
|
||||
|
||||
**Usage:**
|
||||
|
||||
Used by a user to share content with his friends or the world.
|
||||
|
||||
* Owned by a single user.
|
||||
* The user can choose who can write on his profile.
|
||||
* Room visibility : public / private. Up to the user.
|
||||
* The user can have multiple profile (private / public ...)
|
||||
|
||||
This MSC remains voluntarily open as user may want to configure the room as he wishes.
|
||||
|
||||
*Small note about encryption:*
|
||||
|
||||
Clients should notify the user that encryption shouldn't be enabled
|
||||
on 'big / public room'. On a side note, enabling end-to-end encrypted
|
||||
rooms with a very large number of participants don't have a lot of sense.
|
||||
|
||||
**UI considerations :**
|
||||
|
||||
* Should make clear that this room is owned by a specific user.
|
||||
* UI type is up to the client (feed (list view), pictures waterfall (grid) ...)
|
||||
|
||||
##### Room visibility
|
||||
|
||||
Most users will want to have a private profile. However, the question
|
||||
is now how can other user follow our profile ? It is always possible to
|
||||
invite them in the room but in the world of social media, this is kind
|
||||
of weird. This will be like sending a follow proposal.
|
||||
|
||||
This could be solved with knocking. The question being how do we discover the room ?
|
||||
|
||||
* room alias could be an answer (TODO: is it possible to get the room type ?)
|
||||
* An other way could be to use a kind of profile as space. i.e. a place where a user can publicly advertise room that are related to him. This idea could be the topic of a following MSC.
|
||||
|
||||
#### Social media : Groups
|
||||
|
||||
```
|
||||
m.social.group
|
||||
```
|
||||
|
||||
**Usage:**
|
||||
|
||||
* For group discussion
|
||||
|
||||
Group is just a regular profile room `m.social.feed` but with a
|
||||
slightly different UI as there is no single owner of the room.
|
||||
|
||||
|
||||
### Sending posts
|
||||
|
||||
We propose to define a custom type for posts.
|
||||
|
||||
```
|
||||
m.social.post
|
||||
```
|
||||
|
||||
**Why ?**
|
||||
|
||||
As the room is displayed alongside the user's regular chats rooms, we need
|
||||
to make it clear to the user that it's a specific room.
|
||||
Thus, we need to avoid that a user end up "spamming" his room thinking
|
||||
the room is a regular chat room.
|
||||
|
||||
Therefore, we use different event type to separate the regular messaging
|
||||
from the social media posts. It will still be possible to send room message.
|
||||
However, those should not be displayed on the user wall / group.
|
||||
|
||||
**NB:** An initial version of the proposal was using extensible events but
|
||||
we decided to fall back to regular event while waiting for the extensible events
|
||||
proposal to stabilize.
|
||||
|
||||
|
||||
A type for general content. Its structure is of type:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "m.social.post",
|
||||
"content": {
|
||||
"body": "The content of the post, can be Markdown",
|
||||
"m.social.image-ref": [ // optional
|
||||
"$<event_id>",
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Embedding images in the post
|
||||
|
||||
If we want to embed images in the post, we should first send the image as a regular
|
||||
event and then put the image event id in the `m.social.image-ref` attribute of the
|
||||
post content. This, to allow user to allow a user to comment an image individually
|
||||
or to reuse it in different posts. This allows us also to display more easily all
|
||||
the images who have been posted in the room.
|
||||
|
||||
|
||||
### Reactions
|
||||
|
||||
* Emoji reactions are standard matrix reactions.
|
||||
* However, comments on posts will be threads.
|
||||
|
||||
Comments will have the same structure as post but will have the 'm.social.comment'
|
||||
type to allow the owner of the room to allow commenting but preventing the other users
|
||||
to send posts on this group. As said, comment need to have a thread relation to a post
|
||||
event. Failing to do so will have no impact, but the event shouldn't be displayed.
|
||||
|
||||
**Example:**
|
||||
|
||||
```
|
||||
{
|
||||
"type": "org.matrix.msc3639.social.comment",
|
||||
"content": {
|
||||
"body": "ok",
|
||||
"m.relates_to": {
|
||||
"rel_type": "m.thread",
|
||||
"event_id": "$GKhFi7r_7bFx4pWUPfPox8nbCM27aqRkFHwK0PG-Avw"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Alternative
|
||||
|
||||
There has been some discussion about whether we should restrict the
|
||||
room to a specific type of content (i.e. the type of the room define
|
||||
the UI and how the content should be treated). Here is some consideration about the alternative proposal.
|
||||
|
||||
### Advantage of this approach
|
||||
|
||||
* flexibility
|
||||
|
||||
If one day we use another client which could display video only
|
||||
feed, then we could reuse this room and start posting other events
|
||||
type to this room.
|
||||
|
||||
It will help as we have all our followers in the same room.
|
||||
|
||||
### Disadvantages of this approach
|
||||
|
||||
#### Complexity / room size
|
||||
|
||||
This approach comes with a higher complexity.
|
||||
|
||||
* filter algorithm more complex because we need to take into account
|
||||
the multiple events type.
|
||||
* higher room size (the ratio event displayed / event in the room will
|
||||
be higher). May lead to slower client.
|
||||
|
||||
We need to take into account that there might be content which just
|
||||
can't be displayed by the social media app that we are using.
|
||||
|
||||
The app should warn the user about this.
|
||||
|
||||
// TODO : See how the room size impact the time to join.
|
||||
The discussion may need to take into account the time it takes to join one large room
|
||||
with many states vs many small ones. (Is it preferable to have many small rooms
|
||||
that are auto joined or one big room with multiple 'feeds' (different event types)
|
||||
in it.)
|
||||
|
||||
#### Moderation
|
||||
|
||||
* if we let the user post content in a room it may be more complex
|
||||
to moderate the room as the user could write event using an event
|
||||
type that we don't use. Means longer time before removing those events.
|
||||
|
||||
|
||||
## Privacy
|
||||
|
||||
The permissions of the rooms should be easily editable by the user.
|
||||
|
||||
Special attention should be accorded to those events,
|
||||
|
||||
```
|
||||
m.room.join_rules
|
||||
m.room.encryption
|
||||
m.room.power_levels
|
||||
```
|
||||
|
||||
* It must be clear to the user if the actual room is private or not.
|
||||
* It must be clear to the user if the actual room is end-to-end encrypted.
|
||||
* The user should be able to restrict the users able to write in his room.
|
||||
* The user should be that all the followers can see each others.
|
||||
|
||||
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
The following mapping will be used for identifiers in this MSC during development:
|
||||
|
||||
|
||||
| Proposed final identifier | Purpose | Development identifier |
|
||||
| ------------------------- | ----------------------- | ------------------------------------- |
|
||||
| `m.social.profile` | Profile room | `org.matrix.msc3639.social.profile` |
|
||||
| `m.social.group` | Group room | `org.matrix.msc3639.social.group` |
|
||||
| `m.social.post` | Post event | `org.matrix.msc3639.social.post` |
|
||||
| `m.social.comment` | Comment on a post event | `org.matrix.msc3639.social.comment` |
|
||||
| `m.social.image-ref` | Link to an image event | `org.matrix.msc3639.social.image-ref` |
|
||||
|
||||
|
||||
|
||||
## Further idea
|
||||
|
||||
### Image post
|
||||
|
||||
An earlier version of the proposal allowed to define custom events for
|
||||
|
||||
### Alternative proposal
|
||||
|
||||
Instead of filtering the room events according to their types,
|
||||
we could filter the room directly according to his type.
|
||||
Thus defining how the room UI.
|
||||
|
||||
We could define
|
||||
|
||||
* m.social.feed : for regular social media
|
||||
* m.social.image : for image social media
|
||||
|
||||
This solution solve the main disadvantages of the previous solution
|
||||
but lacks the flexibility.
|
||||
|
||||
|
||||
### Idea: Tagging
|
||||
|
||||
*NB:* This is only an idea
|
||||
|
||||
We could add a `tags` entry in the event content. The content of those
|
||||
tags could be 'hashtags'.
|
||||
|
||||
This will be useful for art social media. But we could also see an
|
||||
implementation in regular social media like to tag other person.
|
||||
|
||||
```json
|
||||
{
|
||||
"m.social.post": [/* the post content */],
|
||||
"m.social.tag": [
|
||||
"@mxid",
|
||||
"my chair"
|
||||
]
|
||||
}
|
||||
```
|
||||
### Unstable prefix
|
||||
|
||||
| Proposed final identifier | Purpose | Development identifier |
|
||||
| ------------------------- | ---------------------------------------------------------------- | --------------------------------- |
|
||||
| `m.social.image` | Image event (deprecated, could be restored in a further version) | `org.matrix.msc3639.social.image` |
|
||||
| `m.social.tags` | Tags property of `m.social.post` or `m.social.image` event | `org.matrix.msc3639.social.tag` |
|
||||
|
||||
|
||||
Loading…
Reference in New Issue