Not a budget toy. The pages below replace what people use Mint, Empower, and a stack of spreadsheets to do — under one roof, with your own data.
An industry-configurable investment-research suite for long-term holders. A scored thesis universe joined onto your holdings; public-money signals (free SEC EDGAR filings + Quiver gov-contracts / insider / lobbying / dark-pool with your key); and a sector "rotation watch" that rolls flow, valuation, momentum and relative strength into one read, with a local-LLM narrative. Retarget it to any industry — critical minerals ships as the default.
Per-account FIFO matching mirroring the 1099-B. Chain-correct wash-sale calculator, cross-account transfer reconciliation, Form 8949 CSV, pre-flight sell modal, tax-loss harvest finder.
Multi-decade Monte Carlo with bracket-aware tax math, Roth conversion ladder, IRMAA, RMDs, survivor scenario, sequence-of-returns stress, age-banded spending phases.
30-day forward calendar with paycheck overlay, per-day running balance, projected low-point tile, drag-to-reschedule for one-off events.
Full amortization with extra-payment slider, bi-weekly comparison, refinance modeler, PMI drop-off detection, HELOC modeling, multi-loan stacked timeline.
HSA contribution tracker, capital-loss carryover, Schedule C bucketizer with capital-vs-expense routing, business mileage. One PDF for your CPA.
Per-category targets with personal/business split. Auto-rollover for variable categories. Force-tag/untag overrides for the subscription detector.
Floating panel of curated questions ("how much did I spend", "what changed in my net worth", "what bills are coming up"). Numbers are pre-computed in Python; a local Ollama model writes the prose. No data leaves your laptop.
A real native iOS companion app pairs with your laptop over home Wi-Fi via a one-time QR code, mirrors your accounts and transactions to a local SQLite on the phone, and reads from that mirror so screens are instant and work when the laptop is asleep. Includes a home-screen widget (net worth + cash at a glance). Read-only by design — edits stay on the laptop. Currently in private TestFlight.
The tile grid above is the brochure. This is the showroom — what each page actually looks like and the specific work it does.
The page you open every morning. Net-worth + cash + month-delta tiles, anomaly insights surfaced before you go looking, and stale-balance alerts on accounts that haven’t synced.
A spreadsheet that knows what categories are. Search, filter, edit in bulk, attach notes, pin for later — and when you recategorize a one-off, the app offers to make it a permanent rule.
Heatmap of when you spend, leaderboard of who you pay, year-over-year of how that’s shifting. The page that makes patterns visible before they become problems.
A real calendar, not a list. Bills and paychecks land on actual dates with a running balance underneath, and a low-point tile flags the day you should worry about.
One page that answers “what if I paid an extra $200/mo?” without a spreadsheet. Includes the modeling tools your bank charges to use.
The page accountants charge $300/hour to assemble. Per-account FIFO matching that mirrors your 1099-B, a chain-correct wash-sale calculator, and a clean Form 8949 CSV at the end.
A retirement model that knows about progressive brackets, RMDs, IRMAA, the 0% LTCG rule, and what happens when one spouse outlives the other. Most calculators stop at “rough estimate.”
A year-end summary that pulls from every other page — HSA contributions, capital loss carryover, Schedule C buckets, business mileage — and stitches them into a single document.
A floating panel of curated questions answered by a local Ollama model running on your own laptop. Numbers are pre-computed in Python (no hallucinated dollars) and the LLM only writes prose around them. Your transactions never leave the machine.
Score a universe once, join it onto the names you actually hold, and watch for the inflection. Public-money signals and SEC filings fold into your alerts; a sector rotation read tells you whether capital is arriving yet. Switch or create a whole new industry from the app.
One SQLite file, not a SaaS. Plaid runs over TLS direct from your laptop to your bank. No cloud, no analytics, no telemetry, no marketing emails to opt out of.
Mint went away. Many of its replacements will eventually too. Tusk Ledger is yours — fork it, host it, hack it. The bus factor is one (you).
Free Plaid tier covers up to 100 connected items. For a personal household that’s permanent. Past that you’re paying Plaid directly, not me.
Plaid talks to your bank, your laptop talks to Plaid, and that's the entire round-trip. There is no Tusk Ledger server in the middle because there is no Tusk Ledger server. Your AI assistant connects via a second local process — the MCP server — that never leaves your machine either. And when you turn on the optional Dashboard AI insights card AND the in-app Ask panel, both feed a third local process — Ollama, running an open-weight model on your own hardware — that writes the narratives and answers. The iPhone companion app is just another local read-client — it pairs with the laptop over your home Wi-Fi via a per-device bearer token and reads from the same FastAPI surface; no cloud round-trip there either. Local data, local compute, local model — no cloud in the core loop. The one exception is the optional research suite: to draw a price chart or show public filings it queries market-data, SEC EDGAR, and Quiver endpoints by ticker symbol — never your balances or holdings — and only when you open those tabs.
A native iOS companion app pairs with your laptop over your home Wi-Fi via a one-time QR code, mirrors your accounts and transactions into a local SQLite on the phone, and reads from that mirror so screens are instant and keep working when the laptop is asleep. Your data still never leaves your home network.
Currently in private TestFlight as the iOS build hardens — the June 2026 build shipped a ground-up UI redesign (34pt tabular money numerals, gold-accent design system, sticky day headers, allocation bars) plus the home-screen widget. Source lives in tuskledger/mobile alongside the desktop app — Expo + React Native + TypeScript, talks to the same FastAPI backend over a /api/mobile/* namespace gated by per-device bearer tokens.
Five years ago, running a local-first finance app meant being a developer. Today, you just need an AI assistant in your pocket. Tusk Ledger is built to work with Claude Code, Cursor, Cowork, and the rest — clone the repo, hand it to your assistant, and let it install, configure, and customize it for you.
Tell Claude / Cursor / Cowork to set up tuskledger. It clones, reads AGENTS.md, installs the venv + node modules, and gets the dev servers running.
Add tuskledger-mcp to your assistant's MCP config (one uvx line). Now it can call typed tools like list_accounts, query_transactions, and get_holdings — no UI scraping, no guessing at the schema.
Your assistant guides you through getting sandbox keys (5 min) or production access (a few days). When something errors out, paste the error back to it; the gotchas are documented.
"Add a tile that shows my coffee spending by week." "Make the dashboard hide income." Your assistant edits the React component, hot-reloads, and the change is live. The repo is your repo.
The data stays on your laptop. Your assistant stays separate (you bring your own — there's no LLM embedded in the app). The bridge between them — tuskledger-mcp — stays local too.
Real prompts you can copy-paste into Claude / Cursor / Cowork after the MCP server is connected. Click any question to see the prompt and what the assistant's response would look like — rendered with the same demo data the app ships with.
These responses are mockups based on the demo dataset. Once you wire the MCP server in, your assistant runs the same kind of prompts against your own data — live, no canned content.
Where it's the same, where it's different, where the trade-offs sit. Calibrated by someone who actually used all five for years.
| Mint | Empower | Quicken | Spreadsheet | Tusk Ledger | |
|---|---|---|---|---|---|
| Local-only data | ○ | ○ | ◐ | ● | ● |
| Open source / inspectable | ○ | ○ | ○ | ● | ● |
| No subscription | ◐ | ● | ○ | ● | ● |
| Bank sync (Plaid) | ● | ● | ● | ○ | ● |
| Bills + paycheck calendar | ● | ○ | ● | ○ | ● |
| Tax-aware retirement model | ○ | ◐ | ◐ | ○ | ● |
| Wash-sale calculator | ○ | ○ | ◐ | ○ | ● |
| Schedule C bucketizer | ○ | ○ | ◐ | ○ | ● |
| Investment thesis tracker | ○ | ○ | ○ | ◐ | ● |
| Public-money signals (SEC/Quiver) | ○ | ○ | ○ | ○ | ● |
| Sector rotation watch | ○ | ○ | ○ | ○ | ● |
| Industry-configurable research | ○ | ○ | ○ | ◐ | ● |
| Zero telemetry | ○ | ○ | ○ | ● | ● |
| Survives if vendor folds | ○ | ○ | ○ | ● | ● |
| AI assistant (MCP) hookup | ○ | ○ | ○ | ○ | ● |
| Local LLM for AI insights | ○ | ○ | ○ | ○ | ● |
| In-app local-LLM chat (Ask) | ○ | ○ | ○ | ○ | ● |
| Native iPhone companion | ◐ | ● | ● | ○ | ● |
Your bank data should live where your bank statements live — on your machine. No SaaS to outlive, no breach to be in, no marketing emails to opt out of. SQLite is in your home folder; you can move it, back it up, or delete it like any other file.
Copy the .db file. That’s the entire app’s state. Restore on the new machine, run ./start.sh, and you’re back exactly where you left off. Plaid access tokens carry over too unless they’ve expired.
The app auto-snapshots the SQLite DB on every startup to a sibling folder. You decide what backup tooling fits the rest of your life — Time Machine, rsync, encrypted external drive, an iCloud Drive folder. The DB is one file.
Plaid’s free tier covers 100 connected items. For one household, that’s permanent. If you go past it, you pay Plaid directly — there’s no middle layer marking up your usage. If Plaid disappeared tomorrow you’d lose bank sync but keep every transaction you’d already pulled.
It’s already out. The whole DB is on your laptop in plain SQLite. Open it in DB Browser, dump it to CSV, query it from a Python REPL — there’s no export button because there’s no lock-in.
Demo mode ships enabled by default so you can poke around with seeded data before linking real accounts. One toggle in Settings flips you to real mode; the app refuses to mix the two and prompts before the switch.
Optional. There’s full email/password + TOTP MFA support if you want it — with brute-force lockout, TOTP replay rejection, and the TOTP secret encrypted at rest with the same Fernet key that protects your Plaid tokens. On a single-user laptop many people skip the login via DEV_BYPASS_AUTH. Your machine, your call.
Yes — a read-only seeded instance runs at demo.tuskledger.com (when DEMO_LIVE is on; the link in the hero only appears while the demo is up). It's the full app, populated with synthetic Alex-Carter household data: checking + brokerage + mortgage + 12 months of transactions. Every page is navigable; the read-only middleware blocks any mutation server-side, so visitors can't affect each other. No login, no Plaid keys required — the lockdown is enforced by the DEMO_LOCKED env var on the deployment, not just by hiding edit buttons.
Yes — two ways. Preferred: a native iOS companion app (currently in private TestFlight; source in tuskledger/mobile, Expo + React Native + TypeScript) that pairs with your laptop over your home Wi-Fi via a one-time QR code, mirrors accounts and transactions into a local SQLite on the phone, and reads from that mirror so screens are instant and keep working when the laptop is asleep. It ships with a home-screen widget (net worth + cash + sync freshness, all three sizes) rendered from the same on-device snapshot. Read-only by design — edits happen on the laptop. Fallback: the laptop dev server is also a PWA — open http://<your-laptop-ip>:3000/?view=readonly from Safari, Share → Add to Home Screen. To use either off your home Wi-Fi, run a Cloudflare Tunnel with Cloudflare Access in front (single-email allowlist via Google or Apple OAuth).
GitHub issues for bugs, GitHub PRs for code, GitHub discussions for ideas. The main app and the MCP server are separate repos with their own issue trackers — file the bug where the bug lives.
tuskledger-mcp is a separate, optional Model Context Protocol server. Add it to your AI assistant's config (one uvx line) and Claude / Cursor / Cowork can call typed tools like list_accounts, query_transactions, get_holdings, get_retirement_projection — instead of scraping the React UI. The main app runs perfectly without it; the MCP server just makes agent-driven workflows fast.
No. It binds to 127.0.0.1 only and talks to your local Tusk Ledger backend over stdio. The "MCP cloud" doesn't exist — it's one Python process on your machine talking to another Python process on the same machine. Your assistant reads the responses, your assistant's provider sees those responses (whichever LLM you chose), and that's the entire trust boundary.
There's an optional Dashboard card that runs an open-weight LLM (llama3.1:8b by default) on your own hardware via Ollama. Your transactions never leave the laptop — Ollama binds to 127.0.0.1, the FastAPI backend feeds it pre-computed numbers, and the model writes a 2-3 paragraph plain-English narrative around those numbers. Off by default; flip LLM_ENABLED=true in backend/.env and pull a model with `ollama pull llama3.1:8b` to turn it on. On Apple Silicon a narrative renders in 5-15 seconds; on Intel hardware drop to phi3:mini or leave it off.
No — by design. The narrative service builds the prompt from a structured JSON bundle of pre-computed totals, deltas, and category leaders, and the system prompt explicitly forbids the model from inventing numbers. Every dollar figure in the prompt is rounded to whole dollars at the serializer boundary so the model can't even see fractional cents. The model writes prose around the numbers; the numbers themselves come from Python. Same load-bearing invariant applies to percentages and merchant attributions.
Ask is a floating button in the bottom-right corner of the app that opens a slide-in panel of curated questions — "how much have I spent", "what changed in my net worth", "what bills are coming up", "where am I overspending", "top merchants", and a few more — each with horizon chips (today / 1w / 1mo / 1yr where it makes sense). Click a question, the local Ollama model writes a short answer using numbers pre-computed in Python. Same no-hallucination invariant as the Dashboard AI Insights card, just on-demand and per-question instead of a daily card. Both run on the same local Ollama process; turning LLM_ENABLED off makes Ask fall back to a templated one-line answer derived from the same JSON bundle, so the panel still answers without prose. Nothing leaves your laptop in either case.
An optional investment-research suite for long-term holders. Research is a scored thesis universe (conviction, catalysts, invalidation triggers, analyst-target-vs-price, a real price chart with momentum) joined onto the names you actually hold. Signals layers public-money activity on top — free SEC EDGAR filings (insider Form-4, 8-K, S-1/424B dilution) plus, with your own Quiver key, government contracts, congressional & insider trades, lobbying, and dark-pool data. Rotation rolls it all up to the sector level into one 0-100 "is capital rotating in yet" temperature, narrated by the local LLM. They ship pre-loaded with a critical-minerals universe and are entirely optional — ignore the tabs and the rest of the app is unchanged.
They make outbound calls, but only for public market data — never your balances, holdings, or any personal financial data. To draw a price chart the app fetches public quotes for a ticker; to show filings it queries the SEC's public EDGAR endpoints; to show public-money signals it queries Quiver. What goes over the wire is a stock symbol (e.g. "MP"), not anything about you. SEC EDGAR is free and needs no key; market data (Twelve Data) and Quiver are bring-your-own-key and simply stay dark until you add one. All of it is off until you open those tabs, and the public read-only demo makes no outbound calls at all. Your bank data still never leaves your machine.
Yes — that's the design. The suite is driven by one research file per industry; critical minerals is just the default. Each file carries an "industry" config block (benchmark, sector proxy ETFs, how the rotation temperature is weighted, which signals apply), so you can retarget the whole thing to retail, defense, semiconductors, energy, or anything else with no code changes. You switch the active industry — or scaffold a brand-new one — from inside the app; there's a short guide (docs/adding-an-industry.md) and a copy-and-fill template in the repo. The app focuses on one industry at a time.
Hand it to your AI assistant, run the five-line shell setup, or install the Cowork plugin for one-command setup. Same end state either way: app on localhost, data on your laptop, no cloud in the loop.
demo.tuskledger.com — synthetic Alex-Carter household, every page navigable, nothing you do affects anyone else.Copy the prompt below into Claude Code, Cursor, Cowork, or any other AI client with file system and shell access. Your assistant clones the repo, reads AGENTS.md, runs the setup, pauses to ask you for Plaid sandbox keys, then verifies with ./tuskledger doctor. You answer two questions; it does the rest.
I want to install Tusk Ledger, a locally-run personal finance app. Main repo: https://github.com/BradMorphsters/tuskledger MCP server: https://github.com/BradMorphsters/tuskledger-mcp (optional, recommended) Please: 1. Clone the main repo to a sensible place on my machine. 2. Read AGENTS.md at the repo root — it documents permission boundaries, common operations, and known footguns. Follow its conventions. 3. Run the setup (cp backend/.env.example backend/.env, then ./start.sh). 4. When .env needs Plaid keys, pause and ask me — I'll get sandbox keys from plaid.com (5 min). Don't make up credentials. 5. Run ./tuskledger doctor and show me the JSON; confirm all checks pass. 6. Open http://localhost:3000 and verify Demo Mode loads. 7. Ask if I want the MCP server wired in. If yes, add tuskledger-mcp to my MCP client's config (ask which client) — it's published on PyPI, so the .mcp.json entry is just `"command": "uvx", "args": ["tuskledger-mcp"]`. Don't disable auth or rotate the encryption key without asking. Everything stays local — there is no cloud server to talk to.
Works in any client with file system + shell access (Claude Code, Cursor, Cowork, Copilot CLI, Aider, etc.). Won't work in plain claude.ai or chatgpt.com — those can't touch your computer.
Requires Python 3.12+ and Node 22+. Plaid sandbox keys are immediate; production access takes a few days but is free for household use.
# 1. Clone
git clone https://github.com/BradMorphsters/tuskledger.git
cd tuskledger
# 2. Configure backend (paste Plaid sandbox keys)
cp backend/.env.example backend/.env
# 3. Launch — sets up venv + npm install + boots both servers
./start.shOr double-click Tusk Ledger.command if you cloned to a Mac. Demo mode is enabled by default so you can poke around before linking real accounts.
Drop this into Claude Desktop, Cursor, Cowork, or any other MCP-aware client and your assistant gets typed access to your local Tusk Ledger data — accounts, transactions, holdings, the whole API surface. Source at github.com/BradMorphsters/tuskledger-mcp.
{
"mcpServers": {
"tuskledger": {
"command": "uvx",
"args": ["tuskledger-mcp"]
}
}
}Restart your client and the tools appear. The package is on PyPI, so uvx resolves it by name — or point --from at git+https://github.com/BradMorphsters/tuskledger-mcp for unreleased commits. The server runs locally — it binds to 127.0.0.1 and talks to your laptop's Tusk Ledger backend over stdio. No data leaves your machine.
If you're on Cowork or Claude Code, the bundled plugin wires up the MCP server, registers a /tuskledger-install slash command, a /tuskledger-doctor health check, and an install skill that triggers when you describe wanting to set the app up in your own words. Source at github.com/BradMorphsters/tuskledger-marketplace.
# 1. Add the marketplace /plugin marketplace add BradMorphsters/tuskledger-marketplace # 2. Install the plugin /plugin install tuskledger@tuskledger-marketplace
After install, run /tuskledger-install to set up the actual app — the slash command and the install skill are the same workflow described above, just packaged so your assistant can invoke it directly. The MCP server auto-starts on your client's next launch.
Quick definitions for every project-specific term used on this page or in the app.