Plataforma para operacao de WhatsApp com foco em automacao. O projeto conecta sessoes WhatsApp, sincroniza historico, envia mensagens, recebe eventos em tempo real e permite configurar respostas automaticas com IA por sessao.
O ponto central do Zyntra e simples: transformar um numero de WhatsApp em um bot automatico com IA, com painel web, controle operacional e integracao via API/webhooks.
- Bot automatico com IA por sessao, com prompt configuravel.
- Integracao com OpenAI para gerar respostas automaticas.
- Fluxo completo de sessao WhatsApp com QR Code, status, reconexao e sincronizacao.
- Painel web para operacao, atendimento e configuracao.
- API REST multi-tenant para sessoes, mensagens, webhooks e chaves.
- Worker assicrono com filas BullMQ para execucao e entrega de eventos.
- Historico de mensagens e conversas sincronizado no banco.
- Webhooks com assinatura HMAC e politica de retry.
Quando uma mensagem chega no WhatsApp:
- O
workercaptura o evento via Baileys. - O
backendpersiste a mensagem recebida. - O sistema consulta a configuracao de auto-resposta da sessao.
- Se a IA estiver habilitada, o backend monta contexto recente da conversa.
- O prompt configurado e enviado para a OpenAI.
- A resposta gerada entra na fila de envio.
- O
workerenvia a mensagem automaticamente no WhatsApp.
Se a IA nao estiver habilitada, a sessao ainda pode operar com resposta fixa baseada no prompt salvo.
O projeto esta organizado como monorepo:
backend/: API REST, autenticacao, persistencia, configuracao de IA, webhooks e ingestao de eventos.worker/: engine WhatsApp com Baileys, execucao das filas, envio de mensagens e leitura de eventos.frontend/: painel web para login, sessoes, conversas, webhooks, API keys e configuracao da IA.docs/: documentacao e screenshots.deploy/: arquivos de infraestrutura e Nginx.
PostgreSQL: banco principal.Redis: locks, rate limit, idempotencia e filas.BullMQ: orquestracao de jobs.Baileys: conexao com WhatsApp.OpenAI: geracao de respostas automaticas.Prisma: acesso ao banco e schema.React + Vite: painel administrativo.
- Criacao de sessoes por empresa.
- Start e stop de conexoes.
- QR Code para vinculacao do WhatsApp.
- Status
created,starting,qr,ready,disconnected,stoppedeerror. - Sincronizacao automatica de historico.
- Habilitacao por sessao.
- Prompt de comportamento configuravel.
- Provedor
OpenAIcom modelo editavel. - Teste de conexao antes de salvar credenciais.
- Contexto recente da conversa para respostas mais coerentes.
- Envio de mensagem de texto.
- Envio de arquivo/documento.
- Conversas e mensagens salvas no banco.
- Idempotencia por
Idempotency-Key. - Rate limit por empresa e por sessao.
- Webhooks por empresa.
- Assinatura
X-Signature: sha256=<hex>. - Retry automatico em falhas.
- API pronta para automacao e integracoes externas.
- Isolamento por
companyId. - Autenticacao por
X-API-Keyou JWT. - Credenciais de login por empresa.
- Segredos de worker protegidos por header interno.
- Node.js
- TypeScript
- Express
- Prisma
- PostgreSQL
- Redis
- BullMQ
- OpenAI SDK
- Node.js
- TypeScript
- Baileys
- BullMQ
- Redis
- React 18
- TypeScript
- Vite
- Zustand
- Tailwind CSS
WhatsApp -> Worker (Baileys) -> Backend (/internal/worker/events)
Backend -> Banco / Regras de negocio / IA
Backend -> BullMQ -> Worker
Worker -> WhatsApp
Backend -> Webhooks externos
Frontend -> Backend API REST
- Docker e Docker Compose
- Node.js 20+ para execucao local fora de containers
- npm
Arquivo base na raiz:
NODE_ENV=development
PORT=3000
DATABASE_URL=postgresql://postgres:postgres@localhost:4547/zyntra?schema=public
REDIS_URL=redis://redis:6379
CORS_ORIGIN=http://localhost:5173,http://localhost:4173
JWT_SECRET=change-me
WORKER_SECRET=change-me-worker-secret
SEED_API_KEY=zyn_seed_local_dev_2026
BACKEND_INTERNAL_URL=http://backend:3000
BAILEYS_STORAGE_PATH=/app/data
LOG_LEVEL=infoVariaveis importantes:
DATABASE_URL: conexao com Postgres.REDIS_URL: conexao com Redis.JWT_SECRET: assinatura do JWT.WORKER_SECRET: autenticacao entre worker e backend.SEED_API_KEY: chave padrao criada no seed.BACKEND_INTERNAL_URL: URL interna usada pelo worker.BAILEYS_STORAGE_PATH: persistencia de credenciais das sessoes WhatsApp.
Para a interface web, configure tambem em frontend/.env.local:
VITE_API_BASE_URL=http://localhost:3000O frontend possui package.json proprio e nao faz parte do workspaces da raiz.
Na raiz:
npm installNo frontend, separadamente do workspace raiz:
cd frontend
npm installUse um dos arquivos:
.env.localpara desenvolvimento.env.productionpara producao.envcomo fallback
O backend e o worker carregam automaticamente o arquivo correspondente ao ambiente.
O docker-compose.yml atual sobe infraestrutura local:
docker compose up -dServicos expostos:
- PostgreSQL:
localhost:4547 - Redis:
localhost:6379
Na raiz:
npm run -w backend devEm outro terminal:
npm run -w worker devNo diretorio frontend:
npm run devA interface ficara disponivel em http://localhost:5173.
O seed cria ou atualiza a empresa demo, uma API key padrao e credenciais de acesso:
npm run seedValores padrao:
- Empresa:
Demo Company - Usuario:
demo - Senha:
admin123 - API Key:
zyn_seed_local_dev_2026
Esses valores podem ser alterados por variaveis de ambiente como SEED_COMPANY_USERNAME, SEED_COMPANY_PASSWORD e SEED_API_KEY.
O frontend suporta dois modos:
API Key: enviaX-API-KeyCompany Login: autentica com usuario/senha e recebe JWT
Todas as rotas, exceto GET /health, exigem autenticacao.
curl -s http://localhost:3000/healthPOST /auth/login
POST /api-keysGET /api-keysDELETE /api-keys/:id
POST /sessionsGET /sessionsGET /sessions/:idPOST /sessions/:id/startPOST /sessions/:id/stopPOST /sessions/:id/sync-historyDELETE /sessions/:idGET /sessions/:id/qrGET /sessions/:id/statusGET /sessions/:id/messagesGET /sessions/:id/conversationsGET /sessions/:id/auto-replyPUT /sessions/:id/auto-replyPOST /sessions/:id/auto-reply/test-connection
POST /sessions/:id/messages/textPOST /sessions/:id/messages/media
POST /webhooksGET /webhooksPATCH /webhooks/:idDELETE /webhooks/:id
Payload para salvar auto-resposta da sessao:
{
"enabled": true,
"promptText": "Responda em portugues, de forma objetiva, cordial e profissional.",
"provider": "openai",
"aiModel": "gpt-5",
"apiToken": "sk-..."
}Com isso, a sessao passa a operar como um bot automatico com IA, respondendo mensagens recebidas com base no prompt definido no painel.
- Swagger UI:
http://localhost:3000/docs - OpenAPI JSON:
http://localhost:3000/openapi.json
Headers enviados pelo backend:
X-SignatureX-Event-TypeX-Company-IdX-Session-IdX-Delivery-Id
Eventos suportados:
session.qrsession.readysession.disconnectedhistory.syncmessage.receivedmessage.sentmessage.error
Politica de retry:
- 10s
- 30s
- 2m
- 10m
- 30m
Filas BullMQ:
session-startsession-stopmessage-send-textmessage-send-mediawebhook-deliver
Controles implementados:
- Rate limit por empresa:
20 msg/s - Rate limit por sessao:
5 msg/s - Idempotencia em Redis por
10 min - Locks por sessao para start e stop
- Limpeza automatica de sessoes inativas
Existe estrutura de deploy com Nginx e compose de producao:
docker-compose.prod.ymldeploy/nginx/conf.d/zyntra.conf
Fluxo resumido:
- Configurar DNS para o dominio.
- Emitir certificado Let's Encrypt.
- Subir stack de producao com
docker compose -f docker-compose.prod.yml up -d --build.
Zyntra/
|- backend/
|- worker/
|- frontend/
|- docs/
| |- screenshots/
|- deploy/
|- docker-compose.yml
|- docker-compose.prod.yml
- Atendimento automatico com IA via WhatsApp.
- Bot operacional para empresas com multiplas sessoes.
- Central de mensagens com painel de conversa.
- Integracao com CRMs, ERPs e automacoes via webhook.
- SaaS multi-tenant para operacao de canais WhatsApp.
- O projeto e privado.
- O frontend e instalado separadamente do workspace raiz.
- O
docker-compose.ymlatual esta preparado principalmente para infraestrutura local; backend e worker podem ser executados por processo durante o desenvolvimento.





