Mensageiro LAN para escritórios. Leve, prático e direto ao ponto.
Windows 10/11 · ~20 MB
Chat individual e em grupo com emojis coloridos, estilo bolha ou linear.
Envie arquivos até 100 MB diretamente pela rede local com velocidade máxima.
Crie grupos para equipes, departamentos ou projetos.
Notificações clicáveis que abrem direto na conversa.
Atualizações automáticas. O app detecta, baixa e instala sozinho.
Nenhum dado sai da sua rede. Comunicação direta entre máquinas, sem intermediários.
Envie comunicados para vários contatos de uma vez.
Execute o MBChat_Setup.exe em cada máquina.
Detecta automaticamente todos os colegas na rede.
Mensagens, arquivos e grupos funcionando instantaneamente.
| Caminho | Descrição |
|---|---|
%LOCALAPPDATA%\Programs\MBChat\ |
Pasta de instalação (MBChat.exe + _internal/) |
%APPDATA%\.mbchat\ |
Dados do usuário (banco, imagens, preferências) |
%APPDATA%\.mbchat\mbchat.db |
Banco de dados SQLite (mensagens, contatos, grupos, lembretes) |
%APPDATA%\.mbchat\images\ |
Imagens recebidas no chat (clipboard paste) |
%APPDATA%\MBChat\mbchat.log |
Log de erros e debug |
%USERPROFILE%\MB_Chat_Files\ |
Arquivos recebidos via transferência (padrão, configurável) |
O MB Chat usa SQLite local em cada máquina — não há servidor central nem banco compartilhado. Cada PC guarda o próprio histórico, contatos e configurações. O banco roda em modo WAL (Write-Ahead Logging), que permite leituras e escritas simultâneas com segurança e desempenho.
| Item | Valor |
|---|---|
| Motor | SQLite 3 (embutido no app, sem instalação) |
| Banco principal | %APPDATA%\.mbchat\mbchat.db |
| Write-Ahead Log | %APPDATA%\.mbchat\mbchat.db-wal |
| Shared memory | %APPDATA%\.mbchat\mbchat.db-shm |
| Temas personalizados | %APPDATA%\.mbchat\user_themes.json |
.db + .db-wal + .db-shm são uma unidade atômica do WAL. Ao fazer backup manual (copiando arquivos), salve os três juntos — copiar só o .db com o app aberto pode resultar em banco incompleto ou corrompido. O Backup pelo próprio app (Ferramentas > Backup do histórico) resolve isso usando a API de cópia consistente do SQLite. Veja Backup e Restauração.
ALTER TABLE ... ADD COLUMN protegido por try/except — nunca apagam dados nem quebram bancos antigos. Tabelas usam CREATE TABLE IF NOT EXISTS.REAL (epoch Unix em segundos, ex.: timestamp, created_at, remind_at).INTEGER 0/1 (ex.: is_sent, is_read, archived, completed).TEXT em JSON (ex.: polls.options, reminders.invited_uids).user_id do usuário é persistente (salvo em local_user) — não muda ao trocar de Wi-Fi para Ethernet, evitando histórico fragmentado e usuários fantasmas.? (nunca concatenação de strings) — sem injeção de SQL.archived=1), não apagados, para preservar nome e tipo no histórico.
Cada thread tem a própria conexão (threading.local), aberta com:
PRAGMA journal_mode=WAL -- leituras simultâneas a escritas
PRAGMA busy_timeout=30000 -- aguarda até 30s se o banco estiver ocupado
PRAGMA foreign_keys=ON -- integridade referencial ativa
| Tabela | Colunas principais | Conteúdo |
|---|---|---|
local_user | user_id, display_name, status, note, ramal, avatar_index | Identidade do usuário local (singleton id=1, user_id persistente) |
contacts | user_id (PK), display_name, ip_address, hostname, status, department, ramal, avatar_data | Peers conhecidos na rede |
messages | id (PK), msg_id, from_user, to_user, content, msg_type, timestamp, is_sent, is_read, reply_to_id, file_path | Histórico completo (texto, imagens, arquivos, sistema). Índices por usuários e por tempo |
file_transfers | file_id (UNIQUE), from_user, to_user, filename, filepath, filesize, status, progress, timestamp | Histórico de transferências (enviadas e recebidas) |
settings | key (PK), value | Preferências chave-valor (tema, alertas, rede, VPN, etc.) |
groups | group_id (PK), name, group_type (temp/fixed), creator_uid, archived | Grupos de chat (arquivados em vez de apagados) |
group_members | group_id, uid, display_name, ip, is_admin | Membros de cada grupo (chave composta group_id+uid) |
reactions | msg_id, emoji, from_user, ts | Reações emoji por mensagem e usuário |
polls / poll_votes | poll_id, group_id, question, options (JSON) / voter_uid, option_index | Enquetes de grupo e votos |
reminders | id (PK), text, remind_at, completed, recurrence_rule, share_status, invited_uids (JSON) | Lembretes pessoais, recorrentes e compartilhados |
manual_peers | ip (PK), note, created_at | Peers fora da LAN (VPN/Tailscale). Vazio = zero overhead na LAN |
block_list | user_id (PK), display_name, ip_address, blocked_at | Usuários bloqueados |
rooms | id (PK), name | Salas de reunião (Sala de Vidro, Marcus Barra, Certificado Digital) |
bookings | booking_id (PK), room_id (FK), title, creator_uid, start_ts, end_ts, status, is_deleted | Reservas de sala (Agendar > Reunião). Índice por sala+horário |
booking_participants | booking_id (FK), uid, display_name, response | Convidados de cada reserva (UNIQUE booking_id+uid) |
CREATE TABLE IF NOT EXISTS local_user (
id INTEGER PRIMARY KEY CHECK (id = 1), -- singleton
user_id TEXT NOT NULL, -- persistente (MAC+hostname)
display_name TEXT NOT NULL,
status TEXT DEFAULT 'online',
note TEXT DEFAULT '',
created_at REAL NOT NULL,
updated_at REAL NOT NULL
);
CREATE TABLE IF NOT EXISTS contacts (
user_id TEXT PRIMARY KEY,
display_name TEXT NOT NULL,
ip_address TEXT NOT NULL,
status TEXT DEFAULT 'offline',
last_seen REAL NOT NULL,
first_seen REAL NOT NULL
);
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
msg_id TEXT NOT NULL,
from_user TEXT NOT NULL,
to_user TEXT NOT NULL, -- user_id, 'group:...', 'broadcast'
content TEXT NOT NULL,
msg_type TEXT DEFAULT 'text', -- text | file | system
timestamp REAL NOT NULL,
is_sent INTEGER DEFAULT 0,
is_read INTEGER DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_messages_users ON messages(from_user, to_user);
CREATE INDEX IF NOT EXISTS idx_messages_time ON messages(timestamp);
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
);
%APPDATA%\.mbchat\, modo WAL (3 arquivos atômicos), esquema evolui só por migrações aditivas, histórico permanente sem poda. O instalador oficial nunca toca nessa pasta — seus dados sobrevivem a updates e reinstalações.
| Porta | Protocolo | Uso |
|---|---|---|
50100 |
UDP | Discovery (multicast + broadcast) |
50101 |
TCP | Mensagens, convites de grupo, enquetes |
50102 |
TCP | Transferência de arquivos |
50200–51199 |
TCP | Lock de instância única por usuário (loopback). Cada login Windows obtém uma porta derivada de MD5(usuário) mod 1000 + 50200, permitindo que múltiplos usuários na mesma máquina abram o app simultaneamente sem conflito. |
O LAN Messenger tem um problema conhecido: peers somem da lista ou demoram a aparecer quando a rede tem VPN, Hyper-V, switches gerenciados ou filtros de multicast. O MB Chat resolveu isso com cinco decisões de design que trabalham juntas:
| Mecanismo | O que faz |
|---|---|
| Tri-broadcast | Cada announce sai por 3 caminhos simultâneos: multicast (239.255.100.200), broadcast global (255.255.255.255) e subnet-directed broadcast (ex: 192.168.0.255). Se o multicast for filtrado pelo switch/VPN, os broadcasts garantem entrega. Para um peer sumir, as 3 rotas teriam que falhar. |
| Anúncio imediato em eventos | Trocar status, nome, nota ou avatar dispara _send_announce() na hora — não espera o próximo ciclo. Mudanças chegam em menos de 1 segundo. |
| Anúncio no startup | O primeiro announce é enviado antes do loop periódico começar, então um peer recém-aberto aparece na rede instantaneamente. |
| Detecção de NIC correta | Função get_local_ip() usa rota real pra 8.8.8.8 + enumeração + filtro de interfaces virtuais (Hyper-V, Docker, VPN). Evita o bug clássico do LAN Messenger de sair pela NIC errada em PCs com VPN ativa. |
| Ciclo curto de refresh | Announce a cada 15s (vs ~60s do LAN Messenger). Timeout de presença em 45s — 3× o intervalo, garantindo que 1 pacote perdido não derrube o peer. |
O MB Chat descobre computadores usando multicast + broadcast local. Redes VPN normais bloqueiam esse tráfego de descoberta. Para resolver isso, a partir da v1.8.9, o MB Chat possui o modo Proxy de Descoberta (Announce Relay) compatível com Tailscale, PPTP, L2TP, VPN do Windows e qualquer túnel que roteie tráfego TCP unicast. Basta configurar 1 computador do escritório para agir como ponte (Âncora).
100.x.x.x.
O MB Chat suporta múltiplos logins Windows na mesma máquina simultaneamente. Cada usuário abre sua própria instância sem um bloquear o outro. Desde a v1.4.64, o lock de instância única é calculado por usuário: porta = 50200 + MD5(getpass.getuser().toLower()) mod 1000, gerando uma porta determinística distinta por login dentro da faixa [50200, 51199].
Antes da v1.4.64: o lock usava porta fixa 50199. Quando um usuário deixava o MB Chat rodando em background (ex.: minimizado na bandeja) e outro login entrava na mesma máquina, o novo usuário não conseguia abrir o app — o check detectava o socket do outro e saía silenciosamente via os._exit(0), sem erro visível.
Sintoma: o PC abre o MB Chat e a lista fica vazia, mas os outros PCs enxergam ele como online normalmente. Reinstalar o app não resolve. Causa: o Windows Defender Firewall está bloqueando pacotes de entrada (inbound) nas portas do MB Chat. A partir da v1.4.59 o app detecta isso na primeira execução e pede permissão via UAC para criar as regras automaticamente. Se a janela for recusada ou não aparecer, basta liberar manualmente:
control firewall.cpl e clicar em Permitir um aplicativo ou recurso pelo Firewall do Windows Defender).MBChat.exe em C:\Program Files\MBChat\MBChat.exe (ou %LOCALAPPDATA%\Programs\MBChat\MBChat.exe). Adicionar e marcar as duas caixas.tools/fix_firewall.bat (no repositório) como administrador — ele cria as regras por porta (UDP 50100/50110/50120 + TCP 50101/50102), sobrevive a reinstalações e reinicia o app.
Em PCs com Hyper-V, WSL 2 ou Docker Desktop instalados, o Windows pode reservar dinamicamente a faixa de portas 50101–50400 para redes virtuais internas. O app não consegue abrir a porta TCP padrão, cai para uma porta aleatória (ex: 50078) — mensagens saem normalmente, mas não chegam porque a regra de firewall só cobre a 50101.
Como confirmar (PowerShell como admin):
netsh int ipv4 show excludedportrange protocol=tcp
Se 50101 aparecer dentro de um range listado, este é o problema. Solução:
netsh advfirewall firewall add rule name="MBChat TCP In Dynamic" protocol=TCP dir=in localport=50060-50130 action=allow profile=any
net stop winnat → netsh int ipv4 add excludedportrange protocol=tcp startport=50100 numberofports=5 → net start winnat → reiniciar o PC.50101 normalmente.
Sintoma: um colega em home-office (VPN) aparece na lista de contatos mas duplo-clique não abre nada e clique-direito não exibe menu. Afeta apenas a relação entre dois usuários específicos — outros conseguem clicar normalmente.
_load_saved_contacts na inicialização carrega o registro errado, criando um mapeamento inconsistente entre o item do TreeView e o peer_items em memória. O duplo-clique não consegue localizar o UID pelo IID clicado e retorna silenciosamente.
Rodar no PC afetado (PowerShell como administrador não é necessário):
# 1. Fecha o app
taskkill /f /im MBChat.exe
# 2. Baixa sqlite3 portátil (1 arquivo, ~2 MB) e deleta o registro corrompido
Invoke-WebRequest -Uri "https://www.sqlite.org/2024/sqlite-tools-win-x64-3460100.zip" -OutFile "$env:TEMP\sq.zip"
Expand-Archive "$env:TEMP\sq.zip" -DestinationPath "$env:TEMP\sq" -Force
$sq = Get-ChildItem "$env:TEMP\sq" -Recurse -Filter "sqlite3.exe" | Select-Object -First 1 -ExpandProperty FullName
cd "$env:APPDATA\.mbchat"
# Confirma que o registro existe antes de deletar:
& $sq mbchat.db "SELECT user_id, display_name, ip_address, status FROM contacts WHERE display_name LIKE '%NomeDoPeer%';"
# Deleta pelo IP VPN ou pelo nome:
& $sq mbchat.db "DELETE FROM contacts WHERE ip_address='IP_DO_PEER_VPN';"
# OU: & $sq mbchat.db "DELETE FROM contacts WHERE display_name LIKE '%NomeDoPeer%';"
# 3. Reabre — o peer será redescoberto via UDP em ~30s
Start-Process "$env:PROGRAMFILES\MBChat\MBChat.exe"
contacts não apaga o histórico de mensagens (tabela messages). O histórico fica íntegro; apenas o peer será redescoberto como se fosse o primeiro contato.
A partir da v1.8.27 o duplo-clique usa identify_row(e.y) em vez de selection(), tornando o app resiliente a esse mapeamento inconsistente — mesmo que o registro fique corrompido, o chat abre normalmente.
A partir da v1.8.28, o backup é feito pelo próprio MB Chat — com o app aberto, em um único arquivo .zip, sem mexer em pastas ocultas. O método manual continua valendo como alternativa.
MBChat_backup_AAAAMMDD_HHMM.zip (pendrive, rede, nuvem).zipTodo o histórico fica em uma única pasta oculta no perfil Windows. Copiar essa pasta inteira para um local seguro também é um backup válido.
| Arquivo | Caminho | Conteúdo |
|---|---|---|
mbchat.db | %APPDATA%\.mbchat\ | Banco SQLite — mensagens, contatos, lembretes, configurações |
mbchat.db-wal | %APPDATA%\.mbchat\ | WAL do SQLite — obrigatório salvar junto |
mbchat.db-shm | %APPDATA%\.mbchat\ | Shared memory — obrigatório salvar junto |
user_themes.json | %APPDATA%\.mbchat\ | Temas personalizados criados pelo usuário |
| Arquivos recebidos | %USERPROFILE%\Documentos\MBFiles\ | Arquivos, imagens e documentos recebidos via chat |
.db, .db-wal e .db-shm formam uma unidade do SQLite em WAL mode. Salvar só o .db sem os outros dois pode resultar em banco corrompido ou histórico incompleto.
%APPDATA%\.mbchat\.mbchat inteira para um local seguro (pendrive, rede, nuvem)%USERPROFILE%\Documentos\MBFiles\ (arquivos recebidos)%APPDATA%\.mbchat\
O Revo Uninstaller no modo Avançado varre o disco por arquivos "órfãos" e pode deletar a pasta %APPDATA%\.mbchat\ mesmo sem ela fazer parte do instalador oficial (que preserva os dados por design). Sempre faça backup antes de usar desinstaladores de terceiros. Se for usar o Revo, utilize o modo Moderado para preservar o histórico.
Se ao abrir o app o histórico aparecer vazio ou der erro, o banco pode estar corrompido — geralmente por cópia feita com o app aberto. Se você tiver os três arquivos (.db + .db-wal + .db-shm) do mesmo backup, restaure os três juntos: o SQLite fará o checkpoint automático na próxima abertura e recuperará os dados. Somente o .db sem os outros dois é irrecuperável.
O desinstalador (Painel de Controle > Desinstalar) remove o executável e oferece a opção de manter ou apagar o histórico. Para limpeza total manual, remova os seguintes itens:
| O que remover | Caminho |
|---|---|
| Aplicação | %LOCALAPPDATA%\Programs\MBChat\ |
| Banco de dados e imagens | %APPDATA%\.mbchat\ |
| Log | %APPDATA%\MBChat\ |
| Arquivos recebidos | %USERPROFILE%\MB_Chat_Files\ |
| Atalho Desktop | %USERPROFILE%\Desktop\MB Chat.lnk |
| Atalho Iniciar com Windows | %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\MB Chat.lnk |
| Menu Iniciar | %APPDATA%\Microsoft\Windows\Start Menu\Programs\MB Chat\ |
| Registro (auto-start) | HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MBChat |
| Registro (protocolo URL) | HKCU\Software\Classes\mbchat\ |
%APPDATA%\.mbchat\ (banco e histórico) quando você escolhe "SIM" para manter os dados — e a reinstalação posterior recupera tudo automaticamente. Já o Revo Uninstaller no modo Avançado varre o disco por arquivos "órfãos" e pode apagar essa pasta mesmo sem ela fazer parte do instalador, destruindo o histórico de forma irreversível. Se for usar o Revo, utilize sempre o modo Moderado. Em qualquer caso, faça um backup antes pelo próprio app em Ferramentas > Backup do histórico... (veja Backup e Restauração).
Se as mensagens para um colega estiverem demorando exatos 10 segundos para chegar, ou simplesmente não chegam (mesmo aparecendo online), isso indica que a sua rede física está bloqueando ativamente a conexão local. O MB Chat possui um sistema de emergência (Fallback) que redireciona a mensagem via internet por uma Âncora quando a conexão direta é barrada (causando o atraso de 10s).
Para ter certeza de que sua rede está bloqueando, abra o PowerShell ou Prompt de Comando e faça um Ping para o IP do computador de destino: ping 192.168.0.X
Se o resultado for "Esgotado o tempo limite" (100% de perda) entre dois computadores na mesma casa/escritório, o tráfego P2P está cortado fisicamente e o problema não é no aplicativo.
ipconfig se há muitos adaptadores virtuais ativos.Instalador web: sempre baixa a versão mais recente ao executar. Atalho no Desktop, Menu Iniciar e desinstalador completo.
Baixar Instalador