← Todos os projetos
02Produto próprio · 2026

Finance Web.

O dinheiro de famílias e empresas num sistema só, com o próprio banco separando uma organização da outra.

Multi-tenant com RLSIA sem número inventado~2 mil testes
Painel do Finance Web em modo escuro, com saldo, receitas, despesas e cartões
Contas do Finance Web no celular, com saldo e fatura do cartão

O problema

Retrabalho · Falta de indicadores

Uma família ou uma empresa pequena quer saber para onde vai o dinheiro sem espalhar contas, cartão e compras do mês por planilhas diferentes. Num SaaS em que várias organizações dividem o mesmo banco, basta um filtro esquecido numa consulta para o extrato de uma aparecer para a outra. E um resumo escrito por IA não pode errar valor, porque num relatório financeiro um número inventado é pior do que nenhum.

O que construí

Construí sozinho, da API ao front. Tem contas, categorias, transferências e recorrências. O cartão tem fatura aberta, fechada ou paga, parcelamento em até 48x e estorno. As listas de compras viram despesa, as notificações chegam em tempo real e todo mês a IA escreve um diagnóstico das finanças. A entrada é só por convite, com papéis de admin, gestor e membro, e quem opera o SaaS tem um console para suspender organizações e consultar a auditoria.

Decisões técnicas

  1. 01O banco separa as organizações

    Cada transação grava o id da organização com set_config, e as 12 policies de RLS do Postgres filtram tudo a partir dele. Organização suspensa abre a transação em modo somente leitura. Um teste garante que escrita fora dessa janela é recusada. Se alguém esquecer o filtro numa consulta, ela continua vendo só a própria organização.

    Onde está no código: apps/api/src/shared/tenancy/tenant.ts

  2. 02IA que não escreve número

    No diagnóstico mensal, o modelo não escreve valores. Ele usa referências como {{v:month.income}}, que apontam para o dado real, e um validador descarta qualquer valor que o modelo tenha inventado. O texto pode vir da IA, mas os números vêm do banco.

    Onde está no código: modules/ai/domain/prompt.ts · validator.ts

  3. 03O evento sai junto com a escrita

    Cada escrita grava o próprio evento numa tabela de outbox, na mesma transação. Se a escrita falha, o evento some com ela. Se ela confirma, a notificação sai. API, tempo real e worker rodam em processos separados.

  4. 04Monólito modular

    O código se divide em identity, finance, shopping, notifications e ai, e cada módulo tem as mesmas quatro camadas: domain, application, infra e http. Dá para achar qualquer regra sabendo só o módulo e a camada.

    Onde está no código: apps/api/src/modules/*

  5. 05Uma regra de permissão para API e tela

    As permissões ficam num pacote usado pela API e pelo front. O botão que a tela esconde e a rota que a API bloqueia saem da mesma regra.

    Onde está no código: packages/access

Números

214

commits, autor único

~2k

testes

19

migrações

~31

tabelas em 5 schemas

Stack

  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind 4
  • shadcn/ui
  • Recharts
  • Fastify 5
  • Zod 4
  • Drizzle
  • Better Auth
  • Socket.io
  • PostgreSQL 17
  • Redis 8
  • Vitest
  • Node 24

Telas

Faturas do cartão corporativo mês a mês, com compras parceladas
Lista de compras com itens marcados e o valor pago em cada um
Lançamentos do mês com filtros por conta, categoria e situação
Console da plataforma com as organizações e a situação de cada uma
Próximo case

AtendeLink