Tools / 2026 / Live in the browser
Siphon
Drop in a bank or card CSV and see every recurring charge: what it costs a year, which prices went up, which ones stopped and when each renews. The file never leaves the browser tab.
01
The problem
People do not know what they pay for each month. In a 2022 C+R Research survey of 1,000 US adults, people guessed $86 a month on subscriptions and actually spent $219, and 42% had forgotten one they were still paying for. The apps that find subscriptions for you ask you to link your bank through an aggregator that then sees your entire transaction history, and manual trackers only know about the subscriptions you already remember. Every bank already offers the raw data as a CSV download, so the missing piece is something that reads that file without sending it anywhere.
02
How I approached it
A DOM-free UMD engine does all the work, so the page and node:test run the same code. The CSV reader sniffs the delimiter, skips preamble lines and picks the date, description and amount columns from header names and from what the cells contain, including split money out and money in columns, decimal commas, parentheses and DR/CR suffixes. Day-first and month-first dates are separated by values over 12, then by which reading keeps the file in date order, then by the dotted European style. Descriptions are cleaned of card numbers, store IDs, references and processor prefixes like SQ * and PAYPAL *, and 95 common services are matched by name. Each merchant's charges are chained on six cadences from weekly to yearly with a 2% price tolerance, or a looser one for bills that vary. A known service needs two charges and an unknown one three, and a chain is rejected when the same merchant has many off-schedule purchases in between, which rules out the coffee shop you visit every week. The page ships with a Content-Security-Policy of connect-src 'none', so the browser blocks any request after load.
03
The outcome
Price rises with the date and percentage, subscriptions that stopped and how many cycles they missed, a next-30-days list, Keep and Cancel choices with a running yearly saving, and exports to an .ics calendar with a reminder three days before each renewal or to a formula-safe CSV. A sweep over 1,000 seeded synthetic statements with 15 planted recurring charges each finds all 15,000 with 20 false positives. 17 tests with no dependencies cover the parser, date and amount formats, column mapping, merchant cleaning, detection edge cases, merging overlapping downloads and both exports.