- Protocolo de rede social descentralizada usando sites estáticos, com uma estrutura em que cada usuário possui e gerencia diretamente seus próprios dados
- Todos os dados são armazenados em um repositório JSON criptografado, e o cliente no navegador agrega o feed e publica posts
- Funciona por comunicação direta entre sites e navegadores de amigos, sem servidor nem relay
- O nome de domínio do usuário é sua identidade, autenticada via HTTPS/TLS
- Implementa uma rede social de soberania própria com uma estrutura simples, focada em interações baseadas em confiança entre indivíduos
Visão geral do protocolo sAT
s@ é um protocolo de rede social descentralizada baseado em sites estáticos no qual cada usuário armazena dados em seu próprio site
- Todos os dados são armazenados como arquivos JSON criptografados, que o cliente no navegador lê para publicar posts e agregar o feed
- Funciona sem servidor central ou relay, e os dados vão diretamente do site do usuário para o navegador do amigo
- É necessário haver uma relação de follow mútuo para que a troca de posts seja possível, excluindo uma estrutura centrada em influenciadores
- O protocolo não depende de um serviço de hospedagem específico, como GitHub Pages
Identidade
- O nome de domínio do usuário funciona como identidade
- HTTPS/TLS autentica que o proprietário do domínio publicou o conteúdo
Descoberta
Modelo de criptografia
- Todos os dados do usuário são armazenados em um repositório JSON criptografado, e só o usuário e seus seguidores podem descriptografá-los
- Usa par de chaves X25519: a chave pública é publicada em
profile.json, e a chave privada é armazenada no localStorage do navegador
- Os dados dos posts são criptografados com XChaCha20-Poly1305, e a chave de conteúdo é criptografada para cada seguidor com
crypto_box_seal do libsodium
- O arquivo
keys/_self.json contém a chave de conteúdo do usuário e os segredos de publicação, e só o próprio usuário pode descriptografá-lo
Rotação de chaves e unfollow
- Ao deixar de seguir alguém, uma nova chave de conteúdo é gerada e todos os posts são criptografados novamente
- Novos envelopes de chave são gerados para os seguidores restantes, e
keys/_self.json é atualizado
- O usuário que deixou de seguir não consegue mais descriptografar os posts
Fluxo de descriptografia
- Quando um visitante acessa o site de um amigo, ele descriptografa
keys/{follower-domain}.json com sua própria chave privada para obter a chave de conteúdo
- Depois disso, busca
posts/index.json e os posts individuais (posts/{id}.json.enc) para descriptografá-los
Estrutura de dados (Data Schema)
- Cada post é armazenado como um arquivo criptografado individual, e
posts/index.json lista os IDs dos posts do mais recente para o mais antigo
- Exemplo de objeto de post:
{
"id": "20260309T141500Z-a1b2",
"author": "alice.com",
"created_at": "2026-03-09T14:15:00Z",
"text": "Hello, decentralized world!",
"reply_to": null,
"reply_to_author": null
}
- O ID do post é composto por um timestamp UTC em ISO8601 e um hash aleatório de 4 caracteres
Lista de follows
Agregação do feed
- O cliente lê a lista de follows e descriptografa os posts de cada seguido para montar um feed cronológico
- Os posts são ordenados em ordem decrescente com base em
created_at
Resposta
- Uma resposta é um post com os campos
reply_to e reply_to_author definidos
- Respostas aninhadas não são suportadas, e só é possível responder diretamente a posts de nível superior
- Se o post original não puder ser visto (por exemplo, por não seguir o autor), a resposta não será exibida
Publicação
- Criar um novo post → criptografar com a chave de conteúdo → fazer upload para o site estático → atualizar
posts/index.json
- É possível usar o GitHub Contents API, entre outros, para o upload
- Os segredos de publicação são armazenados de forma criptografada em
keys/_self.json
Exemplo de estrutura de site estático
{domain}/satellite/
profile.json # chave pública e perfil
posts/
index.json # lista de IDs dos posts
{id}.json.enc # post criptografado
follows/
index.json # lista de follows
keys/
_self.json # chave de conteúdo e credenciais
{domain}.json # chave de conteúdo por seguidor
FAQ
- “É RSS + criptografia?” → Sim
- “É uma versão do AT Protocol sem firehose?” → Sim
- “É escalável?” → Não (“amizade também não escala”)
- “O s significa slow/shitty?” → Sim
- “Dá para fazer self-host?” → Sim, mas é necessário ativar CORS
1 comentários
Comentários do Hacker News
Sinto que este projeto sofre dos mesmos problemas que muitas redes sociais alternativas e auto-hospedadas enfrentam
O design centrado em criptografia é legal, mas ao trocar de dispositivo fica difícil recuperar os follows dos amigos, e conceitos como pares de chaves X25519 também são difíceis para pessoas comuns entenderem
Acho que uma estrutura baseada simplesmente em usuário e senha, em que o servidor cuida da criptografia, é mais realista
Vejo esse tipo de abordagem como o caminho para algo que usuários não técnicos consigam usar e que possa substituir as big techs
Ainda assim, talvez eu precise fazer a configuração para familiares ou amigos. Mesmo assim, acho que eles gostariam bastante de ter seu próprio site
Na prática, dá para ver como uma ideia de integrar blogs estáticos ao BlueSky.
Também daria para melhorar usando a identidade do BlueSky ou trazendo automaticamente as credenciais por meio de um plugin de gerador de site estático
Veja este texto relacionado
Fiquei surpreso com a parte sobre armazenar a chave privada no localStorage do navegador
Se as configurações do navegador forem resetadas ou ele for reinstalado, os dados somem, fazer backup é difícil e malware pode acessar isso com facilidade
No fim, se a chave for perdida, o feed também desaparece para sempre, então há risco de os usuários abandonarem a plataforma
URL.createObjectURL(localStorage.getItem(...)), já daria para induzir o salvamento em arquivoClaro, perder a chave significa perder o acesso, mas usuários de 2FA e carteiras de cripto também assumem responsabilidade parecida, então não é algo totalmente inviável
Sugeriram usar
/.well-known/em vez do caminho/satellite/A referência é o padrão Well-known URI
.well-knowné para o host inteiro, então não seria adequado para algo no nível do stream. Na visão dessa pessoa, é melhor manter vários diretórios separadosAcho que a sugestão de
/.well-known/merece consideração sériaJá é um padrão registrado na IANA e amplamente usado, com arquivos de segurança e descoberta ficando ali
Em vez de
/satellite/satproto.json, colocá-lo em/.well-known/satproto.jsonevitaria conflitos e deixaria mais claro que se trata de um endpoint de protocolo.well-knowné no nível do host, então não combina bem com casos em que se quer ter vários diretórios por contaProtocolos de rede social não devem existir pela tecnologia em si, e sim gerar benefício direto para o usuário
Como no BitTorrent, as pessoas precisam participar simplesmente porque precisam daquilo; só assim o efeito de rede aparece
Acho mais realista partir da gestão de dados e da conveniência no compartilhamento
Lemmy e Pixelfed tinham pouco conteúdo e pareciam “lugares onde nada acontece”
O Signal também é assim: como serve só para mensagens, não existe motivo para ficar rolando a tela
No fim, é preciso haver conteúdo e FOMO (medo de ficar de fora) para que as pessoas continuem voltando
Para criar um mensageiro social realmente descentralizado e com E2EE, seria preciso uma estrutura em que cada servidor seja de fato hospedado de forma independente, como no Discord
As contas seriam gerenciadas por um protocolo como o Nostr, e tudo rodaria sobre a Yggdrasil Network para reduzir a dependência de IPv4/6 e DNS
Se o tráfego for encapsulado em HTTPS e a travessia de NAT for automatizada, qualquer pessoa poderia operar um servidor
Só com uma estrutura assim seria possível escapar do controle das big techs e dos governos
Mesmo que o servidor desapareça, os dados continuam nas pontas, e o navegador do usuário também poderia atuar como host
Veja ephemeral-p2p-project
Cada dispositivo atua como servidor, e o WebRTC implementa mensagens totalmente P2P
Mesmo sem internet, também dá para trocar dados por conexão via rádio
No passado já houve tentativas de redes sociais totalmente descentralizadas, como FOAF e Pingback
Recomendo a wiki do IndieWeb como uma boa referência para explorar esse tipo de tecnologia social baseada em sites pessoais
Ao ler a descrição “o sAT Protocol é uma rede social descentralizada baseada em sites estáticos”, senti vontade de desenhar um gráfico de sobrancelhas subindo cada vez mais
Só que o fato de o texto cifrado poder ser enumerado publicamente pode ser um risco na era dos computadores quânticos
Funciona para redes pequenas, mas deve ser difícil escalar por causa dos problemas de distribuição e rotação de chaves
Do ponto de vista do usuário, senti falta de uma explicação mais clara sobre que tipo de serviço isso faz
Está cheio de termos técnicos como fork, path, JSON e criptografia, mas não fica visível qual seria o cenário real de uso
É um espaço que Mastodon ou Signal não atendem, então vale testar com isso
Acho realmente interessante ver esse tipo de experimento com redes descentralizadas
Mesmo que estruturalmente haja muitos problemas, é divertido aprender novas combinações
Mas ter que recriptografar e reconstruir o site inteiro sempre que alguém segue ou deixa de seguir é trabalhoso demais
Além disso, uma estrutura em que você não vê comentários de quem não segue limita bastante a escalabilidade
Ainda assim, é atraente como mistura de RSS, ActivityPub e site estático
A tentativa de implementar controle de acesso dinâmico à lista de amigos com site estático é contraditória, mas interessante
No fim, é uma estrutura que desperta amor e ódio ao mesmo tempo. Ainda assim, fico feliz e grato por ver esse tipo de tentativa