Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.