Situation reports for your money. Point it at the CSV exports from your bank and card accounts — Amex, Chase, and USAA are auto-detected — and get a self-contained HTML financial report plus a terminal summary. Zero dependencies, pure Python standard library, and nothing ever leaves your machine.
- Auto-detects export formats by header layout — Amex card activity, Chase card, Chase checking, USAA checking/card, plus a generic fallback for any CSV with date/description/amount columns. Sign conventions are normalized (Amex exports charges as positive; Chase and USAA as negative).
- De-dupes your own money movement — card payments and internal transfers are excluded from income/spending so paying your Amex from checking doesn't count as $1,400 of "spending" twice.
- Categorizes transactions with 40+ built-in merchant rules, the bank's own
category column as fallback, and your own
rules.jsonon top. - Finds recurring charges — anything hitting 3+ times at a steady interval and amount (weekly/monthly/yearly), with the total subscription burn per month.
- Flags spending anomalies — category-months that spike well above that category's typical level (the $1,287 surprise car repair, the travel month).
- Reports: a single-file HTML dashboard (light/dark, hover tooltips, no external assets — openable offline forever) and optional CSV summaries for your own spreadsheets.
Requires Python 3.10+. No pip install needed — clone and run:
git clone https://github.com/danielneustadter/sitrep.git
cd sitrep
python -m sitrep sample-data --open
Then with your own data: export CSVs from each bank's website into a folder
(the data/ folder is gitignored for exactly this) and run:
python -m sitrep data/ -o reports --csv --open
usage: sitrep [-h] [-o OUT] [--rules RULES] [--csv] [--open] inputs [inputs ...]
inputs CSV files and/or directories containing exports
-o, --out output directory (default: ./reports)
--rules path to a rules.json with custom category rules
--csv also write monthly/category/transaction CSV summaries
--open open the HTML report in your browser when done
Or install it as a command: pip install . gives you sitrep on your PATH.
The full report: cash flow, net position, anomaly watch, category breakdown, recurring-charge table, top merchants, and a category × month matrix.
The terminal gets a compact version of the same thing:
┌──────────────────────────────────────────────────────────────┐
│ SITREP · 2026-01-01 → 2026-06-29 │
└──────────────────────────────────────────────────────────────┘
Accounts Amex Card, Chase Card, USAA Checking
Transactions 233
Total income $47,619.85
Total spending $23,774.56
Net $23,845.29
Savings rate 50%
Monthly net:
Jan 2026 + $4,317 ███████████████████████
Feb 2026 + $4,172 ██████████████████████
...
| Bank | Where | Format detected by |
|---|---|---|
| Amex | Statements & Activity → Download → CSV | Date, Description, Amount (charges positive) |
| Chase card | Account activity → Download account activity → CSV | Transaction Date, Post Date, Description, Category, Type, Amount |
| Chase checking | Same download flow on a checking account | Details, Posting Date, Description, Amount, Type, Balance |
| USAA | Account → Export transactions → CSV | Date, Description, Original Description, Category, Amount, Status |
| Anything else | — | Generic fallback: any date/description/amount headers |
Files are matched by their headers, not their names — rename them however you like. Multiple files per account (e.g. one export per statement period) are fine; just drop them all in the folder.
Put a rules.json next to your exports (or pass --rules). Rules are regexes
matched against the raw description, checked before the built-ins:
[
{ "match": "MY LANDLORD LLC", "category": "Housing" },
{ "match": "ACME PAYROLL", "category": "Income" },
{ "match": "STARBUCKS", "category": "Regret" }
]This tool is offline by design. No network calls, no telemetry, no SDKs — read
the source, it's ~1,200 lines of standard library. Real exports belong in
data/ (gitignored). Everything in sample-data/ is fictional, generated by
scripts/make_sample_data.py.
MIT — see LICENSE.
