Upload your card statements. Find out what you are paying for. Nothing leaves your browser.
Live and free to use, with no account to make and nothing to install. The repository is not public yet.

Paper Trail is a budgeting tool in the shape of Rocket Money, with one difference that decides everything else: there is no account and no server. You open the page, choose a passphrase, and upload the statements your bank already gives you. It sorts them into merchants and categories, finds the subscriptions, flags what looks like excess, and lets you search the lot. The data never leaves the browser, and I cannot see it even if I wanted to.
That constraint came from building it on my own statements first. A tool that reads a year of someone's spending has to be one they can verify rather than trust. So the rule is enforced by the browser, not by a promise: the page carries a content security policy that forbids network requests, the build refuses to ship without it, and anyone can open the developer tools, import a statement, and watch no request appear.
The engine is plain JavaScript with no framework in it: parsers for each statement layout, a normaliser that turns "SQ *MOONFALL COFFEE 3301 CHICAGO IL" into one merchant, a categoriser with shipped rules and your own on top, a fingerprint that stops the same charge counting twice across overlapping files, and the detectors. Every piece is a pure module with a test, and the same code runs in the browser and in a command-line checker that prints counts only, so parsers can be tuned against real statements without the statements ever being pasted anywhere.
What it does
Reads what the bank gives you
Drop in PDF statements, CSV exports, or the Quicken and QuickBooks downloads (QFX, QBO, OFX) that nearly every bank and credit union offers. Twenty-four CSV layouts are built in, from Chase and American Express to Apple Card and Ally. PDFs go through dedicated parsers for Bilt and USAA and a generic one for any statement that prints a date, a description, and an amount per line. A CSV it has never seen asks which columns to use, once, and remembers the answer for that header.
Finds the subscriptions
A merchant that charges on a cadence is a subscription: weekly, fortnightly, monthly, or yearly, within fifteen percent, with the amount steady within ten percent or stepping once. Netflix raising its price shows up as a flag, not a new merchant. Each one gets a yearly cost, a last-seen date, and a keep or cancelled mark, and the total across all of them sits on the overview.
Flags the excess
Four detectors run over every month. Above normal: a category one and a half times its trailing six-month median. Over budget: a cap you set, crossed. Small stuff: charges under fifteen dollars that add up to ten or more a year from one place. Probably forgotten: a subscription unchanged for a long time, a trial that turned into a charge, or the same merchant twice on the same day for the same amount.
Splits the month between two people
Each charge knows whose card it was on. Mark the shared ones and choose a ratio, fifty-fifty or seventy-thirty or anything else, as the default for the pair, for one charge, or as a rule for a merchant so rent splits itself on future imports. The month settles to one line, who owes whom and how much, with a mark-settled button and a record of past months.
Picks up where you left off
A session file is the whole ledger encrypted under a passphrase you type at export. Open it later to resume, or hand it to the other person to merge into theirs; their charges arrive owned by them. The file carries its own salt and no key lives in the app, so the public source cannot read anyone's file. Every decrypted file is whitelisted field by field before it touches the store.
Cannot phone home
The page is forbidden from making a network request. Its content security policy sets connect-src to none, the build fails if that line goes missing, a privacy gate scans the bundle for outside origins, and a browser smoke test counts requests after load and expects zero. Storage is AES-GCM under a key derived from your passphrase with six hundred thousand rounds; lose the passphrase and the data is gone, which is the point.

Read from the repository at its last commit, 9 November 2026.
It began as a concept for a credit card recommendation app, the project this page replaced. Recommendations need your spending to be any good, and the honest way to get spending is from the statements, so the statement reader became the product and the recommendations fell away. The design is deliberately quiet: white ground, an aubergine accent, Castoro Titling for the titles, Afacad for the text, IBM Plex Mono for every number, and Phosphor icons.
The hosted build is up at papertrail.company. Next the repository opens, and the merchant rules ship as a data package anyone can improve. The statement coverage will grow the same way the first layouts did, from real files that did not parse, with the command-line checker reporting what was off and nothing else.