尚未检测到更新。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.