COMPAX E MATRIX
Uma diferença,
e o que vem dela
Matrix é o mensageiro federado maduro, e quase tudo o que se escreve comparando os dois é escrito por gente que não usou nenhuma das duas bases de código. O que vem abaixo foi lido nas duas.
Medido em 27 de agosto de 2026. Synapse: 246.976 linhas de Python — 71.349 só no armazenamento. Continuwuity, uma segunda implementação da mesma rede, 95.220 linhas de Rust. Este servidor: 17.041 linhas. Os dois lados se mexem, e metade do que vem abaixo é sobre hoje e não sobre a natureza das coisas; as partes que são sobre a natureza das coisas estão marcadas.
A DIVERGÊNCIA
Quem é a autoridade
sobre o que é uma sala
- Uma sala é um DAG de eventos, cada um carregando a própria cadeia de autorização.
- Quando os servidores discordam, a resolução de estado v2 resolve.
- Daí os grupos de estado, as extremidades para a frente e para trás, os outliers, o backfill — e 71.349 linhas só na camada de armazenamento.
- Um commit é aceito localmente mesmo quando a rede se parte, e mesclado depois.
- O servidor é um serviço de entrega. Uma ordem só, mantida pela casa da sala.
- Comparar a época, anexar sob a mesma trava. Não há o que divergir.
- Então não há DAG, não há resolução de estado, não há backfill.
- E um commit precisa de uma ida e volta até a casa, e recebe um
409se houver corrida.
A troca é honesta nos dois sentidos, e o MLS não deixa escolha quanto a isso: aplicar um commit destrói os segredos da época anterior. Não há para onde voltar.
UMA AFIRMAÇÃO QUE VALE ACERTAR
“O servidor deles lê as suas mensagens”
está errado nos dois sentidos
Numa sala criptografada do Matrix o corpo de uma mensagem é texto cifrado e o servidor não o lê — Megolm, exatamente como MLS é aqui. O que é verdade é mais estreito e, para a maioria, pior.
- A criptografia é um interruptor da sala. Salas públicas em geral não a têm, e ali tudo é legível.
- O estado da sala nunca é criptografado: nome, tópico, avatar, participação, convites, power levels — texto simples mesmo numa sala criptografada.
- Isso não é um descuido. O servidor aplica as regras de autorização aos eventos, então precisa conseguir lê-los.
- Quem está numa sala com quem, quem convidou quem e quando — sempre visível para o servidor deles.
- Aqui isso vive na árvore MLS. O servidor vê um
group_ide uma época. - E uma consequência fácil de deixar passar: busca no servidor dentro de salas criptografadas não funciona para eles de jeito nenhum. O Element busca localmente — então, em busca, isto está atrás do Element, não atrás do Matrix.
ONDE CADA UM PÕE O ESFORÇO
Foco
- Sobreviver a uma partição da rede, porque o DAG mescla depois.
- Doze versões de sala lançadas e migradas numa rede em funcionamento.
- Escala provada em campo: stream writers, mapas de instâncias, replicação de Redis.
- Moderação em profundidade — API de administração, ACLs de sala, quarentena de mídia, um processo MSC.
- Implementações de terceiros verificadas como caixas-pretas pelo Complement.
- Recuperação depois de perder todos os aparelhos, via backup de chaves no servidor.
- À vista há um
group_ide uma época, e é disso que a ordenação precisa. - A identidade não é emitida pelo servidor: uma chave raiz assina uma atestação de aparelho e cada um a verifica localmente.
- Ordenar custa uma linha — um compare-and-set, medido em 239 acréscimos por segundo numa sala.
- O push não carrega nada. O deles carrega um
room_id, então a sala chega ao provedor de push de qualquer jeito. - Uma chamada herda a sala: a chave de mídia vem do segredo da época, então remover um membro o remove da mídia como efeito colateral.
- Bots são folhas da árvore, não um desvio pelo servidor — não existe lugar onde texto simples fique parado para um bot.
- Uma reclamação é demonstrável: uma prova de mensagem mostra a autoria. Megolm é uma chave de grupo e não prova nada.
- Dinheiro que o grupo guarda junto, o que não faz parte do Matrix de forma alguma.
AS CONSEQUÊNCIAS
O que cada protocolo
não consegue fazer
Não é um placar. Cada linha é o preço da escolha logo acima dela, e as duas colunas contêm coisas que o lado de cada uma preferiria não ter.
Matrix
Compax
Corpos de mensagem numa sala criptografada
Texto cifrado. Megolm — o servidor não os lê.
Texto cifrado. MLS — o mesmo.
Se a criptografia está ligada
Um interruptor por sala, m.room.encryption. As públicas em geral não estão, e ali o servidor lê tudo.
Não é um interruptor. Não existe sala sem criptografia para se estar.
Estado da sala — nome, tópico, participação, convites, power levels
Texto simples, sempre, mesmo numa sala criptografada. Não é descuido: o servidor aplica as regras de autorização, então tem de lê-las.
Na árvore MLS. O servidor vê group_id e a época.
Quem está numa sala com quem
Visível para o servidor, sempre.
Não visível. Isto, e não o texto das mensagens, é a diferença real.
Busca no servidor dentro de uma sala criptografada
Não funciona de jeito nenhum — o evento criptografado não tem content.body para indexar. O Element busca localmente.
Também não funciona, e pelo mesmo motivo. A saída é a mesma que o Element tomou: um índice no cliente.
Um commit aceito durante uma partição da rede
Sim. O evento é aceito localmente e mesclado depois pela resolução de estado.
Impossível. Aplicar um commit destrói os segredos da época anterior — dois commits numa época são dois estados de chave incompatíveis.
Histórico depois de perder todos os aparelhos
Backup de chaves no servidor sob uma chave de recuperação — ponta a ponta também.
Perdido. Um invólucro que a frase sozinha pudesse abrir seria acesso permanente que ninguém conseguiria revogar; foi recusado de propósito.
Regras da sala aplicadas pelo servidor
Sim — power levels, e o servidor rejeita um evento que as quebre.
Não. A política roda na sombra: conta discordâncias e não rejeita nada, porque um commit válido rejeitado não estraga um grupo MLS, encerra ele.
Prévias de link, moderação por conteúdo, push levando texto
Possível onde quer que uma sala não esteja criptografada.
Impossível. Isto não é “ainda não” — é aquilo com que todo o resto foi comprado.
Dinheiro guardado pelo grupo
Não faz parte do protocolo.
Cinco cadeias, a chave de cada signatário no próprio aparelho, o pagamento chegando como mensagem.
E ONDE OS DOIS SE ENCONTRAM
O mesmo, dos dois lados
Postgres para o que precisa durar e Redis para o que precisa ser rápido. Baldes de fichas por ação. Histórico num segundo aparelho — o backup de chaves deles, janelas seladas e uma transferência por QR aqui. Espera crescente entre tentativas num par morto. Juntar muitos registros numa requisição só. Anúncio de versão por HTTP. Bloquear um provedor. Deduplicação no recebimento. Anexos fora do log de eventos. Prometheus e regras de alerta. E nenhuma busca no servidor dentro de uma sala criptografada, de nenhum dos lados.
A SEGUIR
As perguntas
que vêm primeiro
Dezasseis delas, respondidas sem rodeios — incluindo as duas em que a resposta não é a confortável.