Skip to main content
Concept / PrototypeBrowser EngineeringYear: 2026

FinTrack

Modular ES6 Personal Finance Engine with Derived State

Derived state flow: transactions calculate net worth and categorical expenses on-the-fly without storage desynchronization

↳Derived state flow: transactions calculate net worth and categorical expenses on-the-fly without storage desynchronization

01 / CONTEXT

What was this and who was it for?

A software architecture experiment conducted in August 2026: building a stateful, multi-page financial tracking dashboard with vanilla JavaScript to master modularity before relying on React.

02 / PROBLEM

What was broken, frustrating, or missing?

Many vanilla applications store duplicate totals alongside raw transaction logs, which inevitably leads to desynchronized state and phantom calculations when records are edited or deleted.

03 / CONSTRAINTS

Design & Platform Boundaries

  • [1]Pure browser ES modules—no bundlers, no external frameworks.
  • [2]Prevent circular dependencies between navigation, state manager, and UI renderers.
  • [3]Strict data privacy: synthetic demo fixtures only, with zero third-party telemetry.
04 / DECISION

Architectural & UX Strategy

Established localStorage as a single append-only transaction hub, computing balances, category breakdowns, and net worth curves dynamically at runtime while resolving circular module dependencies through callback inversion.

05 / IMPLEMENTATION

Execution Highlights

Structured codebase into strict domain layers: `/core` (storage & calculation), `/components` (renderers), and `/pages`.
Separated event listener registration from state dispatch to eliminate duplicate event firing on view transitions.
Implemented a light/dark theme toggle with system preference listeners and CSS variable updates.
06 / TRADE-OFFS

What was compromised & what was gained?

  • /Accepted recalculating aggregated metrics from raw records on page entry in exchange for absolute data integrity.
07 / OUTCOME

Verifiable Outcome

A modular, maintainable client-side finance application demonstrating robust JavaScript engineering, clean separation of concerns, and defensive state management.

08 / WHAT CHANGED IN MY THINKING
"Deriving values on demand from a single source of truth is always cleaner than synchronizing separate caches. Frameworks come and go, but state discipline remains foundational."