Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Planejamento e controle financeiro do casal Rodolfo e Thainy, incluindo o perfil PJ RLiima. Substitui a planilha anual de abas mensais. A palavra-chave do produto é previsibilidade. O que rodar no dia a dia O .env.local fica fora do git. Copie o .env.example e preencha com a URL e a anon key do projeto. Nunca coloque a service_role no frontend: ela só vale em Edge Functions e scripts.Read the full README ↗
Planejamento e controle financeiro do casal Rodolfo e Thainy, incluindo o perfil PJ RLiima. Substitui a planilha anual de abas mensais. A palavra-chave do produto é previsibilidade.
pnpm install # primeira vez, ou depois de trocar de branch com dependência nova
pnpm dev # http://localhost:5173
pnpm validar # lint, testes e build. Rodar antes de qualquer commit importante
Outros comandos:
| Comando | O que faz |
|---|---|
pnpm test | Testes de unidade dos formatadores, máscaras, formas e erros |
pnpm test:watch | O mesmo, reagindo a cada salvamento |
pnpm lint | ESLint, sem any e exigindo import type |
pnpm build | Checagem de tipos mais o build de produção com o service worker |
pnpm preview | Serve o build pronto, com PWA ligado, em http://localhost:4173 |
pnpm icones | Regera os PNGs do app a partir da marca |
pnpm types:supabase | Regera src/types/database.ts do schema (precisa da CLI do Supabase) |
O .env.local fica fora do git. Copie o .env.example e preencha com a URL e a anon key do
projeto. Nunca coloque a service_role no frontend: ela só vale em Edge Functions e scripts.
src/
├── app/ rotas, shell, guarda de login, cliente de dados, persistência offline
├── features/ uma pasta por módulo: dashboard, lancamentos, carteira, investimentos,
│ categorias, agenda, perfil, auth, catalogo
├── hooks/ todo acesso a dados vive aqui, sempre via TanStack Query
├── ui/ componentes reutilizáveis do design system
├── lib/ formatadores, máscaras, marcas, formas de pagamento, erros, confete
├── store/ zustand: tema, filtros, toasts, sheets
├── styles/ tokens.css e prototipo.css (cópia fiel do v40), correcoes.css, login.css, pwa.css
└── types/ database.ts, gerado do schema
supabase/
├── migrations/ o schema inteiro, em ordem. Nunca alterar nada pelo painel
├── testes/ fluxos críticos e RLS, em SQL
└── seed.sql o casal e as dez categorias padrão
scripts/ gerador dos ícones do PWA
docs/ documento mestre, especificação técnica, PROGRESSO e o protótipo v40
Regra que não se quebra: nenhum componente fala com o Supabase direto. Tudo passa por um
hook em src/hooks/. Assim o cache, a invalidação e o tratamento de erro ficam num lugar só.
Detalhes em supabase/README.md. O resumo:
supabase/migrations, aplicada pelo MCP do Supabase.casal_id. A função que resolve o casal mora no schema private,
fora do alcance da API REST.Depois de cada migration, regerar os tipos e rodar pnpm build.
| Onde | O que cobre | Como rodar |
|---|---|---|
src/lib/*.test.ts | Moeda em BRL, data em DD/MM/AAAA, hora em 24h, máscaras, formas de pagamento e tradução de erro | pnpm test |
supabase/testes/fluxos_criticos.sql | Baixa com timestamp, fatura zerando e restaurando o limite, parcelas com o dia do cartão cruzando o ano, ajuste com motivo obrigatório, aporte somando e subtraindo, integridade de investimento | SQL Editor do painel, com papel de serviço |
supabase/testes/rls_e_restricoes.sql | Isolamento entre casais nos quatro verbos e as restrições de schema | SQL Editor do painel, com papel de serviço |
Os dois scripts SQL limpam tudo o que criam. Se algum passo falhar, a exceção sobe com a palavra FALHOU e nada fica gravado pela metade.
O Supabase no plano gratuito guarda backup automático diário, com retenção curta. Para o histórico financeiro de vocês isso não basta sozinho. O que fazer:
Uma vez por mês, depois de aprovar o balanço:
Exportação manual dos dados, quando quiser um CSV legível:
No SQL Editor, rode e baixe o resultado de cada um:
select * from v_lancamentos order by data_vencimento;
select l.descricao, p.data_pagamento, p.hora_pagamento, p.valor_pago
from pagamentos p join lancamentos l on l.id = p.lancamento_id
order by p.data_pagamento;
select * from carteiras order by tipo, nome;
select * from investimentos order by sub, nome;
select * from ajustes order by criado_em;
Restaurar: Database > Backups > Restore, no próprio painel. Depois de qualquer restauração, confira que os dois agendamentos do pg_cron continuam ativos:
select jobname, schedule, active from cron.job;
O que não é backup: o cache offline no aparelho. Ele existe para o app abrir sem rede, tem teto de um dia e some quando alguém sai da conta.
O deploy é na Vercel, ligado ao repositório: todo push na main publica. As três variáveis de
ambiente precisam estar cadastradas nos três ambientes (Production, Preview e Development):
VITE_SUPABASE_URL
VITE_SUPABASE_ANON_KEY
VITE_APP_NOME
O vercel.json já traz as reescritas da SPA e o cabeçalho de cache certo para o sw.js, que
não pode ser cacheado, senão a atualização do app nunca chega.
O cadastro é fechado por convite: a tabela convites guarda os e-mails liberados e um gatilho
recusa qualquer outro, mesmo por chamada direta à API. Cada convite vale uma vez.
Para liberar mais alguém depois:
insert into convites (email, casal_id, nome)
values ('[email protected]', '00000000-0000-4000-8000-000000000001', 'Nome');
type="date".numeric(12,2) no banco, jamais float.docs/ESTLIM_v40.html é a especificação visual. Divergências ficam isoladas em
src/styles/correcoes.css, cada uma com o motivo escrito.