← back to projects

Solvent

will every statement clear?

added
pythonfastapireactsqlitek3s

I have paid credit card interest before, and it stung enough that I built a tool to never do it again.

The ritual before any big purchase looked like this: open four banking apps, one per card, write down four statement balances, then open the calculator app to check whether my checking account could cover them all. Monarch Money tracks all my accounts, but it does not show statement balances and it was not giving me the forecast I wanted. Solvent (it started life as “spend-or-not”) is that forecast.

## One verdict for the next 92 days

Solvent pulls my data from Monarch and simulates my checking balance day by day for the next 92 days: paychecks, fixed bills, each card’s statement cycle, and an estimate of my variable spend. Every statement is paid in full from checking on its due date. Carrying credit card interest counts as failure, not a trade-off. The whole horizon collapses into one verdict: GREEN, AMBER (the emergency fund had to step in), or RED (checking dips below my floor).

The setup that makes this work is small. I tell it each card’s statement close day and payment due day once, and from there it computes every statement balance itself, which is exactly the number the banking apps made me hunt for.

Day to day I mostly use two things: safe-to-spend, the most I can put on the tightest card today without any statement going unpaid, and a what-if box that answers “can I buy this?” with a yes, a no, and the earliest date a no turns into a yes.

Solvent forecast pipeline

It runs locally on my homelab: a Python engine behind FastAPI, a React dashboard, SQLite for the cache and config. The forecast core is pure and deterministic, no clock reads and no I/O, so every scenario is testable with a fixed date.

## Getting to my own bank data was the hard part

Before any simulation could happen, I needed programmatic access to my own financial data, and that turned out to be surprisingly hard to buy as an individual.

The US has three main aggregators: Plaid, Finicity, and MX. I tried to get direct Plaid access, but production approval means a security questionnaire and a written justification of your use case. For a personal dashboard it felt like a big hassle. There is even a layer above the aggregators now, companies like Quiltt and Fuse that sell one API across Plaid, MX, and Finicity: aggregators of aggregators.

Then I realized I was already paying for one. Monarch connects through all three main aggregators, and my $99 a year already covers it. It is effectively an aggregator of aggregators, with rules, tags, and a clean recurring transaction model on top that keep the forecast inputs accurate. Solvent reads that data through the community-maintained Python client for Monarch’s API (there is no official public one). Monarch did recently launch a Plus tier at $199 a year with more forecasting built in, but I am not paying double for a forecast I can compute myself.

## Checkpoints instead of a squiggly chart

The forecast page is built around a trajectory table. Instead of a 92-day line you squint at, it lists checkpoints: each month end, each card’s payment due date, and the projected low point. Every row says Clear or Short, with the projected checking balance and the cushion left above my floor. Expand a row and it shows the income, bills, and statements driving the change, reconciled to the cent.

Projected statement amounts also carry their source: computed by the simulation, read from balance history at close, or overridden by me. When a real statement posts, I click the amount, type the actual number, and the forecast tightens up.

## The discipline half

The other reason I built this is less flattering: impulse buying plus some recent life situations left me close to paycheck to paycheck, saving only around 10% of my income. The insights page tracks my variable categories (restaurants, groceries, shopping) month by month against my own recent average, and projects the current month’s pace. A red pace number next to restaurants is the kind of signal that changes a weekend plan. The goal is boring and specific: pull the discretionary categories down, push the savings rate up.

## Where it goes next

Right now Solvent is tuned to my exact situation: my cards, my floor, my paycheck rhythm. I want to make it generic enough for someone else’s. After that, notifications: wiring it into my Hermes agent so the verdict finds me on whatever messaging app I am using, and nags me before I spend my way into a RED month.