vault

Populating your vault

Before you can ask questions or tag anything, millfolio needs your documents. You point it at a folder, and it builds a local index you can query — extracting the transactions along the way. Nothing is uploaded.

Get your statements first

Before indexing, you need the files. Sign in to each of your bank and credit-card sites and download your statements or transaction exports — most portals have a Download or Export transactions option. CSV is ideal (millfolio pulls the exact transactions straight out of it), and PDF statements work too.

Drop everything into a single folder. Subfolders per account or per year are fine — indexing walks the folder recursively — so you don't have to flatten anything. Once the files are gathered, point millfolio at that folder.

Index a folder

Gather your statements and exports somewhere — a single folder is easiest — and hand it to mill index:

# index everything under a folder (walked recursively)
mill index ~/Documents/finances

# you can pass several files or folders at once
mill index ~/Documents/statements ~/Downloads/apple-card-2025.csv

Folders are walked recursively, so nested subfolders (one per account, per year, however you keep them) are all picked up in a single pass. The inference server has to be running first — mill start brings it up, and mill index will tell you if it isn't.

Re-indexing is incremental

Run mill index again whenever you add new statements. Only files that actually changed are re-read and re-embedded, so pointing it at the same folder after dropping in a new month is quick. Pass --force to rebuild the whole index from scratch if you ever need to.

What it indexes

millfolio reads four kinds of file, so most of what lands in a downloads or documents folder just works:

  • PDF statements — bank and credit-card statements; text is extracted layout-aware so tables of transactions survive.
  • CSV exports — transaction downloads from your bank or card portal.
  • Word documents (.docx) — extracted to text.
  • Notes and Markdown (.md, plain text) — indexed verbatim.

Every file is embedded on-device and stored in a local vector index, so open-ended questions (mill ask "…" or the web app) can find the relevant passages no matter which document they live in.

Transactions, extracted on-device

For statements and exports, millfolio doesn't just store the text — it pulls out the individual transactions (date, description, amount, debit/credit direction) so you can get exact totals instead of fuzzy guesses. All of this happens locally.

The CSV extractor understands the common bank and card export layouts — Apple Card, Citi, and Chase exports among them — including the quirk that a card export lists purchases as positive numbers, which millfolio reconciles into the right debit/credit direction. Overlapping exports (the same charge in two downloads) are de-duplicated, so re-importing an overlapping range won't double-count.

Tip: keep exporting fresh CSVs into the same folder and re-run mill index. New transactions are added and tagged automatically; duplicates from overlapping date ranges are dropped.

Where the vault lives

The index and the extracted data are stored under millfolio's own local data directory on your Mac (inside ~/Library/Application Support/Millfolio) — never a server. The ad-hoc question path (mill ask) reads its documents from the vault directory at ~/.config/millfolio/vault (override with MILLFOLIO_VAULT). Because it's all on-device, the same privacy guarantees that cover querying cover indexing too: your documents stay put.

Ask a question

Once a folder is indexed, you can query it — one-shot from the terminal, or in the millfolio web app at http://localhost:10000:

mill ask "how much did I spend on groceries last month?"

From here, the next step is making those answers sharp and repeatable with tags.