Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
SaaS para profissionais da beleza e clientes finais. O produto reúne agenda, catálogo, clientes, equipe, gestão operacional e uma experiência própria para a cliente. • Next.js 16 (App Router) + TypeScript • Tailwind CSS 4 + shadcn/ui • Supabase Auth + PostgreSQL + Row Level Security • Deploy previsto na Vercel • Node.js 22 ou superior Uma pessoa tem uma conta (auth.users + profiles). Capacidades são compostas: • client_profiles → área gratuita /cliente • workspaces + workspace_members → negócio / tenant • subscriptions pertencem ao workspace, não ao usuárioRead the full README ↗
SaaS para profissionais da beleza e clientes finais. O produto reúne agenda, catálogo, clientes, equipe, gestão operacional e uma experiência própria para a cliente.
Uma pessoa tem uma conta (auth.users + profiles). Capacidades são compostas:
client_profiles → área gratuita /clienteworkspaces + workspace_members → negócio / tenantsubscriptions pertencem ao workspace, não ao usuáriointended_use no cadastro é apenas roteamento inicial. Não é autorização.
| Rota | Acesso |
|---|---|
/ | pública |
/cadastro /login /verificar-email | autenticação |
/onboarding | e-mail confirmado, sem workspace |
/app | membro de workspace |
/app/agenda | agenda interna (dia/semana) |
/app/equipe | cadastro de profissionais da equipe |
/app/equipe/[member]/disponibilidade | jornada, pausas e bloqueios |
/app/servicos | catálogo de serviços do workspace |
/app/clientes | clientes internos do estabelecimento |
/app/estoque /app/pacotes | estoque e pacotes via RPC |
/app/financeiro /app/relatorios | visão financeira e indicadores dos agendamentos |
/app/avaliacoes | avaliações imutáveis (appointment_reviews) |
/cliente | client_profiles |
/cliente/agendamentos | próximos horários e histórico da cliente |
/cliente/avaliacoes | envio de avaliações de atendimentos concluídos |
/auth/callback /auth/confirm | troca de código / token de e-mail |
Rotas privadas são barradas no servidor (proxy + getUser() + RLS).
status = trialing, datas com clock_timestamp().professional_trial_claims impede trial extra após apagar/recriar.SECURITY DEFINER no schema app, com search_path vaziosubscriptions, workspace_members ou trialsha256(token)cp .env.example .env.local
npm ci
npm run dev
Variáveis:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=
NEXT_PUBLIC_SITE_URL=
Nunca coloque service role em NEXT_PUBLIC_*.
No dashboard do Supabase:
/auth/callback, /auth/confirm)npm run lint
npm run typecheck
npm run test
npm run build
npm run test:e2e
npm run test:e2e:staging
test:e2e sobe o build local com backend sintético (PASS LOCAL). Requer npm run build e Chromium do Playwright (npx playwright install chromium). Porta e evidências: AGENDE_E2E_PORT, AGENDE_E2E_EVIDENCE. Nunca aponta para produção.
test:e2e:staging só navega com AGENDE_STAGING_ACCEPTANCE + AGENDE_STAGING_ORIGIN autorizados. Sem isso, marca BLOQUEADO e sai 0. Detalhes: docs/homologation/e2e.md.
Migrations versionadas em supabase/migrations. Schema app não é exposto na Data API.
Não reescreva migrations já aplicadas no projeto remoto. Correções de banco entram em uma nova migration.
As migrations 20260927014947_launch_readiness_reviews e
20261008131859_launch_hardening_reviews_force_rls estão no Git e ainda não
constam do snapshot remoto de 27/09/2026. Validação e ordem de aplicação:
docs/migrations/launch-readiness-2026-10-08.md.
Não aplicar em produção sem revisão humana.
Os arquivos em supabase/tests/ são executáveis: falham com RAISE EXCEPTION se uma regra quebrar.
Requerem uma conexão privilegiada (postgres / service_role), porque criam usuários em auth.users.
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/helpers.sql
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/foundation.sql
O segundo arquivo imprime a lista de casos que passaram. Usuários de teste usam o domínio @agende-foundation.test e são removidos ao final (também em caso de falha).
Catálogo (equipe, serviços, clientes do estabelecimento):
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/helpers.sql
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/catalog.sql
Agenda (jornada, conflitos, snapshots e IDOR):
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/helpers.sql
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/agenda.sql
weekday 0–6 = domingo–sábado (EXTRACT(DOW) / Date.getDay()).app.product_timezone() e src/lib/time/timezone.ts (America/Sao_Paulo).EXCLUDE USING gist em appointments ativos + pg_advisory_xact_lock no profissional. cancelled e no_show não ocupam horário.price_cents e duration_minutes são snapshot; override de professional_services ganha do catálogo. O browser não define preço, duração nem ends_at.