Plataforma de Open Banking e Open Insurance do Brasil. 16 modulos distribuiveis, compliance FAPI 1.0 Advanced, venda de codigo-fonte + SaaS.
Todas as tecnologias sao open source. A stack e unificada para todo o monorepo.
| Camada | Tecnologia | Justificativa |
|---|---|---|
| Linguagem | TypeScript (Deno) | Full-stack, tipagem estatica, ESM nativo |
| API Framework | Hono | Web framework leve para Deno/Edge, middleware nativo |
| Monorepo | Turborepo + pnpm | Builds incrementais, cache, workspaces nativos |
| Database | Supabase (PostgreSQL 15) | pgmq, pg_cron, Vault, Realtime, Edge Functions |
| Auth Server | Keycloak | Unico OSS certificado FAPI Brasil. PS256, mTLS, DCR |
| Gateway | Kong | mTLS termination, rate limiting, audit |
| Frontend Admin | Vite + React + shadcn/ui | SPA estatico, Tailwind CSS, Recharts, TanStack Table |
| Validation | Zod 4 | SSOT para tipos, validacao e OpenAPI |
| Error Handling | neverthrow | Result pattern — zero throw |
| Logging | LogTape | Structured logging para Deno |
| Observabilidade | OpenTelemetry → Grafana | OTEL Collector vendor-neutral |
| Testes | Vitest + Pact + Playwright | Unit, integration, contract, E2E |
| CI/CD | GitHub Actions | Turborepo Remote Cache, builds seletivos |
| IaC | Terraform | Supabase, Cloudflare, Keycloak, GitHub |
| Versionamento | Changesets | Semver por pacote, CHANGELOG auto-gerado |
| Pre-commit | Lefthook | deno-fmt → deno-lint → deno-check → test affected |
| API Docs | Scalar (OpenAPI) | Portal interativo gerado dos schemas Zod |
16 modulos distribuiveis organizados por papel regulatorio x dominio x foco. Cada modulo e um vertical slice autonomo.
Instancia unica Supabase + schemas declarativos por modulo. DDL em supabase/schemas/, RLS/grants em supabase/migrations/.
audit_log token_cache rate_limits
consents consent_resources consent_audit
channels products participants
customers accounts transactions credit_cards credit_card_bills credit_operations received_consents exposure_configs consumption_metrics ingestion_metrics
policyholders policies claims premiums pension_plans received_consents exposure_configs consumption_metrics ingestion_metrics
dcr_registrations holder_tokens aggregated_data payment_initiations
dcr_registrations holder_tokens aggregated_insurance premium_initiations
connections accounts transactions credit_cards payments institutions
connections policyholders policies claims premiums pension_plans insurers
events consent_funnel_metrics connection_health payment_metrics ingestion_metrics reports audit_log
Fail-closed por padrao. Compliance nao e opcional.
Certificados ICP-Brasil para comunicacao com IFs. Certificados de transporte para DCR.
Tokens assinados com PS256. Qualquer token RS256 e rejeitado automaticamente.
x-fapi-interaction-id, x-fapi-auth-date, x-fapi-customer-ip-address obrigatorios.
Row Level Security em todas as tabelas de usuario. CPF, CNPJ, PIX keys encriptados com pgcrypto.
CPF, CNPJ, tokens, senhas, chaves PIX, numeros de conta nunca sao logados.
Pushed Authorization Request com PKCE para consent. Dynamic Client Registration com certificado.
Violacoes bloqueiam merge. Sem excecoes.
throw — usar Result pattern (neverthrow): ok() / err()console.log — usar LogTape structured loggingany — usar unknown + validacao Zod@ts-ignore — corrigir o tipo! — usar ?. + ??parseJsonBody() retornando Result--no-verify — corrigir o problema, nao bypassar hooksz.infer<typeof Schema> apenas| Elemento | Max Linhas |
|---|---|
| Funcao / metodo | 25 |
| Route handler | 15 |
| Service class | 300 |
| Repository class | 200 |
| Arquivo | 400 |
| Schema file | 300 |
| Complexidade ciclomatica / fn | 5 |
| Nesting depth | 2 |
| Parametros / fn | 3 |
Piramide de 4 niveis. 100% dos testes sao entregues junto ao produto.
Vitest
Logica isolada, sem I/O. Co-localizados com source. *.test.ts
Vitest + Supabase local
Banco real. Apenas cenarios nao cobertos por unit (upsert, pgmq, pg_cron). *.integration.test.ts
Pact (consumer-driven)
Contratos com APIs das IFs + schema validation Zod para APIs proprias.
Playwright
Smoke tests do dashboard admin e fluxos criticos. Apenas happy path.
| Modulo | Branch | Line |
|---|---|---|
| core | 90% | 95% |
| regulatory-* | 85% | 90% |
| power-* | 80% | 85% |
GitHub Actions + Turborepo + Supabase Preview Branches. Trunk-based development.
supabase start
Docker local (~7 containers)
Supabase Preview Branch
Automatico por PR
Supabase Cloud separado
Validacao pre-prod
Supabase Cloud + Cloudflare
Deploy automatico
Projetos, secrets, configuracao de Edge Functions
Pages, DNS, dominios customizados, WAF
Realm FAPI, clients, roles, identity providers
Branch protection, secrets, environments
Data sources, dashboards, alert rules
Modulos reutilizaveis por ambiente (staging/prod). State remoto.
Dois fluxos principais: Receiver (agrega dados de IFs externas) e Holder (ingesta dados internos).
1. Cliente chama: POST /power/v1/connections { institutionId }
2. power-receiver-banking-data → chama IDCRManager.register()
do regulatory-receiver-banking-data (in-process, zero latencia)
3. regulatory faz DCR na IF via FAPI (mTLS, PS256)
persiste no schema regulatory_receiver_banking
4. power normaliza o resultado, cria Connection
no schema power_receiver_banking
5. power inicia sync: chama IDataFetcher.fetchAccounts()
6. regulatory busca dados raw da IF via FAPI
7. power normaliza → grava em power_receiver_banking
(formato unificado, independente da IF)
8. Cliente consulta: GET /power/v1/accounts
(dados normalizados, paginacao consistente)
1. Sistema interno chama: POST /holder/v1/ingestion/customers
(Keycloak Bearer token, sem FAPI)
2. regulatory-holder-banking-data valida payload (Zod)
normaliza dados, persiste no schema regulatory_holder_banking
3. Emite evento: ingestion.completed
(consumido por power-admin para metricas)
4. IF Receiver chama: GET /open-banking/v1/customers
(API regulatoria, FAPI mTLS + PS256)
5. regulatory valida consent, aplica RLS
le dados do mesmo schema regulatory_holder_banking
6. Formata conforme spec oficial e responde a IF Receiver
Todos os modulos emitem eventos tipados via IEventBus (core)
↓
consent.created | connection.synced | payment.completed | ingestion.completed
↓
power-admin consome eventos, persiste em power_admin.events (append-only)
↓
pg_cron jobs computam metricas incrementais (hourly, 5min, daily)
↓
Dashboard SPA (Vite + React) le via API → Consent Funnel, Connection Health, etc.
Imports cross-module sao BLOQUEADOS. Comunicacao cross-module via IEventBus.
PERMITIDO
./ → imports locais ao modulo
@finnest/core → infraestrutura (EventBus, retry, mTLS)
@finnest/{mesmo-dominio-data} → intra-dominio: payments → data (unidirecional)
BLOQUEADO
@finnest/{outro-modulo}/ → cross-module NUNCA
banking ↔ insurance → cross-dominio NUNCA
holder ↔ receiver → cross-role NUNCA
power → regulatory (tabelas) → "codigo sim, banco nao"
CORE
Entra no core SOMENTE se:
(a) e infraestrutura E (b) usado por 3+ modulos E (c) zero logica de negocio
~3.000 linhas maximo
8 ADRs definem toda a arquitetura. Conflitos entre constituicao e ADR sao resolvidos atualizando ambos.
Turborepo + pnpm workspaces. Venda modular nativa via script de empacotamento. 16 modulos em modules/. Deploy por namespace K8s.
Instancia unica + schemas declarativos por modulo. DDL como source of truth. RLS/grants em migrations manuais. Seed modular.
Modulos power in-process com schemas proprios. API simplificada (Bearer token, paginacao, webhooks). Enrichment e normalizacao cross-IF.
Holders separados em -data e -payments por dominio. Ingestao absorvida no regulatory. Duas areas de rotas: interna (Keycloak) e FAPI (mTLS).
Modulo transversal baseado em eventos. Consent funnel, connection health, payment metrics, ingestion health, audit. Frontend Vite + React SPA.
Piramide de 4 niveis: Unit (Vitest) → Integration (DB real) → Contract (Pact) → E2E (Playwright). 100% dos testes entregues ao cliente.
9 dimensoes: vertical slice, error handling, Zod SSOT, seguranca, code quality, database, git, quality gates, OpenAPI pipeline.
GitHub Actions + Turborepo + Supabase Preview Branches. Deploy SaaS em Supabase Cloud + Cloudflare Pages. Terraform para IaC. Changesets para versionamento.
Codigo-fonte (R$80-100k) + SaaS. Modulos power sao add-ons (+40-50%). Empacotamento via script.
Sem add-ons Power para holders — tudo incluido.
Power modules sao add-ons (+40-50% de ticket).