4

Construí um cliente de Discord nativo em Rust que usa apenas ~30MB de RAM (e 0.1% de CPU)

Fala pessoal do TabNews! 👋

Se você joga no PC ou trabalha com várias abas e ferramentas pesadas abertas ao mesmo tempo, provavelmente já passou por isso: abrir o Discord oficial só para conversar com amigos em call e ver o Gerenciador de Tarefas acusar 500MB a 800MB+ de memória RAM e picos de uso de CPU que provocam aqueles micro-stutters (micro-engasgos) chatos no meio de uma partida.

O motivo é conhecido: o Discord oficial roda sobre o Electron (Chromium + Node.js), o que significa carregar um navegador web completo em segundo plano.

Incomodado com isso, decidi encarar um desafio: é possível recriar a essência do Discord — chat de texto e canais de voz com áudio de alta fidelidade — em um binário nativo ultra-leve em Rust?

O resultado é o Litecord, um projeto 100% open source que consome menos de 35MB de RAM e < 0.1% de CPU em idle. Compartilho abaixo as decisões de arquitetura e os desafios técnicos que enfrentei.


🛠️ A Escolha da Stack: Por que não usar WebView/Tauri?

A primeira tentação seria usar Tauri (que substitui o Chromium pelo WebView do sistema). Porém, para atingir o objetivo de performance máxima e consumo irrisório de memória, decidi ir direto ao metal:

  • Linguagem: Rust (2021 Edition) — controle total de memória, zero runtime overhead e segurança para processamento de áudio concorrente em tempo real.
  • Interface Gráfica: Slint UI — um framework moderno de GUI declarativa compilada nativamente. O Slint não renderiza HTML/CSS; ele compila o layout direto para instruções gráficas nativas (via FemtoVG/OpenGL ou renderizador de software), gerando uma interface fluida a 60 FPS com menos de 10MB de pegada de memória.
  • Pipeline de Áudio: CPAL (Cross-Platform Audio Library) + decodificador nativo Opus (48kHz).
  • Async Runtime: Tokio para orquestrar WebSockets, chamadas REST da API do Discord e o loop de eventos de interface sem travar a thread principal.

🔬 Desafios Técnicos Interessantes

1. Voz em Tempo Real e Criptografia DAVE (E2EE)

O Discord recentemente começou a implementar o protocolo DAVE (MLS - RFC 9420) para criptografia de ponta a ponta nas chamadas de voz.

  • Para garantir que a voz não pipocasse ou ficasse "robótica" quando a GPU/CPU do computador estivesse em 100% de carga (durante um jogo pesado), implementamos Opus PLC (Packet Loss Concealment) com um jitter buffer adaptativo de 40ms e resampler cúbico Hermite a 48kHz.

2. Login Seguro por QR Code (Discord Remote Auth v2)

Em vez de pedir para o usuário colar tokens manualmente ou inspecionar cabeçalhos de rede:

  • O Litecord implementa o protocolo Remote Auth v2 do Discord via WebSocket com pares de chaves RSA-2048 transitórias.
  • O app gera um QR Code na tela; você escaneia pelo aplicativo do Discord no celular e autoriza o login com 1 toque.
  • No Windows, o token da sessão é persistido no disco criptografado através da API nativa Windows DPAPI (CryptProtectData), garantindo que nenhum outro processo ou usuário não autorizado no PC consiga ler o segredo.

3. Ducking de Fala Dinâmico (Foco no IGL / Líder do Squad)

Em chamadas com muitas pessoas falando ao mesmo tempo ou bots de música tocando no canal, a comunicação tática fica caótica. Criamos um sistema de Prioridade de Fala (P:1, P:2, etc.):

  • Quando o líder/shot-caller fala, o volume de todos os outros participantes e bots é atenuado suavemente em tempo real (ducking inteligente), voltando ao normal assim que ele termina a frase.

4. DeepSleep na Bandeja do Sistema

Ao minimizar o Litecord para a bandeja do sistema (System Tray):

  • Todos os loops de renderização visual e atualizações de UI do Slint são completamente suspensos (0.0% de CPU).
  • Apenas a thread assíncrona leve de recepção de áudio RTP/Opus continua ativa, consumindo recursos praticamente imperceptíveis enquanto você joga.

📊 Comparativo: Discord Oficial vs Litecord

MétricaDiscord Oficial (Electron)Litecord (Nativo em Rust)
Uso de CPU (Idle)1.5% - 4.5%< 0.1% (DeepSleep: 0.0%)
Uso de CPU (Voz Ativa)4.0% - 8.0%~0.4% - 0.8%
Uso de Memória RAM (Idle)~400 MB - 750 MB~28 MB - 35 MB
Uso de Memória RAM (Voz)~600 MB - 900 MB~32 MB - 45 MB
Tamanho do Executável~180 MB~8 MB (Standalone)
Tempo de Inicialização4 a 9 segundos< 200 milissegundos

📦 Código Aberto & Como Testar

O projeto é 100% open source sob licença MIT e já conta com executáveis prontos gerados pelo GitHub Actions:


💬 Gostaria do Feedback de Vocês!

Quais outras otimizações ou recursos essenciais vocês acham que fariam sentido manter em um cliente focado puramente em leveza e baixo consumo? Fiquem à vontade para testar, abrir issues ou mandar PRs! 🦀🚀

Carregando publicação patrocinada...