Eu administro um fórum pequeno e outros três sites, e eu continuava notando a mesma coisa. As pessoas estavam felizes para conversar no chat uma vez que estavam no fórum, mas ninguém vai a um fórum para fazer uma pergunta rápida. Elas a fazem onde já estão, ou simplesmente não a fazem.
Então, criei um plugin que coloca o chat do fórum nesses outros sites. Uma tag de script, e uma bolha de canto aparece. Os visitantes fazem login com a conta do fórum que já possuem, através da própria tela de login do fórum, e conversam nos mesmos canais que veriam no fórum. As mensagens que enviam chegam ao chat do fórum como qualquer outra mensagem, porque é exatamente isso que são.
Repositório: GitHub - capodieci/discourse-chat-bridge: Allows to install discourse chat as a plugin in other websites · GitHub (MIT)
<script src="https://forum.example.com/chat-bridge/widget.js"
data-site-key="your-site-key" defer></script>
Por que é um plugin e não um serviço
Comecei projetando uma ponte externa que se comunicaria com o Discourse via API, e então li o código-fonte. Isso mudou completamente o design, e os motivos podem ser úteis para qualquer pessoa que esteja considerando algo semelhante.
O plugin de chat registra exatamente um escopo de API granular, create_message. Qualquer coisa além de postar, como ler canais, buscar histórico ou abrir uma mensagem direta, requer uma chave de escopo global, e uma chave de escopo global para cada usuário é um grande monte de credenciais para guardar. Os limites de taxa padrão são de 60 requisições por minuto no balde de administrador e 20 no balde de usuário, o que um cliente de chat consome sem esforço. E os webhooks de chat carregam quatro eventos de mensagem e nada mais, então reações, presença e estado de leitura simplesmente não estão disponíveis para serem encaminhados.
Todos esses problemas desaparecem quando o código roda dentro do Discourse e pode fazer uma pergunta diretamente ao Guardian. Sem chaves, sem teto de limite de taxa, e uma única fonte de verdade em vez de um cache que pode discordar do fórum.
O que funciona
Canais, histórico de mensagens, envio, mensagens diretas com busca de pessoas, e mensagens de voz gravadas no navegador. Mensagens de voz aparecem como um reprodutor de áudio normal para os membros que leem o próprio chat do fórum, não como um link de download, o que exigiu bastante cuidado para acertar.
Cada site recebe sua própria cor de destaque, canto e título de painel, para que três sites possam parecer três produtos diferentes em vez de três cópias do mesmo widget. Os visitantes recebem um som de notificação que podem desligar, uma sobreposição de tema claro ou escuro, e a capacidade de silenciar uma conversa, o que grava em sua verdadeira membresia do Discourse para que a configuração os acompanhe de volta ao fórum.
Tudo é renderizado dentro de um Shadow DOM. Isso roda em páginas que eu não controlo, e o CSS de nenhum dos lados deve ser capaz de quebrar o outro.
O que não funciona, e por quê
Não há chamadas de voz ou vídeo. Isso é intencional e está fora do escopo.
A entrega não é instantânea. As mensagens chegam em cerca de três segundos enquanto o painel está aberto. Isso merece uma explicação, porque o Discourse publica eventos de chat no MessageBus e parece que deveria funcionar apenas assim.
Um navegador em outro domínio não pode autenticar no endpoint do MessageBus. Sua política CORS permite quatro cabeçalhos de requisição e nenhum deles carrega um token bearer, e a rota de parâmetro de consulta para a autenticação do Discourse é restrita a endpoints de RSS e calendário. O único cabeçalho que funciona, X-Shared-Session-Key, resolve para um UserAuthToken e, portanto, autentica qualquer requisição que o carregue, não apenas as do MessageBus. Entregar isso a uma página de incorporação transformaria um buraco de injeção de script entre sites (XSS) em um site de marketing em uma captura completa da conta do fórum. Três segundos é o melhor compromisso.
Existe uma rota mais segura para tempo real documentada no repositório, usando um canal do MessageBus cujo nome inimaginável é ele mesmo a capacidade, limitado a uma sessão de widget em vez da conta do usuário. Eu não o construí. Se alguém quiser, o raciocínio está em docs/decisions.md.
A coisa a entender antes de instalar
Registrar um site concede a esse site acesso cross-origin ao seu fórum carregando as credenciais dos seus membros. Isso não é um efeito colateral, é o mecanismo.
Se um site que você registrou for comprometido, um invasor que possa executar JavaScript lá pode agir como qualquer membro que o visite. Não apenas no chat. Qualquer coisa que esse membro pudesse fazer no fórum.
Então, registre apenas sites que você controla. Registrar o site de um parceiro ou de um cliente significa aceitar a segurança deles como a sua. O plugin diz isso na página de administração ao lado do campo onde você digita a origem, em vez de em um documento que ninguém abre, e o SECURITY.md detalha o que o plugin faz para limitar o raio de explosão e o que ele deliberadamente não faz.
Instalação
Adicione-o à sua definição de container e reconstrua uma vez:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone --depth 1 https://github.com/capodieci/discourse-chat-bridge.git
env:
DISCOURSE_ENABLE_CORS: true
Em seguida, ative chat_bridge_enabled em Admin, Settings, e tudo o mais fica em uma única página em /chat-bridge/admin, onde você adiciona um site e ele te entrega a tag de script.
Duas notas que pouparão a tarde de alguém. Mensagens de voz precisam de formatos de áudio em authorized_extensions, que por padrão não contém nenhum, então a página de administração diz exatamente quais estão faltando. E chat_allowed_groups tem como padrão o nível de confiança 1, então contas totalmente novas não podem conversar até que o ganhem, o que o widget explica em vez de falhar silenciosamente.
Compatibilidade
Testado contra o Discourse 2026.9.0 e 2026.8.0, e em uso de produção em um fórum.
Isso depende de objetos de serviço de chat que não são API pública, então uma liberação do Discourse pode movê-los. O repositório inclui um script de pré-voo somente leitura que afirma que cada um deles ainda existe e relata em segundos em vez de na primeira requisição. Vale a pena executar após uma atualização.
O que eu gostaria
Alguém para instalá-lo em um fórum que não é meu e me dizer o que quebrou. Tudo até agora é verificado contra um Discourse, em um servidor, por uma pessoa, e essa é a parte mais fraca disso.
Eu também gostaria de ouvir de qualquer pessoa que saiba de uma melhor resposta para o problema do MessageBus do que aquela em que me baseei.
