DeskcommCRM README

The project's README from github.com/melgarafael/DeskcommCRM. As one markdown file: README.md.

🇧🇷 Português · 🇺🇸 English · 🇪🇸 Español

Deskcomm CRM

🛠️ DeskcommCRM — o Sistema Operacional de Vendas com IA, open source, pro WhatsApp

Agentes de IA que atendem, qualificam e vendem no WhatsApp — dentro de um CRM open source rodando no seu servidor. Sem mensalidade, sem feature travada, seus dados com você. A alternativa aberta a Kommo, Octadesk e Intercom.

Next.js 16 TypeScript Supabase Self-hosted CI License: MIT

⚡ Instalar · 🔄 Atualizar · 🧭 Visão · 🏗️ Arquitetura · 🤝 Contribuir · 🗺️ Roadmap


☁️ Rode este CRM em produção com 1 comando

O DeskcommCRM foi desenvolvido em parceria com a HostGator: o hostgator-setup-kit/ instala o CRM completo (app + WhatsApp + banco) numa VPS com um único comando, e o runbook de produção já assume esse ambiente.

👉 Assinar a VPS HostGator com desconto da parceria — datacenter em São Paulo, ideal pro WhatsApp rodando 24/7. (link de parceiro — assinar por ele apoia o projeto e sai mais barato)

Ainda não tem servidor? Rode isto no seu computador (macOS, Linux ou WSL). Ele diz qual plano contratar — com os números do runbook, não um "depende" — e te devolve o comando certo pro seu caso:

curl -fsSL https://raw.githubusercontent.com/melgarafael/DeskcommCRM/main/hostgator-setup-kit/comecar.sh | bash

(prefere ler antes de executar? clone o repo e rode bash hostgator-setup-kit/comecar.sh — ele não instala nada sem você confirmar.)


⚡ Instalar na sua VPS (o caminho principal)

1. Entre na sua VPS

Abra o Terminal no seu computador (no Windows, o PowerShell; no Mac ou Linux, o Terminal) e conecte com o IP e a porta que a hospedagem te mandou por e-mail:

ssh -p PORTA root@SEU_IP

Troque PORTA e SEU_IP pelos seus. Se a hospedagem não mencionou porta nenhuma, é a padrão (22) e você pode omitir: ssh root@SEU_IP.

Ele pede a senha. Ao digitar, não aparece nada na tela — nem asteriscos. Isso não é travamento: é o terminal escondendo a senha. Digite (ou cole) e dê Enter.

Na primeira conexão ele pergunta Are you sure you want to continue connecting? — responda yes. É o servidor se apresentando pela primeira vez.

2. Rode o instalador

Já dentro da VPS:

git clone https://github.com/melgarafael/DeskcommCRM.git
cd DeskcommCRM
bash hostgator-setup-kit/install.sh

É isso. Você não instala Node, nem pnpm, nem compila nada — a imagem do app já vem pronta. Se faltar Docker, o instalador pergunta e instala sozinho.

O que você precisa ter em mãos

Item Onde conseguir
VPS com Docker HostGator (parceria) — ou qualquer VPS com Docker. 4 GB de RAM recomendados
Domínio Um registro A apontando pro IP da VPS (ex.: crm.suaempresa.com.br)
Banco Conta grátis no supabase.com — 3 chaves + connection string do Session pooler
IA Uma chave de OpenRouter, Anthropic ou OpenAI — o instalador pergunta qual você quer
WhatsApp Seu número, conectado por QR code no onboarding (ou o canal oficial da Meta)

💡 O Supabase pode ser criado pelo próprio instalador. Exporte um SUPABASE_ACCESS_TOKEN antes de rodar e ele cria o projeto, espera o banco ficar saudável, busca as 4 credenciais e descobre o host do pooler testando conexão real — sem copiar e colar.

O que o instalador faz por você

Ele pergunta só o que é seu (domínio, chaves, senha do admin), valida cada resposta antes de seguir — chave errada ele recusa na hora, não três passos depois — e cuida do resto:

  1. Gera todos os segredos técnicos sozinho (você não inventa senha nenhuma).
  2. Cria as extensões do Postgres e aplica o schema completo (supabase/baseline.sql).
  3. Cria o primeiro admin com o e-mail e a senha que você escolheu.
  4. Sobe a stack inteira com HTTPS automático e confere a saúde no fim.
  5. Instala o cron das automações (sem ele, as regras QUANDO/SE/ENTÃO ficam paradas na fila) e o agente de atualização, que é o que faz o botão "Atualizar agora" existir na tela.

Rodar de novo não quebra nada — o install.sh é idempotente: não duplica cron, não recria usuário, retoma de onde parou.

Modo não-interativo: copie .env.hostgator.example para .env, preencha e rode bash hostgator-setup-kit/install.sh --yes.

Outra hospedagem? (Hostinger, Coolify, Dokploy, CapRover…)

Funciona. Se a sua VPS já vem com um proxy reverso próprio ocupando as portas 80/443, o instalador detecta isso sozinho e publica o CRM através dele, em vez de tentar subir um Caddy que não caberia. Num caso específico — proxy em --network host, como faz a Hostinger — ele pergunta em vez de adivinhar, porque publicar atrás do proxy errado instala "com sucesso" um site mudo. Detalhes em hostgator-setup-kit/README.md.

Primeiro acesso

Abra https://<seu-domínio> (o cadeado leva ~1 min pra aparecer), entre com o admin, e tenha o Google Authenticator ou Authy à mão se você quiser ligar a verificação em duas etapas — ela é opcional e fica em Configurações › Segurança; o primeiro login não a exige. No onboarding, escaneie o QR code com o WhatsApp do seu número.

🤖 Prefere que uma IA instale pra você?

O repositório traz guias do assistente que carregam sozinhos no Claude Code, Codex, Cursor, OpenCode ou Antigravity: instalar, montar um cliente por nicho, analisar métricas, afinar o prompt do agente e contribuir. Para tê-los em qualquer pasta — inclusive antes de clonar, no seu computador —, rode uma vez:

curl -fsSL https://raw.githubusercontent.com/melgarafael/DeskcommCRM/main/scripts/instalar-guias.sh | bash

Depois abra uma sessão nova do seu assistente e diga "quero instalar o CRM na minha VPS": pedir o assunto em português aciona o guia certo em qualquer um dos cinco. Para chamar um guia pelo nome, cada um tem o seu jeito — /deskcomm-instalar no Claude Code, no Cursor e no Antigravity; $deskcomm-instalar no Codex; no OpenCode, peça pelo nome, em linguagem natural.

Os guias não se atualizam sozinhos: rodar o mesmo comando de novo traz a versão nova. Para desfazer:

curl -fsSL https://raw.githubusercontent.com/melgarafael/DeskcommCRM/main/scripts/instalar-guias.sh | bash -s -- --remover

Com o repositório já clonado, os guias vêm dentro dele (.agents/skills/) e nem isso é preciso. Se você rodou o comando mesmo assim, saiba que no Claude Code o guia instalado vale mais que o do clone — e fica na versão do dia em que rodou, até rodar de novo (ou desfazer). Também funciona o jeito antigo: jogar só a pasta hostgator-setup-kit/ no chat do Claude Code dentro da VPS — ele lê o CLAUDE.md do kit e conduz tudo em português.


🔄 Atualizar

Saiu versão nova? Há dois caminhos, e o primeiro não exige terminal.

Pela tela (recomendado)

Quando existe versão nova, o rodapé do menu lateral acende "Nova versão" — só pro dono do servidor, porque avisar quem não pode atualizar é ruído. Clique e você cai em Configurações → Atualização, que mostra o que muda, faz backup do banco sozinha e acompanha cada fase (backup → código → banco → no ar) até terminar. Nada de SSH.

Se a versão nova subir quebrada, o agente volta pra imagem anterior sozinho e grava essa volta no .env — sem isso, o próximo restart traria o app quebrado de novo, em silêncio.

Por baixo: o app só registra o pedido; quem executa é o agente que o install.sh deixou na sua VPS, num cron que confere a cada 5 minutos — então a atualização começa em até 5 minutos depois do clique. Se esse agente estiver fora do ar, a tela avisa "Atualização automática indisponível" e mostra o comando abaixo — ela não finge que deu certo.

Pelo terminal

cd /caminho/do/DeskcommCRM
bash hostgator-setup-kit/update.sh

O comando faz, nesta ordem: (1) confere se há mesmo versão nova — se não houver, sai na hora; (2) faz backup do banco antes de tocar em qualquer coisa; (3) baixa o código novo; (4) atualiza o banco re-aplicando o baseline.sql, que é idempotente e auto-curativo (conserta sozinho dados bagunçados por versões antigas); (5) puxa a imagem nova do app; (6) confere a saúde no fim.

O alvo é a última versão publicada (v1.2.3), não o topo da main — atualizar leva sempre a uma versão marcada e descrita no CHANGELOG.md, nunca a um commit não testado. Ele recusa voltar pra uma versão anterior à instalada (isso desligaria coisas que você já tem); pra isso existe --force, de propósito.

Coisas normais que você vai ver: um monte de already exists / multiple primary keys na parte do banco — é esperado e inofensivo, são coisas que já existiam. O script filtra esse ruído e mostra ✓ banco atualizado. Se o banco estiver ocupado com o CRM atendendo, ele aplica de novo sozinho (até 3 passadas) e conta isso na tela — isso vale a partir da atualização seguinte à que instalar esta correção. Se aparecer ⚠ Apareceram avisos no banco que NÃO são os esperados, aí sim guarde a mensagem: o fim da saída diz o que fazer em cada caso (repetir com --force quando foi o banco ocupado, declarar SUPABASE_DB_ADMIN_URL quando foi permissão). Restaurar o backup é o último recurso.

Deu ruim? bash hostgator-setup-kit/restore.sh volta pro backup. Quer só diagnosticar? bash hostgator-setup-kit/healthcheck.sh.

⚠️ Numa instalação antiga que ainda não tem o agente da tela, rode update.sh duas vezes: a primeira execução ainda é a do script velho (que baixa o novo); a segunda instala o agente e liga o botão.

Passo a passo em linguagem simples: docs/ATUALIZANDO.md.

Outros comandos do kit

Script Função
install.sh Instala tudo (idempotente — pode rodar de novo)
update.sh Atualiza pra versão nova, com backup automático
backup.sh Backup do banco + sessões de WhatsApp
restore.sh Restaura um backup
reset-password.sh Redefine a senha de um usuário
reset-mfa.sh Remove o MFA de quem perdeu o celular
healthcheck.sh Diagnóstico de todos os serviços de uma vez

Backup importa: o plano grátis do Supabase não faz backup sozinho. Vale agendar backup.sh no cron diariamente. O update.sh já roda um backup antes de cada atualização.

🧹 Desinstalar (tirar esta aplicação do Docker)

Para parar e apagar somente os recursos Docker desta instalação, na raiz do repositório:

bash desinstalar_docker.sh

Ele descobre o projeto pelo label que o Docker Compose grava e remove apenas os containers, volumes e redes internas deste projeto. Outras aplicações do mesmo servidor, imagens, cache de build, a rede externa do proxy reverso, o código, o .env, os backups e um Supabase externo não são tocados.

O modo interativo mostra quantos recursos encontrou e exige a confirmação REMOVER-<nome-do-projeto> antes de remover qualquer coisa. Para uma rotina de descarte de ambiente, bash desinstalar_docker.sh --force pula a pergunta. Use --project-name NOME só quando a instalação tiver um COMPOSE_PROJECT_NAME personalizado que não esteja mais no .env.

Os volumes vão junto — inclusive as sessões locais do WhatsApp. Rode backup.sh antes se precisar preservá-las.


✨ O que é

Deskcomm vem de Desk (mesa) + comm (comércio): o comercial de mesa — toda a operação de vendas do seu negócio numa mesa só, operada por pessoas e agentes de IA juntos.

O projeto nasceu como CRM de e-commerce e a comunidade o levou muito além: hoje roda em clínicas, imobiliárias, infoprodutos, agências, lojas e prestadores de serviço — qualquer negócio que vende pelo WhatsApp. O produto acompanhou essa virada e virou um sistema operacional de vendas: agentes de IA com RAG por tenant atendem, qualificam, movem leads no funil, disparam automações e sabem a hora de passar pra um humano — com o CRM inteiro exposto via MCP pros agentes operarem de verdade. A história completa está em VISION.md.

Diferenciais

🔌 Webhooks & Automações

Todo tenant pode criar fontes de captação: um endereço público (/api/v1/webhooks/in/<token>) que recebe leads de landing pages, formulários próprios ou ferramentas como Zapier/n8n via POST (JSON ou application/x-www-form-urlencoded) e já entra direto no funil/estágio escolhido — sem código, sem integração customizada por tenant. Em cima dessas fontes (e dos outros eventos do CRM — lead mudou de etapa, ganhou tag, chegou mensagem no WhatsApp), o tenant monta automações: regras no formato QUANDO/SE/ENTÃO que disparam ações como adicionar tag, mover o lead no funil, atribuir a um atendente, mandar uma mensagem de WhatsApp ou avisar outro sistema via webhook de saída.

Na UI, tudo mora em Webhooks na sidebar (visível só pra quem tem papel manager/admin). A tela tem três abas: Receber dados (criar fonte, copiar o endereço/formulário pronto, disparar um lead de teste, ver os últimos recebimentos), Automações (montar a regra, que sempre nasce pausada até você revisar e ligar) e Atividade (timeline de cada execução, com o resultado de cada ação e reenvio manual quando uma chamada externa falha).

Por baixo, cada evento vira uma linha em event_log — nenhum trigger de banco faz chamada HTTP diretamente. Quem drena essa fila é a rota /api/v1/cron/event-log-drain, chamada a cada minuto. O install.sh/update.sh já configuram esse cron sozinhos — sem ele, as automações são criadas normalmente mas nunca rodam.


🖥️ O que você opera (as telas)

Grupo Telas
Atendimento Inbox (conversas de WhatsApp, você e a IA lado a lado) · Radar (quem esfriou e ainda está aberto) · Respostas rápidas
CRM Kanban (onde cada negócio está no funil) · Contatos · Funis (etapas, vocabulário do negócio e motivos de perda)
Agente de IA Agentes · Follow-ups · Roteadores · Provedores e Credenciais · Conhecimento (RAG) · Memória · Skills · Casos · Alertas · Propostas · Execuções · Uso e orçamento
Canais Conexões (QR ou canal oficial da Meta, com saúde, reconexão e templates) · Nuvemshop · Webhooks
Análise Desempenho (funil e performance por atendente) · Evolução da IA · Audit Log
Organização Equipe · Distribuição de atendimento · Organização · LGPD · API Tokens · Segurança (MFA, códigos de recuperação, sessões) · Perfil, Notificações, Billing

Toda tela tem porta na navegação — o CI reprova tela que existe mas em que só se chega digitando a URL.


🧱 Stack

Camada Escolha Por quê
Frontend Next.js 16 App Router (Turbopack) + React 19 + TypeScript 6 estrito Server Components + Route Handlers no mesmo repo
Estilo Tailwind + shadcn/ui (new-york, neutral) Customizável sem lock-in
DB Supabase (Postgres + RLS + vector) Multi-tenant nativo, embedding pra RAG
Auth Supabase Auth via @supabase/ssr Cookie SameSite=Strict, HttpOnly
Realtime Supabase Realtime postgres_changes + broadcast
Storage Supabase Storage (URLs assinadas) Bucket privado whatsapp-media
WhatsApp WAHA Plus (engine NOWEB) + Meta Cloud API QR pra começar rápido; canal oficial pra escala
Filas event_log table + workers (cron) Trigger de banco nunca faz HTTP
Rate limit Upstash Redis (sliding window) Serverless, free tier suficiente
AI Vercel AI SDK v7 — OpenRouter, Anthropic, OpenAI e Google Instalador pergunta qual; troca depois pela tela
Validação Zod Input externo, env, payloads
Observability Sentry (scrub em erro, transação, span e breadcrumb) Telemetria opt-in no install
Hospedagem VPS com Docker (HostGator/SP na parceria) App + WhatsApp + workers na sua máquina

Detalhes: ARCHITECTURE.md.


🧑‍💻 Desenvolvimento (só pra contribuir com o código)

⚠️ Se você quer USAR o CRM, não é aqui — use o instalador da VPS. Esta seção é pra quem vai mexer no código.

git clone https://github.com/melgarafael/DeskcommCRM.git
cd DeskcommCRM

nvm use                     # Node 22
npm install -g pnpm && pnpm install

cp .env.example .env.local  # guia completo em docs/SETUP.md

docker compose up -d        # WAHA local (opcional em dev sem WhatsApp)

# Schema: aplique o baseline, NÃO as migrations.
# As migrations 0001-0009 e 0013 são stubs `SELECT 1;` — a cadeia não sobe do zero.
# O schema real vive no baseline.sql, o mesmo que o install.sh aplica na VPS.
# `supabase db push` "passa" e deixa o banco vazio.
supabase link --project-ref <seu-ref>

# Num projeto Supabase NOVO, habilite antes as extensões que o schema usa —
# sem elas o baseline para em `type public.vector does not exist`.
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c \
  'create extension if not exists vector with schema public;
   create extension if not exists citext with schema public;
   create extension if not exists pg_trgm with schema public;'

psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -f supabase/baseline.sql

pnpm dev

App: http://localhost:3000 · Health check: http://localhost:3000/api/v1/health

docs/SETUP.md é o tutorial completo de todas as integrações (Supabase, WAHA, provedores de IA, Upstash, Sentry, Resend, Nuvemshop) — ~60–90 min do zero ao app rodando.


📁 Estrutura

DeskcommCRM/
├── app/                    # Next.js App Router
│   ├── (admin)/            # Rotas super-admin (impersonate, tenants)
│   ├── (public)/           # Login, recovery
│   ├── app/                # Rotas autenticadas: inbox, radar, kanban, contacts,
│   │                       #   connections, ai/*, integrations, metrics, lgpd,
│   │                       #   audit, team, settings
│   └── api/v1/             # API REST canônica (196 route handlers)
├── components/             # React (ui/, inbox/, kanban/, shell/, ...)
├── lib/                    # supabase/, waha/, channels/, ai/, agent-engine/,
│                           #   api/, routing/, navigation/, env.ts
├── workers/                # consumers de event_log (IA, RAG, LGPD, mídia, rotinas)
├── supabase/migrations/    # SQL versionado (+ baseline.sql pro self-host)
├── tests/{e2e,unit,invariants,shell}/
├── scripts/                # seeds, qa-waves, manutenção
├── docs/                   # PRDs, specs, runbooks, SETUP.md, ATUALIZANDO.md
└── hostgator-setup-kit/    # instalação e atualização self-host

🧪 Testes

pnpm typecheck     # tsc --noEmit -p tsconfig.typecheck.json (inclui tests/)
pnpm lint          # eslint next/core-web-vitals
pnpm test:unit     # Vitest (NÃO inclui tests/invariants/**)
pnpm test:db       # Postgres efêmero + baseline install/update + invariantes
pnpm test:e2e      # Playwright (requer dev server)

Estes checks são obrigatórios pra mergear na main. A lista abaixo já disse "quatro" e depois "cinco" — meça, não confie nela:

gh api repos/melgarafael/DeskcommCRM/branches/main/protection \
  --jq '.required_status_checks.contexts|join(", ")'
# em 2026-08-14: verify, build-and-size, invariants, e2e, imagens-ok
Check O que faz
verify typecheck + lint + lint:channels + test:unit + test:shell
invariants sobe um Postgres limpo, aplica o baseline.sql em modo install e depois em modo update — as duas passadas com ON_ERROR_STOP=1, que é o que torna a segunda uma prova de idempotência e não só um "terminou" —, e roda os invariantes de RBAC, atribuição, escopo, roteamento, follow-up, webhooks e automações
build-and-size pnpm build em Node 22
e2e sobe Supabase local, aplica o baseline.sql e roda pelo frontend todas as specs Playwright menos as que FORA_DO_CI declara
imagens-ok reprova quando qualquer uma das três imagens Docker (app, worker, scheduler) não constrói — é o artefato que o self-hoster instala

Quais specs ficam de fora é pergunta de comando, não de leitura — esta linha já afirmou que a única era vps-fresh-onboarding, e desde o PR #983 ela roda no CI:

git show origin/main:.github/workflows/e2e.yml | python3 -c "import sys,re; y=sys.stdin.read(); print(sorted({s for _,c in re.findall(r'(FORA_DO_CI):\s*>-\n((?:[ ]{8,}.*\n)+)',y) for s in re.findall(r'[a-z0-9-]+\.spec\.ts',c)}))"

vps-fresh-onboarding segue sendo a P0 da nossa doutrina de QA visual, porque a instalação fresca é o produto que se vende. Ter gate não dispensa a prova pela tela: gate prova que não regrediu, não que a experiência ficou boa.

Entre os invariantes está o teste de isolamento RLS: cria 2 organizações, simula os claims JWT pelo mesmo caminho auth.uid() / fn_user_org_ids() que as policies de produção usam, e prova que um usuário da org A enxerga zero linhas da org B em conversations, messages, contacts e crm_leads. Antes disso, um caso de controle prova que as linhas da org B realmente existem — sem ele, o teste passaria com a tabela vazia.


📚 Documentação

Doc O que tem
hostgator-setup-kit/README.md Instalação self-host — o kit, os scripts, as hospedagens com proxy próprio
docs/ATUALIZANDO.md Como atualizar sua instalação, em linguagem simples
VISION.md Visão e posicionamento — o que o projeto é, no que acredita e pra onde vai
CHANGELOG.md O que mudou em cada versão — leia a seção da versão antes de atualizar
docs/SETUP.md Setup de desenvolvimento, passo a passo de todas as integrações
docs/white-label.md Instalar para clientes — trocar a marca, uma instalação por cliente vs compartilhada, revenda
docs/runbooks/waha-hostgator.md Runbook de WAHA em produção (dimensionamento, recuperação)
docs/runbooks/deploy.md Deploy em produção
CLAUDE.md Convenções não-negociáveis (leitura obrigatória pra contribuir)
ARCHITECTURE.md Visão de 1 página da arquitetura
docs/index.md Índice dos 157 documentos, com regra de precedência
docs/prd/ · docs/specs/ PRDs e specs técnicas (schema SQL, payloads, MCP, governança)

🤝 Contribuindo

Esse projeto é open source pra comunidade. Toda contribuição é bem-vinda — desde fix de typo em doc até feature nova.

Antes de abrir PR:

  1. Leia CLAUDE.md (~5 min) — convenções não-negociáveis (multi-tenancy, RLS, audit, LGPD).
  2. Leia CONTRIBUTING.md — fluxo de branches, commits, epic-executor.
  3. Siga o Código de Conduta.

Fluxo curto:

git checkout -b feat/short-slug
# implementa + testes
pnpm typecheck && pnpm lint && pnpm lint:channels && pnpm test:unit && pnpm test:shell && pnpm build
pnpm test:db   # precisa de Docker — é o job `invariants`, obrigatório no merge
git commit -m "feat(escopo): descrição"
# abre PR — o template já traz o checklist de Definition of Done

Essas duas linhas são tudo o que dá para rodar na sua máquina, de propósito: rodar só metade e descobrir o resto como surpresa vermelha depois de horas de espera é a pior primeira experiência que este repositório sabe entregar.

Dois gates obrigatórios não cabem aí e só rodam no CI: o e2e (precisa de Supabase local) e o imagens-ok (constrói as três imagens Docker). Verde na sua máquina não é verde no merge.

Definition of Done: typecheck zero, lint zero, testes relevantes verdes, RLS testada se toca tabela tenant-aware, audit log emitido em mutações, migration versionada + apêndice no baseline.sql se muda schema (senão a mudança não chega em quem se auto-hospeda). Detalhes em CLAUDE.md.


🐛 Reportando bugs

Abra uma issue — o template pede o que precisamos (ambiente, /api/v1/health, steps). Rodar bash hostgator-setup-kit/healthcheck.sh e colar a saída ajuda muito.

Pra vulnerabilidades de segurança, NÃO abra issue pública — use o relato privado de vulnerabilidades. Detalhes em SECURITY.md.


🗺️ Roadmap

✅ Entregue

🔮 Próximo


💬 Comunidade


📜 Licença

Distribuído sob a licença MIT — veja LICENSE. Você pode usar, modificar e distribuir livremente, inclusive comercialmente. O software é fornecido "como está", sem garantias (ver cláusula de isenção no LICENSE).


🛟 Suporte & responsabilidades (self-host)

Este é um projeto self-host: cada pessoa roda o CRM na própria infraestrutura (VPS, banco Supabase e chave de IA próprios). Isso implica:


🙏 Agradecimentos


Built with ☕ in Brasil · Made for the community

Siga o desenvolvimento: Instagram · YouTube

DeskcommCRM (melgarafael/DeskcommCRM)

privacy-first
Searching Database…

What is this?An open-source AI sales OS: a self-hosted CRM where native AI agents answer, qualify and sell over WhatsApp. It's positioned as an open alternative to Kommo, Octadesk and Intercom for any business that sells by chat.
Is this a hosted SaaS I sign up for, or something I run on my own server?You host it yourself: the app runs on your VPS via Docker, with no monthly fee for the software and your data staying with you. A bundled setup kit installs the whole stack — app, WhatsApp connection and database.
How do I get it running?SSH into a VPS with Docker and run the installer from hostgator-setup-kit/: it asks only for your domain, keys and admin password, generates every secret itself, applies the database schema, creates the first admin and brings up the stack with automatic HTTPS. It's idempotent — re-running it breaks nothing.
What do I need to have ready before installing?A VPS with Docker (4 GB RAM recommended), a domain with an A record pointing to it, a free Supabase database (the installer can create the project for you if you export a SUPABASEACCESSTOKEN), one AI key — OpenRouter, Anthropic or OpenAI — and your WhatsApp number, connected by QR code during onboarding.
How does it connect to WhatsApp — the official API or something unofficial?Both routes exist: you connect your own number by scanning a QR code (via WAHA) during onboarding, or you use Meta's official channel instead.
It was born as an e-commerce CRM — will it fit a clinic or an agency?Yes — the core is multi-niche by design: pipeline vocabulary is configurable, so a lead becomes a Client, Patient or Buyer and 'won' becomes Paid, Scheduled or Closed. It now runs in clinics, real estate, infoproducts, agencies, stores and service businesses, with a native Nuvemshop integration for e-commerce.
Where does my customer data live?On your own VPS and in your own Supabase project. One caveat to plan for: Supabase's free plan doesn't back up automatically, so the README recommends scheduling backup.sh daily — update.sh does run a backup before every update.
What can the AI agents actually do beyond replying to messages?They operate the CRM: RAG per tenant, skills executed mid-conversation, sentiment analysis, follow-ups that revive cooling chats, funnel moves and audited AI-to-human handoff. The whole CRM is exposed via MCP, so an agent works as a first-class assignee — with a spending cap per organization.
Do the agents get better over time?Yes — resolved conversations turn into new knowledge, and an AI Evolution screen shows whether the agent is improving, where it errs and what's left to teach it. The agent also proposes improvements to itself, applied as a new version but always gated by a human.
How do updates work once it's installed?From the UI: a 'New version' marker lights up in the menu, and Settings → Update backs up the database, applies the release and rolls back on its own if a version ships broken. update.sh does the same from the terminal; both target tagged releases (v1.2.3 at the time of the README), never an untested main commit.
Can an AI coding assistant handle the setup for me?Yes — the repo ships skill guides that load into Claude Code, Codex, Cursor, OpenCode or Antigravity and walk the assistant through installing, onboarding a client, analyzing metrics or tuning the agent prompt (e.g. /deskcomm-instalar in Claude Code).
What are similar projects?LibreChat, ENZO, sim, lightspeed, hermes-agent, jevbox, os, QuantDinger
Size
299.3 MB
Stars
4.7K
Age
5mo
Commits · 90 Days