← ~/work

Case study2026Sole author

Wallet importer

Bank transactions into BudgetBakers Wallet, with the time of day intact

Role
Sole author
Stack
TypeScript · Node.js · CLI · bankstract
Status
Shipped
Reading
1 min
Wallet importer · statement → budgetre-runs are safe · batches roll back
bankstractstatement → CSV / JSON
mapbank → Wallet accountdefault category
importerrecord IDs from batch + rowduplicates rejected
Walletrecords with time of dayseveral accounts per run
failed rowsCSV to fix and re-run
undoroll back a batch

A Node CLI that imports transactions into BudgetBakers Wallet from a CSV or straight from bankstract output. It keeps the time of each transaction, handles several accounts in one run, pairs transfers, and can roll a batch back.

Problem

Wallet's own import drops the time of day and takes one account per file. With statements from several banks, that meant many files and a history where every transaction sits at midnight.

Approach

The CLI signs in with your own Wallet account, the same way the app does, and writes records directly. It reads a simple six-column CSV, or bankstract JSON or CSV with a map from bank to Wallet account and a default category. --convert-only writes the CSV so you can fix rows by hand first.

bash
bankstract auto statement.pdf -o statement.csv
budgetbakers-wallet-importer --from-bankstract statement.csv --bank-map banks.json --default-category Other --dry-run

Design decisions

Safe to re-run

Each record's ID is derived from the batch ID and the row itself, so running the same batch twice is rejected instead of duplicating transactions. Rows that fail go to a CSV you can fix and run again.

Undo

A batch can be rolled back by its ID, or by the last N records. Transfers between your own accounts are paired automatically.

Outcome

  • On npm (1.6.0), MIT, public on GitHub
  • 46 tests
  • Closes the loop with bankstract: statement → transactions → your budget