Budget Tracker

A budget is an ordered vector of entries. Each entry is a map:

{:id 1 :label "Groceries" :amount 4250}

Amounts are integer minor units (cents). Floats never touch a balance; formatting to a display string is the caller's concern (fmt-amount).

Storage sits behind an IStorage protocol – a two-method key/value store holding one serialized budget in a single string slot. The JVM binding is an in-memory atom; the browser binding wraps js/localStorage. The pipeline test is the same on both: add an entry, total it, remove it.

Status

Core-only. core.cljc and storage.cljc are complete; app.cljs is a stub init! that logs the version and exposes window._budgetTracker. There is no UI on this page yet.

Piece Namespace State
Pure logic wal-sh.projects.budget-tracker.core complete
Storage protocol impls wal-sh.projects.budget-tracker.storage complete
Browser adapter wal-sh.projects.budget-tracker.browser complete
SPA entry wal-sh.projects.budget-tracker.app stub

8 example-based tests and 15 test.check properties are defined under test/wal_sh/projects/budget_tracker/.

The shadow-cljs build :projects-budget-tracker emits to site/static/js/projects/budget-tracker/.