PERSONAL FINANCE · LOCAL-ONLY · MIT

The ledger that
never forgets.

A locally-run personal finance dashboard. Plaid for the bank data, SQLite on your laptop for storage, FastAPI + React for the surface. MIT-licensed, no cloud, no telemetry, no upsell.

Plaid-compatible · bring your own keys
Apply to Plaid for your own production access, drop your API keys into .env, and the app plugs into the same data tier that powers Robinhood and Mint.
DashboardLIVE
June 2026
Net Worth
$0
Assets
$0
Debt
$0
This Month
−$0
Net worth · 12 months
+19.3% YoY
Spending by day · this month
Top categories
click to drill in
Shopping
$3,168
Travel
$2,340
Services
$1,800
Loan Payments
$1,620
Food & Dining
$936
WHAT'S IN THE BOX

Nine features doing real work.

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.

Research · Signals · Rotation

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.

Trading Tax

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.

Retirement Projection

Multi-decade Monte Carlo with bracket-aware tax math, Roth conversion ladder, IRMAA, RMDs, survivor scenario, sequence-of-returns stress, age-banded spending phases.

Bills Calendar

30-day forward calendar with paycheck overlay, per-day running balance, projected low-point tile, drag-to-reschedule for one-off events.

Loans

Full amortization with extra-payment slider, bi-weekly comparison, refinance modeler, PMI drop-off detection, HELOC modeling, multi-loan stacked timeline.

Tax Prep Pack

HSA contribution tracker, capital-loss carryover, Schedule C bucketizer with capital-vs-expense routing, business mileage. One PDF for your CPA.

Budgets + Business

Per-category targets with personal/business split. Auto-rollover for variable categories. Force-tag/untag overrides for the subscription detector.

Ask — local-LLM chat

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.

Phone access (native iOS app)

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.

A LOOK INSIDE

Ten pages, each pulling its weight.

The tile grid above is the brochure. This is the showroom — what each page actually looks like and the specific work it does.

DASHBOARD+19.3% YoY
NET WORTH
$261,967
THIS MONTH
−$2,486
Hulu jumped from $9.99$14.99
DASHBOARD

Everything important above the fold

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.

  • Net worth, assets, debt, this-month delta — with year-over-year overlay
  • Anomaly cards: subscription price changes, unusual spend, new merchants
  • Daily snapshot, payoff countdown tile, stale-balance alerts on manual accounts
🔍 search merchant, amount, note…
Apr 28
Whole Foods
Groceries
−$87.42
Apr 27
Stripe payout
Business
+$1,420.00
Apr 26
Tesla Supercharge
Auto
−$22.10
Apr 25
Netflix
Subscription
−$22.99
TRANSACTIONS

Every transaction, every filter you’d want

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.

  • Full-text search, saved filters, per-business filter chip
  • Bulk recategorize / tag / business-tag on multi-select
  • Auto-suggested rules, transaction notes, pin-for-later, per-merchant drill-down
SPENDING HEATMAPlast 5 weeks
TOP MERCHANTS
Whole Foods
$432
Shell
$218
Amazon
$184
SPENDING & INCOME

Where the money actually goes

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.

  • Spending heatmap by day-of-month with month-over-month overlay
  • Top merchants leaderboard with sparklines and click-to-drill
  • Year-over-year comparison, cash flow calendar, per-business filter
NEXT 30 DAYSlow: $1,124 on Apr 22
bill paycheck today
BILLS CALENDAR

30 days forward — every bill, every paycheck, your low point

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.

  • 30-day forward calendar with paycheck overlay and per-day running balance
  • Projected low-point tile flagging the day balance dips closest to zero
  • Drag-to-reschedule one-off events, mark paid inline, recurring detection
MORTGAGE PAYOFF+$200/mo → 6 yrs faster
INTEREST SAVED
$48,212
PMI DROPS
Aug 2027
PAYOFF
Jun 2046
LOANS

Pay it off smarter

One page that answers “what if I paid an extra $200/mo?” without a spreadsheet. Includes the modeling tools your bank charges to use.

  • Full amortization with extra-payment slider and instant payoff curve
  • Bi-weekly vs monthly comparison, refinance modeler, PMI drop-off detection
  • HELOC modeling, multi-loan stacked timeline, surfaces manual liabilities
REALIZED 2026FIFO · CHAIN-CORRECT
SHORT-TERM
+$2,841
LONG-TERM
+$5,107
Wash sale (locked)
$412 deferred
3 lots
⬇ Export Form 8949 (CSV)
INVESTMENTS · TRADING TAX

Every sell, tax-correct

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.

  • Per-account FIFO matching mirroring the 1099-B, plus inter-account transfer reconciliation
  • Chain-correct wash-sale calculator — interleaved chronological pass, per-symbol or all-accounts scope
  • Pre-flight sell modal, tax-loss harvest finder, cash & buying power, Form 8949 CSV export
MONTE CARLO · 1,000 PATHS92% success
age 47retire 60drain 92
Roth ladder: $32k/yr
IRMAA tier: 2
RETIREMENT PROJECTION

60 years out, with the tax math right

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.”

  • Monte Carlo + fan chart + probability-of-success, sequence-of-returns stress preset
  • Roth conversion ladder, IRMAA premium tiers, RMD math, fill-to-bracket conversions
  • Survivor scenario, age-banded spending phases, mortgage-payoff step events, depletion-age line
TAX PREP · 2026📄 PDF for CPA
HSA contribution$5,683 / $7,750
Capital loss carry$2,418
Schedule C$14,210 / 22 cats
QBI (§199A)Drafted
TAX PREP PACK

Hand your CPA one PDF

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.

  • HSA contribution tracker (incl. payroll deduction) + capital loss carryover with year tracking
  • Schedule C bucketizer with capital-vs-expense routing, QBI (Section 199A) deduction
  • One umbrella PDF report: every form line, every supporting tile, ready for your CPA
✦ ASK · LOCAL OLLAMA
How much have I spent
TodayPast weekPast monthPast year
What changed in net worth
TodayPast weekPast monthPast year
How is my portfolio doing
TodayPast weekPast monthPast year
✦ ANSWER · LOCAL · LLAMA3.1:8B
You've spent $4,287 over the past 30 days, down ~8% vs the prior month. Top category: Groceries ($679).
ASK · LOCAL LLM CHAT

Click the question. The model does the rest. Locally.

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.

  • Nine prompts ship today: spending total, net worth change, upcoming bills, portfolio status, where am I overspending, top merchants, income, stale accounts, savings rate
  • Time-horizon chips on each (today / 1w / 1mo / 1yr) — pick the window, get a one-paragraph answer
  • Powered by Ollama (llama3.1:8b default) bound to 127.0.0.1; no LLM means a templated fallback so the panel still answers, just without prose
ROTATION WATCHStirring · 41/100
USARconviction 92Oversold
MPconviction 90In range
ALMconviction 91Heating
RESEARCH · SIGNALS · ROTATION

A long-term-hold research desk, retargetable to any industry.

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.

  • Research: conviction, catalysts, invalidation triggers, analyst-target-vs-price (oversold indicator), real price chart + momentum
  • Signals: free SEC EDGAR (insider Form-4, 8-K, dilution filings); Quiver gov-contracts / congressional & insider trades / lobbying / dark-pool with your key
  • Rotation: one 0-100 temperature from flow, valuation re-rating, momentum + sector relative strength, and catalyst cadence — narrated by a local LLM
  • Industry-configurable: switch or create an industry in-app; critical minerals ships as the default
WHY LOCAL-FIRST

One file. Your machine. No middleman.

Your data never leaves your machine

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.

No one can shut it down

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).

No subscription, no upsell

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.

DATA FLOW

Where everything actually lives.

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.

Your bank(Chase, Schwab…)Plaid(TLS · your keys)YOUR LAPTOPSQLiteone .db fileFastAPI:8000React + Vite:3000MCP serverstdio · optionalLocal AIOllama · llama3.1:8b · optionalAI INSIGHTS+ ASK─── NO CLOUD SERVER · NO TUSK LEDGER ENDPOINTS · NO LLM API ───BrowseryouAI assistantClaude · Cursor · CoworkiPhoneTusk Ledger appOAuthHTTPSlocalhostMCP · stdioLAN · token
STORAGE
SQLite, one file, your home folder
BACKEND
FastAPI on localhost:8000
FRONTEND
React + Vite on localhost:3000
BANK ACCESS
Plaid TLS, your keys, your tokens
AGENT BRIDGE
Optional MCP server, stdio, 127.0.0.1 only
AI INSIGHTS + ASK
Optional Ollama (llama3.1:8b default), 127.0.0.1 only — powers both the Dashboard narrative card and the in-app Ask panel
iOS COMPANION
Native Expo app, pairs over home Wi-Fi via QR + per-device bearer token, mirrors to local SQLite on the phone
RESEARCH DATA
Optional. Outbound only for public market data / SEC EDGAR / Quiver, by ticker — never balances or holdings. EDGAR free; market data + Quiver are BYO-key; off until used
TELEMETRY
None. No analytics. No phone-home.
AUTH
Optional TOTP MFA · lockout + replay protection · secrets encrypted at rest
ON YOUR PHONE

And in your pocket — without
shipping it to the cloud.

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.

  • Pair once with a QR. Open the laptop's "Pair phone" page, scan the code from the iOS app, done. No accounts, no cloud signup.
  • Local SQLite mirror. Reads come from the phone's flash, not the network — sub-millisecond, even on a packed subway. Background sync pulls deltas every few minutes when you're home.
  • Read-only by design. Edits, categorization, and budgets all stay on the laptop. The phone is a window, not a workshop — same trust model as the desktop app, just smaller.
  • Home-screen widget. Net worth, cash, and sync freshness on your home screen in all three widget sizes — refreshed after every background sync, served from the same on-device snapshot. No network call to render it.
  • Demo mode for screenshots. One toggle in Settings swaps to the laptop's synthetic demo dataset and tags every screen with a bright DEMO pill, so you can share the UI without exposing real balances.

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.

FOR AGENT-ASSISTED USERS

You don't need to know Python.
You need an AI assistant.

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.

01

Hand the repo to your assistant

Tell Claude / Cursor / Cowork to set up tuskledger. It clones, reads AGENTS.md, installs the venv + node modules, and gets the dev servers running.

02

Wire in the MCP server

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.

03

Walk through Plaid setup together

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.

04

Customize it like it's yours

"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.

What makes the codebase agent-friendly
LIVEAI Insights card · local Ollama LLM
Optional Dashboard card that summarizes the month in plain English using a local open-weight model (llama3.1:8b by default). The model never sees fractional dollars — every number is pre-computed in Python and the LLM only writes prose around them, so a 7B-class model can't hallucinate amounts. Cached once per day; manual refresh button after a Plaid sync. Set LLM_ENABLED=true and `ollama pull llama3.1:8b` to turn it on.
LIVEAsk panel · curated chat over local Ollama
Floating bottom-right button opens a slide-in panel of nine pre-built questions (spending, net worth, bills, portfolio, overspending, top merchants, income, stale accounts, savings rate) each with horizon chips. Same Ollama process as AI Insights, same no-hallucination invariant — handlers compute every dollar in Python and the LLM only writes prose. Falls back to a templated one-liner if Ollama is off, so the panel still answers without an LLM.
LIVEMCP server — its own repo
tuskledger-mcp is a Model Context Protocol server that runs locally — your AI assistant gets typed access to 17 tools (list accounts, query transactions, budgets, cash-flow forecast, trading-tax summary, retirement projection, and more) without touching the network. One uvx line in your MCP client config and you're wired in. Source at github.com/BradMorphsters/tuskledger-mcp.
LIVEAGENTS.md at the repo root
Working-memory doc for AI assistants — permission boundaries, common ops, and the project's known footguns. Saves your assistant hours of grepping.
LIVEtuskledger doctor — JSON health checks
One CLI command runs 13 environment checks (Python/Node versions, .env keys, encryption-key permissions, port availability, alembic head…) and emits a stable JSON shape. Your assistant ingests it and tells you exactly what to fix.
LIVE"Copy to assistant" UX hooks
Errors and setup steps come with a one-click button that builds a perfect prompt — title, context, error, location, recent action — and copies it. Paste it into Claude / Cursor / Cowork and it has everything it needs.
LIVEBoring, well-documented stack
Python 3.12 + FastAPI + React 18 + SQLite. Exactly the stacks AI assistants are best at. No esoteric frameworks for an assistant to misread.
LIVEPure-function tax modules
Wash-sale calculator, retirement simulator, Schedule C bucketizer — all pure functions over typed inputs. Your assistant can reason about them without running them.
LIVEAuto-generated REST API + OpenAPI spec
FastAPI auto-generates an interactive Swagger UI at http://127.0.0.1:8000/docs and ReDoc at /redoc, plus the raw OpenAPI JSON at /openapi.json. Your assistant can read the spec to generate a typed client in any language without scraping the React UI. The MCP server is built on these same routes.

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.

TALK TO YOUR ASSISTANT

Once it's wired in, here's what to ask.

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.

Daily check-ins
Monthly rhythms
Tax season
Customizing the app itself

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.

VERSUS

The honest comparison.

Where it's the same, where it's different, where the trade-offs sit. Calibrated by someone who actually used all five for years.

MintEmpowerQuickenSpreadsheetTusk 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
full partial none
FAQ

The questions everyone asks.

Why local-first?

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.

What if I switch computers?

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.

How are backups handled?

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.

What if Plaid changes pricing?

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.

Can I get my data out?

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.

Is Demo Mode required?

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.

Is auth required?

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.

Is there a demo I can try without installing?

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.

Can I use this from my phone?

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).

How do I report bugs / contribute?

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.

What does the MCP server do — and is it required?

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.

Does the MCP server send my data anywhere?

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.

How do the AI Insights work without sending my data to OpenAI / Anthropic?

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.

Can the local LLM hallucinate the dollar amounts?

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.

What is the Ask panel and how does it differ from the AI Insights card?

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.

What are the Research, Signals, and Rotation tabs?

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.

Do the Research/Signals features send my data anywhere?

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.

Can I point the research suite at a different industry?

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.

GET STARTED

A few ways to get running.

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.

Want to look first?
A read-only seeded copy is running at demo.tuskledger.com — synthetic Alex-Carter household, every page navigable, nothing you do affects anyone else.
Open the demo
HAND IT TO YOUR ASSISTANT

One prompt. Done.

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.

OR, BY HAND

Five lines of shell.

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.sh

Or 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.

OPTIONAL · WIRE UP YOUR AI ASSISTANT

One line in your MCP client config.

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.

OPTIONAL · COWORK / CLAUDE CODE PLUGIN

One marketplace install — MCP, commands, and skill.

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.

GLOSSARY

What everything means.

Quick definitions for every project-specific term used on this page or in the app.

Tusk Ledger
A local-first personal finance app that runs entirely on your laptop. Bank data syncs from Plaid direct to a SQLite file in your home folder; nothing is sent to a Tusk Ledger server because no Tusk Ledger server exists.
AI Insights card
A Dashboard tile that summarizes the current month's spending in 2-3 plain-English paragraphs. The text is written by a local Ollama model around numbers pre-computed in Python — the model never invents dollar figures. Off by default; flip LLM_ENABLED in backend/.env to turn it on.
Ask panel
A floating button in the bottom-right of the app that opens a slide-in panel of curated questions ("how much have I spent", "what changed in my net worth", etc.) with horizon chips. Each question is answered by the same local Ollama model that powers AI Insights, using pre-computed numbers. Falls back to a templated one-liner when the LLM is disabled.
No-hallucination invariant
The design rule that keeps a small local model trustworthy in a finance app: every dollar figure shown to the user is computed in Python from the database, the prompt rounds to whole dollars at the serializer boundary, and the system prompt forbids the model from inventing any number. The model writes prose around the numbers; the numbers themselves come from code.
tuskledger-mcp
An optional Model Context Protocol server that gives an AI assistant (Claude Desktop, Cursor, Cowork, Claude Code) typed access to Tusk Ledger data without scraping the UI. Lives in its own repo at github.com/BradMorphsters/tuskledger-mcp. Binds to 127.0.0.1; nothing leaves the machine.
Common-account math
How net worth deltas are computed honestly when accounts get added between two snapshots: the delta is taken on the INTERSECTION of accounts present in both snapshots, so a newly onboarded $200k 401(k) doesn't masquerade as $200k of growth. Used by both the Net Worth Recent Movement strip and the Ask panel's net_worth_change handler.
Wash-sale chain-correct calculator
Tusk Ledger's calculator for IRC §1091 wash sales does an interleaved chronological pass across all of a symbol's lots so a single replacement purchase can cascade through multiple losses (the chain-correct case most calculators get wrong). Per-account or all-accounts scope; outputs to Form 8949 with the wash adjustment column populated.
Tax Prep Pack
A year-end PDF report that pulls from every other page — HSA contributions, capital loss carryover, Schedule C buckets, business mileage, QBI (Section 199A) deduction — and stitches them into a single document for your CPA.
Retirement projection
A multi-decade two-phase (accumulation + withdrawal) simulator with progressive bracket math, RMDs, IRMAA tiers, Roth conversion ladder, survivor scenario, sequence-of-returns stress, Monte Carlo with fan chart and probability of success, age-banded spending phases, and pre-59½ bridge analysis.
Bills calendar
A 30-day forward calendar with paychecks, bills, and a per-day running balance. Includes a projected low-point tile flagging the day balance dips closest to zero; supports drag-to-reschedule for one-off events and inline mark-as-paid.
Demo mode
Tusk Ledger ships with a parallel synthetic dataset (the Alex Carter household). One toggle in Settings flips between real and demo databases; the app refuses to mix them and prompts before each switch. Lets a new user explore every feature without linking real accounts.
AGENTS.md
A working-memory document at the repo root for AI assistants (Claude Code, Cursor, Cowork) — describes permission boundaries, common operations, project conventions, and known footguns. Reading it saves the assistant hours of grepping the codebase.
tuskledger doctor
A CLI command in the repo that runs ~13 environment checks (Python/Node versions, .env keys present, encryption-key permissions, port availability, alembic head) and emits a stable JSON shape an AI assistant can ingest and act on.
BYO Plaid keys
You apply for your own Plaid production access (a few days) and put the keys in backend/.env. Tusk Ledger doesn't proxy or markup; you pay Plaid directly. Free tier covers 100 connected items, which is permanent for one household.
DEV_BYPASS_AUTH
A backend .env flag that skips the email/password + TOTP MFA login flow. Common for single-user laptops where the OS login is the trust boundary. Refuses to start if the server is bound to a non-localhost interface to prevent accidental exposure.
BUILT WITH
FastAPIReactSQLAlchemySQLiteVitePlaidRechartsMCPOllamaExpoReact Native