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。 以下为已保存的摘录。
STRONILEAD — CRM de leads para academias SaaS multi-tenant de gestão de leads (do lead à matrícula): pipeline Kanban, meta diária, agendamentos, ficha do lead com timeline e configurações por academia. Identidade visual STRONILEAD (azul #2B59FF + laranja #FF6A2B, Space Grotesk nos títulos, Geist no corpo).查看完整 README ↗
SaaS multi-tenant de gestão de leads (do lead à matrícula): pipeline Kanban,
meta diária, agendamentos, ficha do lead com timeline e configurações por
academia. Identidade visual STRONILEAD (azul #2B59FF + laranja #FF6A2B,
Space Grotesk nos títulos, Geist no corpo).
src/App.jsx. Cada tela tem endereço próprio, sem <Routes>:
a tabela de telas e a decisão de rota moram em src/lib/routes.js.api/ (Firebase Admin SDK).main). Regras do Firestore são
publicadas manualmente no console do Firebase.Cada academia é um tenant identificado por um slug (ex.: ironfit). O
isolamento é por custom claim no token do Firebase Auth — não por URL:
tenantId no token. O app resolve o tenant no login
(onAuthStateChanged) e usa appId = tenantId no path dos dados:
artifacts/{tenantId}/public/data/{coleção}.inTenant(appId) exige
request.auth.token.tenantId == appId. Não há vazamento entre tenants mesmo
com acesso direto ao Firestore.superAdmin: true e gerencia
todas as academias pela tela "Organizações".STRONILEAD (super-admin · claim superAdmin:true)
└── Tenant: Academia A (slug: academia-a)
├── Admin: [email protected] (claim tenantId=academia-a, role=admin)
│ ├── Consultor: [email protected] (role=consultant — vê só os próprios leads)
│ └── Consultor: [email protected]
└── Tenant: Academia B (slug: academia-b)
└── Admin: [email protected]
└── Consultor: [email protected]
api/ Funções serverless (Vercel) com Firebase Admin SDK
_firebaseAdmin.js Init do Admin + verifyRequest (verifica ID token)
_auth.js isTenantAdmin + veredito de tenancy do alvo pelo claim
(src/lib/tenantGuard.js) — nunca pelo doc de usuário
_tenantPrivate.js Perfil/WhatsApp do dono em /tenants/{id}/private/profile
(fora do doc raiz, que todo membro lê no login)
provision-tenant.js [super-admin] POST cria tenant+admin+seed · GET lista
tenant-status.js [super-admin] POST suspende/reativa + revoga tokens
invite-create.js [admin] cria convite (/tenants/{id}/invites)
invite-accept.js [público] aceita convite → cria conta + claim
admin-users.js [admin] cria, exclui, troca senha, e-mail e papel da equipe
... lista completa e fronteiras em docs/architecture.md
scripts/ Utilitários Admin (rodar fora do app)
set-super-admin.js Define claim superAdmin num usuário
register-tenant.js Registra um tenant legado na coleção `tenants`
backfill-tenant-claims.js Claim tenantId nos usuários DE UMA academia
(`<tenantId>` obrigatório; simula sem `--apply`)
migrate-tenant-private.js Move perfil/WhatsApp do dono para o subdoc privado
`/tenants/{id}/private/profile` (simula sem `--apply`)
src/
App.jsx Casca do app: login, menu, decisão de rota e telas
lib/routes.js Endereço de cada tela (tabela, leitura, links, decisão)
lib/tenantSlug.js Formato e palavras reservadas do identificador da academia
lib/appShell.js O que a casca do App tira do endereço e da sessão
lib/ firebase.js, leads.js, funnels.js, dates.js, constants.js, auth.js
firestore.rules Regras de isolamento por tenant (publicar manual)
npm install.env.example → .env.local e preencha (ver seção de variáveis).
O frontend funciona sem env (cai no projeto crm-stronix); a pasta api/
precisa das credenciais Admin para rodar localmente (vercel dev).npm run dev (Vite) — ou vercel dev para servir o front + as funções api/..env.example)VITE_FIREBASE_* — opcional (há fallback).FIREBASE_ADMIN_PROJECT_ID, FIREBASE_ADMIN_CLIENT_EMAIL,
FIREBASE_ADMIN_PRIVATE_KEY. No Vercel, configure em Environment Variables.Crie/escolha um usuário no Firebase Auth e defina o claim superAdmin:
FIREBASE_ADMIN_PROJECT_ID=... FIREBASE_ADMIN_CLIENT_EMAIL=... FIREBASE_ADMIN_PRIVATE_KEY="..." \
node scripts/set-super-admin.js [email protected]
Faça logout/login no app para o token pegar o claim. Você verá a aba "Organizações" no menu.
Pela UI (recomendado): logado como super-admin → Organizações → Nova
organização. Preencha nome, slug, dados do admin, plano e dias de teste.
O endpoint POST /api/provision-tenant:
[a-z0-9-], começando e terminando
com letra ou número, e fora das palavras reservadas de src/lib/tenantSlug.js,
que são as telas do app).tenantId.tenants/{slug} (status, plano, trial, settings).stronix_users.O admin acessa o app com o e-mail/senha definidos. 'Venda'/'Perda' são status
sentinela de conversão/perda — não renomeie.
POST /api/invite-create grava o convite em tenants/{id}/invites (token UUID,
validade 7 dias) e devolve um link: /?invite=<token>&t=<tenantId>.POST /api/invite-accept): conta criada, claim tenantId setado, login
automático.POST /api/tenant-status).
Ao suspender, os refresh tokens dos usuários são revogados (sessões caem).tenants/{id} no login: status: 'suspended' → tela de suspensão;
status: 'trial' com trialEndsAt vencido → tela de teste encerrado.main → Vercel faz o deploy de produção
(https://crm-stronix.vercel.app/).firestore.rules
no console do Firebase
(não via CLI). As mudanças de regra só valem após publicar.npm run dev — servidor de desenvolvimento (Vite)npm run build — build de produçãonpm run lint — ESLintnpm test — testes (Vitest)npm run verificar:sentry — confere que chave e telefone não vão ao Sentrynpm run preview — preview do buildMais documentação: PRODUCT.md (produto), AGENTS.md (comandos e acordos de
trabalho), docs/architecture.md, docs/design.md, docs/onboarding.md,
docs/quality.md e docs/setup.md.