- Ein dezentrales Social-Networking-Protokoll auf Basis statischer Websites, bei dem jeder Nutzer seine Daten direkt selbst besitzt und verwaltet
- Alle Daten werden in einem verschlüsselten JSON-Speicher aufbewahrt, und der Browser-Client aggregiert den Feed und veröffentlicht Beiträge
- Funktioniert ohne Server oder Relay durch direkte Kommunikation zwischen den Websites von Freunden und ihren Browsern
- Der Domainname des Nutzers ist zugleich seine Identität und wird über HTTPS/TLS authentifiziert
- Setzt mit einer einfachen Struktur ein selbstsouveränes soziales Netzwerk um, mit Fokus auf vertrauensbasierte Interaktion zwischen Einzelpersonen
Überblick über das sAT Protocol
s@ ist ein dezentrales Social-Networking-Protokoll auf Basis statischer Websites, bei dem jeder Nutzer Daten auf seiner eigenen Website speichert
- Alle Daten werden als verschlüsselte JSON-Dateien gespeichert, die vom Browser-Client gelesen werden, der außerdem Beiträge veröffentlicht und Feeds aggregiert
- Es funktioniert ohne zentrale Server oder Relays, und die Daten wandern direkt von der Website eines Nutzers in den Browser eines Freundes
- Für den Austausch von Beiträgen ist eine gegenseitige Follow-Beziehung erforderlich; eine influencer-zentrierte Struktur wird ausgeschlossen
- Das Protokoll ist nicht an bestimmte Hosting-Dienste wie GitHub Pages gebunden
Identität
- Der Domainname des Nutzers dient als Identität
- Über HTTPS/TLS wird bestätigt, dass der Eigentümer der Domain die Inhalte veröffentlicht hat
Discovery
Verschlüsselungsmodell
- Alle Nutzerdaten werden in einem verschlüsselten JSON-Speicher abgelegt und können nur vom Nutzer selbst und seinen Followern entschlüsselt werden
- Verwendet wird ein X25519-Schlüsselpaar; der öffentliche Schlüssel wird in
profile.json veröffentlicht, der private Schlüssel im Browser-localStorage gespeichert
- Beitragsdaten werden mit XChaCha20-Poly1305 verschlüsselt; der Content-Schlüssel wird pro Follower mit
libsodium crypto_box_seal verschlüsselt
- Die Datei
keys/_self.json enthält den Content-Schlüssel des Nutzers und Veröffentlichungsgeheimnisse und kann nur vom Nutzer selbst entschlüsselt werden
Schlüsselrotation und Unfollow
- Beim Unfollow wird ein neuer Content-Schlüssel erzeugt und alle Beiträge werden neu verschlüsselt
- Für die verbleibenden Follower werden neue Schlüsselumschläge erstellt und
keys/_self.json aktualisiert
- Entfolgte Nutzer können Beiträge nicht länger entschlüsseln
Entschlüsselungsablauf
- Wenn ein Besucher die Website eines Freundes aufruft, entschlüsselt er mit seinem privaten Schlüssel
keys/{follower-domain}.json, um den Content-Schlüssel zu erhalten
- Anschließend werden
posts/index.json und einzelne Beiträge (posts/{id}.json.enc) abgerufen und entschlüsselt
Datenstruktur
- Jeder Beitrag wird als einzeln verschlüsselte Datei gespeichert;
posts/index.json listet die Beitrags-IDs in umgekehrt chronologischer Reihenfolge auf
- Beispiel für ein Beitragsobjekt:
{
"id": "20260309T141500Z-a1b2",
"author": "alice.com",
"created_at": "2026-03-09T14:15:00Z",
"text": "Hello, decentralized world!",
"reply_to": null,
"reply_to_author": null
}
- Die Beitrags-ID besteht aus einem ISO8601-UTC-Zeitstempel und einem 4-stelligen Zufallshash
Follow-Liste
Feed-Aggregation
- Der Client liest die Follow-Liste und entschlüsselt die Beiträge der einzelnen Follower, um einen chronologischen Feed aufzubauen
- Die Beiträge werden nach
created_at absteigend sortiert
Antworten
- Antworten sind Beiträge, bei denen die Felder
reply_to und reply_to_author gesetzt sind
- Verschachtelte Antworten werden nicht unterstützt; direkte Antworten sind nur auf Top-Level-Beiträge möglich
- Wenn der ursprüngliche Beitrag nicht sichtbar ist, etwa weil keine Follow-Beziehung besteht, wird die Antwort nicht angezeigt
Veröffentlichen
- Neuen Beitrag erstellen → mit dem Content-Schlüssel verschlüsseln → auf die statische Website hochladen →
posts/index.json aktualisieren
- Für das Hochladen kann z. B. die GitHub Contents API verwendet werden
- Veröffentlichungsgeheimnisse werden verschlüsselt in
keys/_self.json gespeichert
Beispiel für die Struktur einer statischen Website
{domain}/satellite/
profile.json # Öffentlicher Schlüssel und Profil
posts/
index.json # Liste der Beitrags-IDs
{id}.json.enc # Verschlüsselter Beitrag
follows/
index.json # Follow-Liste
keys/
_self.json # Content-Schlüssel und Zugangsdaten
{domain}.json # Content-Schlüssel pro Follower
FAQ
- „Ist das RSS + Verschlüsselung?“ → Ja
- „Ist das eine Version des AT Protocol ohne Firehose?“ → Ja
- „Ist es skalierbar?“ → Nein („Freundschaft skaliert auch nicht“)
- „Steht das s für slow/shitty?“ → Ja
- „Ist Self-Hosting möglich?“ → Ja, aber CORS muss aktiviert sein
1 Kommentare
Hacker-News-Kommentare
Ich habe das Gefühl, dass dieses Projekt unter denselben Problemen leidet wie viele alternative soziale Netzwerke und Self-Hosting-Netzwerke
Das auf Verschlüsselung ausgerichtete Design ist zwar cool, aber wenn man auf ein neues Gerät wechselt, ist es schwer, den Follow-Graphen der Freunde wiederherzustellen, und Konzepte wie ein X25519-Schlüsselpaar sind für normale Nutzer schwer zu verstehen
Ich denke, eine Struktur auf Benutzername-und-Passwort-Basis, bei der der Server die Verschlüsselung stellvertretend übernimmt, ist realistischer
Genau so ein Ansatz könnte meiner Meinung nach auch von nichttechnischen Nutzern verwendet werden und eine echte Alternative zu Big Tech sein
Allerdings müsste ich es für Familie oder Freunde vielleicht trotzdem einrichten. Trotzdem würden sie es vermutlich ziemlich mögen, wenn sie ihre eigene Website hätten
In der Praxis kann man es als die Idee sehen, einen statischen Blog in BlueSky zu integrieren.
Man könnte es verbessern, indem man die BlueSky-Identität nutzt oder Authentifizierungsinformationen automatisch über ein Plugin für einen Static-Site-Generator übernimmt
Siehe diesen Beitrag
Ich war überrascht von dem Teil, in dem steht, dass der private Schlüssel im
localStoragedes Browsers gespeichert wirdWenn man die Browser-Einstellungen zurücksetzt oder den Browser neu installiert, sind die Daten weg, Backups sind schwierig, und Malware kommt leicht daran
Wenn der Schlüssel verloren geht, verschwindet am Ende auch der Feed für immer, was leicht dazu führen könnte, dass Nutzer abspringen
URL.createObjectURL(localStorage.getItem(...))könnte man das Speichern als Datei anstoßenNatürlich verliert man bei Schlüsselverlust den Zugriff, aber auch Nutzer von 2FA oder Krypto-Wallets tragen eine ähnliche Verantwortung, also ist das nicht völlig unrealistisch
Es wurde vorgeschlagen, statt des Pfads
/satellite/lieber/.well-known/zu verwendenDabei wurde auf den Standard Well-known URI verwiesen
.well-knownfür den gesamten Host gedacht sei und daher für Streams ungeeignet sei. Besser sei es, mehrere Verzeichnisse getrennt zu haltenIch denke, der Vorschlag mit
.well-known/ist ernsthaft erwägenswertEs ist bereits ein weit verbreiteter IANA-registrierter Standard, und Dateien für Sicherheit und Discovery liegen oft dort
Wenn man statt
/satellite/satproto.json/.well-known/satproto.jsonverwendet, vermeidet man Konflikte und macht klar, dass es sich um einen Protokoll-Endpunkt handelt.well-knownhostbezogen ist und deshalb nicht gut passt, wenn man mehrere Verzeichnisse pro Account haben möchteEin Social-Network-Protokoll sollte nicht um der Technik willen existieren, sondern den Nutzern direkten Nutzen bringen
Wie bei BitTorrent müssen Menschen einfach deshalb teilnehmen, weil sie es brauchen, erst dann entstehen Netzwerkeffekte
Ein Ansatz, der bei Datenverwaltung und bequemem Teilen ansetzt, erscheint mir realistischer
Lemmy und Pixelfed hatten so wenig Inhalt, dass sie sich wie Orte anfühlten, an denen „nichts passiert“
Bei Signal ist es ähnlich: Es ist nur fürs Messaging da, also gibt es keinen Grund zum Scrollen
Am Ende braucht es Inhalte und FOMO (Angst, etwas zu verpassen), damit Menschen dauerhaft wiederkommen
Wenn man einen wirklich dezentralen sozialen Dienst bzw. E2EE-Messenger bauen will, braucht man eher eine Struktur wie bei Discord, in der jeder Server tatsächlich unabhängig gehostet wird
Accounts sollten über ein Protokoll wie Nostr verwaltet werden, und das Ganze sollte auf dem Yggdrasil Network laufen, um die Abhängigkeit von IPv4/6 und DNS zu verringern
Wenn man den Traffic in HTTPS verpackt und NAT-Traversal automatisiert, könnte jeder einen Server betreiben
Nur mit so einer Struktur könnte man sich der Kontrolle von Big Tech und Regierungen entziehen
Selbst wenn ein Server verschwindet, bleiben die Daten an den Edges erhalten, und der Browser des Nutzers könnte selbst als Host fungieren
Siehe ephemeral-p2p-project
Dort arbeitet jedes Gerät als Server, und vollständiges P2P-Messaging wird mit WebRTC umgesetzt
Selbst ohne Internet ist Datenaustausch über Funkverbindungen möglich
Früher gab es bereits vollständig dezentrale soziale Ansätze wie FOAF oder Pingback
Das IndieWeb-Wiki ist eine gute Ressource, wenn man solche auf persönlichen Websites basierenden Social-Technologien erforschen will
Als ich die Beschreibung „sAT Protocol ist ein dezentrales soziales Netzwerk auf Basis statischer Websites“ las, wollte ich eine Kurve zeichnen, bei der die hochgezogenen Augenbrauen immer weiter steigen
Allerdings könnten öffentlich auflistbare Chiffretexte im Zeitalter von Quantencomputern riskant sein
Für kleine Netzwerke ist das geeignet, aber eine Skalierung wird wegen Problemen bei Schlüsselverteilung und -rotation schwierig
Aus Nutzersicht müsste zuerst erklärt werden, was für ein Dienst das eigentlich ist und was er tut
Es ist voller technischer Begriffe wie Fork, Pfade, JSON und Verschlüsselung, aber ein tatsächliches Nutzungsszenario ist nicht erkennbar
Mastodon oder Signal decken diesen Bereich nicht ab, deshalb lohnt sich ein Experiment damit
Solche Experimente mit dezentralen Netzwerken finde ich wirklich spannend
Auch wenn die Struktur viele grundsätzliche Probleme hat, macht es Spaß, neue Kombinationen kennenzulernen
Allerdings ist es viel zu umständlich, bei jedem Follow oder Unfollow die gesamte Website neu zu verschlüsseln und neu zu bauen
Außerdem schränkt eine Struktur, bei der man Kommentare nicht sehen kann, wenn man niemandem folgt, die Skalierbarkeit stark ein
Trotzdem ist die Mischung aus RSS, ActivityPub und statischen Websites reizvoll
Der Versuch, mit einer statischen Website eine dynamische Zugriffskontrolle für Freundeslisten umzusetzen, ist widersprüchlich, aber interessant
Am Ende ist es eine Struktur, die gleichzeitig Liebe und Hass hervorruft. Trotzdem freue ich mich über solche Versuche und bin dankbar dafür