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 Chaseexports 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-runmill 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 withMILLFOLIO_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 withtags.