Skip to content
All projects

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
Live previewBudgetBuddy
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

  1. 01

    One typed Hono API with an RPC client, so the frontend and backend can't drift apart; TanStack Query hooks per feature.

  2. 02

    Store every amount as integer miliunits and format it in the user's chosen currency at the edge.

  3. 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

BudgetBuddy / explorer
  • 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.