- Protocolo de redes sociales descentralizadas basado en sitios web estáticos, con una estructura en la que cada usuario posee y administra directamente sus propios datos
- Todos los datos se guardan en un almacén JSON cifrado, y el cliente del navegador agrega el feed y publica las entradas
- Funciona sin servidores ni relays, mediante comunicación directa entre sitios web y navegadores de amigos
- El nombre de dominio del usuario es su identidad, autenticada mediante HTTPS/TLS
- Implementa una red social autosoberana con una estructura simple, enfocada en interacciones basadas en la confianza entre personas
Resumen del protocolo sAT
s@ es un protocolo de redes sociales descentralizadas basado en sitios estáticos, donde cada usuario almacena los datos en su propio sitio web
- Todos los datos se guardan como archivos JSON cifrados, que el cliente del navegador lee para publicar entradas y agregar el feed
- Funciona sin servidor central ni relay, y los datos se mueven directamente desde el sitio del usuario al navegador de sus amigos
- Debe existir una relación de seguimiento mutuo para que se puedan intercambiar publicaciones, excluyendo una estructura centrada en influencers
- El protocolo no depende de servicios de hosting específicos como GitHub Pages
Identidad
- El nombre de dominio del usuario funciona como identidad
- HTTPS/TLS autentica que el propietario del dominio publicó el contenido
Descubrimiento
Modelo de cifrado
- Todos los datos del usuario se almacenan en un almacén JSON cifrado, y solo el usuario y sus seguidores pueden descifrarlos
- Se utiliza un par de claves X25519: la clave pública se publica en
profile.json y la clave privada se guarda en localStorage del navegador
- Los datos de las publicaciones se cifran con XChaCha20-Poly1305, y la clave de contenido se cifra para cada seguidor con
crypto_box_seal de libsodium
- El archivo
keys/_self.json contiene la clave de contenido del usuario y los secretos de publicación, y solo el propio usuario puede descifrarlo
Rotación de claves y dejar de seguir
- Al dejar de seguir, se genera una nueva clave de contenido y se vuelven a cifrar todas las publicaciones
- Se generan nuevos sobres de clave para los seguidores restantes y se actualiza
keys/_self.json
- El usuario al que se dejó de seguir ya no puede descifrar las publicaciones
Flujo de descifrado
- Cuando un visitante entra al sitio de un amigo, descifra
keys/{follower-domain}.json con su clave privada para obtener la clave de contenido
- Después obtiene y descifra
posts/index.json y cada publicación individual (posts/{id}.json.enc)
Estructura de datos
- Cada publicación se guarda como un archivo cifrado por separado, y
posts/index.json lista los IDs de publicaciones en orden de más reciente a más antigua
- Ejemplo de objeto de publicación:
{
"id": "20260309T141500Z-a1b2",
"author": "alice.com",
"created_at": "2026-03-09T14:15:00Z",
"text": "Hello, decentralized world!",
"reply_to": null,
"reply_to_author": null
}
- El ID de la publicación se compone de una marca de tiempo UTC ISO8601 y un hash aleatorio de 4 caracteres
Lista de seguidos
Agregación del feed
- El cliente lee la lista de seguidos y descifra las publicaciones de cada seguidor para construir un feed cronológico
- Las publicaciones se ordenan en forma descendente según
created_at
Respuestas
- Las respuestas son publicaciones con los campos
reply_to y reply_to_author definidos
- No se admiten respuestas anidadas; solo se puede responder directamente a publicaciones de nivel superior
- Si no se puede ver la publicación original (por ejemplo, porque no existe una relación de seguimiento), la respuesta no se muestra
Publicación
- Crear una nueva publicación → cifrarla con la clave de contenido → subirla al sitio estático → actualizar
posts/index.json
- Para la carga se puede usar GitHub Contents API, entre otros
- Los secretos de publicación se guardan cifrados en
keys/_self.json
Ejemplo de estructura del sitio estático
{domain}/satellite/
profile.json # clave pública y perfil
posts/
index.json # lista de IDs de publicaciones
{id}.json.enc # publicación cifrada
follows/
index.json # lista de seguidos
keys/
_self.json # clave de contenido y credenciales
{domain}.json # clave de contenido por seguidor
FAQ
- “¿Es RSS + cifrado?” → Sí
- “¿Es una versión de AT Protocol sin firehose?” → Sí
- “¿Es escalable?” → No (“la amistad tampoco escala”)
- “¿La s significa slow/shitty?” → Sí
- “¿Se puede self-hostear?” → Sí, pero requiere CORS habilitado
1 comentarios
Comentarios en Hacker News
Siento que este proyecto sufre los mismos problemas que muchas redes sociales alternativas y autohospedadas
El diseño centrado en el cifrado suena genial, pero si cambias de dispositivo es difícil recuperar a quiénes sigues, y conceptos como un par de claves X25519 también son difíciles de entender para la gente común
Yo creo que una estructura más realista es simplemente basada en usuario y contraseña, donde el servidor se encarga del cifrado
Me parece que ese enfoque sí apunta a algo que puedan usar usuarios no técnicos y que pueda reemplazar a las big tech
Aun así, quizá tendría que configurar yo mismo todo para mi familia o amigos. Pero creo que igual les gustaría bastante tener su propio sitio web
En la práctica, puede verse como una idea para integrar blogs estáticos con BlueSky.
Podría mejorarse usando la identidad de BlueSky o con un plugin para generadores de sitios estáticos que obtenga automáticamente la información de autenticación
Ver este artículo relacionado
Me sorprendió la parte donde guardan la clave privada en el
localStoragedel navegadorSi restableces la configuración del navegador o lo reinstalas, los datos se pierden, es difícil hacer respaldo y el acceso para malware es fácil
Al final, si se pierde la clave también desaparece el feed para siempre, así que hay riesgo de que los usuarios abandonen la plataforma
URL.createObjectURL(localStorage.getItem(...))ya podrías inducir al usuario a guardar un archivoClaro, si se pierde la clave ya no hay acceso, pero los usuarios de 2FA o de billeteras cripto también asumen responsabilidades parecidas, así que no es algo completamente imposible
Alguien propone usar
/.well-known/en lugar de la ruta/satellite/Hace referencia al estándar Well-known URI
.well-knownes para todo el host, así que no encaja bien a nivel de stream. Le parece mejor mantener varios directorios separadosLa propuesta de usar
.well-known/me parece digna de consideración seriaYa se usa ampliamente como estándar registrado en IANA, y ahí suelen ubicarse archivos de seguridad y descubrimiento
Si en vez de
/satellite/satproto.jsonse pusiera en/.well-known/satproto.json, se evitarían conflictos y quedaría más claro que es un endpoint del protocolo.well-knownes a nivel de host, así que no sirve tanto si quieres tener varios directorios por cuentaUn protocolo de red social no debería existir por la tecnología en sí, sino porque le da un beneficio directo al usuario
Como BitTorrent, tiene que lograr que la gente participe simplemente porque lo necesita, para que aparezca el efecto de red
Me parece más realista un enfoque que parta de la gestión de datos y la comodidad para compartirlos
Lemmy y Pixelfed tenían tan poco contenido que se sentían como “lugares donde no pasa nada”
A Signal le pasa algo parecido: como es solo para mensajería, no hay “motivo para scrollear”
Al final, para que la gente vuelva de forma constante hacen falta contenido y FOMO (miedo a perderse algo)
Si de verdad se quiere crear una red social descentralizada y mensajería E2EE de verdad, hace falta una estructura tipo Discord donde cada servidor esté realmente alojado de forma independiente
Las cuentas deberían gestionarse con un protocolo como Nostr y funcionar sobre Yggdrasil Network para reducir la dependencia de IPv4/6 y DNS
Si además se encapsula el tráfico en HTTPS y se automatiza el cruce de NAT, cualquiera podría operar un servidor
Solo con una estructura así se podría salir del control de las big tech y de los gobiernos
Aunque un servidor desaparezca, los datos quedan en el edge y hasta el navegador del usuario podría cumplir el rol de host
Ver ephemeral-p2p-project
Cada dispositivo actúa como servidor y usan WebRTC para implementar mensajería totalmente P2P
Incluso sin internet se pueden intercambiar datos por enlace de radio
Antes ya hubo intentos de redes sociales totalmente descentralizadas como FOAF o Pingback
Recomiendan la wiki de IndieWeb como buen recurso para explorar este tipo de tecnologías sociales basadas en sitios personales
Al leer la descripción “sAT Protocol es una red social descentralizada basada en sitios estáticos”, me dieron ganas de dibujar una gráfica de cejas levantándose cada vez más
Aunque el hecho de que el texto cifrado pueda enumerarse públicamente podría ser riesgoso en una era de computación cuántica
Funciona para redes pequeñas, pero sería difícil escalarlo por los problemas de distribución y rotación de claves
Desde el punto de vista del usuario, siento que primero hace falta explicar qué tipo de servicio hace esto
Está lleno de términos técnicos como forks, rutas, JSON y cifrado, pero no se alcanza a ver el escenario de uso real
Es un espacio que Mastodon o Signal no cubren del todo, así que vale la pena experimentar con esto
Este tipo de experimentos de redes descentralizadas me resultan realmente fascinantes
Aunque estructuralmente tengan muchos problemas, me gusta aprender de estas combinaciones nuevas
Eso sí, tener que volver a cifrar y reconstruir todo el sitio cada vez que sigues o dejas de seguir a alguien es demasiado engorroso
Además, una estructura donde no puedes ver comentarios si no sigues a alguien limita mucho la escalabilidad
Aun así, resulta atractivo que mezcle RSS, ActivityPub y sitios estáticos
El intento de implementar control de acceso dinámico a la lista de amigos con un sitio estático es contradictorio, pero interesante
Al final es una estructura que me hace sentir amor y odio al mismo tiempo. Igual se agradece mucho que existan intentos así