Javis OS
Javis OS is an Agentic AI that assists entrepreneurs in business tasks, helping them grow their work.
AI translation
UpFlow CRM atende, qualifica e move o funil pelo WhatsApp com agentes de IA — tudo registrado e auditável. Planos sem cobrança por assento.
Translation pending
BusinessTypeScript · PLpgSQLGitHub @IvanliinsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
🛠️ 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. 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.Read the full README ↗
🇧🇷 Português · 🇺🇸 English · 🇪🇸 Español
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.
⚡ 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.)
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?— respondayes. É o servidor se apresentando pela primeira vez.
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.
| 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 |
| Seu número, conectado por QR code no onboarding (ou o canal oficial da Meta) |
O instalador também atende VPS ARM64/aarch64, como a Oracle Ampere A1, e escolhe a imagem
NOWEB oficial do WAHA compatível com essa arquitetura. Vale para os dois caminhos: com Supabase
externo e com o Supabase na mesma VPS (as imagens do Supabase self-hosted fixadas pelo kit também
são publicadas para linux/arm64). Nada é compilado na VPS.
💡 O Supabase pode ser criado pelo próprio instalador. Exporte um
SUPABASE_ACCESS_TOKENantes 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.
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:
supabase/baseline.sql).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.examplepara.env, preencha e rodebash hostgator-setup-kit/install.sh --yes.
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.
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.
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.
Saiu versão nova? Há dois caminhos, e o primeiro não exige terminal.
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.shdeixou 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.
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).
Deu ruim? Guarde a mensagem e peça ajuda. O restore.sh não volta o backup por cima do
banco em uso: ele só restaura num banco vazio (ver hostgator-setup-kit/README.md).
Quer só diagnosticar? bash hostgator-setup-kit/healthcheck.sh.
⚠️ Numa instalação antiga que ainda não tem o agente da tela, rode
update.shduas 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.
| 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.shno cron diariamente. Oupdate.shjá roda um backup antes de cada atualização.
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.shantes se precisar preservá-las.
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.
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.
| Grupo | Telas |
|---|---|
| Atendimento | Visão geral (o resumo do período: atendimentos, respostas da IA, vendas, leads e quem espera por você — a primeira tela de quem gere) · 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.
| 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 |
| 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, Requesty, 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.
⚠️ 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.
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
├── 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
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.
| 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 |
Esse projeto é open source pra comunidade. Toda contribuição é bem-vinda — desde fix de typo em doc até feature nova.
Antes de abrir PR:
CLAUDE.md (~5 min) — convenções não-negociáveis (multi-tenancy, RLS, audit, LGPD).CONTRIBUTING.md — fluxo de branches, commits, epic-executor.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.
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.
hostgator-setup-kit (app + WhatsApp + banco com 1 comando), baseline.sql auto-curativo, atualização pela tela com backup automático, runbook de produção.docs/specs/14).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).
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:
update.sh quando quiser), e manter/backup do seu servidor é com você.install.sh pergunta durante a instalação e respeita a
sua resposta; em modo não-interativo, sem SENTRY_DSN definido, a telemetria fica
desligada. Se você aceitar o Sentry da comunidade, o que é enviado são relatórios
de erro (stack trace) com CPF, telefone e e-mail substituídos, cabeçalhos sensíveis
removidos, e token de webhook/convite redigido da URL — sem rastreamento de
performance e sem replay de sessão contínuo, que ficam em 0 nesse caminho. Vai
junto do erro a gravação dos instantes que o antecederam, com texto e mídia mascarados,
as mesmas URLs redigidas e nenhuma gravação nas páginas com credencial na URL
(lib/sentry/replay.ts). Para desligar a
qualquer momento: SENTRY_DSN=off no .env. Para mandar ao seu Sentry (aí sim com
performance e replay): SENTRY_DSN=<seu-dsn>. O que é redigido, e por quê, está em
lib/sentry/scrub.ts; a resolução do DSN em
lib/sentry/dsn.ts.Built with ☕ in Brasil · Made for the community
| 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 geral da documentação, com a regra de precedência |
docs/handoffs/ | Diário dos épicos (HANDOFF*.md), com o índice em docs/handoffs/README.md |
docs/prd/ · docs/specs/ | PRDs e specs técnicas (schema SQL, payloads, MCP, governança) |