Full-stack · Next.js 2026
BudgetBuddy
Personal finance, beautifully simple.
- Role
- Solo — product, design, frontend and backend
- Year
- 2026
- Stack
- Next.js 16
- React 19
- TypeScript
- Hono
- Drizzle ORM
- PostgreSQL
- Clerk
- TanStack Query
- Tailwind CSS
- Recharts
- Links
- 8
- product areas
- 0
- floating-point money bugs — integer miliunits
- 4-step
- CSV import with column mapping
- 375px
- and up, with an app-style tab bar
[A]Overview
A full-stack finance app: accounts, transactions with CSV import, monthly budgets, recurring bills that post themselves, and reports that explain where the money went — on desktop or phone, light or dark.
[B]The problem
Most budgeting apps are either spreadsheets in disguise or subscription products that lock your data away. I wanted something calm to use every day, that handles the boring parts — recurring bills, categorising, month-end math — automatically.
[C]Approach
- 01
One typed Hono API with an RPC client, so the frontend and backend can't drift apart; TanStack Query hooks per feature.
- 02
Store every amount as integer miliunits and format it in the user's chosen currency at the edge.
- 03
Design mobile-first: a collapsible sidebar on desktop, a bottom tab bar with a centre add button on phones, ⌘K everywhere.
[D]Highlights
- H-01
Recurring transactions that don't drift
Occurrences are computed from the start date by index, so a rule on the 31st goes Jan 31 → Feb 28 → Mar 31. A claim-then-insert step stops two tabs from posting the same bill twice.
- H-02
Budgets with a safe-to-spend figure
Monthly limits per category with progress, over-budget alerts, and how much you can still spend per day this month.
- H-03
CSV import that forgives messy files
Upload, map columns with previews, pick rows, choose an account. Dates and amounts like $1,234.50 or (45) are parsed and bad rows are flagged, not silently dropped.
- H-04
Private by construction
Every endpoint checks the signed-in user and verifies that referenced accounts and categories belong to them.
[E]Under the hood
- app/(dashboard)the signed-in app, eight areas
- app/api/[[...route]]Hono API, one file per resource
- features/*query hooks, forms and sheets per feature
- db/schema.tsDrizzle schema, money as miliunits
- lib/recurring.tspure date logic with unit tests
[NEXT] Next project
Hasura Query Saver
Never lose a GraphiQL query again.