Team Desk.
A operação inteira de uma rede de franquias num sistema só, com cada pessoa vendo só o que é dela.


O problema
Falta de indicadores · Retrabalho
Uma franqueadora precisa padronizar várias unidades e saber o que acontece em cada uma, sem planilha nem grupo de WhatsApp. Dono, consultor, franqueado, gerente e colaborador veem e fazem coisas diferentes, e nada pode vazar de uma unidade para outra.
O que construí
Construí o produto inteiro, do PRD ao deploy. O SLA conta horas úteis e escala sozinho. Inspeção enviada a mais de 200 metros da unidade vai para revisão. Cada item "não conforme" vira um plano 5W2H com prazo de 7 dias. Lead aprovado vira unidade, com chat e projeto de implantação criados na mesma transação. O cronograma recalcula o caminho crítico toda noite, e a universidade corporativa emite certificado com página pública de verificação.
Decisões técnicas
01Auditoria que nem a aplicação consegue apagar
A tabela de auditoria é particionada por mês, e a role do banco que a aplicação usa não tem UPDATE, DELETE nem TRUNCATE nela. Um bug, ou alguém com acesso ao app, não reescreve o histórico.
Onde está no código: drizzle/0002_audit_partition_grants.sql
02Webhooks assinados e protegidos contra SSRF
Cada entrega leva HMAC-SHA256 sobre timestamp e corpo cru, tenta 6 vezes com backoff e desativa o endpoint depois de 10 falhas. Antes de chamar a URL do cliente, uma resolução de DNS própria recusa faixas de rede privada.
Onde está no código: lib/webhooks/signature.ts · url.ts · deliver.ts
03API pública que aguenta retry
Todo POST exige Idempotency-Key, a paginação é por cursor, o limite é de 300 requisições por minuto e o contrato sai em OpenAPI 3.0. Cliente que repete a chamada não cria nada em dobro.
Onde está no código: lib/api/idempotency.ts · openapi.ts
04Três processos, um domínio
Web (Next), workers (BullMQ) e tempo real (Socket.io com adapter Redis) rodam separados sobre o mesmo código de domínio. Job pesado não trava a tela de ninguém.
05Testes contra banco de verdade
Cerca de 2.050 testes Vitest e 85 E2E. Os de integração rodam contra Postgres e Redis reais, e o CI ainda confere se as migrações batem com o schema. Upload confere os magic bytes do arquivo, e rich text fica guardado como JSON validado, nunca como HTML.
Números
552
commits, autor único
~2k
testes Vitest
85
testes E2E
61
tabelas
55
páginas
13
eventos de webhook
Stack
- Next.js 15
- React 19
- TypeScript
- Tailwind 4
- shadcn/ui
- Better Auth
- PostgreSQL 16
- Drizzle
- Redis
- BullMQ
- Socket.io
- S3
- Vitest
- Playwright
- Docker
Telas



Finance Web