Skip to content
</>
Back
Financial domain, architecture & productIn development

Personal project

Financial Control Center

  • Next.js
  • TypeScript
  • Prisma
  • PostgreSQL
  • Better Auth
  • Vitest

Problem

A bank balance does not tell you what you can spend: it ignores commitments, debt, reserved savings and planned transactions. The product turns those rules into an honest financial picture.

Context

A personal project: it started as a way to solve a problem of my own, and I designed and built it from scratch. It is still in development. The repository contains a working application, demo data, architecture documentation and financial-invariant tests against real PostgreSQL.

Objective

Build a control center that explains real available money, records operations without rewriting history and lets the domain evolve incrementally.

My role

  • Defined the product, domain language, visual experience and full-stack architecture.
  • Modeled the domain in Prisma (23 models and 17 enums), documenting which constraints belong in the database and which belong in business logic.
  • Implemented authentication, persistence, use cases, responsive UI, demo data and automated tests.

Architecture & decisions

  • Next.js 16 with Server Components and Server Actions; PostgreSQL is the source of truth and Prisma is the persistence layer.
  • Better Auth shares the domain User and renames its Account model to avoid colliding with a financial account.
  • Multi-entity writes run in transactions; Zod validates rules PostgreSQL cannot express.
  • 23 ADRs record decisions around domain, security, authentication, state, theming and testing.

Architecture flow

  1. 01UI + forms
  2. 02Use cases + Zod
  3. 03Prisma + transactions
  4. 04PostgreSQL

Solution

  • Implemented: accounts, transactions, credit and installments, planning, budgets, savings, loans, reconciliation, rules, overview and analysis.
  • Implemented: quick entry, light/dark/system themes, deterministic demo data and per-user data isolation.
  • In development: public deployment and refinement of complete flows with real-world data.
  • Planned: natural-language transaction entry as a layer over validated use cases, never as direct database writes.

Challenges & trade-offs

  • Distinguishing balance, available money, debt, spending, savings and reimbursements without duplicating sources of truth.
  • Keeping an auditable history: transactions are voided instead of deleted and time-sensitive values are derived on read.
  • Prioritizing domain correctness over premature abstractions; V1 adds neither a generic repository layer nor global state.

Views

Screenshots from the live site

Screenshot of Financial Control Center: Financial overview — light
Financial overview — light
Screenshot of Financial Control Center: Financial overview — dark
Financial overview — dark
Screenshot of Financial Control Center: Sign in — light
Sign in — light
Screenshot of Financial Control Center: Sign in — dark
Sign in — dark

Learnings

  • Domain modeling and invariants shape the product more than any isolated screen.
  • Testing financial rules against real PostgreSQL catches failures a mock cannot represent.
  • ADRs make the engineering process visible and let decisions be revisited as the product grows.

Result

A working application in development with authentication, a complete financial domain, responsive UI and a test suite. Production infrastructure is documented; public deployment is still pending.