Budgio is a manual personal finance tracker with transaction history, monthly budgets, and live summaries. Its dashboard aims to explain recorded money movement through a small set of transaction types.
Implementation focus#
My implementation focus is consistent calculations and user-scoped changes. Next.js, React, TypeScript, Supabase, PostgreSQL, Recharts, and Zod support the project. The inspected query helpers and transaction actions show the relationship between input, stored records, and dashboard totals.
Give each transaction type a meaning#
Income and refunds add to the recorded balance, expenses subtract, and transfers have zero net impact in the current model. For category spending, expenses add and refunds subtract.
These are explicit application semantics. They matter because displaying a refund as new spending or a transfer as income would distort the dashboard even if its charts rendered correctly.
Validate and scope mutations#
Server actions validate positive amounts, supported types, category combinations, descriptions, and dates. The authenticated user supplies record ownership on insertion. Update and delete operations scope their database filters by both record ID and user ID.
After a mutation, the relevant dashboard, transaction, and budget routes are revalidated. This keeps the visible summaries connected to the persisted change.
Demonstrable result and boundaries#
The source demonstrates a defined transaction model and a public dashboard preview. It does not establish bank integration, audited financial reporting, or a measured improvement in personal finances. Balances depend on the records and opening balance entered into the application.
The companion article works through refund and transfer semantics.