Skip to content

matthewod11-stack/spendstory

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

spendstory

Every dollar has a story. A personal finance tool built to work with AI. Drop your bank CSVs, get a dashboard, then sit down with Claude and actually talk through your spending.

spendstory dashboard — recurring charges bento view

Why This Exists

Mint is dead. YNAB costs $100/year. Every finance app wants you to hand over your bank credentials and trust their cloud. And even when they work, they just show you charts and leave you to figure out the rest.

The thing none of them do is talk to you about your money.

spendstory is different. It's a local Python pipeline that processes your bank CSVs and generates an interactive dashboard -- but the real value is what happens next. The pipeline produces structured JSON outputs (anomalies, recurring charges, uncategorized transactions) that are designed to be reviewed conversationally with an AI assistant like Claude.

Instead of staring at a pie chart wondering "why was March so expensive?", you get a conversation:

"You had a $847 spike in Dining Out this month -- that's 3x your average. There are 4 charges at restaurants in Tulum between March 12-16. Was this a trip?"

You answer, the context gets saved, and next month's report is smarter.

What Makes It Different

It's a conversation, not a dashboard. Finance apps are passive -- they show you data and hope you notice things. spendstory actively flags anomalies, identifies new subscriptions, and walks you through them one at a time. The AI remembers your context month over month.

Your data never leaves your machine. No bank logins, no cloud sync, no telemetry. CSVs stay on disk, the dashboard is a single HTML file, and config is a gitignored TOML file. Python 3.11+ stdlib only -- zero pip dependencies.

It handles real-world messiness. 8 bank parsers that understand each bank's formatting quirks. Overlapping CSV date ranges are auto-deduped. "UBER *EATS" and "UberEats" and "UBER EATS UBER EATS" all normalize to the same merchant. Amazon orders get broken out by item.

It builds knowledge over time. Monthly Obsidian reports accumulate year-to-date data with month-over-month comparisons. Category corrections feed back into future runs. Your financial picture gets clearer every month.

What You'll Need

  • Python 3.11+ (already on most Macs and Linux machines)
  • Bank CSV exports -- download from your bank's website (the script auto-detects the format from headers)
  • An AI assistant (optional but recommended) -- Claude Code, Claude Desktop, or any tool that can read JSON files
  • ~15 minutes per month to download CSVs, run the pipeline, and review the output

No sign-ups, no API keys, no credit card required. Clone the repo and go.

Getting Started

git clone https://github.com/matthewod11-stack/spendstory.git
cd spendstory

# Optional: personalize your config
cp config.example.toml config.toml

# Drop your bank CSVs into data/raw/
mkdir -p data/raw

# Run the pipeline
python -m spendstory

# Open the dashboard
open data/output/personal_spend_dashboard.html

After your first run, check the terminal output for "Other" transactions. These are spending the system couldn't categorize -- add keyword rules in spendstory/categorize.py to catch them. Each month, there are fewer.

Supported Banks

Capital One, Amex (household + personal), Citi (checking + bankcard), Mercury, Apple Card, Venmo -- plus a generic CSV fallback that auto-detects columns for unsupported banks.

The Monthly Workflow

  1. Download fresh CSVs from your bank accounts (2nd of the month works well)
  2. Drop them into data/raw/
  3. Run python -m spendstory
  4. Open the dashboard or review the terminal summary
  5. Walk through flagged anomalies with Claude -- save context for next month
  6. Obsidian reports auto-generate for completed months with YTD rollups

For Developers

Python 3.11+ stdlib only -- no pip install, no virtual environment needed to run the app. The only dev dependency is pytest.

# Run the 66-test suite
python3 -m venv .venv
.venv/bin/pip install pytest
.venv/bin/python3 -m pytest tests/ -v

The pipeline runs 7 phases: CSV detection, parsing + dedup, categorization, HTML dashboard, Obsidian reports, recurring detection, and anomaly analysis. The dashboard is a self-contained HTML file generated via Python f-string templating -- no bundler, no build step.

See docs/adding-a-parser.md for how to add support for a new bank.

Technology Role
Python 3.11+ Core engine (stdlib only, uses tomllib for config)
HTML / CSS / JS Self-contained dashboard via f-string templating
pytest Dev-only test runner
Obsidian (optional) Monthly report consumption via Dataview queries

License

MIT

About

Personal finance dashboard — drop CSVs, get insights. Python 3.11+ stdlib only.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages