1
0
mirror of https://codeberg.org/fediverse/fep.git synced 2026-08-05 19:55:46 +00:00

feat: FEP dd4b Quote Posts (#510)

This FEP describes using the `Announce` activity type to implement quote posts in Activity Streams 2.0 and ActivityPub.

Reviewed-on: https://codeberg.org/fediverse/fep/pulls/510
Co-authored-by: Evan Prodromou <codeberg@evanprodromou.name>
Co-committed-by: Evan Prodromou <codeberg@evanprodromou.name>
This commit is contained in:
Evan Prodromou
2025-02-22 19:07:16 +00:00
committed by silverpill
parent a4dcefee2a
commit 68e2994c2e
3 changed files with 366 additions and 0 deletions
+222
View File
@@ -0,0 +1,222 @@
---
slug: "dd4b"
authors: Evan Prodromou <evan@socialwebfoundation.org>
status: DRAFT
dateReceived: 2025-02-21
discussionsTo: https://codeberg.org/evanp/fep/issues
---
# FEP-dd4b: Quote Posts
## Summary
This FEP describes the mechanism defined in [Activity Streams 2.0][AS2] and the [Activity Vocabulary][Vocabulary] for making quote posts, that is, [Announce](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-announce) activities with additional commentary.
## Motivation
Redistributing content or activities created by other actors is a key activity on the social web. The [Announce](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-announce) activity type is defined in Activity Streams 2.0 ("AS2") to represent this activity. `Announce` is used in ActivityPub to provide sharing functionality; see [7.11 Announce Activity (sharing)](https://www.w3.org/TR/activitypub/#announce-activity-inbox).
The [Activity](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-activity) object type in AS2 inherits all the properties of the [Object](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-activity) type. This means that **all** activity types have a rich set of properties for representation as first-class content on the social web. The `Announce` type is no exception.
However, the ActivityPub specification does not describe how to use those properties to provide additional commentary, metadata, and files for the shared content. Called ["quote Tweets"](https://en.wikipedia.org/wiki/Tweet_(social_media)#Quote_tweets), "repost with comment", or ["quote posts"](https://help.instagram.com/279780184399513), this kind of extended sharing gives additional context to shared objects.
This FEP describes how to use the `content` property to provide this commentary, as well as other properties that may be useful in this context. It is applicable to uses of Activity Streams 2.0 in general; where it applies to ActivityPub, it is noted.
## Specification
- The `object` property of an `Announce` activity MUST be a reference to the shared content. It MAY be an AS2 `Object` or a `Link`, either as a JSON object or as a URL.
- The `content` property of an `Announce` activity MAY be used to provide additional commentary on the shared content.
- The `attachment` property of an `Announce` activity MAY be used to provide additional media content related to the shared content or the commentary.
- The `tag` property of an `Announce` activity MAY be used to provide additional metadata, such as [Mention](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-mention) objects or [Hashtag][Miscellany] objects, about the shared content or the commentary.
- The `inReplyTo` property of an `Announce` activity MAY be used to connect an `Announce` activity to another object as a reply. The replied-to object MAY be the shared content, but this is unusual; it MAY also be part of a separate conversation.
- An `Announce` activity with an `inReplyTo` property SHOULD be included in the `replies` collection of the object being replied to.
- `Announce` activities SHOULD be counted as part of the `shares` collection of the shared content, regardless of any additional properties, as defined in [7.11 Announce Activity (sharing)](https://www.w3.org/TR/activitypub/#announce-activity-inbox).
## Examples
### Basic Quote Post
This represents a simple quote post, where the actor is sharing a note from another actor with commentary.
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://example.com/activities/aaabbbccc",
"type": "Announce",
"actor": "https://example.com/users/evan",
"to": "https://example.com/users/evan/followers",
"object": {
"id": "https://example.com/notes/1234",
"type": "Note",
"attributedTo": "https://example.com/users/franklin"
},
"content": "I think that this is a good point and should be shared."
}
```
### Quote Post with Attachment
This represents a quote post with an attachment, where the actor is sharing a note from another actor with commentary and an image.
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://example.com/activities/dddeeefff",
"type": "Announce",
"actor": "https://example.com/users/evan",
"to": "https://example.com/users/evan/followers",
"object": {
"id": "https://example.com/notes/1234",
"type": "Note",
"attributedTo": "https://example.com/users/franklin"
},
"content": "The author describes the rock formations of Crete; here's an example from my recent visit.",
"attachment": {
"type": "Link",
"mediaType": "image/jpeg",
"url": "https://example.com/images/1234.jpg"
}
}
```
### Quote Post with Hashtag
This represents a quote post with a hashtag, where the actor is sharing a note from another actor with commentary and a hashtag.
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://example.com/activities/ghhiijjkk",
"type": "Announce",
"actor": "https://example.com/users/evan",
"to": "https://example.com/users/evan/followers",
"object": {
"id": "https://example.com/notes/1234",
"type": "Note",
"attributedTo": "https://example.com/users/franklin"
},
"content": "Great description of Cretan geology; saving it for my next trip. <a href='https://example.com/tags/evanstriptocrete'>#evanstriptocrete</a>",
"tag": {
"type": "Hashtag",
"href": "https://example.com/tags/evanstriptocrete",
"name": "evanstriptocrete"
}
}
```
### Quote Post with Mention
This represents a quote post with a mention, where the actor is sharing a note from another actor with commentary and a mention.
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://example.com/activities/lllmmnnoo",
"type": "Announce",
"actor": "https://example.com/users/evan",
"to": ["https://example.com/users/evan/followers", "https://example.com/users/jeff"],
"object": {
"id": "https://example.com/notes/1234",
"type": "Note",
"attributedTo": "https://example.com/users/franklin"
},
"content": "<a href='https://example.com/users/jeff'>@jeff</a> you might like this Cretan geology article.",
"tag": {
"type": "Mention",
"href": "https://example.com/users/jeff",
"name": "jeff"
}
}
```
The author of the quoted material can also be mentioned.
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://example.com/activities/pppqqqrrr",
"type": "Announce",
"actor": "https://example.com/users/evan",
"to": ["https://example.com/users/evan/followers", "https://example.com/users/franklin"],
"object": {
"id": "https://example.com/notes/1234",
"type": "Note",
"attributedTo": "https://example.com/users/franklin"
},
"content": "<a href='https://example.com/users/franklin'>@franklin</a> wrote this great Cretan geology article.",
"tag": {
"type": "Mention",
"href": "https://example.com/users/franklin",
"name": "franklin"
}
}
```
### Quote Post as Reply
A quote post can be used as a reply, often to share evidence or information from another source.
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://example.com/activities/rrrsssttt",
"type": "Note",
"actor": "https://example.com/users/jeff",
"to": "https://example.com/users/jeff/followers",
"content": "Does anyone know where I can find a good article on Cretan geology?",
"replies": {
"id": "https://example.com/activities/rrrsssttt/replies",
"type": "Collection",
"totalItems": 1,
"items": [
{
"id": "https://example.com/activities/lllmmnnoo",
"type": "Announce",
"actor": "https://example.com/users/evan",
"object": {
"id": "https://example.com/notes/1234",
"type": "Note",
"attributedTo": "https://example.com/users/franklin"
},
"content": "<a href='https://example.com/users/jeff'>@jeff</a> you might like this Cretan geology article.",
"tag": {
"type": "Mention",
"href": "https://example.com/users/jeff",
"name": "jeff"
},
"inReplyTo": "https://example.com/activities/rrrsssttt"
}
]
}
}
```
## User interface guidance
A common representation of quote posts is to include the `object` of the `Announce` as an embedded card or other representation, with the `content` of the `Announce` object as introductory text.
![Example of a quote post in a microblogging interface](quote-post.png)
## Security considerations
For all `Announce` activities, it's important to consider how much of the shared content to expose to the recipient of the `Announce` activity. Using an URL as a reference, or including a limited set of metadata as in the examples in this FEP, allows the publishing server for the shared content to control access to the content. See [Inclusion of the shared object](https://www.w3.org/wiki/ActivityPub/Primer/Announce_activity#Inclusion_of_the_shared_object) in the [ActivityPub Primer][Primer] for more information.
## References
- James Snell, Evan Prodromou, et al. [Activity Streams 2.0][AS2]. W3C Recommendation. 8 May 2018.
- James Snell, Evan Prodromou, et al. [Activity Streams Vocabulary][Vocabulary]. W3C Recommendation. 8 May 2018.
- Christine Lemmer-Webber, Jessica Tallon, et al. [ActivityPub][ActivityPub]. W3C Recommendation. 23 January 2018.
- Evan Prodromou. [ActivityPub Miscellaneous Terms][Miscellany]. W3C Social Web Community Group Draft Report. 3 October 2024.
- W3C members and contributors. [ActivityPub Primer][Primer]. W3C Wiki. 2023 and later.
[ActivityPub]: https://www.w3.org/TR/activitypub/
[AS2]: https://www.w3.org/TR/activitystreams-core/
[Vocabulary]: https://www.w3.org/TR/activitystreams-vocabulary/
[Miscellany]: https://swicg.github.io/miscellany/
[Primer]: https://www.w3.org/wiki/ActivityPub/Primer
## Copyright
CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
To the extent possible under law, the authors of this Fediverse Enhancement Proposal have waived all copyright and related or neighboring rights to this work.
+144
View File
@@ -0,0 +1,144 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.8 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.8">
<diagram name="Page-1" id="epeHU_GuXWhuZM6-Jwps">
<mxGraphModel dx="1266" dy="667" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-1" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="120" y="80" width="570" height="360" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-2" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="140" y="100" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-3" value="Sharing author" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="210" y="100" width="120" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-6" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;&lt;i&gt;&lt;br&gt;&lt;/i&gt;&lt;/h1&gt;&lt;p&gt;&lt;i&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&lt;/i&gt;&lt;/p&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxGeometry x="220" y="120" width="390" height="120" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-4" value="sharer@example.com" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="260" y="130" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-5" value="14 Feb 2025" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="580" y="100" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-7" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="220" width="420" height="170" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-8" value="" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="230" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-9" value="Original author" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="300" y="230" width="90" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-12" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;&lt;i&gt;&lt;br&gt;&lt;/i&gt;&lt;/h1&gt;&lt;p&gt;&lt;i&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&lt;/i&gt;&lt;/p&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxGeometry x="235" y="270" width="390" height="120" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-10" value="original@example.org" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="330" y="260" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-11" value="10 Feb 2025" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="550" y="230" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-13" value="Replies (3)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="220" y="360" width="70" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-14" value="Likes (1)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="300" y="360" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-15" value="Shares (1)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="380" y="360" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-16" value="Replies (1)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="140" y="400" width="70" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-17" value="Likes (2)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="220" y="400" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-18" value="Shares (0)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="300" y="400" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-19" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="150" y="110" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-20" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="240" y="240" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-23" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-22" target="Ahd9KyH9aZ40LfpxCRtS-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-22" value="icon of actor of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="20" y="20" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-25" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-24" target="Ahd9KyH9aZ40LfpxCRtS-3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-24" value="name of actor of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="210" y="10" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-27" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-26" target="Ahd9KyH9aZ40LfpxCRtS-5">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-26" value="published of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="580" y="20" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-29" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;entryX=1;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-28" target="Ahd9KyH9aZ40LfpxCRtS-4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-28" value="webfinger of actor of Announce (derived)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="360" y="20" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-33" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-32" target="Ahd9KyH9aZ40LfpxCRtS-6">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-32" value="content of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="20" y="170" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-35" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-34" target="Ahd9KyH9aZ40LfpxCRtS-8">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-34" value="icon of attributedTo of object of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="10" y="230" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-37" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-36" target="Ahd9KyH9aZ40LfpxCRtS-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-36" value="published of object of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="710" y="200" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-39" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-38" target="Ahd9KyH9aZ40LfpxCRtS-9">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-38" value="name of attributedTo of object of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="710" y="140" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-41" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-40">
<mxGeometry relative="1" as="geometry">
<mxPoint x="430" y="275" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-40" value="webfinger of attributedTo of object of Announce (derived)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="710" y="260" width="110" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-43" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-42" target="Ahd9KyH9aZ40LfpxCRtS-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-42" value="content of object of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="720" y="310" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-45" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-44" target="Ahd9KyH9aZ40LfpxCRtS-15">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-44" value="replies, likes and shares of object of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="720" y="380" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-47" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" edge="1" parent="1" source="Ahd9KyH9aZ40LfpxCRtS-46" target="Ahd9KyH9aZ40LfpxCRtS-16">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Ahd9KyH9aZ40LfpxCRtS-46" value="replies, likes and shares of Announce" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" vertex="1" parent="1">
<mxGeometry x="10" y="380" width="60" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB