PARE

How it works

Drop a PDF. See where your money went.

No β€œconnect your bank” step, no aggregator sitting between you and your accounts. You hand Pare a statement you already have, and it does the reading, the math, and the categorizing. Here's the whole pipeline, start to finish. (Want automatic sync anyway? There's an opt-in SimpleFIN connection β€” off by default, read-only, and paid for and revocable by you.)

01

Drop a PDF

Export a statement from your bank and drag it in. No login, no aggregator, no MFA. PDF parsing is tuned today for Amex Gold, CIBC Aeroplan Visa, and CIBC chequing β€” more banks ship as their parsers are verified β€” and any bank works via an OFX/QFX export.

02

We parse it in seconds

A Python parser runs in a Cloudflare Container: it extracts the text, reads every transaction, and reconciles the running balance against the statement's own summary so totals can't silently drift. Rules categorize each row, and your corrections teach the rules. The PDF is deleted the moment parsing finishes.

03

See where your money went

Your dashboard is built on import: spend by category, this month versus last, detected subscriptions, and your savings rate. No pivot tables, no manual tagging.

Balance-reconciled, not best-effort

Parsing a statement is easy to get quietly wrong β€” a missed row, a transposed date, a credit read as a charge. Pare's ledger engine ties the running balance it computes back to the balance the statement prints. When a row doesn't reconcile, it's skipped and logged rather than folded into a wrong total. You get missing rows you can see, never corrupted numbers you can't.

Categorization that learns

Categories are assigned on parse by a first-match-wins rule list, so a 300-line statement is sorted the second it lands β€” you don't touch 300 dropdowns. When you re-file a merchant, that correction becomes a rule and re-applies to everything, including past transactions. The taxonomy is generic in the open-source code; your tuned rules live only in your database.

Under the hood

For the curious: the whole thing runs on Cloudflare. Nothing here is proprietary black-box magic β€” it's the parser you can read on GitHub and run on your own machine.

Next.js 16 on Cloudflare Workers

The app itself β€” pages and API run at the edge.

Per-user Durable Object (SQLite)

One private database per account. No shared table, no cross-account query.

R2 object storage

Holds an uploaded PDF only until it's parsed, then drops it.

Queues

Hand the parse job off so the upload returns immediately and retries survive a blip.

Python parser in a Container

The same parser you can run locally, isolated per job and asleep when idle.

Same code, two shapes: the hosted app splits the parser into a Container and the database into a per-user Durable Object; self-host collapses both into one local process over a SQLite file. The parsing logic is identical either way.