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.