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
O Agendê organiza o seu negócio de beleza enquanto os clientes marcam horário sozinhos. 7 dias grátis, sem cartão.
Translation pending
BusinessTypeScript · JavaScriptGitHub @plbr010OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
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.