A web application for tracking your budget via Plaid API integration. View your transactions, categorized spending, and financial insights through a clean React interface.
- 💳 Plaid Integration - Securely connect to your bank accounts
- 📊 Transaction Tracking - View all your transactions by month
- 📈 Category Breakdown - See spending by category with averages
- 🔄 Auto-categorization - Intelligent transaction categorization
- 🔒 Secure - Tokens stored locally, no data sent to third parties
poetry installCopy the example environment file and add your Plaid credentials:
cp .env.example .envEdit .env with your settings:
# Get your credentials from https://dashboard.plaid.com/
PLAID_CLIENT_ID=your_client_id_here
PLAID_SECRET=your_secret_here
# Environment: sandbox, development, or production
PLAID_ENV=sandbox
# Which account to filter transactions for
ACCOUNT_TO_FILTER=Your Account NameImportant:
- Use
PLAID_ENV=sandboxfor testing with fake data - Use
PLAID_ENV=productionfor real bank connections (requires Plaid approval) - Make sure
ACCOUNT_TO_FILTERmatches your actual account name exactly
# Start the web server
poetry run api-start
# Visit http://localhost:8000On the web interface:
- Click "Link New Account" button
- Complete the Plaid authentication flow
- Click "Exchange & Save Token" to save your credentials
For Re-authentication:
If you see an ITEM_LOGIN_REQUIRED error:
- Click "Re-authenticate Account" button
- Complete the authentication flow again
The frontend is a React application built with Vite.
Quick Start (Auto-rebuild):
./dev.sh
# Automatically rebuilds frontend on changes and serves at http://localhost:8000Manual Development:
Terminal 1 - Backend:
poetry run api-startTerminal 2 - Frontend (with hot reload):
cd src/budget_tracker_api/frontend
npm run dev
# Visit http://localhost:5173 for instant hot reloadingBuild for Production:
cd src/budget_tracker_api/frontend
npm run build# Run linter
ruff check src/
# Auto-fix issues
ruff check --fix src/
# Type checking
mypy src/src/budget_tracker_api/
├── app/
│ ├── main.py # FastAPI app with thin route handlers
│ ├── services/
│ │ ├── plaid_client.py # Low-level Plaid API wrapper
│ │ ├── plaid_service.py # High-level Plaid operations
│ │ └── transaction_service.py # Transaction business logic
│ ├── utils/
│ │ └── storage.py # Token & cache storage
│ ├── assets/
│ │ └── templates/ # HTML templates (link, update pages)
│ └── public/ # React build output
└── frontend/ # React source code
├── src/
│ ├── App.jsx # Main app component
│ └── hooks/ # Custom React hooks
└── package.json
- Click "Link New Account" to connect your bank
- Make sure you clicked "Exchange & Save Token" after linking
- Your bank credentials need to be updated
- Click "Re-authenticate Account" to fix
- Check that
ACCOUNT_TO_FILTERin.envmatches your account name exactly - The error will show available account names - copy one exactly
For Testing (Sandbox):
PLAID_ENV=sandbox- Use test credentials (username:
user_good, password:pass_good) - Free fake data for development
For Real Banking (Production):
PLAID_ENV=production- Requires Plaid production approval
- Uses real bank credentials
- You'll need to re-link your account after changing environments
- 🔒 Access tokens are stored in
.data/access-token.json - 🔒 Never commit
.envor share your Plaid credentials - 🔒 Transaction data is cached locally in
.data/transactions/ - 🔒 Production environment requires additional security measures
MIT