Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SITREP

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.

SITREP report: KPI tiles and monthly cash flow chart

What it does

  • 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.json on 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.

Quick start

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 report

The full report: cash flow, net position, anomaly watch, category breakdown, recurring-charge table, top merchants, and a category × month matrix.

Full SITREP report

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  ██████████████████████
    ...

Getting your exports

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.

Custom category rules

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" }
]

Privacy

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.

License

MIT — see LICENSE.

About

Situation reports for your money — offline financial reports from Amex, Chase, and USAA CSV exports. Zero dependencies.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages