A self-hosted personal finance tool that connects to your bank accounts via Plaid, tracks your recurring expenses, and runs a daily check at 3am to tell you what to pay, when to pay it, and whether you're at risk of overdraft.
Designed to be used alongside Claude AI β ask questions like:
- "Can I afford this $500 expense?"
- "How long to save $5,000 for a trip without cutting anything?"
- "What should I pay today?"
- π¦ Multi-account support β connect up to 6+ bank accounts, checking, savings, and credit cards across any US institution
- π Secure local storage β Plaid access tokens are encrypted with AES-256 on your machine; your credentials never leave your computer
- π Expense tracker β manage all recurring bills, loans, subscriptions, and savings goals in a simple JSON file (or by chatting with Claude)
β οΈ Overdraft protection β daily check calculates your projected balance after upcoming bills and flags risk before it happens- π Interactive dashboard β open
dashboard.htmlin your browser for a live financial overview and Q&A chat - β° Automated daily reports β runs at 3am, saves a markdown report, and delivers a briefing when you open Claude
- Python 3.9+
- A free Plaid developer account (takes ~5 minutes)
- Claude desktop app (for the interactive Q&A features)
- Git
git clone https://github.com/jlqoc/Budgeting.git
cd Budgetingpip install -r requirements.txt- Go to dashboard.plaid.com and create a free account
- Navigate to Team Settings β Keys
- Copy your Client ID and Sandbox secret
- When you're ready for real bank connections, request Development access (free, approved within a day or two)
cp .env.example .envOpen .env and fill in your Plaid credentials:
PLAID_CLIENT_ID=your_client_id_here
PLAID_SANDBOX_SECRET=your_sandbox_secret_here
PLAID_ENV=sandbox
β οΈ .envis gitignored β it will never be committed. Never share this file.
Run the bank linker once per institution:
python connect_banks.pyYou'll be prompted to:
- Create a vault password (used to encrypt your access tokens locally)
- Choose a bank to link
In sandbox mode, you can use test institutions to try everything out before connecting real accounts. In production mode, you'll go through Plaid's secure OAuth flow for each real bank.
Repeat for each bank account (up to as many as you have).
Open expenses.json and fill in your recurring bills, income, credit cards, loans, and subscriptions. Each item has:
nameβ friendly labelamountβ monthly amount in USDdue_dayβ day of month it's due (1β28)autopayβtrueif autopay is set up (won't flag as urgent)accountβ which bank account it pulls from (optional label)
Or just tell Claude: "Add my $1,200 rent due on the 1st" and it'll update the file for you.
python daily_check.pyYou'll be prompted for your vault password. The script will:
- Fetch live balances from all linked accounts
- Identify bills due in the next 14 days
- Calculate overdraft risk
- Save a report to
reports/report_YYYY-MM-DD.md - Print the advisory to the terminal
Open dashboard.html in your browser. On first load it shows placeholder data. To populate it with live data:
python export_for_dashboard.pyThis writes reports/latest.json, which the dashboard reads. Refresh the page to see your live financial snapshot.
crontab -eAdd:
0 3 * * * VAULT_PASSWORD=yourpassword /usr/bin/python3 /path/to/Budgeting/daily_check.py >> /path/to/Budgeting/reports/cron.log 2>&1
- Open Task Scheduler β Create Basic Task
- Trigger: Daily at 3:00 AM
- Action: Start a program
- Program:
python - Arguments:
"C:\path\to\Budgeting\daily_check.py" --vault-password yourpassword - Start in:
C:\path\to\Budgeting
- Program:
If you're using Claude's Cowork mode, the scheduled task is set up automatically via the built-in scheduler.
Budgeting/
βββ connect_banks.py # One-time bank account linker (run once per bank)
βββ daily_check.py # Daily advisory script (runs at 3am)
βββ export_for_dashboard.py # Exports live data to dashboard
βββ expenses.py # Expense utilities (imported by other scripts)
βββ expenses.json # Your recurring expenses, bills, goals (edit this)
βββ dashboard.html # Interactive browser dashboard + Claude Q&A
βββ requirements.txt
βββ .env.example # Copy to .env and fill in your keys
βββ .gitignore # Keeps .env and tokens/ out of git
βββ LICENSE
β
βββ tokens/ # Created automatically β gitignored
β βββ tokens.enc # AES-256 encrypted Plaid access tokens
β βββ salt.bin # Encryption salt
β
βββ reports/ # Created automatically β gitignored
βββ report_YYYY-MM-DD.md
βββ latest.json
- Your bank credentials are never stored. Plaid uses OAuth β you log in directly on your bank's website, and Plaid gives back a token.
- Access tokens are encrypted with AES-256 (Fernet) using a password you choose. They live in
tokens/tokens.encon your machine only. tokens/and.envare gitignored β they cannot be accidentally committed to a public repo.- Reports are gitignored β your actual financial data never leaves your machine.
Once set up, open Claude and ask things like:
"I want to plan a $5,000 trip. How long will it take to save without changing my budget?"
"I have an emergency expense of $300 β can I pull from my Chase checking without overdrafting?"
"What subscriptions am I paying for that I could cut?"
"Show me a paycheck-by-paycheck plan to pay off my credit card by December."
Claude reads your expenses.json and the latest balance report to give you specific, accurate answers based on your real numbers.
PRs welcome. Some ideas for improvements:
- Web UI for editing expenses (instead of JSON)
- Email/SMS delivery of daily report
- Credit card payoff optimizer
- Multi-currency support
- Transaction categorization and trend analysis
MIT β see LICENSE