Create MSCZZZZ-matrix-for-the-social-media-use-case.md
parent
2a5e33a760
commit
40b3cbba13
@ -0,0 +1,419 @@
|
|||||||
|
# MSCZZZZ: 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 projects.
|
||||||
|
|
||||||
|
While writing this specification, the following principles should
|
||||||
|
be respected:
|
||||||
|
|
||||||
|
* **simplicity in mind:** the solution should be the simplest one
|
||||||
|
|
||||||
|
* **not confusing:** The end user shouldn't know the theoretical usage
|
||||||
|
of the room. i.e. A user which isn't using the social media app
|
||||||
|
shouldn't be able to 'spam' the main room.
|
||||||
|
|
||||||
|
* re-use as much as possible the matrix specifications.
|
||||||
|
|
||||||
|
We will restrict ourselves to the creation of the specific rooms.
|
||||||
|
The discovery of the user rooms using profile as room is the topic of
|
||||||
|
[another MSC](https://nextcloud.carnot.cc/index.php/s/EHQKzJi78oX7GPE).
|
||||||
|
|
||||||
|
## The idea
|
||||||
|
|
||||||
|
While Matrix could be used for almost anything, we will
|
||||||
|
restrict ourselves on the following use cases.
|
||||||
|
|
||||||
|
* **'Reqular'** social media (Twitter style, Facebook : Circles, MinesTRIX)
|
||||||
|
* **'Art'** social media (Matrix Art)
|
||||||
|
|
||||||
|
## The proposal
|
||||||
|
|
||||||
|
|
||||||
|
To cover those use case, we will separate our proposal in two part.
|
||||||
|
|
||||||
|
* the room types: The container which will store the events
|
||||||
|
* special events types: dedicated to the social media use cased
|
||||||
|
which will be filtered depending on the client type/UI.
|
||||||
|
(displaying a feed or a grid of pictures...).
|
||||||
|
|
||||||
|
It is up to the client to filter the room event's and display only
|
||||||
|
the one which are relevant on the client goal.
|
||||||
|
|
||||||
|
### Room
|
||||||
|
|
||||||
|
We propose three room types.
|
||||||
|
|
||||||
|
* m.social.feed
|
||||||
|
* m.social.group
|
||||||
|
* m.social.event
|
||||||
|
|
||||||
|
Those three 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 : 'Regular' or 'feed'
|
||||||
|
|
||||||
|
```
|
||||||
|
m.social.feed
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
|
||||||
|
Used by a user to share content with his friends or the world.
|
||||||
|
|
||||||
|
* Owned by a single user
|
||||||
|
* Writing in this room could be owner only or any member. Up to the user.
|
||||||
|
* Room visibility : public / private. Up to the user.
|
||||||
|
* A user could have multiple of them
|
||||||
|
|
||||||
|
**UI considerations :**
|
||||||
|
|
||||||
|
* Should make clear that this room is owned by a specific user.
|
||||||
|
* UI type is up to the client (feed, pictures waterfall ...)
|
||||||
|
|
||||||
|
#### 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.
|
||||||
|
|
||||||
|
#### Social media : Events (TODO)
|
||||||
|
|
||||||
|
This type is only an idea yet and should be defined more clearly.
|
||||||
|
|
||||||
|
May be the topic of another MSC.
|
||||||
|
|
||||||
|
```
|
||||||
|
m.social.event
|
||||||
|
```
|
||||||
|
|
||||||
|
This room type could be reserved for the event use case. i.e. for a
|
||||||
|
single event, invite people and let each user say if he will be present.
|
||||||
|
|
||||||
|
Idea:
|
||||||
|
|
||||||
|
What should be defined for the event
|
||||||
|
* name : [regular event] : room name
|
||||||
|
* main picture : [regular event] : room avatar
|
||||||
|
* topic : [regular event] : room topic
|
||||||
|
* event location
|
||||||
|
* event time start
|
||||||
|
* event time end
|
||||||
|
* add a way to say if we will come (maybe use regular polls)
|
||||||
|
|
||||||
|
regular events : the actual event is already defined in matrix,
|
||||||
|
no need to reimplement.
|
||||||
|
|
||||||
|
### Room content
|
||||||
|
|
||||||
|
Require
|
||||||
|
|
||||||
|
* [MSC1767 - Extensible event types & fallback in Matrix (v2)](https://github.com/matrix-org/matrix-doc/pull/1767)
|
||||||
|
|
||||||
|
We propose two events type to categorize the content of the event.
|
||||||
|
|
||||||
|
**Why ?**
|
||||||
|
|
||||||
|
As the room is displayed alongside the user' 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.
|
||||||
|
|
||||||
|
The solution is to separate the regular messaging from the social
|
||||||
|
media posts. Thus, defining special events different from the regular
|
||||||
|
messaging events.
|
||||||
|
|
||||||
|
It will still be possible to send room message. But those should not
|
||||||
|
be displayed on the user wall / in the group.
|
||||||
|
|
||||||
|
**Types:**
|
||||||
|
|
||||||
|
* m.social.post
|
||||||
|
* m.social.pictures
|
||||||
|
|
||||||
|
|
||||||
|
**WARNING: ** Regular chat messages should be displayed on the user wall / in the group.
|
||||||
|
|
||||||
|
**Why defining a specific m.social.pictures event ?**
|
||||||
|
|
||||||
|
When sending events, we want to be sure that the other users will be
|
||||||
|
be able to see our posts. Thus it might be problematic with image
|
||||||
|
only social media if we send a post with only text and then want to
|
||||||
|
display it in a images only social media or is not able to render
|
||||||
|
a fraction of the post (like a post with text, video, image).
|
||||||
|
This becomes problematic when the user start making reference
|
||||||
|
to previously sended post.
|
||||||
|
|
||||||
|
Defining separate types help making sure the app displaying them
|
||||||
|
is able to support all the content of this specific event type.
|
||||||
|
|
||||||
|
#### Base event
|
||||||
|
|
||||||
|
The structure of the event should just be extensible events.
|
||||||
|
|
||||||
|
#### Social: Post
|
||||||
|
```
|
||||||
|
m.social.post
|
||||||
|
```
|
||||||
|
|
||||||
|
A type for general content.
|
||||||
|
|
||||||
|
Could be text, pictures, video ...
|
||||||
|
|
||||||
|
**TODO:**
|
||||||
|
|
||||||
|
Define what base events the clients supporting those event
|
||||||
|
should be able to display.
|
||||||
|
|
||||||
|
like:
|
||||||
|
|
||||||
|
* m.text
|
||||||
|
* m.image
|
||||||
|
* m.video
|
||||||
|
* m.file
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "m.social.post",
|
||||||
|
"content": {
|
||||||
|
"msgtype": "m.text",
|
||||||
|
"body": "<h1>The awesome story</h1><p>A long time ago in a galaxy far, far away...</p><a href='...'>Read full post</a>",
|
||||||
|
"m.social.post": [
|
||||||
|
{
|
||||||
|
"msgtype": "m.text",
|
||||||
|
"body": "The first part of full text of story, located before image.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"msgtype": "m.image",
|
||||||
|
"url": "mxc://example.com/KUAQOesGECkQTgdtedkftISg",
|
||||||
|
"body": "Image 1.jpg",
|
||||||
|
"info": {
|
||||||
|
"mimetype": "image/jpg",
|
||||||
|
"size": 1153501,
|
||||||
|
"w": 963,
|
||||||
|
"h": 734,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"msgtype": "m.text",
|
||||||
|
"body": "The ending text of full story after image.",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Social: Image
|
||||||
|
|
||||||
|
Base : [MSC3552 - Extensible Events - Images and Stickers](https://github.com/matrix-org/matrix-doc/blob/travis/msc/extev/images/proposals/3552-extensible-events-images.md)
|
||||||
|
|
||||||
|
```
|
||||||
|
m.social.image
|
||||||
|
```
|
||||||
|
|
||||||
|
Events adapted to client like Matrix Art to build pictures only
|
||||||
|
social media.
|
||||||
|
|
||||||
|
UI could be a grid or a list view of pictures.
|
||||||
|
|
||||||
|
**Required content:**
|
||||||
|
|
||||||
|
The list of arguments that should be part of event["content"]
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
like :
|
||||||
|
|
||||||
|
* m.image
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "m.social.image",
|
||||||
|
"content": {
|
||||||
|
"m.caption": [
|
||||||
|
{
|
||||||
|
"m.text": "Tramline in Berlin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"body": "Tramline in Berlin",
|
||||||
|
"mimetype": "text/html"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"m.file": {
|
||||||
|
"mimetype": "image/jpeg",
|
||||||
|
"name": "_MG_0641.jpg",
|
||||||
|
"size": 10158773,
|
||||||
|
"url": "mxc://"
|
||||||
|
},
|
||||||
|
"m.image": {
|
||||||
|
"height": 3456,
|
||||||
|
"width": 5184
|
||||||
|
},
|
||||||
|
"m.text": "Tramline Berlin",
|
||||||
|
"m.thumbnail": [
|
||||||
|
{
|
||||||
|
"height": 533,
|
||||||
|
"mimetype": "image/jpeg",
|
||||||
|
"size": 215496,
|
||||||
|
"url": "mxc://nordgedanken.dev/",
|
||||||
|
"width": 800
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Linking posts/pictures to the regular chat
|
||||||
|
|
||||||
|
One may want to advertise the room that he posted a specific content
|
||||||
|
(only visible in a social media client) that may be of interest to user
|
||||||
|
and provide a link to it).
|
||||||
|
|
||||||
|
A [solution adapted from the one proposed by @MurzNN](https://github.com/matrix-org/matrix-doc/pull/1767#issuecomment-787431678)
|
||||||
|
is to define event like this one
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "m.room.message", // will be m.text in the future. According to extensible events
|
||||||
|
"content": {
|
||||||
|
"msgtype": "m.text",
|
||||||
|
"body": "<h1>The awesome story</h1><p>A long time ago in a galaxy far, far away...</p><a href='...'>Read full post</a>",
|
||||||
|
"m.social.post": [
|
||||||
|
{
|
||||||
|
"msgtype": "m.text",
|
||||||
|
"body": "The first part of full text of story, located before image.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"msgtype": "m.image",
|
||||||
|
"url": "mxc://example.com/KUAQOesGECkQTgdtedkftISg",
|
||||||
|
"body": "Image 1.jpg",
|
||||||
|
"info": {
|
||||||
|
"mimetype": "image/jpg",
|
||||||
|
"size": 1153501,
|
||||||
|
"w": 963,
|
||||||
|
"h": 734,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"msgtype": "m.text",
|
||||||
|
"body": "The ending text of full story after image.",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On regular chat client like element, it should render as a simple link.
|
||||||
|
|
||||||
|
Another solution is to just send two events, one m.post.post or m.social.image
|
||||||
|
and a summary in the form of a room message.
|
||||||
|
|
||||||
|
##### Todo
|
||||||
|
|
||||||
|
Some client may not be web pages, thus a `href=""` may not make sense.
|
||||||
|
A text fall back, `Open in xxx to see the whole post` could make sense.
|
||||||
|
|
||||||
|
#### 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.
|
||||||
|
|
||||||
|
|
||||||
|
### Reactions
|
||||||
|
|
||||||
|
* Emoji reaction will use the regular event.
|
||||||
|
* However, post comment will be threads.
|
||||||
|
|
||||||
|
For rooms where only the user can write, it could be interesting to
|
||||||
|
allow other users to have a comment only permission.
|
||||||
|
See [MSC3394 - new auth rule that only allows someone to post a message in relation to another message](https://github.com/frandavid100/matrix-doc/blob/threaded-replies/proposals/3394-new-auth-rule-that-only-allows-someone-to-post-a-message-in-relation-to-another-message.md)
|
||||||
|
for such a proposal.
|
||||||
|
|
||||||
|
|
||||||
|
## Aternative
|
||||||
|
|
||||||
|
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 (the main one)
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
|
#### 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.
|
||||||
|
|
||||||
|
### 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 flexiblity.
|
||||||
|
|
||||||
|
## 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.
|
||||||
Loading…
Reference in New Issue