Por que implementei sincronização LAN em meu mensageiro self-hosted (e não via servidor)
O desenvolvedor do ONYX, um mensageiro self-hosted, E2E-criptografado e anônimo, detalha a nova funcionalidade WardLink, que permite a sincronização direta de dados entre dispositivos na mesma rede local, eliminando a necessidade de passar pelo servidor para tarefas de sincronização de estado.
MundiX News·20 de junho de 2026·5 min de leitura·👁 4 views
ONYX é um projeto pessoal: um mensageiro self-hosted, anônimo e com criptografia de ponta a ponta (E2E). O cliente é desenvolvido em Flutter e está disponível para Windows, Linux, macOS e Android, permitindo a criação de contas sem a necessidade de número de telefone ou e-mail. A versão v1.7-beta foi lançada, e embora contenha diversas atualizações, o foco principal deste texto é uma nova funcionalidade chamada WardLink, que motivou o lançamento deste release.
A problemática abordada pelo WardLink reside na forma como a sincronização de estado (como chats favoritos e sua ordem) entre dispositivos, mesmo em um servidor self-hosted, geralmente ainda ocorre através do servidor. Embora isso seja aceitável para a sincronização de mensagens em si, o desenvolvedor achava ineficiente que, para uma tarefa puramente local – como sincronizar dois dispositivos na mesma rede doméstica – o tráfego fosse roteado através de um servidor mantido para outros fins. O WardLink resolve isso permitindo a comunicação direta entre os dispositivos via LAN, excluindo o servidor do processo para essa tarefa específica.
O funcionamento do WardLink é baseado em um pareamento inicial via QR code. Um dispositivo escaneia o código exibido no outro, enviando uma requisição de pareamento autenticada por nonce via LAN. Após a confirmação, o segundo dispositivo passa a confiar no primeiro, estabelecendo uma confiança mútua a partir de um único escaneamento. Cada dispositivo utiliza uma chave de identidade X25519 persistente armazenada de forma segura, em contraste com as chaves efêmeras usadas em mensageiros LAN comuns, que são rotacionadas a cada inicialização. A chave de sessão é estabelecida através de ECDH static-static e HKDF. A sincronização é pull-based: cada dispositivo solicita independentemente um manifesto do seu par (listando mensagens e chats existentes), compara com seu próprio estado e baixa os dados ausentes, sem a necessidade de um coordenador central. Arquivos de mídia maiores são transferidos via stream, utilizando AES-GCM em quadros de 256KB, sem codificação base64 e sem carregar o arquivo inteiro na memória. Isso remove a limitação anterior de 200MB e eleva o limite para 512MB a 4GB (com 2GB como padrão). A sincronização abrange apenas os chats marcados como favoritos, de forma completa e contínua.
É importante ressaltar as limitações do WardLink: ele opera exclusivamente em LAN, funcionando apenas quando ambos os dispositivos estão na mesma rede. Para sincronização via internet, o servidor ainda é necessário. O WardLink foca em cenários específicos como "dois dos meus dispositivos próximos". Além do WardLink, o release v1.7-beta inclui outras novidades: uma galeria de mídia em cada chat, busca aprimorada por configurações e chats (por nome ou palavra-chave), backups manuais ou agendados, um botão de rolagem para baixo personalizável, a utilização de markdown na seção "novidades" (onde a lista de alterações é publicada), um redesign do player de mídia, caixas de diálogo e configurações, além de uma reestruturação destas últimas. Um novo motor de armazenamento de dados foi implementado, e em PCs, as pastas de favoritos permanecem desbloqueadas durante a sessão. A animação de entrada de mensagens ao abrir um chat foi removida por causar mais lentidão do que benefícios. Correções de bugs incluem problemas críticos no backend que afetavam o envio de mensagens, um bug na animação de setas nas configurações e o ajuste do seletor biométrico para não ser exibido onde a biometria não está disponível ou desativada.
Para usuários que estão atualizando de versões anteriores, o armazenamento local foi migrado para o novo motor, e a migração de dados ocorre automaticamente na primeira inicialização. Para usuários com um histórico extenso de chats, a migração pode levar algum tempo, mas os testes indicam um aumento de performance de 70-80% após a conclusão. O repositório e a lista completa de alterações estão disponíveis no GitHub. Sendo uma versão beta e desenvolvida por um único programador, a ocorrência de bugs é esperada. O desenvolvedor incentiva os usuários a reportarem quaisquer bugs encontrados através do sistema de issues no repositório, pois isso é de grande ajuda no desenvolvimento.
Sem cartão para começar · Planos a partir de R$49/mês
ONYX é um projeto pessoal: um mensageiro self-hosted, anônimo e com criptografia de ponta a ponta (E2E). O cliente é desenvolvido em Flutter e está disponível para Windows, Linux, macOS e Android, permitindo a criação de contas sem a necessidade de número de telefone ou e-mail. A versão v1.7-beta foi lançada, e embora contenha diversas atualizações, o foco principal deste texto é uma nova funcionalidade chamada WardLink, que motivou o lançamento deste release.
A problemática abordada pelo WardLink reside na forma como a sincronização de estado (como chats favoritos e sua ordem) entre dispositivos, mesmo em um servidor self-hosted, geralmente ainda ocorre através do servidor. Embora isso seja aceitável para a sincronização de mensagens em si, o desenvolvedor achava ineficiente que, para uma tarefa puramente local – como sincronizar dois dispositivos na mesma rede doméstica – o tráfego fosse roteado através de um servidor mantido para outros fins. O WardLink resolve isso permitindo a comunicação direta entre os dispositivos via LAN, excluindo o servidor do processo para essa tarefa específica.
O funcionamento do WardLink é baseado em um pareamento inicial via QR code. Um dispositivo escaneia o código exibido no outro, enviando uma requisição de pareamento autenticada por nonce via LAN. Após a confirmação, o segundo dispositivo passa a confiar no primeiro, estabelecendo uma confiança mútua a partir de um único escaneamento. Cada dispositivo utiliza uma chave de identidade X25519 persistente armazenada de forma segura, em contraste com as chaves efêmeras usadas em mensageiros LAN comuns, que são rotacionadas a cada inicialização. A chave de sessão é estabelecida através de ECDH static-static e HKDF. A sincronização é pull-based: cada dispositivo solicita independentemente um manifesto do seu par (listando mensagens e chats existentes), compara com seu próprio estado e baixa os dados ausentes, sem a necessidade de um coordenador central. Arquivos de mídia maiores são transferidos via stream, utilizando AES-GCM em quadros de 256KB, sem codificação base64 e sem carregar o arquivo inteiro na memória. Isso remove a limitação anterior de 200MB e eleva o limite para 512MB a 4GB (com 2GB como padrão). A sincronização abrange apenas os chats marcados como favoritos, de forma completa e contínua.
É importante ressaltar as limitações do WardLink: ele opera exclusivamente em LAN, funcionando apenas quando ambos os dispositivos estão na mesma rede. Para sincronização via internet, o servidor ainda é necessário. O WardLink foca em cenários específicos como "dois dos meus dispositivos próximos". Além do WardLink, o release v1.7-beta inclui outras novidades: uma galeria de mídia em cada chat, busca aprimorada por configurações e chats (por nome ou palavra-chave), backups manuais ou agendados, um botão de rolagem para baixo personalizável, a utilização de markdown na seção "novidades" (onde a lista de alterações é publicada), um redesign do player de mídia, caixas de diálogo e configurações, além de uma reestruturação destas últimas. Um novo motor de armazenamento de dados foi implementado, e em PCs, as pastas de favoritos permanecem desbloqueadas durante a sessão. A animação de entrada de mensagens ao abrir um chat foi removida por causar mais lentidão do que benefícios. Correções de bugs incluem problemas críticos no backend que afetavam o envio de mensagens, um bug na animação de setas nas configurações e o ajuste do seletor biométrico para não ser exibido onde a biometria não está disponível ou desativada.
Para usuários que estão atualizando de versões anteriores, o armazenamento local foi migrado para o novo motor, e a migração de dados ocorre automaticamente na primeira inicialização. Para usuários com um histórico extenso de chats, a migração pode levar algum tempo, mas os testes indicam um aumento de performance de 70-80% após a conclusão. O repositório e a lista completa de alterações estão disponíveis no GitHub. Sendo uma versão beta e desenvolvida por um único programador, a ocorrência de bugs é esperada. O desenvolvedor incentiva os usuários a reportarem quaisquer bugs encontrados através do sistema de issues no repositório, pois isso é de grande ajuda no desenvolvimento.
Divulgação: alguns links são patrocinados. Podemos receber comissão se você comprar — sem custo extra para você. Só indicamos o que faz sentido para a comunidade.