Plataforma de inteligência financeira da Norma Contábil — DRE gerencial, insights automáticos e forecast.
- Next.js 15 (App Router, RSC, Server Actions)
- TypeScript com
strict+noUncheckedIndexedAccess - Tailwind CSS + Shadcn UI
- Supabase (Postgres, Auth, RLS)
- Zod para validação
- TanStack Query para data fetching no client
- pnpm como gerenciador de pacotes
Feature-based + DDD light. Cada feature em src/features/<dominio>/ com as camadas:
domain/ # Entidades, value objects — sem dependências externas
application/ # Use cases, server actions, contratos
infrastructure/ # Adapters (Supabase, APIs)
presentation/ # Componentes React, hooks, forms
index.ts # Barrel — único ponto de entrada público
Multi-tenant por organização. Isolamento garantido por Row Level Security no Postgres — não confiamos em filtros de aplicação.
Veja docs/architecture.md para os detalhes.
- Node.js 20+
- pnpm 11+ (
npm install -g pnpmoucorepack enable pnpm) - Conta no Supabase (free tier serve para começar)
- (Opcional, recomendado) Supabase CLI para rodar o stack local
pnpm installcp .env.example .env.localPreencha:
NEXT_PUBLIC_SUPABASE_URL— URL do projeto SupabaseNEXT_PUBLIC_SUPABASE_ANON_KEY— anon key (públicas, ok no browser)SUPABASE_SERVICE_ROLE_KEY— service role key (NUNCA commitar, NUNCA expor no client)
Com a Supabase CLI:
supabase link --project-ref <seu-project-ref>
supabase db pushOu rode o stack local:
supabase start
supabase db reset # aplica migrations + seedpnpm db:typesIsso atualiza src/shared/types/database.types.ts a partir do schema vigente.
pnpm devApp em http://localhost:3000.
| Comando | O que faz |
|---|---|
pnpm dev |
Dev server com Turbopack |
pnpm build |
Build de produção |
pnpm start |
Server de produção |
pnpm lint |
ESLint |
pnpm typecheck |
tsc --noEmit |
pnpm format |
Prettier (write) |
pnpm format:check |
Prettier (check) |
pnpm db:types |
Regenera tipos TS a partir do schema Supabase |
.
├── src/
│ ├── app/ # App Router (rotas)
│ │ ├── (public)/ # Landing pública
│ │ ├── (auth)/ # Login, signup, callback
│ │ ├── (app)/ # Área autenticada
│ │ └── api/
│ ├── features/ # Módulos verticais
│ │ ├── auth/
│ │ ├── organizations/
│ │ ├── dre/
│ │ ├── forecast/
│ │ └── insights/
│ ├── shared/
│ │ ├── components/ui/ # Shadcn UI
│ │ ├── components/layout/ # Shell, sidebar, header
│ │ ├── supabase/ # Clients (server/browser/middleware/admin)
│ │ ├── money/ # Value object Money (bigint-based)
│ │ ├── errors/ # AppError, ValidationError, …
│ │ ├── config/env.ts # Env vars validadas com Zod
│ │ ├── lib/ # utils, Result type
│ │ ├── hooks/
│ │ └── types/
│ └── middleware.ts # Refresh de sessão + gate de rotas
├── supabase/
│ ├── config.toml # Config local (CLI)
│ ├── migrations/ # SQL migrations
│ └── seed/ # Seed local opcional
├── docs/
│ └── architecture.md
├── public/
└── README.md
- Server-first. Use Server Components por padrão. Client Components só quando precisar de interatividade.
- RLS é a primeira linha de defesa. Filtros de aplicação são reforço, não substituto.
Moneyem todo valor financeiro. Float é proibido. Aritmética em bigint (centavos).- Server Actions validadas com Zod. Toda entrada do usuário passa por schema antes de tocar a infra.
- Errors tipados. Use
AppErrore subclasses; mapeie para HTTP no boundary. - Features fechadas pelo
index.ts. Nada de imports atravessando camadas internas de outra feature.
© Norma Contábil