Data Precision
Amounts are stored as integer cents and only formatted for display, so no balance is ever the result of adding two floating-point numbers.
A commercially released desktop budgeting app for Windows and macOS that keeps every customer's financial data on their own machine.
Accompt began as a simple expense tracker for a friend who didn’t want a subscription, but the functions and macros in the spreadsheet template he bought kept breaking. So, I built an application with the structure and safeguards the spreadsheet lacked. Eventually, it grew into a commercial desktop application for Windows and macOS, bringing income, expenses, savings, debt, and goals together in one private, local-first system.
I chose local storage because it serves both the product and the business model. It makes a one-time purchase viable by avoiding recurring server costs and the need to collect or store customer financial data. For users, the same decision means faster access, stronger privacy, and direct control over their information and the relational database with foreign keys preserves data integrity. Finally, to keep development efficient, I used a shared codebase for Windows and macOS, allowing the product to reach both markets without doubling the work required to build and maintain it. And releasing it commercially meant building purchase-based licensing, automatic updates, code-signed Windows builds, and signed, notarized macOS releases.
This project allowed me to carry an idea through every stage, from understanding the user’s needs to delivering a reliable product they could purchase and use.
Powers the interface inside Electron’s renderer process, which is isolated from direct database access. Data requests pass through the main process, while React updates only the parts of the interface affected by each change.
Packages the app for Windows and macOS from one codebase, with an IPC layer separating the interface from database access.
Runs the entire backend from one local file instead of a server, with scoped queries, enforced relationships, integer-cent money, and migrations that can roll back.
Holds every value the interface reads, with memoized selectors that pre-index transactions into maps and derive balances and goal progress rather than storing them.
Visualizes the data across several chart types, allowing users to follow trends over time, track progress toward their goals, and compare figures side by side.
Provides the macOS build environment the project needs, since signing and notarizing require Apple tooling that can't run on the Windows machine I develop on.
Amounts are stored as integer cents and only formatted for display, so no balance is ever the result of adding two floating-point numbers.
Each schema change backs up the database first, verifies integrity with a foreign key check after, and rolls back atomically if anything fails.
Goal tracking derives progress from the associated transactions themselves rather than storing it, so coals never fall out of sync with the actual data.
Transactions are pre-indexed into maps once, so regrouping a report by category, account, or period recomputes without walking the full history.
Purchases issue a license through a backend I built and host, and the app stays gated until it activates against it and the activation confirms.
Goals that roll over on a schedule handle leap years and month-end dates, so a target set for the 31st still fires in a month that doesn't have one.
The preload bridge exposes a fixed set of named operations rather than generic data access, so the renderer can only request what the main process allows.
Universal macOS builds are signed, notarized, and stapled by an automated pipeline, so no release ever requires a manual signing step.