larperCord Me pague um café no ko-fi.com English
layout { row {  // cliente nativo e não oficial de Discord · v0.6.0

O Discord,sem o navegadordentro.

Um cliente nativo que fica perto de 130 MB de RAM com uma conta real e em 0% de CPU parado. A interface inteira é um arquivo de texto que você edita com o app aberto. Olha ela se reorganizando.

Leia antes: clientes de terceiros violam os Termos de Uso do Discord e a sua conta pode ser bloqueada, então use uma conta secundária. O modo demonstração não precisa de conta.

E esse é o app de verdade. Mesmos dados, mesmo binário:

NÃO É A DISCORD INC.
O app larperCord mostrando uma conversa

RAM, conta real
~130 MB
CPU parado
0%
temas
11
electron
0
status-bar items="ram cpu size" {

1.279 MB para dar bom dia.

Um cliente em Electron é um navegador inteiro fantasiado de app. Cada quadradinho é 5 MB de RAM.

1,279 MBVesktop (Electron)
~290 MBDiscord Phoenix (Rust, ainda não lançado)
~130 MBlarperCord, conta real
Vesktop (Electron)Discord Phoenix (Rust)larperCord
RAM (PSS)1,279 MB~290 MB~130 MB com conta real
CPU parado12–47%0.1%0–0.4%
Binário em disco287 MBnão lançado~15 MB

larperCord: 125–140 MB no uso normal de uma conta e cerca de 70 MB logo depois de abrir. O seu depende dos seus servidores, membros e imagens. O CPU parado foi medido nos 11 temas, com a reprodução automática de GIFs desligada, e um GIF animado na tela custa cerca de 2,5%. Cerca de 35 MB do PSS são o driver da NVIDIA, as bibliotecas e as fontes. Vesktop: média desde a abertura, medida com ps. Os dois no mesmo PC: Arch Linux, Hyprland, i5-2400S, GTX 1050 Ti, 1280×800. Discord Phoenix: não medido por nós e não é um teste lado a lado. É uma versão inicial para Windows 11, de um print do Gerenciador de Tarefas postado pelo CTO do Discord. Como foi medido →

}
messages flex=1 {

A interface é um arquivo. Vai, quebra ele.

Estes são os layouts de verdade de themes/*.kdl. Mude uma largura, mova um nó, troque o nome de um componente. No app, salvar o arquivo recarrega a janela pelo inotify. Um erro aponta arquivo:linha:coluna e o tema anterior continua na tela.

Um esboço em JavaScript do motor de layout, com conteúdo de mentira. O app desenha com Dear ImGui. As larguras são pixels reais de uma janela de 1280×800.

Referência completa da linguagem de temas →

}
guild-bar variant=dock {

Onze temas. Não onze esquemas de cor.

Mesmo binário, mesmos dados, outro arquivo. Os componentes mudam de lugar, de forma e de variante. Passe o ponteiro por cima de um print para ver o modo claro. Clique para vestir esta página inteira com as cores dele (ou aperte F2, como no app).

01classicoO layout familiar, nas cores do seu wallpaper, com banner do servidor.
02vidroCartões de vidro sobre o wallpaper, com blur do compositor e reflexo.
03terminaltmux + IRC: monoespaçado, canais em árvore, efeito CRT e logo em ASCII.
04subsoloTerminal de subsolo: preto fóssil, fósforo ácido, ultravioleta e scanlines.
05orbitalConsole de bordo: grafite, menta, numeração de sistemas e servidores no rodapé.
06editorialRevista impressa: masthead em serifa, conversa em coluna central e índice à direita.
07bolhasMensageiro: balões de conversa, "Entregue ✓✓" e balão de digitando.
08zenFoco: coluna central, letras maiores e a navegação que se esconde sozinha.
09papelCaderno: folha pautada com margem vermelha, títulos em serifa e índice.
10escritorioFerramenta de trabalho: barra superior com busca, servidores em lista.
11cupertinoMesa de trabalho estilo Mac: papel de parede, janela flutuante com semáforo, barra lateral translúcida e Dock com lupa.
}
channel-list variant=tree {

Fala com o gateway de verdade. É um cliente de verdade.

  1. Tela dividida

    Até três conversas lado a lado, cada uma com o histórico e a rolagem dela. A caixa de texto segue o painel em foco.

    Duas conversas lado a lado
  2. Threads e fóruns

    As threads ficam abaixo do canal e abrem como qualquer conversa, com abas, rascunho e busca. Os fóruns mostram a lista de posts no lugar da conversa, com tags e “Novo post”.

    Um canal de fórum mostrando a lista de posts
  3. Emoji e autocompletar

    Emoji personalizado e figurinhas aparecem como imagem, animados inclusive. O seletor tem a lista Unicode inteira e os emojis dos seus servidores. Na caixa de texto, @, #, :ab e / abrem uma lista.

    O seletor de emoji
  4. Leitura sincronizada

    Não lidos e menções batem com o Discord ao abrir o app, e ler em outro aparelho limpa aqui. O canal abre na primeira não lida. As fixadas ficam no alfinete, e links do Discord abrem no app.

    O painel de mensagens fixadas
  5. Caixa de entrada

    Ctrl+I: DMs e menções não lidas de todos os servidores, por canal, com prévia e “marcar tudo como lido”.

    O painel da caixa de entrada
  6. Busca offline

    Ctrl+F busca na memória e no cache local a cada tecla, sem internet. Filtros: from:, in:, has:link, has:imagem, has:arquivo.

    Resultados da busca filtrados por autor
  7. Paleta de comandos

    Ctrl+K: busca aproximada de canais, DMs, servidores, temas, status e todas as opções. Esta página também tem uma. Experimente.

    A paleta de comandos
  8. Vídeo na conversa

    Anexos e links diretos tocam no lugar, com o FFmpeg do sistema, carregado só no primeiro play. Até 480p e cerca de 30 qps. Sem FFmpeg, o vídeo abre no navegador.

    Um vídeo tocando dentro da conversa
  9. Código que parece código

    Markdown do Discord, interpretado uma vez quando a mensagem chega. Blocos de código têm realce nas cores do tema e botão de copiar, e uma prévia aparece acima da caixa enquanto você digita.

    Um bloco de código com realce
  10. Perfis completos

    Banner, bio, atividade, amigos e servidores em comum, conexões, cargos e uma nota só sua.

    Um perfil completo de usuário
  11. Mensagens salvas, com anotação

    Ctrl+Shift+S: favoritos que ficam só no seu computador. Nada vai para o Discord.

    Uma mensagem salva com anotação
  12. Alertas e filtros

    Palavras de alerta contam como menção, o filtro recolhe mensagens, “ignorar” esconde alguém sem bloquear e o modo foco silencia tudo menos DMs e menções. Tudo local.

    A página de alertas e filtros
  13. E o resto

    Respostas, edição, reações, botão direito em tudo, seleção de texto entre mensagens, imagens e GIFs, pastas de servidores, abas de canal, várias contas, rascunho por canal, proxy e Tor, inglês e português, teclas de vim opcionais. Tour completo →

    O menu do botão direito numa mensagem
}
voice e2ee=#true {

Chamadas de verdade. Com criptografia de ponta a ponta.

01MicrofoneStream do SDL3, lido a cada 20 ms
02Opus48 kHz estéreo, com PLC para pacote perdido
03DAVEPonta a ponta sobre MLS, via libdave
04RTPaead_xchacha20_poly1305_rtpsize
05UDPGateway de voz v8, com heartbeat e resume
O mixer com o volume de cada pessoa durante uma chamada
  • Mixer com um volume para cada pessoa. Cada pessoa é um stream de áudio próprio no mesmo dispositivo de saída.
  • Sem call, sem custo. A thread de voz só nasce quando você entra. Antes disso, o áudio só abre se você entrar nas configurações de voz.
  • Seu microfone, suas regras. Escolha os dispositivos, mesmo no meio da call. Detecção de voz com limiar automático ou aperte para falar, filtro passa-altas, porta de ruído e supressão de ruído com RNNoise, medidor ao vivo e teste de microfone.
  • Limites sinceros. O aperte para falar só funciona com a janela em foco. Sem compartilhamento de tela nem câmera. Guia de voz →
}
plugins sandbox=#true {

Lua, numa jaula.

Coloque um .lua em ~/.config/larpercord/plugins/ para somar painéis, entradas no botão direito, notas embaixo das mensagens, comandos e atalhos, sem recompilar nada. Anti-golpe, radar de CVE, cartões do GitHub, o que perdi, tradução, lembretes, destaques, links limpos, e links e arquivos vêm com o app.

lua
-- @name CVE notes
-- @capabilities messages, decorate, http
-- @hosts cveawg.mitre.org
larper.on("message", function(msg)
  local id = msg.content:upper():match("CVE%-%d+%-%d+")
  if not id then return end
  larper.http.get("https://cveawg.mitre.org/api/cve/" .. id, function(res)
    local cve = res.ok and larper.json.decode(res.body)
    local cna = cve and cve.containers and cve.containers.cna
    if cna and cna.title then
      larper.decorate(msg.id, { note = id .. ": " .. cna.title })
    end
  end)
end, { contains = { "cve-" } })
  • Numa thread só deles. Um plugin lento não engasga a interface. Sem plugin ligado, a thread nem existe.
  • Sem arquivos, sem processos, sem sockets. io, os.execute, require, load e debug simplesmente não existem. A única rede é HTTPS para hosts que você aprova um a um, sem o seu token nem cookies.
  • Cerca de 5 milhões de instruções por chamada. Um while true do end é parado e não congela o app. O pcall não segura esse erro.
  • 8 MB por plugin. Cada um roda num Lua separado. Depois de 10 erros, ele é parado.
  • larper.send só funciona a partir de um gesto seu. Responder sozinho transformaria a conta num self-bot, então isso é bloqueado de propósito. API de plugins →
larperCord na demonstração: um link de golpe marcado em vermelho, um CVE com a severidade, um cartão do GitHub e um painel resumindo as não lidas

Os dados são da demonstração, mas as notas de CVE e do GitHub são respostas de verdade desses serviços. Nada sai antes de você aprovar o host no cartão do plugin.

}
metrics budget=50 {

Sem mágica. Dez decisões chatas.

  1. Dorme quando nada acontece. O laço principal espera em SDL_WaitEvent. Rede, inotify e relógio acordam o app com eventos. Sem animação, sem redesenho.
  2. Nada de navegador. Tudo é desenhado com o ImDrawList do Dear ImGui sobre o SDL_Renderer.
  3. Fontes mapeadas, não copiadas. Cada arquivo de fonte é um mmap usado por todos os pesos, então só as páginas lidas ficam na RAM.
  4. Só o driver de vídeo necessário. Em máquinas só com NVIDIA, o glvnd também carregaria o Mesa e o LLVM à toa. O app detecta e evita.
  5. Markdown interpretado uma vez. Quando a mensagem chega. Depois, a interface só faz layout dos trechos, com cache de altura por largura.
  6. Lista virtualizada. Busca binária pelo primeiro item visível e desenha só o que está na tela.
  7. Memória com teto. 1.500 mensagens por canal e 3.000 no total. Conversas esquecidas são descarregadas, e o cache de imagens tem um teto fixo de 64 MB.
  8. fontconfig liberado. Depois de resolver as fontes: FcFini e malloc_trim.
  9. Sem cursor piscando. Um cursor piscando manteria a CPU acordada à toa.
  10. As coisas nascem quando você pede. A thread de voz na primeira call, o FFmpeg no primeiro vídeo. Sem plugin ligado, não há thread de plugins nem Lua, e nada se gasta por mensagem, tecla ou quadro.
interface → Action → app → Command → gateway → Event → Store → interface

A interface nunca muda dados direto. Ela só lê o Store e pede ações, e é por isso que trocar o gateway de demonstração pelo real não toca na interface. Arquitetura →

}
options honest=#true {

O que funciona hoje. E o que não.

ÁreaEstadoDetalhe
Mensagens, DMs, reações, respostasfuncionaEnviar, editar, excluir, histórico, menções
ImagensfuncionaAvatares e anexos, com cache de tamanho fixo
Vídeo na conversafuncionaAnexos e links diretos, precisa do FFmpeg do sistema
Caixa de entrada, salvas, busca offlinefuncionaTudo local, dá para desligar e apagar
Contas, proxy, plugins em Luafunciona
Threads e fórunsfuncionaThreads aninhadas, lista de posts dos fóruns, criar threads e posts
Emoji personalizado, figurinhas, autocompletarfuncionaAnimados inclusive. O seletor avisa quando um emoji precisa de Nitro
Leitura, fixadas, links do DiscordfuncionaSincronizada com os seus outros aparelhos
Temasfunciona11 embutidos, claro e escuro, recarregam ao salvar
VozparcialE2EE, mixer, seletor de dispositivo, aperte para falar e filtros funcionam. O aperte para falar precisa da janela em foco
PermissõesparcialCanais trancados, voz, threads e fóruns são respeitados. A caixa de texto nos canais comuns, as reações e a lista de membros ainda não consultam
NotificaçõesparcialPelo notify-send. Clicar não abre o canal, sem bandeja do sistema
AcessibilidadeparcialEscala de fonte, reduzir movimento, paleta por teclado. Sem foco visível nem alto contraste
PlataformasparcialLinux e Windows 10/11. Testado todo dia no Arch com Hyprland; o Windows é novo.
Entrar em servidor por convitefaltaConvites viram um cartão e abrem no navegador
Compartilhar tela e câmerafalta

Roteiro →

}
Clientes de terceiros violam os Termos de Uso do Discord. Sua conta pode ser bloqueada: use por sua conta e risco, de preferência com uma conta secundária. O larperCord não tem relação com a Discord Inc. Com --demo, o app roda com dados falsos e não conecta em nada.
download variant=latest {

Baixe. Rode.

Não precisa de conta para dar uma olhada: o modo demonstração não conecta em nada. Depois ele se atualiza sozinho, e toda atualização é assinada.

Linux x86_64

Baixar para Linux ↓

Um arquivo só, que roda em distros de 2022 para cá (glibc 2.34). Antes de cada versão, ele é aberto em Ubuntu, Debian, Fedora, openSUSE e Arch. Marque como executável com chmod +x e rode.

Ou instale, listando as bibliotecas que faltam:

curl -fsSL https://raw.githubusercontent.com/RshaCuDeVidro/larperCord/main/install.sh | sh

Windows 10 / 11, x64

Baixar para Windows ↓

Descompacte e abra o larpercord.exe. O programa ainda não tem assinatura de código, então o Windows pode avisar na primeira vez.

Ou instale para o seu usuário, no PowerShell:

irm https://raw.githubusercontent.com/RshaCuDeVidro/larperCord/main/install.ps1 | iex

Todas as versões e checksums · O que mudou

}
composer variant=prompt {

Três comandos. Sem conta.

bash
# Arch Linux
sudo pacman -S zig sdl3 freetype2 fontconfig curl zlib libwebp opus openssl \
    inter-font ttf-jetbrains-mono noto-fonts-emoji

# Compilar (Zig 0.17)
zig build -Doptimize=ReleaseFast

# Modo demonstração: dados falsos, não conecta em nada
./zig-out/bin/larpercord --demo --theme subsolo

Prefere não compilar? Baixe para Linux ou Windows.

O mascote viu o seu uso de RAM. Não ficou impressionado.

}
tip-jar variant=coffee {

Deixe o mascote cafeinado.

O larperCord é grátis e não tem anúncio. Ele roda com cerca de 130 MB de RAM. Quem desenvolve roda a café.

Me pague um café no ko-fi.com
}