SaaS sob medida · plataforma multi-tenant
Milsaca

Problema
Um setor inteiro rodava no improviso entre planilhas e WhatsApp, sem um sistema único.
Solução
SaaS multi-tenant (web + mobile) com painéis por papel, automações e dados seguros (RLS). Prova de que entrego produto complexo de ponta a ponta.
SaaS em desenvolvimento ativo.
Como foi construído
Monorepo Turborepo + pnpm com três frentes num só backend: Next.js 16 (App Router) pro web, que sozinho já cobre três painéis (produtor, corretora e admin da plataforma), e Expo Router pro app mobile do produtor. Web e mobile falam com o mesmo Supabase através de um pacote compartilhado (@milsaca/db) com três camadas de client: uma com cookie de sessão pro server, uma sem cookie (só a chave pública) pra rotas com cache, e uma com secure-store pro mobile.
Multi-tenant de verdade, não só "filtro no WHERE": toda tabela do schema público tem Row Level Security habilitada, sem exceção, com isolamento por corretora_id garantido no banco, não na aplicação. Papéis (produtor/corretora/admin) vivem num array na tabela de perfil, permitindo o mesmo e-mail acumular mais de um papel; o admin da plataforma fica numa tabela própria, fora do enum de papéis, pra não vazar por engano num RLS mal escrito.
A decisão de autenticação é um bom exemplo de aprender com o próprio produto: começou com magic link e foi trocada por OTP de 6 dígitos por e-mail, porque o Gmail Safe Links faz prefetch automático do link (pra escanear por segurança) e acaba "queimando" o token de uso único antes do usuário clicar. É um bug sutil que só aparece em produção, com e-mails reais.
O diferencial de domínio é a classificação COB (Instrução Normativa MAPA nº 8/2003): a lógica de tipos, defeitos, peneira e bebida do café cru foi extraída pra um pacote puro (@milsaca/cob), sem dependência de runtime, testável isoladamente. O laudo gerado tem PDF com QR code e uma página pública de verificação, dando ao produtor algo que hoje é feito no papel ou de cabeça.
Multi-tenant via RLS
Isolamento por corretora_id garantido no banco, não na aplicação. RLS em toda tabela.
Laudo COB digital
Motor de classificação da IN 8/2003 (MAPA) em pacote puro, com PDF + QR de verificação pública.
Cotações ao vivo
CEPEA, ICE NY Coffee C e PTAX (BCB) sincronizados via edge function agendada.
Web + mobile, um backend
Next.js 16 e Expo Router compartilhando o mesmo Supabase por um pacote de clients em camadas.
Mais telas
Stack
- Next.js
- Expo
- Supabase
- PostgreSQL
- TypeScript


