尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Gestão financeira familiar — um Progressive Web App para o controle do dinheiro de casa: contas, cartões, lançamentos, despesas divididas em grupo, orçamento, metas e relatórios. Tem um módulo de investimentos, mas ele é uma parte do produto, não o produto.
No ar em https://pulodogato.hmoraes.com.br.
Sobre este arquivo. Até setembro de 2026 o README e a PRD descreviam um "Controle de Investimentos": um app de carteira de ações, FIIs e dividendos que nunca foi o que este repositório construiu. O passo a passo de instalação chegava a mandar colar
CREATE TABLE assets,transactionsedividendsno SQL Editor — tabelas que não existem no schema real e que conflitam com as 25 migrations dedatabase/migrations/. Quem seguisse o README montava um banco que o app não sabe ler. Isto é a HMO-119.
Dinheiro entrando e saindo
Dividir com outras pessoas
Planejar
O resto
| Frontend | Next.js 14 (App Router) + TypeScript + Tailwind |
| Componentes | Radix UI, Recharts, Lucide |
| Formulários | React Hook Form + Zod |
| Banco / Auth | Supabase (PostgreSQL, RLS) |
| PWA | next-pwa |
| Hospedagem | Vercel (+ Vercel Cron) |
Precisa de Node 20 e de um projeto Supabase.
npm install
cp .env.local.example .env.local # preencha as duas chaves do seu projeto
npm run dev # http://localhost:3000
As variáveis que o app lê:
| variável | para quê |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | cliente e servidor |
NEXT_PUBLIC_SUPABASE_ANON_KEY | cliente e servidor |
SUPABASE_SERVICE_ROLE_KEY | só as rotas de cron |
CRON_SECRET | autentica as rotas de cron |
NEXT_PUBLIC_VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT | push |
NEXT_PUBLIC_URL | links absolutos em e-mail e push |
BRAPI_TOKEN | só o cron de cotação da carteira (/api/cron/cotacoes) |
As duas primeiras são obrigatórias já no build: utils/supabase/env.ts
valida que existem, que a URL é válida e que não são o valor de exemplo — e
next build pré-renderiza as telas de login, então um build sem elas falha em 31
páginas com Variável de ambiente ausente. As demais são lidas dentro dos
handlers: faltar não quebra o build, quebra a rota que precisa delas.
.env.productionnão está versionado (nem poderia: o.env.local.exampleexiste justamente para isso). Um clone limpo não constrói sem que você preencha as duas chaves — foi assim que o jobbuilddo CI reprovou na sua primeira execução.
O schema vive versionado em database/migrations/, hoje 001 a 024, e a ordem
importa — 001 sozinho deixa o banco aberto, é o 002 que liga a RLS.
001_baseline.sql é gerado por pg_dump; não edite à mão.
O deploy publica código, não schema. Não existe runner de migration neste
projeto: subir um PR para a Vercel não aplica nada no banco. Migration nova é um
passo manual, colada no SQL Editor do Supabase a partir do bundle de
database/validation/ — que o CI mantém em sincronia com as migrations
(node scripts/gen-validation-bundle.mjs --check).
Detalhes de cada arquivo, a ordem completa e as armadilhas conhecidas estão em
database/README.md.
Cálculo financeiro é testado dos dois lados. A aritmética em TypeScript roda com o runner nativo do Node sobre o JS compilado:
npm run test:lancamento # sinal, categoria, campos obrigatórios
npm run test:grupos # rateio e acerto de grupo
npm run test:card-invoice # fatura de cartão
npm run test:dinheiro # máscara de valor (R$ 1.000,00 -> 1000)
npm run test:contas # o corte entre Contas e Cartões
# ...~50 suítes no total; veja os scripts `test:*` do package.json
E as regras que moram no banco — RLS, triggers, invariantes de dinheiro — rodam
em Postgres de verdade, em database/tests/, dentro do workflow db-verify.
npm run type-check # tsc --noEmit
npm run lint # hoje 142 warnings, nenhum erro
Onze workflows no GitHub Actions. O primeiro nasceu com a HMO-119:
| workflow | prova |
|---|---|
build | next build, tsc --noEmit e o build da imagem Docker |
db-verify | o schema sobe do zero e a RLS isola um usuário do outro |
code-schema-drift | todo .from("tabela") do código existe no schema |
color-tokens | nenhuma cor fixa fora dos tokens, contraste AA nos dois temas |
pwa-assets | todo asset declarado existe e é o que diz ser |
lancamento, contas, dinheiro, configuracoes, menu-mobile | as regras e a árvore de cada tela |
env-preview | o preview da Vercel não escreve no banco de produção |
Quase todos rodam sem filtro de paths, de propósito: o db-verify é
filtrado e foi assim que três suítes deste repositório ficaram paradas em verde.
Vários deles carregam controle negativo — um passo que planta o defeito e exige que a verificação reprove. Verificação que nunca viu vermelho não é verificação.
Vercel, a partir da main. Duas coisas que este projeto aprendeu doendo:
.env.production local não chega ao build de lá.Os crons (/api/cron/*) rodam pelo Vercel Cron, autenticados por CRON_SECRET.
No plano Hobby o horário tem tolerância de ±59 min, então a ordem entre dois
jobs do mesmo dia não é garantida.
docker build -t pulodogato .
docker run -p 3000:3000 pulodogato
A imagem é multi-stage e o estágio final copia .next/standalone, que só existe
porque next.config.js tem output: "standalone". O job docker do CI existe
para pegar justamente isso: tirar essa chave não quebra next build nem o tsc,
só o COPY da imagem.
docs/ tem a PRD, a especificação da API, as decisões de arquitetura e os guias
de cada área (offline, PWA, grupos, contas previstas, deploy). O guia de
governança da PRD (docs/PRD-Governance.md) descreve como mudá-la.
Um aviso sobre
docs/: documento que se declara FINAL costuma ser o menos confiável da pasta. Este repositório já teve umSTATUS_FINALanunciando pronto uma pendência que o guia ao lado listava como aberta.