Lalabase
티켓·문서·근무시간·고객대화를 한 곳에 모아 KI로 검색, 소프트웨어 기업 고객 프로젝트용, 오픈소스로 자체 서버·독일 클라우드에 배포
이발집 WhatsApp 상담, 즉시 응답·예약·대화 진입 시 자동 퇴장
Atendimento no WhatsApp para barbearia. Responde na hora, marca na agenda, e sai da frente quando você entra na conversa.
비즈니스TypeScript · PLpgSQLGitHub @Saymon0123온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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 finalREADME 전문 보기 ↗
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.