- Um exemplo de implementação que exibe comentários usando a API do Bluesky mesmo em sites estáticos
- Como o Bluesky cuida de autenticação de conta, gerenciamento de spam, armazenamento e moderação, não é necessário manter um servidor separado
- A implementação tem cerca de 200 linhas de código TypeScript e usa
@bluesky/api e Tanstack react-query
- Os comentários são exibidos em modo somente leitura, com o ID do post do Bluesky vinculado aos metadados de cada post do blog para carregamento automático
- Uma implementação experimental que mostra a possibilidade de combinar uma plataforma social aberta com um blog estático
Contexto da implementação da seção de comentários do Bluesky
- O ponto de partida foi a dificuldade de hospedar diretamente um recurso de comentários em um site gerado estaticamente
- Conteúdo estático publicado em CDN não permite armazenar dados dinâmicos
- Operar um VPS ou serviço em nuvem separado traz custo e carga de manutenção elevados
- O Bluesky já oferece, como plataforma aberta baseada em API pública e no protocolo AT, os recursos necessários para gerenciar comentários
- O Bluesky cuida de autenticação de conta, filtragem de spam, armazenamento e moderação
- Do lado do blog, basta chamar a API para exibir os comentários
Outras alternativas e por que o Bluesky foi escolhido
- Também foram consideradas alternativas como Twitter, Disqus e giscus (baseado em GitHub Discussions)
- O Bluesky é construído sobre o protocolo AT descentralizado, o que reduz o risco de controle por uma empresa específica
- Em comparação com soluções baseadas no GitHub, ele é mais adequado para hospedar comentários por ser uma plataforma centrada em conversas
Forma de implementação
- Embora tenha servido de referência o pacote bluesky-comments publicado por Cory Zue, foi escolhida uma implementação própria
- O código foi escrito internamente para permitir customização de acordo com o estilo do site e futura expansão
- A implementação completa, incluindo componentes de UI e funções de API, tem cerca de 200 linhas
- No início, também foi considerada a publicação direta via OAuth, mas ela foi descartada devido à complexidade da UI e à limitação de tempo
- Como resultado, foi implementado apenas um recurso de exibição de comentários em modo somente leitura
Stack técnica
- O site foi construído com React Server Components e Parcel
- O conteúdo é escrito em MDX, o que permite incluir JavaScript/JSX diretamente
- Cada post inclui
bskyPostId no objeto metadata para vinculá-lo ao post do Bluesky
- O SDK TypeScript do Bluesky (
@bluesky/api) é usado para receber os dados da thread de comentários pelo endpoint getPostThread
- As requisições de API são gerenciadas com Tanstack react-query
- Estados de erro, carregamento e retry são tratados automaticamente
Design da UI
- Apenas o conteúdo de texto é extraído da resposta do Bluesky e exibido em uma UI de comentários simples
- A estrutura em thread é distinguida por indentação e uma borda à esquerda
- A imagem de perfil e a data da publicação seguem como referência o design do Bluesky
- No topo, foi adicionado um link para o post original no Bluesky para incentivar a participação na conversa
- Não há função para escrever comentários; os usuários deixam respostas diretamente no Bluesky
Possibilidades futuras
- Se necessário, essa implementação pode ser publicada como pacote independente
- No entanto, o código atual está ajustado ao site pessoal do autor
- Como a estrutura é simples, outros desenvolvedores também podem consultar o código-fonte e implementar facilmente
- Ainda não está claro se a integração de comentários do Bluesky ajudará a aumentar o engajamento do blog
Reações dos usuários do Bluesky
- Vários usuários do Bluesky deixaram reações positivas nos comentários, como “boa ideia”, “resposta rápida” e “adequado como alternativa ao Disqus”
- Alguns levantaram questões sobre gerenciamento de spam, tratamento de comentários aninhados e suporte a anexos
- O autor explicou que é possível ocultar comentários específicos com o recurso de moderação pessoal do Bluesky
1 comentários
Comentários do Hacker News
Se você renderiza um blog ou site com um static site generator, foi sugerido trazer os comentários como arquivos de conteúdo e incluí-los no processo de build
.mdou.htmlEsse processo dá trabalho, mas tem as vantagens de bloquear spam e de ter propriedade total dos dados
Se você não quer usar React, pode dar uma olhada no web component de comentários do Bluesky que eu fiz
Dá para ver no repositório no GitHub e no playground de temas.
É muito fácil de customizar o tema
Pegando a ideia do post original, alguém implementou isso como um sistema de comentários baseado em Mastodon
Dá para ver os detalhes neste post do meu blog
Referência: post relacionado
Existe a história de que, por causa das leis da UE sobre discurso de ódio, se o dono do site não filtrar os comentários pode acabar sendo punido, e alguém queria saber como isso funciona na prática
Por isso, eu simplesmente desativei os comentários
Meu blog é totalmente estático, e um script de Cloudflare Worker com 50 linhas recebe os comentários e os adiciona direto ao Markdown.
Dá para implementar isso sem embutir uma funcionalidade de comentários
Usando a API do Bluesky, também daria para automatizar isso encontrando automaticamente o primeiro post que contém o link de um determinado blog e conectando-o aos comentários
Achei que isso também poderia ajudar no crescimento do Bluesky, então criei uma conta para testar. Parece uma ideia bem divertida de growth hacking
Idealmente, um sistema de comentários self-hosted ou baseado no Fediverse seria mais sustentável
Meu blog não é muito popular, mas no passado eu já passei por um verdadeiro inferno de spam e comentários de ódio
Por isso, nunca mais pretendo reabrir comentários em blog pessoal
Mesmo num sistema baseado em Bluesky, dá para adicionar seu próprio labeler e fazer uma censura própria, filtrando os comentários que recebam determinados rótulos
Eu também fiz algo parecido: além do meu blog, adicionei na cartes.app uma função de comentários por local do OSM
Dá para deixar avaliações com uma conta ATproto, e os dados ficam armazenados no PDS como JSON de propriedade do usuário