Local-first personal finance with AI. Connect your bank accounts, analyze spending, and talk to your money through Claude.
Your data stays on your machine. No cloud. No subscription. Open source.
git clone <repo-url> fino
cd fino
npm install
cd client && npm install --legacy-peer-deps && cd ..Create your environment file:
openssl rand -hex 32 # generates your encryption key
cp .env.example .env # then edit .env with your valuesPLAID_CLIENT_ID=your_client_id
PLAID_SECRET=your_secret
PLAID_ENV=production # apply for the Plaid production account. Free for personal usage upto 5 accounts
ENCRYPTION_KEY=paste_64_char_hex_here
PORT=3001
SYNC_THRESHOLD_HOURS=4
Set up the database and run:
npm run db:push
npm run goOpen http://localhost:3001.
Plaid connects to your bank accounts automatically. Plaid is optional. If you don't want to set up Plaid, you can skip this section entirely and import transactions via CSV/OFX files instead (see Connect Bank Accounts > Via CSV/OFX Import).
There are two Plaid portals (they are separate accounts):
- dashboard.plaid.com -- developer dashboard where you get API keys (this is what you need)
- my.plaid.com -- consumer portal for managing data sharing (you don't need this)
Get Sandbox Keys Not needed though production is important, takes few hours to get approved (instant, fake data)
- Go to dashboard.plaid.com and sign up
- Select Business or developer
- Enter a company name, verify your email
- Go to Developers > Keys in the left sidebar
- Copy your Client ID and Sandbox secret
Sandbox lets you test the full app with fake bank data. Use these test credentials when connecting:
- Username:
user_good/ Password:pass_good/ 2FA:1234
Production access is free for personal use. Once you have sandbox working:
- On the dashboard home page, click "Test with real data" or "Unlock real data"
- Fill out the form: name, phone, short description (e.g., "personal finance tracking")
- Click Request Access. Approval is usually within minutes
- Once approved, a Production secret appears on Developers > Keys
- Update
.env:PLAID_SECRET=your_production_secret PLAID_ENV=production - Restart the server. Non-OAuth banks work immediately (Venmo, Discover, PayPal, most credit unions)
Major banks use OAuth and require a one-time registration. Still free.
- Click "Get production access" in the left sidebar
- Fill out three sections:
- Company Profile: company name, legal entity name (skip Legal Entity Identifier), address
- App Profile: app name, 1024x1024 PNG icon, description of what the app does
- Data Security: how you handle data (for personal use, keep answers simple)
- Go to Developers > API and add redirect URIs:
http://localhost:5173/http://localhost:3001/
- Submit. Plaid reviews each OAuth institution individually
- Check status at Developers > API > OAuth institutions
Some banks enable instantly (Citibank). Others takes couple of hours. You can connect whatever is already enabled while waiting for the rest.
- Open the app and go to the Accounts page
- Click Connect Account
- Search for your bank, log in, and select accounts
- Transactions sync automatically. Balances appear immediately, transactions may take a few minutes on the first pull
- Click Sync All anytime to pull the latest data
For banks Plaid cannot connect to (Apple Card, or banks pending OAuth approval):
- Export transactions from your bank's website as CSV or OFX
- Go to the Import page in the dashboard
- Drag and drop the file, select or create an account, confirm
- Duplicates are automatically skipped on re-import
Apple Card: export from card.apple.com > Statements > Export Transactions.
The CSV parser auto-detects Apple Card format and generic bank CSVs. OFX/QFX files from any bank are also supported.
One command sets up everything for Claude Code, Claude Desktop, and Cowork:
npm run install-claudeThis:
- Configures the Fino MCP server (reads your
.envautomatically, no env var duplication) - Installs all slash commands globally
Restart Claude after running this.
The MCP server runs independently. You do not need the web server running. Claude spawns Fino automatically when you ask about your finances. The web dashboard (npm run go) is only for the browser UI.
| Command | What it does |
|---|---|
/snapshot |
Quick health check: balances, net worth, this month vs last |
/monthly-report |
Full month report with categories, top merchants, trends |
/spending-audit |
90 days of spending: recurring charges, waste, patterns |
/find-charges |
Search a merchant: total spent, frequency, annual cost |
/cash-flow |
6-month income vs expense trend with savings rate and projections |
/sync |
Force sync all bank accounts |
You can also ask naturally: "what did I spend on food this month?" or "show me my net worth."
| Tool | Description |
|---|---|
sync_transactions |
Force sync with Plaid |
get_accounts |
List accounts with balances |
get_transactions |
Query transactions with filters |
search_transactions |
Search by merchant name |
get_balances |
Net worth breakdown |
get_spending_summary |
Spending by category |
get_monthly_comparison |
Income vs spending per month |
All read tools auto-sync with Plaid when data is older than SYNC_THRESHOLD_HOURS (default 4).
server/ Hono API + static file serving
client/ React + Vite dashboard
mcp/ MCP server (stdio, 7 tools)
.claude/skills/ Slash command definitions
data/ SQLite database (gitignored)
Stack: Hono, React 19, Vite, SQLite (libsql), Drizzle ORM, Plaid API, Tailwind CSS, Recharts.
Data is stored locally in data/finance.db. Plaid access tokens are encrypted at rest with AES-256-GCM.
| Command | What it does |
|---|---|
npm run go |
Build frontend + start server |
npm run dev |
Development with hot reload |
npm run build |
Build frontend only |
npm start |
Start server only |
npm run db:push |
Create/migrate database |
npm run install-claude |
Install MCP + skills for Claude |

