Mit Solid nach Mastodon posten, geht das?

Ein Blogpost bei Mastodon beschreibt, wie man quasi „manuell“ über das ActivityPub Protokoll auf einen Mastodon-Toot antworten kann.

We want to send a Mastodon user a message from our own, non-Mastodon server.

Ich dachte mir: Das muss doch auch mit einem Solid Pod klappen. Angelehnt an den Originalartikel ist unser Ziel in diesem Artikel daher:

Wir wollen einem Mastodon User eine Nachricht von unserem Solid Pod senden.

Los geht’s! 🚀

Der „Actor“

Idealerweise würden wir natürlich mit unserer Solid Web ID tätig werden, da ich aber im ersten Schritt möglichst wenig vom Originalartikel abweichen möchte (um mögliche Probleme zu vermeiden), habe ich mir wie dort beschrieben ein Schlüsselpaar angelegt und das fertige JSON-LD für den Actor auf meinem Solid Pod veröffentlicht. Leider ist der Data Browser Stand heute nicht in der Lage die Rohdaten aufzubereiten. Ein klassisches curl zeigt aber, dass es geklappt hat:

> curl https://angelo.veltens.org/profile/actor

{
  "@context": [
  "https://www.w3.org/ns/activitystreams",
  "https://w3id.org/security/v1"
  ],
  "id": "https://angelo.veltens.org/profile/actor",
  "type": "Person",
  "preferredUsername": "angelo",
  "inbox": "https://angelo.veltens.org/inbox",
  "icon": {
    "type": "Image",
    "mediaType": "image/jpeg",
    "url": "https://angelo.veltens.org/profile/me.jpg"
  },
  "publicKey": {
  "id": "https://angelo.veltens.org/profile/actor#main-key",
  "owner": "https://angelo.veltens.org/profile/actor",
  "publicKeyPem": "-----BEGIN PUBLIC KEY..."
}
}

Ich hab auch gleich noch ein Profilbild (icon) dazu gepackt, damit es etwas persönlicher aussieht und auch meine normale Solid Inbox verlinkt.

Webfinger

Auch die statische Webfinger Datei ist leicht platziert, da der Node Solid Server einen .well-known Ordner von Haus aus mitbringt. Nun lässt sich das Profil schon über die Mastodon-Suchleiste auffinden 🎉

Der auf dem Solid-Pod platzierte Actor ist über Mastodon auffindbar

So weit so gut!

Die Nachricht

Auch die Nachricht verfasse ich wieder als JSON-LD und lege sie in meinem Pod ab:

{
  "@context": "https://www.w3.org/ns/activitystreams",

  "id": "https://angelo.veltens.org/public/toots/hello-solid#create",
  "type": "Create",
  "actor": "https://angelo.veltens.org/profile/actor",

  "object": {
    "id": "https://angelo.veltens.org/public/toots/hello-solid#note",
    "type": "Note",
    "published": "2020-07-12T20:26:27+0200",
    "attributedTo": "https://angelo.veltens.org/profile/actor",
    "inReplyTo": "https://mastodon.social/@Gargron/100254678717223630",
    "content": "<p>Hello from Solid</p>",
    "to": "https://www.w3.org/ns/activitystreams#Public"
  }
}

Für den folgenden Schritt, brauchen wir die Datei aber auch auf dem lokalen Rechner.

Das Skript

Für die Erzeugung einer gültigen HTTP-Signature brauchen wir ein Skript, wie im Originalpost bereits beschrieben. Dort müssen wir noch unsere eigene keyId hinterlegen und ggf. den Namen der JSON-Datei an unsere anpassen, aber dann kann es schon losgehen.

Das Skript gibt leider keine Auskunft, ob es geklappt hat. Bei mir war es so, dass mein Post partout nicht bei Mastodon erscheinen wollte. Ich habe das Skript daher erstmal so umgeschrieben, dass es ein curl Kommando erzeugt, das ich manuell ausführen und besser debuggen kann:

Trotzdem hat die Antwort auf den Post von @Gargon erstmal nicht funktioniert. Der Server antwortete mit 202 (Accepted), aber die Nachricht erschien immer noch nicht! 😒

Der Durchbruch ⛏

Im SocialHub Forum gibt es ein paar Spekulationen woran es liegen könnte. Der Node Solid Server geht z.B. nicht korrekt mit dem Mime-Type application/activity+json um, und versteht auch JSON-LD Profile nicht korrekt.

Letztlich habe ich es aber doch noch geschafft einen Post abzusetzen, der auch auf Mastodon sichtbar wird. Bei mastodon.online hat es funktioniert. Dort hatte ich mir zuvor einen nativen Account angelegt, um die Webfinger-Suche zu testen. Auf einen Post dieses Accounts konnte ich dann auch mit meinem Solid-Actor antworten. Möglicherweise liegt es daran, dass die mastodon.online Instanz den Actor durch die vorherige Suche schon kannte, aber sicher weiß ich es nicht.

Hier ist jedenfalls das Ergebnis:

Bonus: Inbox-Nachrichten

Bereits kurz nachdem ich erstmals meinen Actor auf mastodon.online suchte, fiel mir auf, dass dieser Server seitdem Änderungen in meine Inbox kommunizierte.

Warum also nicht mal eine Direktnachricht ausprobieren? 💌

Mit dem Mastodon Account schreibe ich meinen Solid-Actor an

Die Nachricht konnte problemlos abgesetzt werden und erschien kurz darauf in der Inbox meines Solid-Pods. Da der Data Browser nicht in der Lage ist JSON-LD Daten anzuzeigen, habe ich die Daten kurzerhand manuell nach Turtle konvertiert:

Nach der manuellen Konvertierung kann auch der Data Browser die Daten anzeigen.

Fazit

Es funktioniert! Ein Solid Pod eignet sich grundsätzlich, um einen ActivityPub Actor und Posts zu beherbergen. Die LDP Inbox ist in der Lage Nachrichten von Mastodon zu empfangen. Hier und da hakt es noch und das alles ist natürlich weit entfernt von einer praktischen Benutzbarkeit. Es zeigt aber, dass Solid und ActivityPub sich technisch gut ergänzen. Einen Solid Server kompatibel zu gestalten dürfte keine große Herausforderung sein. Wenn die Daten dann auch noch hübsch dargestellt werden, bietet ein Solid Pod ein Tor zum Fediverse.

Solid: Neues aus der Community, große Ankündigungen von Inrupt

Was ist eigentlich in den letzten Monaten im Solid-Projekt passiert? Die Solid World July gibt einen Überblick über das 1. Halbjahr 2020.

Während am W3C die Spezifikation verfeinert wird und die Community an Apps tüftelt, fällt Inrupt erstmals seit langem wieder mit großen Ankündigungen auf.

Solid World_July from Solid Project on Vimeo.

W3C Solid Community Group

Die Community Group arbeitet in verschiedenen Panels an der Weiterentwicklung der Spezifikationen. Sie sammelt dazu Use Cases und Anforderungen von App-Entwickler*innen und Solid Early Adaptors.

Solid Community

Die Solid Community insgesamt arbeitet darüber hinaus auch an Apps, Tools, Dokumentation und mehr. Wie man mitwirken kann beschreibt der Prozess. Die Website unter solidproject.org bietet einen guten Einstieg für Benutzer*innen, Entwickler*innen, Unternehmen und allgemein Interessierte. Darüber hinaus gibt es weiterhin das Forum, den Chat und eine Reddit Community.

Open Link

Open Link arbeitet schon seit vielen Jahren an Linked Data und WebID Software. Der Support von Solid ist ein logischer Schritt. Mit YouID lassen sich Solid Profildokumente und Identitäten erstellen. Der Structured Data Sniffer erlaubt das Speichern von Webseiten und Daten im Solid Pod.

Inrupt

Inrupt fällt mit großen Neuankündigungen auf: Ein Team der Ghent University unter Führung von Ruben Verborgh entwickelt den Community Solid Server, eine Open-Source-Neuentwicklung und Alternative zum Node Solid Server (NSS). Inrupt finanziert und unterstützt die Entwicklung.

Für NSS wird Inrupt noch Bugfixes und Sicherheitsupdates bereitstellen, aber keine neuen Features mehr entwickeln. Außerdem hat Inrupt neue JavaScript-Client-Bibliotheken veröffentlicht und weitere für andere Programmiersprachen angekündigt.

Inrupt ist mit dem pod-server und dem react-sdk zuvor bereits Ähnliches angegangen und dort nach einiger Zeit eher mit Inaktivität und Intransparenz aufgefallen. Ich bin gespannt ob die neuen Anläufe ihren Schwung erhalten und Inrupt die Kommunikation mit der Community wieder intensiviert. Regelmäßige Statusupdates wurden auf der Solid World zumindest versprochen.

Eine weitere vielversprechende Ankündigung ist ein Enterprise Solid Server, der hoffentlich eine gute Grundlage für professionelles Pod-Hosting und unternehmenskritische Anwendungen geben wird.

Informiert bleiben

Die Solid World findet monatlich statt. Updates zum Nachlesen gibt es im Newsletter This Month in Solid.