Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Clínica — CRM para barbearias e salões CRM multi-tenant para barbearias e salões: agenda, clientes, financeiro (caixa/comanda/comissões), catálogo de produtos e serviços, equipe, assinatura e cobrança por uso, e atendimento por WhatsApp com agente de IA. • React + Vite + TypeScript • Tailwind CSS v4 • Supabase (Postgres + Auth + edge functions em Deno) • React Router • n8n, fora deste repositório, para tudo que fala com o cliente final檢視完整 README ↗
CRM multi-tenant para barbearias e salões: agenda, clientes, financeiro (caixa/comanda/comissões), catálogo de produtos e serviços, equipe, assinatura e cobrança por uso, e atendimento por WhatsApp com agente de IA.
O projeto nasceu como "clínica" e virou o Club Cut. Alguns nomes técnicos ficaram, de propósito, porque trocar custa mais do que explica:
Clinica), o pacote (clinica-crm) e o project_id do
Supabase local;asaas, que não fala com o Asaas: o pagamento é PIX pelo
AbacatePay (cobrar-uso e abacate-webhook).npm install
cp .env.example .env # preencher com as credenciais do projeto Supabase
npm run dev
Não há fallback para as credenciais do Supabase: sem VITE_SUPABASE_URL e
VITE_SUPABASE_ANON_KEY definidas, a aplicação falha ao iniciar em vez de
conectar silenciosamente no projeto errado.
npm run typecheck # tsc -b — cobre src/ e o vite.config.ts
npm run lint # oxlint
npm test # vitest — funções puras de src/ e de supabase/functions/_shared
npm run test:db # pgTAP — políticas de RLS (requer Docker)
npm run test:db sobe o Postgres local do Supabase, aplica as migrations e roda
supabase/tests/. É o único lugar onde o isolamento entre salões é verificado —
sem ele, uma regressão nas políticas de RLS passa despercebida.
O CI (.github/workflows/ci.yml) roda a cada push e PR e vai além dos dois:
| Job | O que faz |
|---|---|
| Typecheck, lint e testes de unidade | os quatro comandos acima, menos o test:db, mais deno check sobre as edge functions — que o tsc -b não alcança |
| Testes de RLS (pgTAP) | o test:db, contra um banco criado do zero |
| Segredos no codigo (gitleaks) | varre a árvore em busca de credencial commitada |
| Vulnerabilidade nas dependencias (npm audit) | não trava o merge de propósito: aviso novo nasce do mundo lá fora, não do PR |
O CodeQL roda à parte (.github/workflows/codeql.yml), na main e toda semana —
nunca em PR, porque achado dele precisa de triagem e viraria atraso.
src/
features/ # um diretório por módulo: agenda, clientes, financeiro, vendas,
# catalogo, equipe, rede, assinatura, whatsappWeb, site, auth,
# adminTool, entre outros
components/ # UI compartilhada (layout, cards, etc.)
lib/ # cliente Supabase e helpers
supabase/
migrations/ # o schema inteiro, em ordem; aplicadas À MÃO em produção
functions/ # edge functions em Deno; `_shared/` é o código comum entre elas
tests/ # pgTAP
As migrations não estão no pipeline de deploy: subir código não aplica migration. Quem aplica em produção é uma pessoa, à mão.
SPA React falando direto com o Postgres do Supabase — não há backend próprio.
A autorização mora inteiramente no banco, via RLS: toda tabela do schema
public tem RLS habilitado, com políticas por papel (dono da rede / gerente /
barbeiro). Não é uma contagem que envelhece: é um invariante, e quebrá-lo é
regressão. As políticas foram crescendo desde a 0002 e hoje estão espalhadas
por dezenas de migrations.
As edge functions cobrem o que RLS não alcança: criação de salão e de unidade,
convite de equipe, a agenda pública (que atende quem não tem login), o webhook
do WhatsApp, a cobrança por uso e o webhook do pagamento. Todas passam por
_shared/sentry.ts, que captura o erro e fecha cada requisição com uma linha de
log dizendo função, status, duração e de qual barbearia ela era.
Cada módulo em src/features/ segue a mesma forma: XPage.tsx + modais +
types.ts + um hook useXData.ts que concentra o acesso ao Supabase. O escopo
multi-tenant vem de useSalon() (src/features/auth/), do qual todas as
páginas dependem.
Este repositório é uma de cinco peças — CRM, Supabase, Vercel, GitHub e n8n.
Nenhuma automação que fale com o cliente final existe sem passar pelo n8n. O
CLAUDE.md explica por que isso está escrito em todo lugar.
Em produção. Módulos implementados: agenda, clientes (com importação CSV), financeiro (caixa, comandas, comissões, metas), vendas, catálogo, equipe e convites, rede/multi-unidade, agenda pública, assinatura e cobrança por uso, e atendimento WhatsApp com agente de IA.
A integração com o n8n é descrita em docs/n8n-integration.md. O que está aberto mora em docs/backlog.md.
Pendências conhecidas:
service_role, que ignora RLS. O filtro por
salon_id depende inteiramente do fluxo externo; o banco não protege contra
gravação no salão errado.deno check do CI garante que
elas compilam; que elas fazem a coisa certa, ninguém verifica automaticamente.