Privacy-first local expense tracker — import bank CSVs/PDFs, auto-categorize, explore trends. No data ever leaves your machine.
Project description
finn-tracker
A fully local expense tracking and visualization tool. Import bank CSVs and PDF statements, auto-categorize transactions, and explore spending trends through an interactive dashboard. No data ever leaves your machine.
Features
- Auto-import — drop CSVs/PDFs into
~/Documents/finn-tracker/expense/(orincome/) and they load automatically on every page refresh (setEXPENSE_TRACKER_DATA=/your/pathto use a different directory) - Smart categorization — 200+ static rules auto-categorize merchants across 15 categories (including Donations); manual overrides are persisted, learned as reusable rules, and applied on future transactions
- Interactive dashboard — summary cards, spending-by-category bar chart, account donut chart, spending trend timeline, and category drill-down
- Period filtering — 1M, 3M, 6M, YTD, This Month, Last Month, All, or a custom date range
- Export — CSV or PDF report with masked merchant names
- AI chat assistant — ask questions about your spending in plain English ("How much did I spend on food last month?"). Powered by a local LLM (llama.cpp) — your data never leaves your machine
- MCP server — connect Claude Desktop, Cursor, Kiro, and other AI tools directly to your expense data via the Model Context Protocol
- Privacy-first — server binds to
127.0.0.1only; all state stored in a local SQLite DB; sensitive strings masked before any API response
Quick Start
Step 1 — Install Python (if you haven't already)
finn-tracker requires Python 3.9 or later. Check if you have it:
python3 --version
If you see Python 3.9 or higher, skip to Step 2. Otherwise, install it:
- macOS: Download from python.org or run
brew install python - Ubuntu/Debian:
sudo apt install python3
Note: finn-tracker is developed and tested on macOS and Ubuntu. It may work on other platforms but is not officially supported on Windows.
Step 2 — Install finn-tracker
Open a terminal and run:
pip install finn-tracker
Tip: If
pipisn't found, trypip3 install finn-trackerorpython3 -m pip install finn-tracker.
Optional — use a virtual environment: If you want to keep
finn-trackerisolated from other Python packages, create a virtual environment first:python3 -m venv ~/.venvs/finn-tracker source ~/.venvs/finn-tracker/bin/activate pip install finn-trackerYou'll need to activate the environment (
source ~/.venvs/finn-tracker/bin/activate) each time before runningfinn-tracker.
Step 3 — Launch
finn-tracker
Your browser opens automatically at http://localhost:5050.
Step 4 — Add your bank statements
Drop your bank CSV or PDF exports into:
~/Documents/finn-tracker/expense/ ← charges, debits
~/Documents/finn-tracker/income/ ← salary, deposits
Then refresh the page — your transactions appear automatically.
Not sure where to find those folders?
- macOS: Open Finder, press ⌘ Shift H to go to your home folder, then open
Documents → finn-tracker.- Ubuntu: Open your file manager and navigate to
~/Documents/finn-tracker/.
Try it first with sample data
Not ready to import real statements yet? Run this to load synthetic demo data:
finn-tracker --demo
Privacy Guarantee
No data leaves your machine. finn-tracker:
- Runs at
127.0.0.1:5050— not accessible from the network by default - Stores everything in SQLite on your disk (
~/Documents/finn-tracker/finn_tracker.db) - Never makes outbound network calls
- Deletes uploaded files immediately after parsing
- Masks card numbers, SSNs, and account numbers in all API responses
AI Chat Assistant
finn-tracker includes a built-in chat assistant that answers questions about your spending in plain English:
"How much did I spend on groceries last month?" "What's my biggest expense category this year?" "Show me my top 5 merchants" "Filter the dashboard to last month" "Which transactions are uncategorized?"
The assistant can answer spending questions and control the dashboard — filtering by period or category on your behalf. It runs entirely on your machine using llama.cpp. No data is sent to any external service.
To enable it:
- Install and start llama-server on port 8080 (the default)
- Launch
finn-tracker— the chat button in the top-right corner will show AI Ready
To use a different port: LLAMA_CPP_URL=http://localhost:8081 finn-tracker
MCP Server (Claude Desktop, Cursor, Kiro)
finn-tracker ships an MCP server that lets AI tools query your expense data directly — no browser required.
To connect Claude Desktop:
Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"finn-tracker": {
"command": "/path/to/your/python",
"args": ["/path/to/finn-tracker/mcp_server.py"]
}
}
}
Once connected, you can ask Claude things like "summarize my spending this month" or "what did I spend on dining last quarter" directly in Claude Desktop.
Supported File Formats
| Format | Auto-detected banks |
|---|---|
| CSV | Chase Bank (checking), Chase Credit, Bank of America, Capital One, generic |
| Capital One, Chase, Bank of America (Visa Signature), and any table-based statement (pdfplumber) |
How It Works
- Files in your expense/income folders are scanned on every page load; unchanged files are cached in memory and not re-parsed.
- Manually imported files are parsed once and persisted to SQLite.
- All transactions are deduplicated by
(date, merchant, amount, account). - Category overrides and learned merchant rules survive server restarts via SQLite.
When you manually categorize a transaction, the app saves a normalized merchant pattern as a rule. Future transactions matching that pattern are auto-categorized.
Use 🗑 Clear Session to undo a bad import without losing your history. Use 🗑 Clear All to start completely fresh.
Platform Support
finn-tracker is developed and tested on macOS and Ubuntu. CI runs on both platforms across Python 3.9, 3.11, and 3.12. Other Unix-like systems should work but are not officially tested. Windows is not supported.
Contributing
Found a bug or want to add a bank parser? See CONTRIBUTING.md for how to get started.
For performance optimization guidance when scaling beyond 10K transactions, see SCALING.md.
Open an issue on GitHub — include the output of finn-tracker --version.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file finn_tracker-0.0.1.tar.gz.
File metadata
- Download URL: finn_tracker-0.0.1.tar.gz
- Upload date:
- Size: 98.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ad3ee352e1418e3482676721f448b9072363f2348919adc6c3272a6ef0ce5084
|
|
| MD5 |
a715cccdc9d3d58349fccf15fd5dcdea
|
|
| BLAKE2b-256 |
fcde1840c822a65b6e329adf30c196166a777e490894a17c2cd60224a5f017b9
|
Provenance
The following attestation bundles were made for finn_tracker-0.0.1.tar.gz:
Publisher:
ci.yml on RachithP/finn-tracker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
finn_tracker-0.0.1.tar.gz -
Subject digest:
ad3ee352e1418e3482676721f448b9072363f2348919adc6c3272a6ef0ce5084 - Sigstore transparency entry: 1525681296
- Sigstore integration time:
-
Permalink:
RachithP/finn-tracker@8f14bff3012296b985e08d2f4240c28bba69312e -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/RachithP
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@8f14bff3012296b985e08d2f4240c28bba69312e -
Trigger Event:
push
-
Statement type:
File details
Details for the file finn_tracker-0.0.1-py3-none-any.whl.
File metadata
- Download URL: finn_tracker-0.0.1-py3-none-any.whl
- Upload date:
- Size: 70.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c584f2aee664785bd8819063a263b5a4565f874a269306bc7cc37754ade2309
|
|
| MD5 |
40f1b0b7db44f9d06fd9c6d643908889
|
|
| BLAKE2b-256 |
367018428a1c920d6aead66c549133268cce2d959cf0e4161e1e73ad1d448744
|
Provenance
The following attestation bundles were made for finn_tracker-0.0.1-py3-none-any.whl:
Publisher:
ci.yml on RachithP/finn-tracker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
finn_tracker-0.0.1-py3-none-any.whl -
Subject digest:
7c584f2aee664785bd8819063a263b5a4565f874a269306bc7cc37754ade2309 - Sigstore transparency entry: 1525681407
- Sigstore integration time:
-
Permalink:
RachithP/finn-tracker@8f14bff3012296b985e08d2f4240c28bba69312e -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/RachithP
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@8f14bff3012296b985e08d2f4240c28bba69312e -
Trigger Event:
push
-
Statement type: