The door
Plaid is the only way in. Transactions arrive through a sync cursor, one page per commit, so a sync that dies on page 487 of 500 picks up at 487.
Removed transactions are soft-deleted, never lost.
on your machine
The House of Hearthself-hosted personal finance
A self-hosted home for your financial data. Plaid brings your accounts in, one encrypted database keeps them, and the dashboard, Claude and whatever you build next all read from the same core.
See how it's builtPersonal finance should stay personal.
Most money apps want your bank login, your whole history, and a server of theirs to keep it on. We wanted the opposite.
A ledger you host yourself, kept in a single file you can back up or delete, that answers in plain English and gives every app you build one trusted place to read from.
Plaid is the only way in. Transactions arrive through a sync cursor, one page per commit, so a sync that dies on page 487 of 500 picks up at 487.
Removed transactions are soft-deleted, never lost.
The dashboard and the Claude server are the first two rooms upstairs. Neither keeps logic of its own; both walk down to core/, and so can any room you add.
Everything rests in one SQLite file on your disk. The bank tokens inside are sealed with AES-GCM, each bound to its own account so it can't be lifted and replayed against another.
The master key never touches the disk. It lives in your system keychain: macOS Keychain, Windows Credential Locker or Linux Secret Service.
Copy finance.db to a stranger's laptop and it opens nothing.
Claude gets a window, never a key. Its server opens the file read-only, never imports the crypto layer, and has no road to Plaid.
The worst it can do is read your spending.
Claude can answer things like what did I spend on dining in September?
Connect ClaudeIllustrative answers from Plaid Sandbox data
Five read-only tools. Not one of them can write.
The dashboard and the Claude server are just the first tenants. Underneath them is a plain foundation: your accounts, transactions and holdings, synced, encrypted and queryable three ways.
core/ · import it
Five read-only functions over your ledger. They take a session and return plain, JSON-safe dicts, the same ones every other room calls.
from core.queries import net_worth net_worth(session) # {"total": …, "credit": …, …}
api/ · call it
A FastAPI service for accounts, transactions, holdings, net worth, category spend and sync, with interactive docs at /docs.
curl -G 127.0.0.1:8000/category-spend \ -d start_date=2026-09-01 \ -d end_date=2026-09-30
mcp_server/ · ask it
Five read-only tools over stdio for Claude Desktop or any other MCP client. The database opens read-only, so no agent can write.
python -m mcp_server
# five tools, read-only
Rooms you could add
The API binds to 127.0.0.1 and has no login of its own, deliberately: whatever you build runs beside it on the same machine. Reaching it from other devices means putting your own authentication in front of it first.
You'll need Python 3.11 or newer, Node with pnpm, and a free Plaid Sandbox key. Migrations run on first start.
117 tests keep it standing: 116 run on every change, and one opt-in test talks to the real Plaid Sandbox.
$ git clone https://github.com/Kandel-Bibas/House_of_Hearth.git $ cd House_of_Hearth
$ python3 -m venv .venv && source .venv/bin/activate $ pip install -e ".[dev]" $ cp .env.example .env # add your Plaid Sandbox keys
$ cd frontend && pnpm install && cd ..$ make dev api on localhost:8000, dashboard on localhost:5173
If that sounds right to you, clone it and light the fire