Skip to content
All projects

Project detail

Fintrack: Personal Finance Workspace

A personal finance workspace built on Next.js 16 (App Router, React 19), with the entire backend living in the same deployable. A Hono app is mounted on a catch-all route handler, and its fluent chain exports an AppType, so the frontend gets a fully typed RPC client through hc<AppType>() with zero codegen. Types run end to end without a single hand-written DTO. The Drizzle schema is the single source of truth, drizzle-zod derives the validators from it, and those same Zod schemas back the react-hook-form resolvers, so changing a column surfaces as a compile error in the component that renders it. Twelve feature modules cover accounts across nine types (savings, cash, wallet, investment, fixed deposit, PPF, EPF, credit and loan), transactions with CSV import and bulk operations, categories, budgets over four period types, savings goals with a contribution ledger, debt payoff with snowball versus avalanche projection, transfers, a holdings and trade ledger with weighted-average cost, a balance forecast, and a command palette. Two design decisions carry most of the weight. Recurring transactions materialise lazily on read rather than through a cron or a queue, so a monthly SIP or a loan EMI enters itself with no extra infrastructure. And net worth is computed from real account balances as of any date rather than inferred from cash flow, which keeps assets, liabilities and the daily trend honest. Every colour is a CSS variable on a Geist-derived OKLCH scale, so Recharts themes with the app across light and dark.

LiveFull Stack2026

Technologies

Stack used

The core tools and frameworks behind this project.

NJNext.js 16R1React 19TypeScriptHHonoDODrizzle ORMNPNeon PostgresCClerkTQTanStack Query v5TTTanStack Table v9ZustandR3Recharts 3TCTailwind CSS v4Sshadcn/uiRURadix UIZ4Zod 4RHReact Hook FormDZdrizzle-zodDFdate-fnsCcmdkVitestE+ESLint + SonarJSBBun

System design

Architecture

How the pieces fit together: monorepo frontends, the DDD backend, data stores, and the AI pipeline.

Key Highlights

What it demonstrates

The main product, architecture, and delivery signals from this build.

  • End-to-end type safety with no codegen step. The Hono route chain exports AppType, hc<AppType>() consumes it, and a change to any handler response shape becomes a compile error in the component that renders it
  • The Drizzle schema is the only source of truth: drizzle-zod derives the insert schemas, which serve as both the API validators and the react-hook-form resolvers, behind a global Zod error map so no internal message reaches a user
  • Recurring transactions materialise lazily on read instead of via cron or a queue. A pure planner computes the due occurrences with deterministic row IDs, so the write is idempotent and needs no scheduler, worker or extra infrastructure
  • Recurring templates are polymorphic: give one a destination account and it becomes a scheduled transfer (a monthly SIP), give it a debt and each occurrence writes a linked debt payment (a loan EMI that records itself)
  • Net worth is derived from real account balances as of any date rather than from cash flow, splitting assets and liabilities across nine account types with a daily trend
  • Debt payoff projects a clearance date and total interest from APR and minimum payment, and compares snowball against avalanche for any extra monthly amount
  • Transfers are written as one linked pair of ledger entries sharing a transfer ID, deliberately excluded from income, expense and budget totals so moving your own money never reads as spending
  • The portfolio module derives weighted-average cost, market value and realised versus unrealised P&L from a trade ledger, with every trade backed by a real cash transaction so the ledger and the position can never disagree
  • Budgets span weekly, monthly, yearly and custom periods, per category or overall, with live on-track, warning and over states computed in SQL
  • CSV import maps arbitrary columns onto amount, date and payee before a validated bulk create, so any bank statement format can be brought in
  • Shared abstractions rather than duplication: createResourceRoutes generates the CRUD chain for accounts and categories, ResourcePage renders both list pages, and createNewSheetStore / createOpenSheetStore back every sheet
  • Fully tokenised design system on a Geist-derived OKLCH scale. Recharts series bind to CSS variables, so all seven chart types theme with the app in light, dark and system modes
  • Quality gate enforced in CI on every push: typecheck, ESLint with typescript-eslint and eslint-plugin-sonarjs (cognitive complexity, duplicate literals, identical functions), Prettier, Vitest and a production build
  • Domain logic is isolated from the database and unit tested directly: recurrence maths, budget periods, goal pacing, debt amortisation, holdings cost basis, transfer legs and CSV mapping all covered without a test database

Roadmap

Planned improvements

Next useful additions and production-hardening ideas for the project.

Multi-currency support with per-account currency and historical FX rates
Bank sync through an aggregator so accounts reconcile themselves instead of relying on CSV import
AI insights over the ledger: spending anomalies, subscription detection and plain-language answers about your own data
Replace the neon-http driver with a pooled connection so multi-statement writes run inside real database transactions
Live market prices for holdings, replacing the manually recorded last price
Shared budgets and goals for households, which means a real ownership model rather than a flat user ID on every row
Attachments on transactions, with receipt OCR feeding the CSV import mapper
Export to CSV and PDF, plus a scheduled monthly summary email

Screenshots

Product walkthrough

Screens from the actual project, preserved as a visual record of the interface.

Fintrack: Personal Finance Workspace screenshot 1
Fintrack: Personal Finance Workspace screenshot 2
Fintrack: Personal Finance Workspace screenshot 3
Fintrack: Personal Finance Workspace screenshot 4
Fintrack: Personal Finance Workspace screenshot 5
Fintrack: Personal Finance Workspace screenshot 6
Fintrack: Personal Finance Workspace screenshot 7
Fintrack: Personal Finance Workspace screenshot 8
Fintrack: Personal Finance Workspace screenshot 9
Fintrack: Personal Finance Workspace screenshot 10
Fintrack: Personal Finance Workspace screenshot 11
Fintrack: Personal Finance Workspace screenshot 12
Fintrack: Personal Finance Workspace screenshot 13
Fintrack: Personal Finance Workspace screenshot 14
Fintrack: Personal Finance Workspace screenshot 15
Fintrack: Personal Finance Workspace screenshot 16
Fintrack: Personal Finance Workspace screenshot 17
Fintrack: Personal Finance Workspace screenshot 18
Fintrack: Personal Finance Workspace screenshot 19
Fintrack: Personal Finance Workspace screenshot 20
Screenshot 1
1 / 20

Swipe on touch devices or use the controls to browse screenshots