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.
Translation pending
Gerenciar clientes e imóveis com CRM imobiliário
Translation pending
AI summary · README
BusinessTypeScript · PLpgSQLGitHub @mrobertzenithOnlineOwner 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.
CRM por workflow para corretores de imóveis (produto by Navis). Kanban de imóveis e clientes, motor de matching com score ponderado, gestão de equipe com papéis, autenticação e banco de dados reais. O frontend fala diretamente com o Supabase via SDK — não há servidor de aplicação próprio para manter no ar. Decisões de arquitetura registradas em MIGRACAO.md (histórico da migração mockup → produção). Destaques:Read the full README ↗
CRM por workflow para corretores de imóveis (produto by Navis). Kanban de imóveis e clientes, motor de matching com score ponderado, gestão de equipe com papéis, autenticação e banco de dados reais.
Produção: https://navis-crm.vercel.app
O frontend fala diretamente com o Supabase via SDK — não há servidor de aplicação próprio para manter no ar.
flowchart LR
subgraph client["Navegador do corretor"]
UI["React SPA<br/>Vite · TanStack Query · Zustand"]
end
subgraph vercel["Vercel"]
CDN["Build estático + CDN<br/>deploy automático a cada push"]
end
subgraph supabase["Supabase (São Paulo)"]
AUTH["Auth<br/>login por corretor"]
API["PostgREST<br/>API automática com RLS"]
FN["Edge Functions<br/>'equipe' (convites/papéis) · 'matching' (score) · 'ranking-corretores' (admin) · 'link-preview' (capa do anúncio)"]
DB[("Postgres<br/>14 tabelas · 5 migrações")]
end
SENTRY["Sentry<br/>erros de produção"]
RESEND["Resend<br/>SMTP de e-mails de auth"]
UI --> CDN
UI -->|supabase-js| AUTH
UI -->|supabase-js| API
UI -->|supabase-js| FN
API --> DB
FN --> DB
AUTH -.-> RESEND
UI -.->|erros| SENTRY
Decisões de arquitetura registradas em MIGRACAO.md (histórico da migração mockup → produção). Destaques:
domain/normalizacao.ts
reconhece o mesmo bairro escrito de formas diferentes ("Jardim Botânico" = "Jd. Botanico"
= "jd botanico"; "Olhos d'Água" = "Olhos dagua"). Os cadastros ainda sugerem os nomes já
usados pela equipe, para a base não se encher de variações.corretores; escrita em corretores e exclusões são exclusivas de admin;
corretor suspenso é banido do login e perde acesso aos dados..env.local, o app roda 100% offline (MSW + localStorage) —
útil para desenvolvimento e testes.flowchart TD
A["Admin abre Equipe → Adicionar corretor"] --> B{"Como?"}
B -->|"Convite por e-mail"| C["Edge Function cria conta<br/>e envia link via Resend"]
C --> D["Corretor clica no link →<br/>página Criar sua senha"]
B -->|"Senha provisória"| E["Edge Function gera senha forte;<br/>admin envia por WhatsApp"]
D --> F["Sessão ativa"]
E --> F
G["Login com e-mail e senha"] --> F
F --> H{"E-mail existe em corretores<br/>e status ≠ suspenso?"}
H -->|sim| I["App libera; RLS libera os dados"]
H -->|não| J["Desconectado — sem acesso"]
flowchart LR
a["Novo"] --> b["Análise e Estudo"] --> c["Produção"] --> d["Publicado"]
d -->|"gate: exige cliente vinculado"| e["Em negociação"] --> f["Vendido"]
flowchart LR
1["Novo Cliente"] --> 2["Em contato"] --> 3["Visita agendada"]
3 -->|"gate: exige imóveis da negociação"| 4["Em negociação"] --> 5["Negócio Fechado"] --> 6["Finalizado"]
2 -.-> 7["Standby"]
2 -.-> 8["Perdidos"]
As transições têm gates (validações por etapa em src/domain/gatesImovel.ts e
gatesLead.ts). O matching (src/domain/matching.ts) cruza o perfil de busca de cada
cliente com os imóveis e calcula um score 0–100 com pesos configuráveis por corretor.
Os diferenciais têm duas naturezas: a lista padrão (elevador, mobiliado, lazer…) pesa no score; os diferenciais livres, escritos pelo corretor, não entram no cálculo — cada um usa seus próprios termos — mas aparecem no detalhe do imóvel e são sugeridos aos colegas.
npm install
npm run dev
.env.local → modo mock: dados fictícios no navegador, sem login (útil pra
desenvolver offline)..env.local → banco real + login obrigatório:VITE_SUPABASE_URL=https://<projeto>.supabase.co
VITE_SUPABASE_ANON_KEY=<anon key>
VITE_SENTRY_DSN=<dsn> # opcional
| Comando | O quê |
|---|---|
npm run dev | servidor de desenvolvimento |
npm run build | typecheck + build de produção |
npm test | testes (vitest) |
npm run lint | eslint |
npx vite-node scripts/seed.ts --confirmar | carga dos dados de demonstração num banco novo (usa SUPABASE_SERVICE_ROLE_KEY, nunca a anon key — RLS exige dono/admin pra escrever) |
npx supabase db push | aplica migrações pendentes no banco remoto |
npx supabase functions deploy equipe | publica a Edge Function de gestão de equipe |
npx supabase functions deploy matching | publica a Edge Function que calcula os contadores/drill-down de match |
npx supabase functions deploy ranking-corretores | publica a Edge Function do ranking (admin-only) |
npx supabase functions deploy link-preview | publica a Edge Function que busca a imagem de capa (og:image) de um link de anúncio |
npx supabase migration list | confere paridade migrações local × remoto |
Automático: push na main → Vercel builda e publica. Variáveis de ambiente ficam em
Vercel → Settings → Environments → Production. Migrações de banco são aplicadas manualmente
via npx supabase db push (exige CLI logado e senha do banco).
src/
app/ rotas, layout, guardas (RequireAuth/RequireAdmin)
components/ UI por domínio (imovel, lead, kanban, match, equipe…)
domain/ tipos, etapas, gates e motor de matching (puro, testado)
hooks/ TanStack Query — fala com Supabase (ou MSW no modo mock)
lib/ supabase, mapeadores snake↔camel, sentry, formatação
mocks/ modo demonstração (MSW + localStorage) e dados de seed
pages/ telas
stores/ zustand (auth, notificações, score, ui)
supabase/
migrations/ schema versionado (fonte da verdade do banco)
functions/ Edge Functions 'equipe' (service role; cria/gerencia contas),
'matching' (JWT de quem chama; contadores e drill-down de match) e
'ranking-corretores' (JWT + checagem de papel admin) e
'link-preview' (JWT; busca a og:image de um link, com proteção SSRF)
scripts/seed.ts dados de demonstração
Convidar corretor (e-mail ou senha provisória) · promover/rebaixar admin · desativar/reativar · redefinir senha · excluir convite não usado. Travas: ninguém desativa a si mesmo nem remove o próprio papel de admin (o sistema nunca fica sem administrador).
E-mails de convite/redefinição usam Resend. Sem domínio verificado, entregam apenas para o e-mail do dono da conta Resend — para a equipe real, verificar um domínio próprio no Resend.