/\_/\
( o.o ) *rummages through your finances*
> ^ <
/| |\
(_| |_)
Plain-text finance tracking. Rummage through your transactions like a raccoon through trashβfind the good stuff, spot the problems, know where everything went.
A pipeline that transforms raw bank exports into queryable financial data:
bank exports β transforms β your data β beancount/reports
π π¦ π° π
- Tracking, not budgeting - see where money went, don't enforce limits
- Own your data - plain text, version controlled, LLM-queryable
- Extensible - add transforms for your banks, custom reports, API later
rummage (v.): to inspect financial data for irregularities, hidden opportunities, or risksβlike customs officials inspecting cargo. Also what raccoons do. π¦
If you have Nix with flakes enabled:
# Enter dev shell (provides bun, beancount, fava)
nix develop
# Or use direnv for automatic activation
direnv allowInstall separately:
# Bun (JS runtime)
mise install # or: curl -fsSL https://bun.sh/install | bash
# Beancount + Fava (Python)
uv tool install beancount fava
# or: pipx install beancount favagit clone https://github.com/aviraccoon/rummage
cd rummage
bun install
# Rummage through example data
bun run build
# Validate the ledger
bean-check examples/generated/main.beancount
# View in Fava (http://localhost:5000)
fava examples/generated/main.beancountWorks out of the box with examples.
rummage/
βββ examples/ # Sample data (works out of the box)
β βββ raw/ # Bank exports
β β βββ fio/ # Fio banka exports
β β βββ revolut/ # Revolut exports
β β βββ ofx/ # Generic OFX files
β β βββ manual/ # Manual entries
β βββ generated/ # Output (main.beancount)
β βββ accounts.ts # Account definitions
β βββ categories.ts # Category hierarchy
β βββ locations.ts # Payee locations
β βββ overrides.ts # Transaction corrections
β βββ rules.ts # Categorization patterns
βββ data/ # Your real data (gitignored, same structure)
βββ src/ # Source code
βββ scripts/ # Custom reports
See CONTRIBUTING.md for source code structure.
- Create
data/directory (gitignored) - Copy structure from
examples/ - Add your bank exports to
data/raw/ - Customize
data/rules.tswith your patterns - Rummage:
RUMMAGE_DATA_SOURCE=data bun run buildOr create .env:
RUMMAGE_DATA_SOURCE=data
Default is examples - safe for tests and new users.
Some importers (like Fio) need API tokens. Each Fio account needs its own token.
Simple approach - create .env (gitignored):
FIO_TOKEN_PERSONAL=your-64-character-token
FIO_TOKEN_BUSINESS=another-token
Password manager approach - create mise.local.toml (gitignored):
[tasks.1p]
run = "op run --account my.1password.com --env-file .env --"
raw = trueThen use op:// references in .env:
FIO_TOKEN_PERSONAL=op://Private/Fio/personal
FIO_TOKEN_BUSINESS=op://Private/Fio/business
Run with: mise 1p bun run build
Works with 1Password, Bitwarden, or any tool that injects env vars.
- Multi-currency - handles conversions, preserves original amounts
- Split transactions - one purchase, multiple categories
- Payee locations - geographic spending data
- Recurring detection - find subscriptions automatically
- Balance assertions - verify against bank statements
- Override system - fix categorization without editing raw data
Like a raccoon finding treasures:
- ποΈ Forgotten subscriptions
- πΈ Where money actually goes
- π Net worth over time
- π Recurring patterns
- πΊοΈ Geographic spending
β οΈ Anomalies and surprises
- HTTP API for mobile/LLM access
- Custom dashboards beyond Fava
- Threshold alerts
- Bun + TypeScript
- Beancount (output format)
- Fava (web UI)
bean-check ledger.beancount # Validate ledger
bean-query ledger.beancount # Query transactions (SQL-like)
bean-format ledger.beancount # Format/prettify
fava ledger.beancount # Web UI at localhost:5000Want to add support for your bank? See CONTRIBUTING.md.
MIT - do whatever you want with the code.
Your financial data stays yours. Happy rummaging! π¦