# ActivityPub-Plugin

**URL:** https://meta.discourse.org/t/activitypub-plugin/266794
**Category:** Plugin
**Tags:** experimental, activitypub
**Created:** [31. Mai 2023 um 17:21 UTC](https://meta.discourse.org/t/activitypub-plugin/266794 "2023-05-31T17:21:52Z")
**Posts on this page:** 20
**Page:** 20

<div class="post-metadata">

### Author: ![TedJohnson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tedjohnson/32/486408_2.png) [@TedJohnson](https://meta.discourse.org/u/TedJohnson)
#### Post date: [9. Februar 2025 um 11:23 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/391 "2025-02-09T11:23:15Z")

</div>

Du musst mir das vielleicht so erklären, als wäre ich 5 Jahre alt.

Wenn meine Organisation auf Mastodon unter [https://example.social/@MyOrganization](https://example.social/@MyOrganization) ist

Kann ich eine Kategorie in Discourse haben, die alle Beiträge der Organisation auf Mastodon anzeigt?

[https://discourse.example.org//c/fediverse/67](https://discourse.example.org//c/fediverse/67)

Und werden Interaktionen mit diesen Beiträgen (Favorit oder Antwort) auf Mastodon in den Discourse-Beiträgen in dieser Kategorie dargestellt?

Und werden Interaktionen mit diesen Beiträgen in Discourse auf Mastodon sichtbar sein?

Ich warte auf deine Bestätigung oder Widerlegung, bevor ich meine Folgefragen stelle.

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [9. Februar 2025 um 12:12 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/392 "2025-02-09T12:12:53Z")

</div>

Ich antworte für alle, die ich sicher kenne.

> [@TedJohnson](#):
>
> Kann ich eine Kategorie in Discourse haben, die alle Beiträge der Organisation nach Mastodon anzeigt?

Ja, das kannst du. Dann folgt diese Kategorie deinem Mastodon-Account.

> [@TedJohnson](#):
>
> Und alle Interaktionen mit diesen Beiträgen (Favoriten oder Antworten) auf Mastodon werden in den Discourse-Beiträgen in dieser Kategorie dargestellt?

Antworten ja. Favoriten (Sterne) nein, da ihre Rolle darin besteht, diese “Likes” nur lokal für diesen Mastodon-Benutzer anzuzeigen. Andere, wie deine Kategorie oder wer auch immer diesem Benutzer folgt, alias deiner Organisation, sehen niemals gegebene Favoriten.

> [@TedJohnson](#):
>
> Und alle Interaktionen mit diesen Beiträgen in Discourse werden auf Mastodon sichtbar sein?

Das ist im Moment mein Problem, aber nein, in dem Sinne, dass Kommentare, die unter einem Thema in einer Kategorie geschrieben werden, nicht nach Mastodon übertragen werden.

Aber wenn du es erlaubst, kann diese Kategorie von Mastodon aus verfolgt werden und dann ist alles, was geschrieben wird, auf Mastodon öffentlich – je nach deinen Einstellungen, Themen und Beiträgen, oder nur der erste Beitrag von Themen. Reaktionen werden nicht nach Mastodon übertragen.

Grundsätzlich:

- Wenn eine Kategorie einem Mastodon-Benutzer folgt: Discourse erhält von Mastodon
- Wenn ein Mastodon-Benutzer einer Kategorie folgt: Mastodon erhält von Discourse

Also Betonung, aus einer vereinfachten Sichtweise sicher,

- wenn der Hauptpunkt ist, die Forenbenutzer zu informieren, und Mastodon-Benutzer nur sehen, wenn sie folgen, dann findet die Veröffentlichung in Themen statt und Mastodon-Benutzer sehen nur, wenn jemand dieser Kategorie folgt (oder sie wissen, wie sie diese Kategorie als ActivityPub-Benutzer finden können)
- wenn der Hauptpunkt ist, die Mastodon-Benutzer zu informieren, und Forenbenutzer sehen, wenn sie dieser Kategorie folgen, und eine föderierte Teilnahme von der Kategorie nicht benötigt wird, dann folgt diese Kategorie deinem Mastodon-Benutzer

Fast dasselbe, aber Nachrichten werden auf Mastodon unterschiedlich angezeigt.

Eins. Aufgrund der Grenzen von Mastodon werden praktisch alle Markdown-Tags so angezeigt, wie sie sind, was bedeutet, dass zum Beispiel Fettdruck auf Mastodon nicht erfolgt und Follower ` **fett** ` anstelle von **fett** sehen. Und Tags werden weder hier noch dorthin verschoben.

---

<div class="post-metadata">

### Author: ![TedJohnson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tedjohnson/32/486408_2.png) [@TedJohnson](https://meta.discourse.org/u/TedJohnson)
#### Post date: [10. Februar 2025 um 08:00 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/393 "2025-02-10T08:00:54Z")

</div>

Ich habe eine Discourse-Sandbox, falls Sie einen Beta-Tester benötigen.

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [10. Februar 2025 um 10:26 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/394 "2025-02-10T10:26:03Z")

</div>

> [@Jagster](#):
>
> kein Konto ist `@ScienceScholar@mastodon.social`

Der Grund, warum Sie diesem Konto derzeit nicht folgen können, ist, dass es sich um einen Bot handelt. Wir haben die Follow-Unterstützung für Bots noch nicht hinzugefügt.

> [@Jagster](#):
>
> Ein weiteres Beispiel könnte `@GetCarter@mastodonapp.uk` sein

Dies scheint daran zu liegen, dass Mastodons autorisiertes Abrufen auf `mastodonapp.uk` aktiviert ist. Ich werde mir das in den nächsten Tagen noch einmal ansehen.

> [@Jagster](#):
>
> Wenn eine Kategorie Hashtags von Mastodon folgen (hashtagen) könnte… das wäre ein echter Gamechanger

Ich möchte darauf hinweisen, dass, wenn Sie einem Hashtag auf Mastodon folgen, Sie nur Beiträge mit diesem Hashtag sehen, die sich bereits auf dem Server befinden, auf dem Sie sich befinden. Wenn es Beiträge mit diesem Hashtag auf einem anderen Mastodon-Server gibt, werden Sie diese nicht sehen. Anders ausgedrückt: Mastodon hat keine primäre ActivityPub-Unterstützung für seine Hashtags hinzugefügt (z. B. hat es sie nicht zu Akteuren gemacht, wie es das Discourse-Plugin für Discourse-Tags tut). Sehen Sie sich die [Dokumentation](https://docs.joinmastodon.org/spec/activitypub/#extensions-not-defined-by-activitystreams) und die Diskussion [hier](https://socialhub.activitypub.rocks/t/user-being-able-to-follow-to-remote-server-hashtag/4277) an. Es könnte immer noch möglich sein, dies zu tun, aber es erfordert eine Art von Weiterleitung oder vielleicht Abfrage.

> [@Jagster](#):
>
> Was ist das:
> 
> discourseactivitypub::AP::Handlers::Warning

Sie müssen die Nachricht selbst teilen, damit ich Ihnen mehr erzählen kann (d. h. nicht nur den Backtrace). Wenn Sie die detaillierte Protokollierung aktiviert haben, protokolliert das Plugin Fehler bei der Verarbeitung eingehender Objekte. Es kann viele Gründe für einen Verarbeitungsfehler geben, von denen viele nichts mit Discourse zu tun haben. Das Fediverse hat ständig viele Objekte im Umlauf. Ich werde die Protokollebene dieser Verarbeitungsfehler möglicherweise auf “info” ändern, da ich glaube, dass sie Leuten ein Problem mit dem Plugin selbst suggerieren, obwohl in den meisten Fällen kein Problem auf der Discourse-Seite besteht.

> [@Jagster](#):
>
> Also dachte ich, wenn dieser Beitrag/diese Nachricht ursprünglich von Mastodon stammt und Kommentare erhält, werden diese als Antworten an Mastodon gesendet.

Ja, sie sollten als Antworten auf Mastodon erscheinen. Spezifische Beispiele sind immer am besten, da ich analysieren kann, was passiert ist, und alles ansprechen kann, was angesprochen werden muss (falls etwas angesprochen werden muss).

> [@TedJohnson](#):
>
> Kann ich eine Kategorie in Discourse haben, die alle Beiträge der Organisation an Mastodon anzeigt?
> 
> [https://discourse.example.org//c/fediverse/67](https://discourse.example.org//c/fediverse/67)
> 
> Und werden Interaktionen mit diesen Beiträgen (Favorit oder Antwort) auf Mastodon in den Discourse-Beiträgen in dieser Kategorie dargestellt?
> 
> Und werden Interaktionen mit diesen Beiträgen in Discourse auf Mastodon sichtbar sein?

Ja, so funktioniert die Einstellung “Vollständiges Thema”. Weitere Informationen finden Sie unter

> [@Setting up an ActivityPub Actor](https://meta.discourse.org/t/setting-up-an-activitypub-actor/314578):
>
> This topic covers setting up an ActivityPub Actor in Discourse with the Discourse ActivityPub Plugin. If you’re not sure what this means, head on over to the [Discourse ActivityPub Plugin](https://meta.discourse.org/t/activitypub-plugin/266794) topic first. Next Step Instructions To create an ActivityPub actor: Go to Admin \> Plugins \> ActivityPub. Click “Add Actor”. Fill out the Add Actor form (the settings are explained below). Click “Save Actor”. When you save the Actor, other Actors in the fediverse can start following it. You can disable an…

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [10. Februar 2025 um 10:35 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/395 "2025-02-10T10:35:52Z")

</div>

> [@angus](#):
>
> > [@Jagster](#):
> >
> > discourseactivitypub::AP::Handlers::Warning
> 
> Du musst die Nachricht selbst teilen, damit ich dir mehr sagen kann.

Ich weiß nicht, auf welche Nachrichten es sich bezieht, aber ich habe viele davon bekommen. Aber ich werde versuchen, das herauszufinden (ich bin mir ziemlich sicher, dass ich eine ausführliche Protokollierung aktiviert habe, aber mein Gedächtnis ist wirklich unzuverlässig). Andererseits sehe ich nirgendwo ein seltsames Verhalten.

Tags, Bots usw. – danke, das hat viel erklärt.

> [@angus](#):
>
> > [@Jagster](#):
> >
> > Ich dachte also, wenn dieser Beitrag/diese Nachricht ursprünglich von Mastodon stammt und Kommentare erhält, werden diese als Antworten an Mastodon gesendet.
> 
> Ja, sie sollten als Antworten auf Mastodon erscheinen. Konkrete Beispiele sind immer am besten, da ich analysieren kann, was passiert ist, und alles ansprechen kann, was angesprochen werden muss (falls etwas angesprochen werden muss).

Wie mache ich das? Weil das bei jedem einzelnen passiert, nicht bei einigen.

—

**Bearbeiten**

Ich weiß nicht, ob das ein wenig hilft, aber das kam eine Minute vor dieser Warnung auf:

`[Discourse Activity Pub] Failed to process https://mastodon.social/users/fesshole: Object is not supported`

Es war eine von mir verstärkte Nachricht.

Und mit demselben Zeitstempel wie diese Warnung war dies:

`[Discourse Activity Pub] Failed to process https://mastodon.social/users/moa333#delete: Object is not ready`

Wenn ich raten müsste, bezieht sich letzteres auf die `handlers::warning`, und beide sind informative, und ich muss mich überhaupt nicht darum kümmern?

**Bearbeiten2**

> [@angus](#):
>
> sie sollten als Antworten auf Mastodon erscheinen

Ja, das Problem war die HTTP-Signatur. Das Plugin wollte sie, aber mein Mastodon hat sie nicht verwendet. Als sie auf beiden Seiten deaktiviert wurde (vielleicht würde die Aktivierung auf beiden Seiten dasselbe bewirken), reisten Nachrichten hin und her und überallhin.

Ich muss tiefer graben, was die tatsächlichen Vor- und Nachteile dieser Einstellung sind.

Danke, dass du mich in die richtige Richtung geführt hast!

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [10. Februar 2025 um 11:48 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/396 "2025-02-10T11:48:49Z")

</div>

Danke fürs Teilen. Ich werde unsere Implementierung von HTTP-Signaturen in den nächsten Tagen erneut betrachten, im Kontext der Untersuchung von Mastodon autorisiertem Abruf. Vielleicht haben sie geändert, wie sie Signaturen handhaben, oder wir müssen unsere Handhabung anpassen.

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [10. Februar 2025 um 12:02 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/397 "2025-02-10T12:02:16Z")

</div>

Denn ich dachte (auf Vorstellungsebene, keine Fakten), dass Nachrichten von Discourse zu Mastodon gesendet werden, wenn Signaturen in Discourse aktiviert und in Mastodon deaktiviert sind (da die Instanz keine HTTP-Signaturen verwendet), aber nicht von Mastodon zu Discourse (da das Forum HTTP-Signaturen wünscht). Aber es geschah genau das Gegenteil.

Aber der Akteur von Mastodon (mein Konto) ist mit meinem Discourse-Benutzer verbunden, und ich bin ein Administrator – kann das etwas bedeuten?

Auf jeden Fall funktioniert alles wie erwartet, wenn beide keine HTTP-Signatur verwenden. Damit bin ich einverstanden, aber Sie als Entwickler könnten eine andere Geschichte sein 😏

Ich bin mir nicht sicher, wie stark die gültigen Vorteile der HTTP-Signatur sind. Irgendwann, vor nicht allzu langer Zeit, hatte Pixelfed Probleme mit Mastodon, als Signaturen verwendet wurden. Und wir haben auch einen dritten Spieler – Wordpress.

Wie auch immer, ich schweife jetzt vom Thema ab.

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [10. Februar 2025 um 15:06 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/398 "2025-02-10T15:06:00Z")

</div>

> [@angus](#):
>
> > [@Jagster](#):
> >
> > Ein weiteres Beispiel könnte `@GetCarter@mastodonapp.uk` sein.
> 
> Dies scheint daran zu liegen, dass das autorisierte Abrufen von Mastodon auf `mastodonapp.uk` aktiviert ist.

Dieses Konto sollte auffindbar sein, wenn dies zusammengeführt und auf Ihrem Server bereitgestellt wird.

> <https://github.com/discourse/discourse-activity-pub/pull/164>
>
> This is now required for Mastodon Authorized Fetch. See further:
> 
> \- https://me…ta.discourse.org/t/how-to-debug-connectivity-issues-with-activitypub/345798/22?u=angus 
> \- https://meta.discourse.org/t/activitypub-plugin/266794/394?u=angus
> 
> cc @pmusaraj

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [10. Februar 2025 um 17:04 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/399 "2025-02-10T17:04:13Z")

</div>

@Jagster Alle deine Antworten werden auch auf Mastodon korrekt angezeigt, wenn dies zusammengeführt wird.

> <https://github.com/discourse/discourse-activity-pub/pull/161>
>
> @pmusaraj This PR does the following:
> 
> \- Adds an ActivityPub Topic Map
> \- Adds… ActivityPub Topic Actions
> \- Adds ActivityPub Post Actions
> \- Adds ActivityPub Topic Info
> \- Updates ActivityPub Post info
> 
> Here's a narrative as to why the additional changes (in addition to the topic map) these changes are needed:
> 
> https://www.loom.com/share/7cbe6ac12f614f24ac7a481eb901c3a2?sid=11d38c5c-66f0-4b16-9c6d-beba052bf6fe

(Mastodon hat einige Handhabungen auf deren Seite angepasst)

---

<div class="post-metadata">

### Author: ![pmusaraj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pmusaraj/32/119489_2.png) [@pmusaraj](https://meta.discourse.org/u/pmusaraj)
#### Post date: [12. Februar 2025 um 15:28 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/400 "2025-02-12T15:28:12Z")

</div>

Das ist jetzt behoben, @tvavrda. Entschuldigen Sie das, ich habe einen Schritt im Prozess übersehen.

---

<div class="post-metadata">

### Author: ![SpoilerDiacre](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/spoilerdiacre/32/380281_2.png) [@SpoilerDiacre](https://meta.discourse.org/u/SpoilerDiacre)
#### Post date: [16. Februar 2025 um 02:52 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/401 "2025-02-16T02:52:28Z")

</div>

Versuche, einem PeerTube-Konto in einer Kategorie zu folgen, aber es kommt nicht über „ausstehend“ hinaus.

Hier ist, was in den Protokollen steht

```plaintext
POST-Anfrage an https://spectra.video/accounts/spoilerdiacre/inbox fehlgeschlagen: Expected([200, 201, 202]) <=> Actual(403 Forbidden)
https://community.derpandchill.com/ap/actor/ca233d6f9d47cde558877fb7609a6b3a konnte nicht an https://spectra.video/accounts/spoilerdiacre/inbox übermittelt werden

```

Ich habe es mehrmals versucht. Ich weiß, dass sie unterschiedlich sind, aber es wäre schön, Videos automatisch in meiner Community zu posten.

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [17. Februar 2025 um 13:38 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/402 "2025-02-17T13:38:04Z")

</div>

Vielen Dank für den Bericht, ich werde diese Woche später genauer nachgehen.

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [20. Februar 2025 um 09:13 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/403 "2025-02-20T09:13:28Z")

</div>

Über die Föderation zwischen Discourse und Mastodon. Es gibt ein paar Dinge, die ich nicht verstehe, nicht kann und/oder zu viel erwarte. Ich habe einige Links eingefügt. Der Inhalt ist auf Finnisch, aber der Inhalt ist, denke ich, nicht wichtig.

**Forum-Akteure und Boosting**

Wenn ich es richtig verstehe, föderiert ein Kategorie-Akteur ein Thema, indem er es boostet, weil der echte Benutzer ein Akteur ist, aber die Dinge funktionieren (noch) nicht so. Ist Boosting also die einzige Möglichkeit, Föderation zu betreiben?

Aber es schafft eine Situation, in der ein Mastodon-Benutzer es als geboostet sieht und der ursprüngliche Absender zum Beispiel mein `@Jagster@foorumi.katiska.eu` ist. Aber sie folgen nie dem Booster-Konto, sondern dem ursprünglichen, wie meinem persönlichen Foren-Konto – aber das können sie nicht, weil sie eine Genehmigungsanfrage sehen, und das kann ich nicht tun. Also folgen sie nie jemandem.

**Artikel vs. Notiz**

Ich verstehe nicht, was ich erwarten soll, aber ich denke, diese funktionieren gegensätzlich.

Wenn ich das Formular “Notiz” verwende, föderiert Discourse den ersten Beitrag so, wie er ist. So: [Sokeriton kofeiini voi olla terveellistä - Ihminen, luonto & maailma - Katiskan foorumi](https://foorumi.katiska.eu/t/sokeriton-kofeiini-voi-olla-terveellista/14090) (und wie üblich finden ActivityPub-Links usw. wie üblich; übrigens, ich mag diese neue Art, es zu zeigen, auch wenn ich es nicht ganz benutze)

Dieser zeigt “Mehr lesen”, aber das Klicken darauf öffnet den Inhalt in Mastodon.

Dieser ist ein Artikel: [Onko koiran peitsaaminen aina merkki ongelmasta? - Koiramaailma - Katiskan foorumi](https://foorumi.katiska.eu/t/onko-koiran-peitsaaminen-aina-merkki-ongelmasta/14091)  
Er zeigt nur den Titel und Links zu diesem Thema. Das Lesen in Mastodon ist also unmöglich.

**Bearbeiten** : Entschuldigung für das Durcheinander nach der Bearbeitung, ~~aber ich habe gerade festgestellt, dass dieser Artikeltyp als von meinem Forum-Akteur kommend angezeigt wurde, nicht als von einem Kategorie-Akteur geboostet.~~ _Er tut es jedes Mal; zwei verschiedene Dinge: Original und Boosting_ 🤦‍♂️ Das war aber nett. Aber dem Folgen meines Forum-Akteurs ist wegen der Genehmigung immer noch unmöglich; es verhält sich wie ein gesperrtes Konto.

Ich habe versucht, dieses (Mega-)Thema zu lesen, und ich habe mich auch bei [ask.discourse.com](http://ask.discourse.com) gemeldet. Ist die Fähigkeit, einen vollständigen Artikel anzuzeigen, genau durch Verlinkung realisiert, nicht durch Anzeige des Inhalts selbst? Wenn ja, ist es für Mastodon unnötig, da es auch längere Inhalte anzeigen kann, und ich werde Notiz anstelle von Artikel verwenden.

**Föderation der Diskussion**

Wenn ich ein Thema föderiert habe und jemand dort kommentiert, wird das schön unter diesem Thema angezeigt. Aber wenn ich in diesem Thema im Forum kommentiere, wird das föderiert, aber niemand sieht es als Kommentar zu diesem Thema (oder Thread in Mastodon), weil es als Boost vom Kategorie-Akteur gesendet wurde?

Ist das eine Situation, in der die (offizielle) Mastodon-App sagt, dass vielleicht nicht alle Kommentare auf dieser Instanz sind und man die Originale öffnen sollte – und das tut niemand jemals.

Dies ist ein Thema, bei dem ich zwei unabhängige Diskussionen hatte, bei denen das Forum alles sah, aber Mastodon nichts von im Forum geschriebenen Kommentaren wusste: [Pikkulasten ruuat? - Retkeily & Melonta - Katiskan foorumi](https://foorumi.katiska.eu/t/pikkulasten-ruuat/13975)

**Bearbeiten** : Dieses Thema ist zum Zeitpunkt des Schreibens etwa 5 Tage alt und wurde vom Kategorie-Akteur geboostet und veröffentlicht, nicht von meinem Forum-Benutzer. Hat sich zwischen damals und jetzt etwas geändert (ja, ich baue fast jeden Tag neu auf).

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [20. Februar 2025 um 14:37 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/404 "2025-02-20T14:37:08Z")

</div>

> [@Jagster](#):
>
> Also ist Boosten der einzige Weg, um Föderation zu betreiben?

Es ist nicht der einzige Weg, aber es ist der primäre Weg, den plattformähnliche Foren nutzen, um Gruppen von Themen/Threads zu föderieren (d. h. mit einem bestimmten Tag oder einer bestimmten Kategorie). Der Prozess wird in etwas beschrieben, das [FEP-1b12](https://codeberg.org/fediverse/fep/src/branch/main/fep/1b12/fep-1b12.md) genannt wird, dem wir mit anderen Implementierern folgen und an dem wir arbeiten.

> [@Jagster](#):
>
> Aber es schafft eine Situation, in der ein Mastodon-Benutzer es als “geboostet” sieht und der ursprüngliche Absender beispielsweise mein `@Jagster@foorumi.katiska.eu` ist. Aber sie folgen nie dem Booster-Account, sondern dem ursprünglichen, als meinem persönlichen Foren-Account – aber das können sie nicht, weil sie eine Genehmigungsanfrage sehen, und ich kann das nicht tun. Also folgen sie nie jemandem.

Entschuldigung, ich verstehe nicht ganz, worum es hier geht. Könnten Sie das bitte anders formulieren?

> [@Jagster](#):
>
> Wenn ich die Formularnotiz verwende, wird Discourse den ersten Beitrag so föderieren, wie er ist. So: [Sokeriton kofeiini voi olla terveellistä - Ihminen, luonto & maailma - Meta/KATISKA](https://foorumi.katiska.eu/t/sokeriton-kofeiini-voi-olla-terveellista/14090) (und wie üblich finden ActivityPub-Links usw. wie üblich; übrigens, ich mag diese neue Art, es anzuzeigen, auch wenn ich es nicht ganz benutze). Dieser zeigt “Weiterlesen”, aber das Klicken darauf öffnet den Inhalt in Mastodon. Dies ist ein Artikel: [Onko koiran peitsaaminen aina merkki ongelmasta? - Koiramaailma - Meta/KATISKA](https://foorumi.katiska.eu/t/onko-koiran-peitsaaminen-aina-merkki-ongelmasta/14091)  
> Er zeigt nur den Titel und Links zu diesem Thema. Lesen in Mastodon ist also unmöglich.

Der Grund dafür ist, dass Mastodon aufgehört hat, den Inhalt von Artikeln zu konvertieren und nur einen Link zum ursprünglichen Inhalt anzeigte. Angesichts des Aufstiegs von Foren im Fediverse, z. B. uns!, könnte es bald an der Zeit sein, einen neuen PR für Mastodon zu erstellen, um diese Unterstützung wieder einzuführen.

> [@Jagster](#):
>
> Wenn ich ein Thema föderiert habe und jemand dort kommentiert, wird das schön unter diesem Thema angezeigt. Aber wenn ich in diesem Thema im Forum kommentiere, wird das föderiert, aber niemand sieht es als Kommentar zu diesem Thema (oder Thread in Mastodon), weil es als Boost vom Kategorie-Actor gesendet wurde?
> 
> Ist das eine Situation, in der die (offizielle) Mastodon-App sagt, dass vielleicht nicht alle Kommentare auf dieser Instanz sind und man die ursprüngliche öffnen sollte – und niemand tut das jemals.
> 
> Dies ist ein Thema, bei dem ich zwei unabhängige Diskussionen hatte, bei denen das Forum alles sah, aber Mastodon nichts von den im Forum geschriebenen Kommentaren wusste: [Pikkulasten ruuat? - Retkeily & Melonta - Meta/KATISKA](https://foorumi.katiska.eu/t/pikkulasten-ruuat/13975)
> 
> **Bearbeiten** Dieses Thema ist zum Zeitpunkt des Schreibens etwa 5 Tage alt und wurde vom Kategorie-Actor und nicht von meinem Foren-Benutzer geboostet und veröffentlicht. Hat sich seitdem etwas geändert (ja, ich baue fast jeden Tag neu auf).

Ja, in dieser Hinsicht gab es kürzlich einige Änderungen, da Mastodon verschiedene Änderungen auf seiner Seite vorgenommen hat. Es wird wahrscheinlich weitere Änderungen geben, während wir versuchen, den Ansatz hier zu verfeinern. Wenn Sie spezifische Beispiele dafür darlegen könnten, was Ihren Erwartungen nicht entspricht, z. B. Beitrag 1 (Discourse), Antwort 1 (Mastodon), Antwort 2 (Discourse) usw. oder etwas Ähnliches, wäre das hilfreich.

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [20. Februar 2025 um 15:57 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/405 "2025-02-20T15:57:27Z")

</div>

Ich habe keine zu hohen Erwartungen, aber ein paar Wünsche 😂. Alles andere ist jetzt klar, aber diese Boost/Writer-Sache. Ich habe vielleicht keine Probleme mehr.

Ich spreche davon, wie es in Mastodon angezeigt wird.

 ![The image is a screenshot of a Katiska.eu forum post by Jagke Lehtonen encouraging users to request early access to the game "Trot," featuring a black and white line drawing of a horse and a green checkmark indicating approval. (Tekoälyn laatima kuvateksti)](https://global.discourse-cdn.com/meta/original/4X/9/0/2/90249dabd5ca5f608f61e911c5830ae6ae5ba498.jpeg)

- gestärkt durch den Akteur der Kategorie
- das Original ist mein Benutzer aus dem Forum

Als ich auf meinen Akteur aus dem Forum klickte, wurde dies angezeigt (Screenshot von der Mona-App, aber die offizielle PWA zeigte dasselbe, aber auf ihre Weise)

 ![The image shows a section of a webpage containing a mention with a username "@Jagster@foorumi.katis" and a date "20.2.2025", along with an atrium logo and a vocabulary ranking in the upper right corner. (Tekoälyn laatima kuvateksti)](https://global.discourse-cdn.com/meta/original/4X/6/3/4/634e2fd09d55d2a0f48608f06bbd8da83b19c3f5.jpeg)

Dieses rote Symbol ist eine Follow-Anfrage, dasselbe, als ob es ein gesperrtes Profil wäre.

Dann habe ich einen Neuaufbau durchgeführt.

Jetzt zeigt die offizielle PWA, was sie sollte:

 ![The image shows a profile section of a user named Jakke Lehtonen with an icon that resembles a drawing of the letter "A", next to a bell and dropdown menu icon, and an "Unfollow" button. (Tekoälyn laatima kuvateksti)](https://global.discourse-cdn.com/meta/original/4X/8/9/f/89f5ef2faa103a2778d611f0a162cc45307b2592.jpeg)

**Aber** Mona zeigt immer noch dieses rote Symbol.

Aus irgendeinem Grund konnte ich oder jemand anderes meinen Foren-Akteur wegen dessen nicht folgen. Aber jetzt ist es behoben (ein seltsames Problem zwischen zwei Systemen 🤷‍♂️). Und die jetzt verwendete Mastodon-App aktualisiert ihren Inhalt nicht – aber das ist in keiner Weise Ihr Problem.

Dieser Beitrag war also nur informativ und zeigte… etwas 😂

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [22. Februar 2025 um 10:03 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/406 "2025-02-22T10:03:30Z")

</div>

Eine kleine kosmetische Funktionsanfrage: Könnten wir eine grafische Anzeige haben, die anzeigt, wann ein Beitrag von einem ActivityPub-Akteur stammt? So wie wir ein Briefumschlag-Symbol sehen, wenn jemand E-Mail verwendet.

Der Grund dafür ist, dass meine Benutzer verwirrt sind, da sie keinen Unterschied zwischen lokalen Forum-Benutzern und Mastodon-Benutzern sehen.

Warum sollten sie das wissen? Ich weiß es nicht. Die Leute verhalten sich einfach so und ich möchte sie ruhig halten. Und wir zeigen auch E-Mails an, und das ist auch nicht notwendig oder überhaupt ein wichtiges Detail.

---

<div class="post-metadata">

### Author: ![pmusaraj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pmusaraj/32/119489_2.png) [@pmusaraj](https://meta.discourse.org/u/pmusaraj)
#### Post date: [22. Februar 2025 um 13:30 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/407 "2025-02-22T13:30:49Z")

</div>

Es gibt eine Anzeige, wenn ein Beitrag von einem entfernten Akteur stammt. Es ist ein blaues AP-Symbol an genau derselben Stelle wie das Briefsymbol, neben dem Datum des Beitrags.

Das gilt für Antworten. Für den OP wird dasselbe Symbol in Blau sowie weitere Details unterhalb der Themenübersicht angezeigt.

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [22. Februar 2025 um 13:49 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/408 "2025-02-22T13:49:59Z")

</div>

Jetzt, wo du das sagst, kann ich den Unterschied erkennen, kaum 😂

 ![Die Bildbeschreibung wurde vom KI-Modell generiert und beschreibt zwei Kommentare auf Finnisch, in denen nach Informationen zu einem Lieferort gefragt wird und die andere Person dem Ort zustimmt und den Lieferstatus erwähnt, den sie überprüfen wird. (KI-generierte Bildunterschrift)](https://global.discourse-cdn.com/meta/original/4X/5/1/9/519fe963f463430d2e850f2e2279fa924a0bc9cc.jpeg)

Erinnerst du dich an das CSS, um eine der beiden Farben deutlicher zu ändern?

**Bearbeiten**

Diese beiden Farben zu ändern, könnte auch einfacher sein, aber wie mein Profil sagt, bin ich nur ein weiterer Copy&Paster. Also habe ich das hier aus der Quelle übernommen.

Da ich keine Ahnung habe, was all diese Tertiärfarben usw. in der realen Welt bedeuten, habe ich einfache Webfarben verwendet.

```plaintext
.activity-pub-topic-status,
.activity-pub-post-status {

  &.published .d-icon-discourse-activity-pub,
  &.updated .d-icon-discourse-activity-pub {
    color: #808080;
  }
  &.published-remote .d-icon-discourse-activity-pub {
    color: #008000;
  }
}

```

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [23. Februar 2025 um 07:10 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/409 "2025-02-23T07:10:15Z")

</div>

**EDIT**

Das folgende Problem hängt mit dem Benutzer `@a.gup.pe` zusammen. Jede föderierte Kategorie findet den Benutzer `@koirat@a.gup.pe` und folgt ihm, wobei der Status _warte_ angezeigt wird. Wenn man die Seite wechselt und zurückkehrt, wird nichts angezeigt, dass dem Folgen nicht mehr existiert.

Kategorien können jedoch echten Menschen folgen.

Dieser Akteur ist de facto ein Bot, und Discourse kann Bots nicht folgen – aber meines Wissens identifiziert er sich nicht als Bot. Und selbst wenn das Problem die Bot-Natur wäre (ist das überhaupt ein Wort 😳), sollte Discourse mir das Folgen nicht überhaupt erst erlauben (es sei denn, Discourse weiß das in diesem Moment nicht). Jedenfalls sollte es das Folgen nicht beenden, ohne es mir mitzuteilen. Oder hat es das… Ich habe die Protokolle nicht überprüft, mein Fehler.

**EDIT2**

Das ist alles, was ich gefunden habe.

> **Fehler bei der Zustellung an https://a.gup.pe/u/koirat/inbox**
>
> ```plaintext
> [Discourse Activity Pub] https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd konnte nicht an https://a.gup.pe/u/koirat/inbox zugestellt werden
> --- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
> id: https://foorumi.katiska.eu/ap/activity/e05428a3d5d0d9637c8b191bc4556063
> type: Follow
> to: https://a.gup.pe/u/koirat
> published: '2025-02-23T07:11:19Z'
> updated: '2025-02-23T07:11:19Z'
> actor: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
> id: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd
> type: Group
> updated: '2025-02-20T08:03:45Z'
> url: https://foorumi.katiska.eu/c/koiramaailma/33
> name: 'Katiska.eu: koiramaailma'
> inbox: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd/inbox
> outbox: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd/outbox
> followers: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd/followers
> preferredUsername: koiramaailma
> publicKey: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
> id: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd#main-key
> owner: https://foorumi.katiska.eu/ap/actor/b37cda0cddecb02465691872595307dd
> publicKeyPem: |
> -----BEGIN PUBLIC KEY-----
> (Das ist wohl nicht relevant. Es nimmt nur Platz ein)
> -----END PUBLIC KEY-----
> icon: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
> type: Image
> mediaType: image/png
> url: https://cdnfoorumi.katiska.eu/original/1X/c51c0a678551648d73e3f8729ec95ecd1fc0bb73.png
> "@context": https://www.w3.org/ns/activitystreams
> "@context": https://www.w3.org/ns/activity...
> 
> ```

[Webfinger findet](https://a.gup.pe/.well-known/webfinger?resource=acct:koirat@a.gup.pe) diesen a.gup.pe-Benutzer, das kann also nicht der Grund sein.

* * *

Ist das ein Grenzfall, oder versuche ich mal wieder etwas Seltsames?

Discourse kann Mastodon-Listen nicht folgen (und diese haben auch in Mastodon eigene Probleme). Also habe ich stattdessen einen „Pseudo-Benutzer“ von [a.gup.pe](https://a.gup.pe/) ausprobiert.

Ich habe `@koirat@a.gup.pe` erstellt, indem ich demselben Benutzer auf meiner Instanz gefolgt habe – er sammelt Toots, in denen der Tag `#koirat` verwendet wird (Hunde auf Finnisch, übrigens). Das hat gut geklappt.

Dann habe ich eine Nachricht von Mastodon gesendet und sowohl der Tag als auch der Benutzer wurden erwähnt. Sie erschien in der Liste, die dem guppe-Benutzer folgte.

In meinem Discourse habe ich die Kategorie X gebeten, dem Benutzer `@koirat@a.gup.pe` zu folgen. Ich habe eine andere Kategorie Y, die meinem Akteur `@jagster@kvarkki.nexus` folgt, sie war im Status _warte_. Also erwartete ich, diese Nachricht zweimal zu erhalten, einmal von mir und einmal über guppe (oh, zum Teufel, ist das das Problem 🤔).

Die von meinem Akteur gesendete Nachricht wurde in Kategorie Y veröffentlicht, wie erwartet. Kategorie X erhielt nichts, das vom guppe-Akteur zugestellt wurde.

Als ich die Föderation von Kategorie X öffnete, folgte sie `@koirat@a.gup.pe` nicht mehr.

Also, was sind die Vermutungen:

- `@a.gup.pe` funktioniert auf eine andere Weise und Discourse kann es nicht verstehen
- Ich habe versucht, zwei identische Themen von Mastodon zu veröffentlichen (das kann ich leicht ausprobieren, dauert nur wenige Augenblicke)

Das ist kein rein akademisches Problem, denn es würde die Listenprobleme von Mastodon lösen.

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [24. Februar 2025 um 13:46 UTC](https://meta.discourse.org/t/activitypub-plugin/266794/410 "2025-02-24T13:46:08Z")

</div>

Der Grund, warum das nicht funktioniert, ist, dass Discourse beim Versuch, einen Follow an `a.gup.pe/u/koirat/inbox` zu senden, eine 500er-Fehlermeldung vom Typ “Internal Server Error” als Antwort erhält.

```plaintext
HTTP/1.1 500 Internal Server Error\r\n

```

Mit anderen Worten, es gibt einen Fehler in Guppe.

Ich möchte darauf hinweisen, dass sich der kollektive Fediverse-Ansatz für Gruppen derzeit noch etwas weiterentwickelt. Ich diskutiere dies und einige andere damit zusammenhängende Themen derzeit mit Leuten von NodeBB, Wordpress, Mastodon und anderen. Siehe zum Beispiel:

> **[1b12 vs Guppe groups](https://socialhub.activitypub.rocks/t/1b12-vs-guppe-groups/5032)**
>
> @panos brought up something interesting recently, which is that Lemmy communities don't boost everything (at least when viewed from Mastodon), but just the original post. I wasn't sure whether this was intentional (because 1b12 definitely...

Das andere Problem, dem sich Guppe stellen wird, ist, dass Mastodon selbst seit einiger Zeit an einer “Gruppen”-Funktion arbeitet, die mit dem Guppe-Ansatz in Konflikt geraten könnte.

> <https://github.com/mastodon/mastodon/pull/19059>
>
> \## :warning: Do not merge :warning: 
> 
> This PR is \*\*not\*\* intended to be merge…d outside of purely development environments until it's finished. While it has reached a pretty stable state, groups are a complicated topic, and the database model, API and protocol design \*\*may change\*\* before the PR gets merged, with no clear migration path between versions of this PR.
> 
> :warning: \*\*Merging this on your instance before this is reviewed will likely result in incompatibilities and migration issues.\*\*
> 
> \## Basic expectations around groups
> 
> Nothing is set in stone yet, but what we are going for is something along those lines:
> \- groups have a set of members and administrators/moderators
> \- only group members can post in a group
> \- posts and replies within a group all have the same audience, set by the group (group members, and potentially publicly-viewable as well): no public/unlisted/followers-only/direct
> \- posts are viewed in a per-group timeline and not on the home timeline
> \- new members may or may not need to be approved (group-specific settings)
> \- moderators can kick/ban group members and delete individual posts
> \- ideally, users should be able to report group posts not only to server moderators but to group moderators as well, and have a choice in that (e.g. be able to chose not to report to group moderators in case they are wanting to report the group's behavior as a whole to their server's moderators)
> 
> \## Interface
> 
> \### Video overview
> 
> https://user-images.githubusercontent.com/384364/193271051-436428e9-7229-49fa-b82e-fe5f03e81f65.mp4
> 
> \### Viewing and posting
> 
> !\[image\](https://user-images.githubusercontent.com/384364/191318311-a6b2bd67-5198-4a98-a954-f034771123ad.png)
> 
> \### Pending and rejected posts
> 
> While a priori moderation isn't planned on Mastodon's side on the short term, interacting with remote groups means you can't synchronously know whether your posts are accepted. They may have a priori moderation, or there might be federation hiccups. For these reasons, your posts may be pending or eventually rejected
> 
> Pending | Rejected
> :-------------------------:|:-------------------------:
> !\[image\](https://user-images.githubusercontent.com/384364/192572962-8b0f9d6f-522f-44ff-a8d0-86ce56bd48a9.png) | !\[image\](https://user-images.githubusercontent.com/384364/192573147-855b8f67-f1b4-4a12-902d-72e99b408745.png)
> 
> \### Group administration dropdown
> 
> !\[image\](https://user-images.githubusercontent.com/384364/193268539-e3326770-45d3-4cfd-8aa8-12adfe5250e5.png)
> 
> \### Group members list (with group administration dropdown)
> 
> !\[image\](https://user-images.githubusercontent.com/384364/193101108-bfcf42e2-2f15-46f4-b2ba-df23c7d04300.png)
> 
> \### Server administration interface
> 
> !\[image\](https://user-images.githubusercontent.com/384364/191318619-e7aaa402-993a-4320-a2d1-aec82722b287.png)
> 
> !\[image\](https://user-images.githubusercontent.com/384364/191318888-d1f1366b-f058-4259-ab35-f76707d24c5a.png)
> 
> !\[image\](https://user-images.githubusercontent.com/384364/191319026-f64e01f5-403f-4b2a-9a4b-fa802fceb196.png)
> 
> \## REST API
> 
> :warning: The described API is subject to change and the description is documented for discussion.
> 
> \### New OAuth scopes
> 
> \- \`read:groups\`
> \- \`write:groups\`
> \- \`admin:read:groups\`
> \- \`admin:write:groups\`
> 
> \### New entities
> 
> \#### \`Group\`:
> 
> \- \`id\`: string, local identifier for the group
> \- \`display\_name\`: string, name of the group
> \- \`created\_at\`: string (ISO 8601 Datetime), date at which the group was created
> \- \`note\`: string, description of the group
> \- \`uri\`: string, global (ActivityPub) identifier for the group
> \- \`url\`: string, user-friendly URL for the group
> \- \`avatar\`: string, URL to a possibly animated image to be used as icon for the group
> \- \`avatar\_static\`: string, URL to an image to be used as icon for the group
> \- \`header\`: string, URL to a possibly animated image to be used as a cover/header image for the group
> \- \`header\_static\`: string, URL to an image to be used as a cover/header image for the group
> \- \`domain\`: string, domain hosting the group. \`null\` if the group is hosted locally
> \- \`locked\`: boolean, \`false\` if the group is expected to automatically accept membership requests
> \- \`statuses\_visibility\`: boolean, \`'public'\` is the only value so far and means all posts are expected to be public
> \- \`membership\_required\`: boolean, only \`true\` so far, meaning that it is expected that only members can post
> 
> \#### \`GroupMembership\`:
> 
> \- \`id\`: string, internal identifier for the membership
> \- \`account\`: \`Account\` entity, which user this membership is about
> \- \`role\`: string, role of the user within the group. Valid values are \`admin\`, \`moderator\` and \`users\`
> 
> \### Existing entities with new or changed attributes
> 
> \### \`Status\`:
> 
> \- new optional \`group\` attribute: \`Group\` in which the status exists. When this attribute is set, \`visibility\` must be \`"group"\`
> \- new value for the \`visibility\` attribute: \`"group"\`. When \`visibility\` is \`"group"\`, the \`Status\` has a \`group\` attribute
> \- new optional \`approval\_status\` attribute with the following possible values: \`"pending"\`, \`"approved"\`, \`"rejected"\`, \`"revoked"\`. Its absence is equivalent to \`"approved"\` and does not require any special handling. It is currently only used for group posts but may be used in other cases in the future (e.g. reply control policies). \`"pending"\` means it has not been approved yet, while \`"rejected"\` means it has been rejected in a priori moderation / automatic filtering / access rules, and \`"revoked"\` means it has been denied after being first being approved for a time
> 
> \### New endpoints
> 
> \- \`POST /api/v1/groups\` (requires \`write\` or \`write:groups\` and also requires proper user permissions): create a group with the given attributes (\`display\_name\`, \`note\`, \`avatar\` and \`header\`). Sets the user who made the request as group administrator
> \- \`GET /api/v1/groups\` (requires \`read\` or \`read:groups\`): returns an array of \`Group\` entities the current user is a member of
> \- \`GET /api/v1/groups/:id\` (requires \`read\` or \`read:groups\`): returns the \`Group\` entity describing a given group
> \- \`POST /api/v1/groups/:id/join\` (requires \`write\` or \`write:groups\`): joins (or request to join) a given group
> \- \`POST /api/v1/groups/:id/leave\` (requires \`write\` or \`write:groups\`): leaves a given group
> \- \`GET /api/v1/groups/:id/memberships\` (requires \`read\` or \`read:groups\`). Has an optional \`role\` attribute that can be used to filter by role (valid roles are \`"admin"\`, \`"moderator"\`, \`"user"\`).
> 
> \#### Group administration
> 
> All of these require the current account to be an admin of the group:
> \- \`PUT /api/v1/groups/:group\_id\` (requires \`write\` or \`write:groups\`): update group attributes (\`display\_name\`, \`note\`, \`avatar\` and \`header\`)
> \- \`DELETE /api/v1/groups/:group\_id\` (requires \`write\` or \`write:groups\`): irreversibly deletes the group
> 
> \#### Group moderation
> 
> All of these require the current account to be an admin/moderator of the group:
> 
> \- \`GET /api/v1/groups/:group\_id/membership\_requests\` (requires \`read\` or \`read:groups\`): returns an array of \`Account\` entities representing pending requests to join a group
> \- \`POST /api/v1/groups/:group\_id/membership\_requests/:account\_id/authorize\` (requires \`write\` or \`write:groups\`): accept a pending request to become a group member
> \- \`POST /api/v1/groups/:group\_id/membership\_requests/:account\_id/reject\` (requires \`write\` or \`write:groups\`): reject a pending request to become a group member
> \- \`DELETE /api/v1/groups/:group\_id/statuses/:id\` (requires \`write\` or \`write:groups\`): delete a group post (actually marks it as \`revoked\` if it is a local post)
> \- \`POST /api/v1/groups/:group\_id/kick?account\_ids\[\]=…\` (requires \`write\` or \`write:groups\`): kick one or more group members
> \- \`GET /api/v1/groups/:group\_id/blocks\` (requires \`read\` or \`read:groups\`): list accounts blocked from interacting with the group
> \- \`POST /api/v1/groups/:group\_id/blocks?account\_ids\[\]=…\` (requires \`write\` or \`write:groups\`): block one or more users. If they were in the group, they are also kicked of it
> \- \`DELETE /api/v1/groups/:group\_id/blocks?account\_ids\[\]=…\` (requires \`write\` or \`write:groups\`): lift one or more blocks
> \- \`POST /api/v1/groups/:group\_id/promote?role=new\_role&account\_ids\[\]=…\` (require \`write\` or \`write:groups\`): promote one or more accounts to role \`new\_role\`. An error is returned if any of those accounts has a higher role than \`new\_role\` already, or if the role is higher than the issuing user's. Valid roles are \`admin\`, and \`moderator\` and \`user\`.
> \- \`POST /api/v1/groups/:group\_id/demote?role=new\_role&account\_ids\[\]=…\` (require \`write\` or \`write:groups\`): demote one or more accounts to role \`new\_role\`. Returns an error unless every of the target account has a strictly lower role than the user (you cannot demote someone with the same role as you), or if any target account already has a role lower than \`new\_role\`. Valid roles are \`admin\`, \`moderator\` and \`user\`.
> 
> \#### Instance moderation
> 
> \- \`GET /api/v1/admin/groups\` (requires \`admin:read:groups\` and permissions to manage users): list groups known to the instance. Mimics the interface of \`/api/v1/admin/accounts\`
> Optional query parameters:
> - \`origin\` (string): \`"remote"\` to list only remote groups, or \`"local"\` to list only local groups
> - \`status\` (string): \`"active"\` to list only groups that have not been suspended, or \`"suspended"\` to list only suspended groups
> - \`by\_domain\` (string): search for groups originating from a specific domain
> - \`display\_name\` (string): filter groups on display name
> - \`order\` (string): \`"active"\` to sort by date of most recent post, \`"recent"\` to sort by group creation date
> - \`by\_member\` (string): search groups in which a specific account (given by account id) is a member
> \- \`GET /api/v1/admin/groups/:group\_id\`: return basic group information
> \- \`POST /api/v1/admin/groups/:group\_id/suspend\` (requires \`admin:write:groups\` and permissions to manage users): suspends a group
> \- \`POST /api/v1/admin/groups/:group\_id/unsuspend\` (requires \`admin:write:groups\` and permissions to manage users): lift a suspension
> \- \`DELETE /api/v1/admin/groups/:group\_id\` (requires \`admin:write:groups\` and permissions to delete user data): deletes an already-suspended group
> 
> \### Changes to existing endpoints
> 
> \- \`POST /api/v1/statuses\`: accepts the new value \`"group"\` for the \`visibility\` parameter, and accepts a new \`group\_id\` parameter. When \`visibility\` is set to \`"group"\`, a valid \`group\_id\` must be provided, and when a \`group\_id\` is provided, \`visibility\` must be set to \`"group"\`. A reply cannot have a different \`group\_id\` than the post it is in reply to.
> 
> \## ActivityPub (federation)
> 
> \### Context and survey of existing work
> 
> Other fediverse projects have or are working on similar functionality, though there is no definite standard yet, and there are still many open questions. From what I have gathered, the main implementations seem to be:
> \- \[Smithereen\](https://github.com/grishka/Smithereen/blob/master/FEDERATION.md#groups), using \[FEP-400e\](https://codeberg.org/fediverse/fep/src/branch/main/feps/fep-400e.md) to submit posts to the group's \`sm:wall\` collection
> \- Pixelfed, supposedly implementing Smithereen's protocol
> \- \[Streams\](https://codeberg.org/streams/streams/src/branch/dev/FEDERATION.md)-related projects (\[Friendica\](https://wiki.friendi.ca/docs/forums), Hubzilla, …) which seems to aim for maximizing compatibility with every ActivityPub implementation, including those which do not have explicit support for groups
> \- \[Lemmy\](https://join-lemmy.org/docs/en/federation/overview.html), which seems to mostly reuse the \`Follow\` and \`Announce\` flow
> 
> At the same time, other projects such as Mobilizon and Peertube use \`Group\` actors for different purposes.
> 
> \### Implementation in this PR
> 
> :warning: This is subject to change.
> 
> Remote users interacting with local groups and local users interacting with remote groups are supported. For the time being, local groups can only have local moderators, and local users can only moderate local groups.
> 
> At this time, Mastodon does not perform JSON-LD compaction and expects implementations to use the shorthand for the described attributes, but produces a valid context properly qualifying them.
> 
> \- groups actors are of type \`PublicGroup\`, and are expected to provide the following attributes:
> - \`wall\`: an identified public \`OrderedCollection\` of all approved group posts
> - \`members\`: a \`Collection\` or \`OrderedCollection\` of group members
> - \`name\`: a human-readable name for the group
> - \`publicKey\`: public key used for signing requests
> - \`attributedTo\` (optional): array of non-group actors with group moderation powers
> - \`summary\` (optional): a description of the group
> - \`icon\` (optional): icon for the group, akin to profile avatars
> - \`image\` (optional): header illustration for the group, akin to profile headers
> - \`manuallyApprovesMembers\` (optional): true if the group is expected to not automatically approve new members (similar to \`manuallyApprovesFollowers\`)
> - \`suspended\` (optional): indicates that the group has been temporarily suspended and should not be interacted with
> \- joining a group works by sending the group actor a \`Join\` activity and expecting an \`Accept\` in return
> \- leaving a group works by sending the group actor a \`Leave\` activity
> \- group posts have only the group members in their explicit audience through the \`to\` attribute
> \- posts are sent using \[FEP-400e\](https://codeberg.org/fediverse/fep/src/branch/main/feps/fep-400e.md) by sending a \`Create\` activity exclusively to the group's inbox, with the embedded object targeting the group's \`wall\` collection. Such an activity can be denied in /a priori/ moderation or access control via a \`Reject\` activity
> \- posts from remote groups are received through an \`Add\` activity from the group actor, adding the post to its \`wall\` collection. The post is fetched and MUST include the \`wall\` collection as its \`target\`. If the added post is a local post, it will be marked as approved.
> \- users \`Delete\` their group posts, and the group actor distributes a \`Remove\` activity to reflect it. In addition, if the \`Delete\` activity is signed, the group actor may forward it
> \- posts can be removed by group moderators, in which case the group actor will send a \`Remove\` activity
> \- a group can \`Update\` itself or \`Delete\` itself like \`Person\` actors
> 
> \### Examples
> 
> Group actor:
> 
> \`\`\`
> {
> "@context": \[
> "https://www.w3.org/ns/activitystreams",
> "https://w3id.org/security/v1",
> {
> "toot": "http://joinmastodon.org/ns#",
> "discoverable": "toot:discoverable",
> "suspended": "toot:suspended",
> "sm": "http://smithereen.software/ns#",
> "wall": {
> "@id": "sm:wall",
> "@type": "@id"
> },
> "members": {
> "@id": "sm:members",
> "@type": "@id"
> },
> "PublicGroup": "toot:PublicGroup",
> "manuallyApprovesMembers": "toot:manuallyApprovesMembers"
> }
> \],
> "id": "https://mastodon.social/groups/1",
> "type": "PublicGroup",
> "inbox": "https://mastodon.social/groups/1/inbox",
> "outbox": "https://mastodon.social/groups/1/outbox",
> "name": "Mastodon development",
> "url": "https://mastodon.social/groups/1",
> "published": "2022-09-19T00:00:00Z",
> "wall": "https://mastodon.social/groups/1/wall",
> "members": "https://mastodon.social/groups/1/members",
> "summary": "\<p\>A group to discuss Mastodon development and make screenshots of the work-in-progress group feature.\</p\>",
> "manuallyApprovesMembers": true,
> "attributedTo": \[
> "https://mastodon.social/users/Gargron",
> \],
> "publicKey": {
> "id": "https://mastodon.social/groups/1#main-key",
> "owner": "https://mastodon.social/groups/1",
> "publicKeyPem": "-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwIG7x+jVanVg+C1Cb8w\\nfYMrAWaK6fIu8amptKI4pChe7YmRWOzhulgTEBjSYSuwvO70kiEKkUzxUARlPRxC\\nOehlw2+gsv2PlGfGu3VViq9+jZO41El3s8qOFYnZ+yfHX/SZlHGsujQLnoLP3rPZ\\nc5GkaDJ3SHucTzUkFuf+znA7lESFMmK4oM7JtoSFrGlD0u8GObKKXjhenPxt8kxN\\n9zKpwA/u4mi91vsEjIctoBbYo90tY5vxKJlTYQq7Btz6Xe6uKibWRXhMES9Col/7\\nzG+PQ/RvdiKL7Q5T8R4H9t4bk+RmNFqFPQhmKkq1NX3kw7/uZPay+z4qCBGYud44\\nRwIDAQAB\\n-----END PUBLIC KEY-----\\n"
> },
> "tag": \[\],
> "endpoints": {
> "sharedInbox": "https://mastodon.social/inbox"
> },
> "icon": {
> "type": "Image",
> "mediaType": "image/png",
> "url": "https://mastodon.social/system/groups/avatars/109/027/262/422/883/263/original/f6f5deced1bec83a.png"
> },
> "image": {
> "type": "Image",
> "mediaType": "image/png",
> "url": "https://mastodon.social/system/groups/headers/109/027/262/422/883/263/original/e5eb3fa2014b9320.png"
> }
> }
> \`\`\`
> 
> Join activity:
> \`\`\`
> {
> "@context": "https://www.w3.org/ns/activitystreams",
> "id": "https://mastodon.dev/c07d86b4-55bd-413c-a45b-71778cdeca65",
> "type": "Join",
> "actor": "https://mastodon.dev/users/claire",
> "object": "https://mastodon.social/groups/1"
> }
> \`\`\`
> 
> Create activity:
> \`\`\`
> {
> "@context": \[
> "https://www.w3.org/ns/activitystreams",
> {
> "toot": "http://joinmastodon.org/ns#",
> }
> \],
> "id": "https://mastodon.dev/users/claire/statuses/109086682464796744/activity",
> "type": "Create",
> "actor": "https://mastodon.dev/users/claire",
> "published": "2022-09-30T09:37:57Z",
> "to": \[
> "https://mastodon.social/groups/1/members"
> \],
> "cc": \[\],
> "object": {
> "id": "https://mastodon.dev/users/claire/statuses/109086682464796744",
> "type": "Note",
> "published": "2022-09-30T09:37:57Z",
> "url": "https://mastodon.dev/@claire/109086682464796744",
> "attributedTo": "https://mastodon.dev/users/claire",
> "to": \[
> "https://mastodon.social/groups/1/members"
> \],
> "cc": \[\],
> "content": "\<p\>hello\</p\>",
> "target": {
> "type": "OrderedCollection",
> "id": "https://mastodon.social/groups/1/wall",
> "attributedTo": "https://mastodon.social/groups/1"
> }
> }
> }
> \`\`\`
> 
> Add activity:
> \`\`\`
> {
> "@context": "https://www.w3.org/ns/activitystreams",
> "type": "Add",
> "actor": "https://mastodon.social/groups/1",
> "object": "https://mastodon.dev/users/claire/statuses/109086682464796744",
> "target": "https://mastodon.social/groups/1/wall"
> }
> \`\`\`
> 
> \## TODO
> 
> This is a rough outline of the planned development, but as stated above, “finished” steps will likely be revisited as UX or protocol considerations emerge when working on other steps.
> 
> \- \[x\] models and database schema for local groups, members, group posts
> \- \[x\] API for posting in groups and seeing group posts
> \- \[x\] user interface for posting in groups and seeing group posts
> \- \[x\] API for basic group moderation (kicking/banning someone from a group, deleting individual group posts, approving or rejecting group members)
> \- \[x\] basic user interface for the aforementioned moderation actions
> \- \[x\] API for seeing group information, group members and moderators, joining and leaving groups
> \- \[x\] user interface for seeing group information, joining and leaving groups
> \- \[x\] API for creating groups
> \- \[\] user interface for creating groups (partially done, it exists but does not offer setting description, avatar or header image)
> \- \[x\] API for deleting groups
> \- \[x\] user interface for deleting groups
> \- \[x\] ActivityPub support for joining, leaving, and posting within a group \*\*(done up to possible upcoming protocol changes)\*\*
> \- \[x\] ActivityPub support for cross-instance moderation (group moderators on a different server than the group actor) \*\*(done up to possible upcoming protocol changes, also needs more testing)\*\*
> \- \[\] models and database schema for reports within groups
> \- \[\] REST API changes for reporting posts to group moderators
> \- \[\] user interface changes for reporting posts to group moderators
> \- \[\] ActivityPub support for reporting posts to group moderators
> 
> \_\_\_
> 
> This project was funded through the \[NGI0 Discovery\](https://nlnet.nl/discovery) Fund, a fund established by \[NLnet\](https://nlnet.nl/) with financial support from the European Commission's \[Next Generation Internet\](https://ngi.eu/) programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 825322.

[Vorherige Seite](https://meta.discourse.org/t/activitypub-plugin/266794.md?page=19)

[Nächste Seite](https://meta.discourse.org/t/activitypub-plugin/266794.md?page=21)
