Arquitetura¶
Estrutura de alto nível da plataforma Brandvelia e como as peças se conectam.
Stack¶
| Camada | Tecnologia |
|---|---|
| App | Next.js, App Router, src/, Tailwind v4, shadcn/ui + Lucide |
| Linguagem | TypeScript, strict |
| Dados | Supabase (projeto panoptes, schema brandvelia), RLS + views |
| IA | OpenRouter via gateway interno server-only (packages/ai) |
| Integrações | packages/integrations — ClickBank (LinkBuilder/INS/QuickStats/Marketplace/Opportunity Score), Meta read-only |
| Tipos | packages/types — IDs nominais + schemas Zod + enums de domínio |
Domínios (workspaces)¶
Cada afiliado autenticado possui um workspace isolado (bv_workspace_id): um
conjunto de produtos (do ClickBank/LinkBuilder), métricas de tráfego, dados financeiros e
modelos de IA. O isolamento é garantido por RLS nas tabelas base — e forced RLS nas
tabelas do motor de decisão.
Fluxo de acesso a dados: tabela bv_* → view auto-atualizável public.bv_*
(security_invoker = true) → API REST. O RLS das tabelas base aplica-se na view, então
dados nunca vazam entre workspaces.
Fluxo de dados¶
Visitante Workspace do operador Supabase compartilhado
│ │ │
│ POST /api/track │ INSERT bv_visits │
│───────────────▶ ┌───▶│ (atribuição via click_id) │
│ └───▶│ (RLS por workspace_id) │
│ │ │
│ /api/radar │ CREATE / refresh │
│◀────┬────────────┬────│ produtos + opportunity score │
│ │ ClickBank │ │ (aditivo, brandvelia only)│
│ │ (API v2) │ │ │
│◀────┴─────────────┴───┤ linkbuilder → public.bv_offer
Fluxo do frontend¶
- Vision Board — captura a ideia de produto; gera URL de afiliado LinkBuilder → cria uma
BV_Offer(síncrona, persistida no Supabase). - Radar — consulta o ClickBank por produto; ranqueia com um Opportunity Score (
economics,gravityFit,funnelQuality,trafficFit,creativePotential,complianceScore) para revelar o que vale construir. - Ofertas — um dashboard por produto; analytics e métricas de settlement.
- Campanhas — roteamento de tráfego entre plataformas (Google, Meta, TikTok) com orçamentos e fases de decisão.
- Criativos — criativo gerado por IA por plataforma, público e tom.
- Landing Pages — destinos próprios orientados a métricas (preview + slug).
- Leads — captura → CRM → finanças → settlement.
- Finanças — P&L completo reconciliado contra o snapshot de marketplace (import CSV) e inputs de capital.
- Motor de Decisão — evidência → capital → cenários → recomendação SHADOW → decisão humana → fase de campanha.
Pipeline de IA¶
[componente copilot]
└─ [snapshot: workspace_id, transactions] → [invoca modelo: google/gemini-2.5-flash]
└─ resposta textual (cita valores calculados em SQL) → [aiRuns.log]
- Chaves de modelo são server-only; a fronteira requisição→provedor é isolada por funcionalidade (
AI_LINKER). - Toda execução é logada (
bv_ai_runs); o custo por chamada vem do registrobv_ai_models. - Nenhum provedor/modelo é chamado diretamente do client.
- Claims factuais passam pelo validador de evidência do Motor de Decisão.
Entrypoint de agente¶
fetch(api, {
headers: { "AI_Model": name, "AI_Tags": JSON.stringify(t), "Content-Type": "application/json" },
method: "POST",
});
Agendamento & limites de função (Vercel)¶
Verificado contra a documentação da Vercel em 2026-08-20 (limites dependem do plano — revalidar após qualquer mudança de plano):
| Preocupação | Hobby | Pro |
|---|---|---|
| Cron jobs por projeto | 100 | 100 |
| Frequência mínima de cron | 1× por dia (expressões mais frequentes falham o deploy) | 1× por minuto |
| Precisão do cron | por hora (±59 min) | por minuto |
| Duração máxima de função | 300 s (padrão e máximo) | 300 s padrão, até 800 s (1800 s beta) |
Consequências para a Brandvelia:
- Expressões cron são sempre UTC. No Hobby o
apps/web/vercel.jsontem SÓ jobs diários (qualquer*/Nfalha o deploy); a alta frequência roda no cron-job.org (console, grátis, até 60 exec/h — verdocs/INFRA.md):google-conversionsa cada 10 min,google-campaignsa cada 5 min, syncs ClickBank 2x/dia. Fallback manual em.github/workflows/cron.yml(CRON_SECRET+SITE_URL). - Rotas disparadas por cron carregam o user agent
vercel-cron/1.0e exigem bearerCRON_SECRET(defesa em profundidade). - Trabalhos em batch (upserts de feed, deletes de retenção) devem caber nos 300 s: escritas em chunks (500 linhas/batch) e deletes curtos apoiados por índice.
Status¶
- V1 (Feature Manager): funcionando (Vision Board, Radar, dashboard).
- V2: aba EXPERIMENT, gráficos, relatórios custom e dashboard financeiro completo em desenvolvimento.
- Motor de Decisão (fases 0–4): implementado em SHADOW — evidência, capital, cenários, recomendações, decisões humanas, fases, alertas e score v2.