“What if you could run a full double-entry ledger without ever typing a debit or a credit?”
Solo Developer · Jan 2026 – Present
BookEasy
Self-hosted double-entry accounting & bank-reconciliation app running the real books for a two-storefront eCommerce business.
- one shared FIFO inventory
- 2 storefronts
- typed by the user
- 0 debits/credits
- live A = L + E proof
- Balanced
one shared FIFO inventory
typed by the user
live A = L + E proof
BookEasy hides the accounting machinery behind plain-language screens: the owner records a “sell” or a “buy”, and the app generates the balanced journal entries, tracks FIFO inventory cost, reconciles bank deposits against sales, and produces financial statements.
One shared inventory is sold through two storefronts with independent per-store pricing. I built the whole thing solo — product, data model, backend, and UI.
- ▹Money is never a JavaScript number — every amount flows through one Decimal-based money module (DB columns Decimal(18,2)), killing a whole class of rounding bugs.
- ▹One double-entry invariant in one place: every posted entry has ≥2 lines and SUM(debit) === SUM(credit), written in a single Prisma transaction so half-entries are impossible.
- ▹Posted entries are immutable — corrections are reversing entries, never edits, preserving a clean audit trail; sales void by restoring the exact FIFO stock lots.
- ▹Bank reconciliation matches Zelle deposits to the sale that produced them and learns each sender → customer alias, so future statements auto-match — no AI required.
- TypeScript
- Next.js 16
- PostgreSQL 17
- Prisma 7
- decimal.js
- Zod
- Tailwind CSS 4
- shadcn/ui
- pgvector
- Tesseract OCR
- Claude vision
- Vitest

