尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Protótipo funcional de um SaaS multi-tenant de contabilidade (Diário, Plano de Contas, Razões, Balancete) e análise de carteira de investimentos (índices de risco/concentração, agenda de vencimentos com alertas), com um assistente de IA ("CFO de Bolso") que responde perguntas com base nos dados da própria organização — nunca de outra.
Construído com Next.js 16 (App Router, Server Actions) + Supabase (Postgres + Auth + Row Level Security). O isolamento entre clientes (tenants) é garantido no banco de dados, não só na aplicação — ver seção Segurança e RLS abaixo.
app/
(auth)/ login, signup, criação de organização
(app)/ área logada: dashboard, diario, plano-de-contas,
razoes, balancete, carteira, vencimentos, cfo-bolso
api/cfo-bolso/ rota do chat (usa client com RLS do usuário, nunca service role)
api/cron/ job de alertas de vencimento (usa service role, protegido por CRON_SECRET)
privacidade/, termos/ páginas públicas
lib/
supabase/ clients (browser, server, admin) + middleware de sessão
accounting/ queries de saldo/razão (via views SQL)
portfolio/ cálculo de índices de carteira (HHI, ROA, K estimado etc.)
cfo-bolso/ montagem do contexto financeiro enviado ao modelo
org.ts resolução de organização atual + papel do usuário
supabase/
migrations/0001_schema.sql schema completo com RLS (rode isto no seu projeto Supabase)
scripts/
seed.mjs popula uma organização de EXEMPLO com dados fictícios
Em https://supabase.com/dashboard, crie um novo projeto. Anote a Project URL, a anon key e a service_role key (Project Settings → API).
No SQL Editor do painel do Supabase, cole e rode o conteúdo de
supabase/migrations/0001_schema.sql. Isso cria todas as tabelas, funções,
triggers e políticas de RLS. (Alternativamente, use a Supabase CLI:
supabase db push apontando para este diretório de migrations.)
cp .env.local.example .env.local
Preencha NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY e
SUPABASE_SERVICE_ROLE_KEY com os valores do seu projeto. ANTHROPIC_API_KEY
é opcional (sem ela, o CFO de Bolso funciona em modo demo, mostrando o
contexto que seria enviado ao modelo). CRON_SECRET é um valor aleatório seu.
npm install
npm run dev
Acesse http://localhost:3000, crie uma conta em /signup e depois crie sua
organização em /signup/organizacao.
NEXT_PUBLIC_SUPABASE_URL=... SUPABASE_SERVICE_ROLE_KEY=... \
node scripts/seed.mjs [email protected] "SuaSenha123!"
Isso cria (ou reaproveita) o usuário informado e uma organização "Exemplo Holdings Ltd" com plano de contas, lançamentos, ativos e configuração de alerta já preenchidos, com números fictícios/redondos.
.env.local
nas configurações do projeto.GET https://seu-dominio/api/cron/vencimentos periodicamente (sugestão:
a cada hora), enviando o header Authorization: Bearer <CRON_SECRET>.
A rota hoje conta quantos alertas disparariam; plugue seu provedor de
push/e-mail no ponto marcado com TODO em
app/api/cron/vencimentos/route.ts.Antes de escrever qualquer código de UI, o schema SQL (supabase/migrations/0001_schema.sql)
foi validado rodando um Postgres local de verdade (não é só leitura de código):
lancamentos, plano_de_contas, views de
saldo) pertencente à organização do usuário A, e uma tentativa de INSERT
forjando o org_id de A é rejeitada pelo Postgres com
new row violates row-level security policy.viewer
consegue ler os lançamentos da organização, mas uma tentativa de
INSERT/UPDATE é rejeitada — só owner/admin/accountant têm
permissão de escrita (via a função has_write_role).owner/admin — corrigido um bug
real de recursão infinita de política (infinite recursion detected in policy for relation memberships) durante os testes, resolvido com uma
função auxiliar SECURITY DEFINER (is_org_admin) que evita a política de
memberships reconsultar a própria tabela sob o role do usuário.INSERT direto
quanto via a função create_lancamento.v_saldo_contas e
v_movimento_contas são criadas com security_invoker = true, então
herdam as mesmas policies das tabelas base — testado que o usuário B
consegue ler suas próprias views com count() = 0 para a org de A.O código da aplicação (lib/org.ts, lib/supabase/*) segue os mesmos
princípios: toda leitura/escrita usa o client autenticado do usuário (chave
anon + sessão), nunca a service role — a única exceção documentada é o job
de alertas de vencimento (app/api/cron/vencimentos/route.ts), que
deliberadamente precisa varrer todas as organizações e por isso é protegido
por um segredo (CRON_SECRET) e nunca é chamado a partir do navegador.
npm run build e npm run lint passam limpos) e o
schema foi testado com um Postgres real, mas o fluxo completo de
autenticação/UI não foi testado ponta a ponta contra um projeto Supabase
real dentro deste ambiente (não há acesso a um projeto Supabase de
produção a partir daqui) — recomenda-se testar o fluxo de cadastro/login
assim que configurar seu próprio projeto.app/(app)/carteira/page.tsx) — ajuste-os ou
transforme-os em configuração por organização conforme sua necessidade.TODO — o job já identifica corretamente quais ativos
deveriam alertar, falta plugar o provedor de notificação escolhido.