• MIT
  • macOS 14+ · Apple Silicon
  • Local-first
  • v0.1.0 inicial

O WhatsApp na sua mesa,ligado ao código e ao Claude.

ZapDesk é um app desktop open source para macOS que roda inteiro na sua máquina. Converse com várias contas, envie mensagens personalizadas para listas de leads, acompanhe negócios num Kanban — e deixe o Claude fazer isso por você com 69 ferramentas MCP.

Apple Silicon · macOS 14+ · ainda sem notarização — veja o Início rápido

// 01 — features

Tudo numa mesa só

Um cliente de WhatsApp completo e as ferramentas para trabalhar uma lista de leads — tudo rodando no seu Mac.

  • Várias contas

    Conecte cada número por QR code, como um aparelho conectado. A sessão continua entre aberturas.

  • O chat completo

    Grupos, busca, mídia, áudio gravado, citações, reações, edição, figurinhas, etiquetas, notas e templates com /. Chamadas de voz e vídeo não são suportadas.

  • Envio em massa no seu ritmo

    Variáveis {nome}, anexos, agendamento, janela de horário e intervalo sorteado com limites por hora e por dia. Relatório por destinatário, exportável em CSV.

  • Base de leads sem duplicatas

    Importe CSV/XLSX, cole números ou escolha contatos. Todo telefone vira E.164 e é deduplicado, com relatório de novos, já existentes e inválidos.

  • Servidor MCP para o Claude

    69 ferramentas deixam o Claude Code ou o Claude Desktop ler conversas, importar leads, criar disparos e mover negócios.

  • Funis de venda

    Quantos funis precisar, com etapas num quadro Kanban e o histórico de cada movimento.

  • Chatbots e fluxos sem código

    Monte menus, perguntas e transferência para humano num editor visual de nós, ou fluxos gatilho → condição → ação. Teste num chat simulado.

  • Automações de IA em TypeScript

    Escreva uma automação como um pequeno projeto TypeScript, com a API ctx tipada e modelos Claude. Cada uma roda num processo próprio e restrito.

// 02 — tour

Um passeio pela mesa

Como é um dia de trabalho no ZapDesk. Telas reais, dados fictícios.

Disparo

Ritmo e agenda, você decide

Escolha o intervalo, os limites por hora e por dia, as pausas e a janela de horário. Se o ritmo for agressivo, o app avisa; você decide.

  • Intervalo sorteado entre o seu mínimo e o seu máximo, a cada mensagem.
  • Limites por hora e por dia, pausa a cada N mensagens e parada após falhas seguidas.
  • Comece agora ou agende o início, e envie só dentro de uma janela de horário.

Relatório

Saiba o que aconteceu com cada mensagem

Enviada, entregue, lida, respondida ou com falha — por destinatário, ao vivo. Exporte tudo em CSV.

  • Contadores ao vivo enquanto o disparo roda.
  • O estado de cada destinatário, com o motivo quando algo falha.
  • Um clique exporta o relatório em CSV.

Funil

Negócios num quadro

Arraste contatos entre etapas ou deixe uma automação mover por você.

  • Quantos funis precisar, cada um com suas etapas.
  • Todo movimento fica no histórico do funil.
  • Automações e o Claude, pelo MCP, também movem cards.

// 03 — mcp

Entregue a mesa ao Claude

O ZapDesk vem com um servidor MCP. Adicione ao Claude Code ou ao Claude Desktop e o Claude opera o app com as mesmas ferramentas que você.

69

ferramentas em 10 grupos

Todas as ferramentas, por grupo

  • Contas e sistema2
    • listar_contas
    • status_zapdesk
  • Leads2
    • importar_leads
    • listar_leads
  • Conversas9
    • listar_conversas
    • ler_mensagens
    • buscar_mensagens
    • enviar_mensagem
    • reagir_mensagem
    • editar_mensagem
    • apagar_mensagem
    • marcar_como_lida
    • ver_status
  • Contatos e etiquetas6
    • listar_contatos
    • atualizar_contato
    • listar_etiquetas
    • criar_etiqueta
    • atualizar_etiqueta
    • excluir_etiqueta
  • Templates4
    • listar_templates
    • criar_template
    • atualizar_template
    • excluir_template
  • Disparos8
    • criar_disparo
    • listar_disparos
    • ver_disparo
    • iniciar_disparo
    • pausar_disparo
    • retomar_disparo
    • cancelar_disparo
    • exportar_relatorio
  • Funil10
    • listar_funis
    • criar_funil
    • editar_funil
    • excluir_etapa
    • excluir_funil
    • listar_cards_funil
    • mover_card_funil
    • remover_card_funil
    • historico_funil
    • atualizar_lead
  • Automações12
    • listar_automacoes
    • ver_automacao
    • ver_formatos_automacao
    • criar_automacao
    • editar_automacao
    • validar_automacao
    • excluir_automacao
    • ativar_automacao
    • desativar_automacao
    • executar_automacao
    • testar_automacao
    • simular_chatbot
  • Automações de IA (código)9
    • ver_tipos_sdk
    • listar_modelos_automacao_ia
    • criar_automacao_ia
    • listar_arquivos_automacao
    • ler_arquivo_automacao
    • escrever_arquivo_automacao
    • renomear_arquivo_automacao
    • excluir_arquivo_automacao
    • compilar_automacao
  • Execuções e segurança7
    • listar_execucoes
    • ver_execucao
    • listar_pausas
    • pausar_conversa
    • retomar_conversa
    • listar_segredos
    • ver_configuracao_automacoes

O que o MCP não faz

  • Conectar ou remover contas (só por QR, no app).
  • Definir valores de segredos.
  • Mudar limites globais.

Disparos criados pelo MCP começam na hora, sem etapa de confirmação — revise o pedido antes de rodar.

// 04 — automations

Automatize sem perder o controle

Três jeitos de automatizar, do arrastar-e-soltar ao código.

  • Fluxos

    Gatilho → condições → ações, inclusive esperas que sobrevivem a reinícios.

  • Chatbots

    Editor visual de nós com menus, perguntas, condições e transferência para humano.

  • IA (código)

    Um projeto TypeScript por automação, com o SDK ctx tipado e modelos Claude.

Classificar o lead e mover no funil

Modelo real que vem com o app: motor/internal/automacoes/projetos/modelos/classificar_funil/index.ts

motor/internal/automacoes/projetos/modelos/classificar_funil/index.ts
import { definirAutomacao } from '@zapdesk/automacao';
import { ACOES, CATEGORIAS, FUNIL } from './categorias';

// Classifica o contato pelas últimas mensagens e move o lead no funil, com uma etiqueta.
// Não envia nada ao contato.
export default definirAutomacao({
  async aoReceberMensagem(ctx, msg) {
    if (!msg.texto || !ctx.conversa) return;
    const historico = await ctx.conversa.historicoParaIA({ limite: 10 });
    const texto = historico.map((m) => `${m.papel === 'user' ? 'Contato' : 'Loja'}: ${m.texto}`).join('\n');
    const { categoria } = await ctx.ia.classificar(texto, CATEGORIAS, {
      instrucoes: 'Classifique o interesse de compra do contato. Na dúvida, escolha "morno".',
    });
    const acao = ACOES[categoria];
    await ctx.funil.mover(FUNIL, acao.etapa);
    await ctx.etiquetas.adicionar(acao.etiqueta);
    ctx.log.info('classificado como', categoria);
  },
});

automacao.json

Gatilhos
mensagem_recebida
Permissões
ler_conversasfuniletiquetasia
Limites
60 s256 MB

Como as automações de IA ficam isoladas

  • Cada automação de IA roda num processo Node próprio e fala com o motor só por JSON-RPC via stdio.
  • O modelo de permissões do Node está ligado: sem acesso a arquivos fora do bundle, sem processos filhos.
  • Sem fetch global, process.env vazio, sem token da API nem chave da Anthropic no processo.
  • Toda chamada a ctx é checada contra as permissões declaradas em automacao.json.
  • 60 s e ~256 MB por execução.

Salvaguardas de toda automação

  • No máximo 10 mensagens automáticas por conversa a cada 10 minutos.
  • Responder à mão pausa as automações daquela conversa por 30 minutos.
  • Grupos ficam desligados por padrão.
  • A automação se desliga após 5 erros seguidos.
  • Nada roda com o app fechado.

O isolamento protege contra erros e acidentes, não contra código malicioso. Rode só automações em que você confia.

// 05 — architecture

Local de propósito

Cada peça roda no seu Mac e conversa por 127.0.0.1. Nenhuma nuvem no meio.

Diagrama de arquitetura: o app ZapDesk, o servidor MCP e os runners de automação falam com o motor em Go em 127.0.0.1; o motor guarda os dados em SQLite e se conecta ao WhatsApp pelo whatsmeow.
  1. O app fala com o motor por HTTP + WebSocket em 127.0.0.1, com um token novo a cada abertura.
  2. O motor se conecta ao WhatsApp como aparelho conectado, pelo whatsmeow.
  3. O motor guarda tudo num banco SQLite local.
  4. O Claude Code ou o Claude Desktop iniciam o servidor MCP via stdio.
  5. O servidor MCP chama a mesma API local que o app.
  6. Cada automação de IA roda num processo próprio e só alcança o motor por JSON-RPC via stdio.

O que "local" quer dizer aqui

  • Abrir o app liga o motor; fechar desliga tudo.
  • Sem servidor na nuvem, sem Docker, sem conta para criar.
  • API local em 127.0.0.1, porta aleatória, token novo a cada abertura.
  • Seus dados ficam em SQLite no seu Mac. Sem telemetria.
  • Se um disparo estiver rodando quando você sair, o app espera na barra de menus até terminar.

// 06 — quick start

Início rápido

Baixe o app ou compile do código-fonte — depois ligue ao Claude.

Baixar

Instale o DMG

Requisitos
  • Apple Silicon (M1 ou mais novo)
  • macOS 14+
  1. Baixe ZapDesk-<versão>-arm64.dmg nas Releases do GitHub.

  2. Arraste o ZapDesk para Aplicativos.

  3. O build ainda não é notarizado: abra uma vez, vá em Ajustes do Sistema › Privacidade e Segurança e clique em "Abrir mesmo assim".

  4. Leia o QR code com o celular (Aparelhos conectados).

Compilar do código

Rode a partir do repositório

Requisitos
  • Node ≥ 22.12
  • Go 1.27
  • macOS em Apple Silicon
  1. Clone o repositório e instale as dependências.

  2. npm run dev compila o motor em Go e os pacotes compartilhados e abre o app.

  3. npm run empacotar gera o DMG em app/dist/ (opcional).

Terminal
git clone https://github.com/Gabriel-Almeida0/zapdesk.git
cd zapdesk
npm install
npm run dev            # compila o motor em Go + pacotes compartilhados e abre o app
npm run empacotar      # opcional: gera app/dist/ZapDesk-<versão>-arm64.dmg

Ligar ao Claude

Adicione o servidor MCP

Claude Code

Rode uma vez.

Terminal
claude mcp add -s user -e ELECTRON_RUN_AS_NODE=1 zapdesk -- \
  "/Applications/ZapDesk.app/Contents/MacOS/ZapDesk" \
  "/Applications/ZapDesk.app/Contents/Resources/mcp/zapdesk-mcp.mjs"
claude mcp list

Claude Desktop

Adicione ao claude_desktop_config.json e reinicie o Claude.

Arquivo de configuração~/Library/Application Support/Claude/claude_desktop_config.json

claude_desktop_config.json
{
  "mcpServers": {
    "zapdesk": {
      "command": "/Applications/ZapDesk.app/Contents/MacOS/ZapDesk",
      "args": ["/Applications/ZapDesk.app/Contents/Resources/mcp/zapdesk-mcp.mjs"],
      "env": { "ELECTRON_RUN_AS_NODE": "1" }
    }
  }
}

Os mesmos comandos estão no app em Ajustes › Usar com Claude. Não precisa instalar Node à parte.

// 07 — responsible use

Uso responsável

Leia antes de conectar um número.

  • Cliente não oficial

    O ZapDesk se conecta pelo whatsmeow, uma implementação open source e não oficial do protocolo multi-device do WhatsApp.

  • Sem afiliação

    O ZapDesk não é afiliado, endossado nem patrocinado pelo WhatsApp ou pela Meta. "WhatsApp" é marca de seu titular.

  • Seu número pode ser bloqueado

    O WhatsApp pode restringir ou banir números que enviam mensagens não solicitadas. O uso do app é responsabilidade sua.

  • Consentimento e lei

    Envie só para quem aceitou receber suas mensagens e siga a LGPD, o GDPR e os termos do WhatsApp.

  • Seus dados ficam no seu Mac

    Conversas, leads e relatórios ficam guardados localmente. Nada vai para um servidor do ZapDesk — ele não existe.

  • No estado em que se encontra, MIT

    O software é fornecido "as is", sem garantia de qualquer tipo, sob a licença MIT.

// 08 — open source

Open source, MIT

Leia o código, abra uma issue, mande um pull request. As specs que guiaram o desenvolvimento estão no repositório.

Feito com

  • Gomotor
  • Electronapp desktop
  • Reactinterface
  • TypeScriptservidor MCP e SDK de automações
  • SQLitebanco local

Como contribuir

  • Reporte bugs e ideias nas Issues.
  • Leia docs/features e specs/ antes de mudanças maiores.
  • Rode npm test e npm run motor:testar antes de um PR.

Status

v0.1.0 — inicial

Ainda não

  • Builds notarizados
  • Windows e Linux