- Protocole de réseau social décentralisé basé sur des sites web statiques, dans lequel chaque utilisateur possède et gère directement ses propres données
- Toutes les données sont stockées dans un dépôt JSON chiffré, et le client navigateur agrège le fil et publie les messages
- Fonctionne sans serveur ni relais, via une communication directe entre les sites web des amis et les navigateurs
- Le nom de domaine de l’utilisateur fait office d’identité, avec authentification via HTTPS/TLS
- Met en œuvre un réseau social autosouverain avec une structure simple, centré sur des échanges fondés sur la confiance entre individus
Vue d’ensemble du protocole sAT
s@ est un protocole de réseau social décentralisé basé sur des sites statiques dans lequel chaque utilisateur stocke ses données sur son propre site web
- Toutes les données sont enregistrées sous forme de fichiers JSON chiffrés, que le client navigateur lit pour publier des messages et agréger le fil
- Il fonctionne sans serveur central ni relais, les données allant directement du site de l’utilisateur vers le navigateur de ses amis
- Les échanges de publications ne sont possibles qu’en présence d’une relation de suivi mutuel, ce qui exclut une structure centrée sur les influenceurs
- Le protocole n’est pas dépendant d’un service d’hébergement particulier comme GitHub Pages
Identité
- Le nom de domaine de l’utilisateur sert d’identité
- HTTPS/TLS permet de vérifier que le propriétaire du domaine a bien publié le contenu
Découverte
Modèle de chiffrement
- Toutes les données utilisateur sont stockées dans un dépôt JSON chiffré, déchiffrable uniquement par l’utilisateur et ses abonnés
- Une paire de clés X25519 est utilisée : la clé publique est publiée dans
profile.json, tandis que la clé privée est stockée dans le localStorage du navigateur
- Les données des publications sont chiffrées avec XChaCha20-Poly1305, et la clé de contenu est chiffrée pour chaque abonné avec
crypto_box_seal de libsodium
- Le fichier
keys/_self.json contient la clé de contenu de l’utilisateur et les secrets de publication, et lui seul peut le déchiffrer
Rotation des clés et désabonnement
- Lors d’un désabonnement, une nouvelle clé de contenu est générée et toutes les publications sont rechiffrées
- De nouvelles enveloppes de clé sont générées pour les abonnés restants et
keys/_self.json est mis à jour
- L’utilisateur désabonné ne peut plus déchiffrer les publications
Flux de déchiffrement
- Lorsqu’un visiteur consulte le site d’un ami, il déchiffre
keys/{follower-domain}.json avec sa propre clé privée pour obtenir la clé de contenu
- Il récupère ensuite
posts/index.json et les publications individuelles (posts/{id}.json.enc) pour les déchiffrer
Structure des données
- Chaque publication est stockée dans un fichier chiffré séparé, et
posts/index.json liste les identifiants des publications de la plus récente à la plus ancienne
- Exemple d’objet de publication :
{
"id": "20260309T141500Z-a1b2",
"author": "alice.com",
"created_at": "2026-03-09T14:15:00Z",
"text": "Hello, decentralized world!",
"reply_to": null,
"reply_to_author": null
}
- Les identifiants de publication sont composés d’un horodatage UTC ISO8601 et d’un hash aléatoire de 4 caractères
Liste des abonnements
Agrégation du fil
- Le client lit la liste des abonnements et déchiffre les publications de chaque contact pour construire un fil chronologique
- Les publications sont triées par ordre décroissant selon
created_at
Réponses
- Les réponses sont des publications dont les champs
reply_to et reply_to_author sont renseignés
- Les réponses imbriquées ne sont pas prises en charge : seules les réponses directes à une publication de premier niveau sont possibles
- Si la publication d’origine n’est pas visible (par exemple faute d’abonnement), la réponse n’est pas affichée
Publication
- Création d’une nouvelle publication → chiffrement avec la clé de contenu → téléversement sur le site statique → mise à jour de
posts/index.json
- Le téléversement peut utiliser l’API Contents de GitHub, entre autres
- Les secrets de publication sont stockés chiffrés dans
keys/_self.json
Exemple de structure de site statique
{domain}/satellite/
profile.json # clé publique et profil
posts/
index.json # liste des identifiants de publication
{id}.json.enc # publication chiffrée
follows/
index.json # liste des abonnements
keys/
_self.json # clé de contenu et identifiants
{domain}.json # clé de contenu par abonné
FAQ
- « Est-ce du RSS + chiffrement ? » → Oui
- « Une version de l’AT Protocol sans firehose ? » → Oui
- « Est-ce scalable ? » → Non (« l’amitié non plus n’est pas scalable »)
- « Le s signifie-t-il slow/shitty ? » → Oui
- « Peut-on l’auto-héberger ? » → Oui, mais CORS doit être activé
1 commentaires
Avis sur Hacker News
J’ai l’impression que ce projet rencontre les mêmes problèmes que beaucoup de réseaux sociaux alternatifs et auto-hébergés
La conception centrée sur le chiffrement est séduisante, mais quand on change d’appareil, il devient difficile de restaurer la liste de ses abonnements, et des notions comme une paire de clés X25519 restent trop complexes pour le grand public
Je pense qu’une structure plus réaliste serait un système basé sur identifiant et mot de passe, où le serveur se charge du chiffrement à la place de l’utilisateur
C’est selon moi ce genre d’approche qui peut vraiment remplacer le Big Tech tout en restant utilisable par des personnes non techniques
En revanche, il faudra peut-être que je fasse l’installation à la place de ma famille ou de mes amis. Cela dit, ils pourraient quand même beaucoup apprécier d’avoir leur propre site web
En pratique, on peut y voir une idée d’intégration d’un blog statique à BlueSky.
Ce serait améliorable en exploitant l’identité BlueSky, ou via un plugin de générateur de site statique qui récupérerait automatiquement les informations d’authentification
Voir cet article
J’ai été surpris de voir que la clé privée est stockée dans le localStorage du navigateur
Si les paramètres du navigateur sont réinitialisés ou si le navigateur est réinstallé, les données disparaissent, les sauvegardes sont difficiles, et l’accès par un malware est facile
Au final, si la clé est perdue, le fil disparaît lui aussi définitivement, ce qui risque de faire fuir les utilisateurs
URL.createObjectURL(localStorage.getItem(...)), on peut inciter l’utilisateur à enregistrer un fichierBien sûr, perdre la clé signifie perdre l’accès, mais les utilisateurs de 2FA ou de portefeuilles crypto acceptent déjà une responsabilité similaire, donc ce n’est pas totalement irréaliste
Quelqu’un propose d’utiliser
/.well-known/au lieu du chemin/satellite/En référence au standard Well-known URI
.well-knowns’applique à l’hôte entier et ne convient donc pas à des flux distincts ; il vaudrait mieux séparer plusieurs répertoiresLa proposition
.well-known/me semble mériter une vraie réflexionC’est déjà un standard enregistré auprès de l’IANA et largement utilisé, notamment pour les fichiers de sécurité et de découverte
Mettre
satproto.jsondans/.well-known/satproto.jsonplutôt que dans/satellite/satproto.jsonpermettrait d’éviter les conflits et d’indiquer plus clairement qu’il s’agit d’un endpoint de protocole.well-knownfonctionne au niveau de l’hôte, donc ce n’est pas adapté si l’on veut plusieurs répertoires distincts par compteLes protocoles de réseau social ne doivent pas exister pour la technique elle-même, mais apporter un bénéfice direct à l’utilisateur
Comme avec BitTorrent, il faut que les gens participent simplement parce qu’ils en ont besoin, afin de créer un effet de réseau
Une approche qui part de la gestion des données et de la facilité de partage paraît plus réaliste
Lemmy ou Pixelfed donnaient l’impression d’endroits où « il ne se passe rien », faute de contenu
Signal aussi : comme c’est uniquement de la messagerie, il n’y a pas de raison de scroller
En fin de compte, il faut du contenu et du FOMO (peur de rater quelque chose) pour donner envie de revenir régulièrement
Pour construire une vraie messagerie sociale décentralisée et chiffrée de bout en bout, il faudrait une architecture où chaque serveur est réellement hébergé de manière indépendante, comme avec Discord
Les comptes seraient gérés via un protocole du type Nostr, et le tout fonctionnerait sur Yggdrasil Network afin de réduire la dépendance à IPv4/6 et au DNS
Si le trafic est encapsulé dans HTTPS et que le contournement du NAT est automatisé, n’importe qui peut exploiter un serveur
Ce n’est qu’avec ce type de structure qu’on peut vraiment échapper au contrôle du Big Tech et des gouvernements
Même si les serveurs disparaissent, les données restent en périphérie, et le navigateur des utilisateurs peut lui-même jouer le rôle d’hôte
Voir ephemeral-p2p-project
Chaque appareil agit comme un serveur, et la messagerie totalement P2P est implémentée via WebRTC
Même sans Internet, l’échange de données reste possible via une liaison radio
Il y a déjà eu des tentatives de réseaux sociaux totalement décentralisés, comme FOAF ou Pingback
Le wiki IndieWeb est recommandé comme bonne ressource pour explorer ce type de technologies sociales fondées sur le web personnel
En lisant la description « sAT Protocol est un réseau social décentralisé basé sur des sites statiques », j’avais envie de dessiner un graphique où mes sourcils montent progressivement
En revanche, le fait que les textes chiffrés puissent être énumérés publiquement peut devenir risqué à l’ère des ordinateurs quantiques
C’est adapté à de petits réseaux, mais difficile à étendre à grande échelle à cause des problèmes de distribution et de rotation des clés
Du point de vue utilisateur, j’ai l’impression qu’il faudrait d’abord expliquer quel service cela rend concrètement
Il n’y a que des termes techniques comme fork, chemin, JSON ou chiffrement, sans qu’on voie vraiment le scénario d’usage réel
C’est un terrain que Mastodon ou Signal ne couvrent pas vraiment, donc cela vaut le coup d’expérimenter
Je trouve ces expériences de réseaux décentralisés vraiment fascinantes
Même si elles ont souvent beaucoup de problèmes structurels, j’aime découvrir de nouvelles combinaisons d’idées
En revanche, devoir rechiffrer et reconstruire tout le site à chaque abonnement ou désabonnement est beaucoup trop contraignant
De plus, le fait de ne pas voir les commentaires sans suivre la personne limite fortement la scalabilité
Cela dit, le mélange de RSS, ActivityPub et site statique a quelque chose d’attirant
Tenter de mettre en place un contrôle d’accès dynamique à une liste d’amis sur un site statique est contradictoire, mais intéressant
Au final, c’est une architecture que j’aime et déteste à la fois. Mais je suis content et reconnaissant de voir ce genre de tentative