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


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
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
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
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.
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/*
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




AtendeLink