[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81426":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":16,"starSnapshotCount":16,"syncStatus":28,"lastSyncTime":29,"discoverSource":30},81426,"fungible","tomfunk\u002Ffungible","tomfunk","Terminal UI for personal finance — Plaid sync, CSV import, AI assistant, and MCP server","https:\u002F\u002Fgithub.com\u002Ftomfunk\u002Ffungible",null,"TypeScript",84,8,34,9,0,18,50,3,56.86,"MIT License",false,"main",[],"2026-06-12 04:01:33","\u003Cimg src=\"logo.png\" alt=\"fungible\" width=\"400\" \u002F>\n\n[![CI](https:\u002F\u002Fgithub.com\u002Ftomfunk\u002Ffungible\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Ftomfunk\u002Ffungible\u002Factions\u002Fworkflows\u002Fci.yml)\n\nA terminal UI for personal finance. Syncs transactions from [Plaid](https:\u002F\u002Fplaid.com\u002Fdocs\u002Fquickstart\u002F), imports CSVs, and lets you categorize, search, tag, and analyze spending — all from the keyboard.\n\n\u003Cimg src=\"docs\u002Fscreenshots\u002Fdemo.gif\" alt=\"fungible demo\" width=\"720\" \u002F>\n\n\u003Cdetails>\n\u003Csummary>Screenshots\u003C\u002Fsummary>\n\n| | |\n|---|---|\n| ![Dashboard](docs\u002Fscreenshots\u002Fdashboard.png) | ![Transactions](docs\u002Fscreenshots\u002Ftransactions.png) |\n| ![Trends](docs\u002Fscreenshots\u002Ftrends.png) | ![Net Worth](docs\u002Fscreenshots\u002Fnet-worth.png) |\n| ![Tags](docs\u002Fscreenshots\u002Ftags.png) | ![Financial Health](docs\u002Fscreenshots\u002Ffinancial-health.png) |\n| ![Rules](docs\u002Fscreenshots\u002Frules.png) | ![Accounts](docs\u002Fscreenshots\u002Faccounts.png) |\n\n\u003C\u002Fdetails>\n\n## Features\n\n- **Plaid sync** — connect bank accounts and pull transactions automatically; 15-min debounce with force-sync option\n- **CSV import** — import statement exports from any bank with flexible column mapping\n- **Manual assets** — track a house, car, or other asset by name and value\n- **Category rules** — substring and regex rules that auto-categorize transactions, with optional amount filters\n- **Name rules** — rename how transactions display, with optional amount filters\n- **Spending flexibility** — tag categories as fixed \u002F flexible \u002F discretionary; view breakdown on Dashboard\n- **Manual edits** — pin a category or display name to a specific transaction; survives re-syncs\n- **Ignore** — soft-hide transactions from totals (transfers, reimbursements, etc.)\n- **Hidden categories** — exclude categories like Transfer from all totals and charts\n- **Tags** — label transactions across accounts (trips, projects, events) and view summaries by tag\n- **Net worth** — balance history with asset\u002Fliability breakdown; view by account or by type; scroll by week, month, quarter, or year\n- **Financial health** — cash and liquid runway, FIRE number and progress, years to retirement with adjustable assumptions\n- **Dedup review** — review and remove CSV transactions that duplicate Plaid imports\n- **Time ranges** — view Dashboard by week, month, quarter, year, or all time\n- **Trends** — bar charts for expenses, income, net, or any category; per-range aggregation (week \u002F month \u002F quarter \u002F year)\n- **Delta mode** — toggle on Dashboard to see per-category spending deltas vs prior period, same period last year, and 12-month rolling average; heat-map coloring by deviation\n- **Regex search** — `\u002F` on Dashboard or Transactions filters by name using a regular expression; search is shared when navigating between Dashboard, Transactions, and Trends\n- **MCP server** — Claude can read and manage your finances via the Model Context Protocol\n- **HTTP API** — REST-style API server for scripting and automation\n- **Daily backups** — database is backed up to `~\u002F.fungible\u002Fbackups\u002F` on startup once per day; keeps the last 7 backups by default, configurable via `FUNGIBLE_BACKUP_DAYS`\n\n## Try it (no account needed)\n\n```bash\nfungible --demo\n```\n\nSpins up a fully pre-loaded instance with fake accounts, transactions, tags, and rules — completely isolated from any real data. Good for exploring all the screens before connecting a bank.\n\n## Install\n\n### Homebrew (recommended)\n\n```bash\nbrew tap tomfunk\u002Ffungible\nbrew install fungible\nfungible --setup   # first-time setup wizard\nfungible\n```\n\n### From source\n\nRequires Node.js 22+.\n\n```bash\nnpm install\nnpm run dev\n```\n\nOn first run, use `--setup` to configure credentials:\n\n```bash\nnpm run dev -- --setup\n```\n\nData and config are stored at `~\u002F.fungible\u002F`. Plaid access tokens are encrypted at rest using a key file at `~\u002F.fungible\u002Fkey` — do not delete this file or you will need to re-link your bank accounts. You'll need a free [Plaid](https:\u002F\u002Fplaid.com) developer account to sync bank transactions (sandbox tier works).\n\n## Running\n\n| Command | What starts |\n|---------|-------------|\n| `fungible` | TUI + MCP server (HTTP, port 3741) + REST API (port 3456) |\n| `fungible mcp` | stdio MCP server only — use this in your Claude Desktop config |\n| `fungible api` | REST API server only |\n\nWhen you run the TUI, the MCP server and REST API start automatically in the background on their default ports. They share the same database connection as the TUI, so any changes made through them are reflected the next time you navigate in the UI.\n\nThe `FUNGIBLE_MCP_PORT` and `FUNGIBLE_API_PORT` env vars (in `~\u002F.fungible\u002F.env`) override the defaults.\n\n## Screens\n\n| Key | Screen |\n|-----|--------|\n| `1` | Dashboard |\n| `2` | Transactions |\n| `3` | Trends |\n| `4` | Net Worth |\n| `5` | Tags |\n| `6` | Financial Health |\n| `7` | Rules |\n| `8` | Accounts |\n| `q` | Quit |\n| `Esc` | Back \u002F clear filter |\n\n## Key bindings\n\n### Dashboard `[1]`\n\n| Key | Action |\n|-----|--------|\n| `r` | Cycle time range (Week → Month → Quarter → Year → All Time) |\n| `← →` | Previous \u002F next period |\n| `Tab` | Cycle views: Categories → Flex → Account picker |\n| `↑ ↓` | Select category (Categories view) or account (Account view) |\n| `Enter` | Drill into transactions for selected category \u002F account |\n| `Space` | Toggle account filter (Account view) |\n| `c` | Clear account filter |\n| `d` | Toggle delta mode (spending vs prior period \u002F same period last year \u002F 12-month avg) |\n| `\u002F` | Search transactions by name (regex); filters category totals live |\n\nIn **Categories** view, spending is broken down by category with bar charts. In **Flex** view, spending is grouped by flexibility tier (fixed \u002F flexible \u002F discretionary \u002F untagged). In **Account** view, select an account to filter all dashboard data to that account.\n\nIn **delta mode**, the bar chart is replaced by three delta columns — vs prev period, vs same period last year, and vs 12-month rolling average — color-coded green \u002F yellow \u002F red by deviation. Not available for the All Time range. An active search carries through when switching to Transactions (`2`) or Trends (`3`).\n\n### Transactions `[2]`\n\n| Key | Action |\n|-----|--------|\n| `↑ ↓` | Navigate |\n| `← →` | Previous \u002F next month (when date filter active) |\n| `s` | Cycle sort: Date ↓↑ → Description ↑↓ → Amount ↓↑ → Category ↑↓ |\n| `\u002F` | Search by name (regex); inherited from Dashboard if navigated with an active search |\n| `a` | Show all transactions |\n| `u` | Show uncategorized only |\n| `e` | Edit: rename display name or change category |\n| `g` | Tag panel: add\u002Fremove tags on selected transaction |\n| `G` | Tag all visible transactions at once (use `\u002F` to filter first) |\n| `c` | Undo manual category override |\n| `i` | Ignore \u002F un-ignore selected transaction |\n| `x` | Delete selected transaction (CSV-imported only) |\n| `Esc` | Clear active filter (peels off one at a time) |\n\n### Trends `[3]`\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Cycle views: Expenses → Income → Net → [each category] |\n| `↑ ↓` | Navigate periods |\n| `r` | Cycle aggregation range (Week \u002F Month \u002F Quarter \u002F Year) |\n| `Enter` | Drill into transactions for selected period |\n\n### Net Worth `[4]`\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Toggle: by account ↔ by type |\n| `r` | Cycle history range (Week \u002F Month \u002F Quarter \u002F Year) |\n| `↑ ↓` | Scroll history |\n\nShows assets (depository, investment, manual), liabilities (credit), and net worth. History shows one snapshot per period (last sync within each bucket), scrollable with up\u002Fdown.\n\n### Tags `[5]`\n\n| Key | Action |\n|-----|--------|\n| `↑ ↓` | Select tag |\n| `\u002F` | Search tags |\n| `Enter` | Open tag detail (income \u002F expenses \u002F category breakdown) |\n| `t` | View all transactions for selected tag |\n| `a` | Add new tag |\n| `n` | Rename selected tag |\n| `x` | Delete selected tag |\n\nIn tag detail, `↑ ↓` selects a category and `Enter` drills into transactions for that tag + category. `← →` cycles to the previous\u002Fnext tag.\n\n### Financial Health `[6]`\n\nDisplays a full financial picture across four sections:\n\n- **Snapshot** — savings rate (color-coded) and estimated monthly income\n- **Runway** — months of cash and liquid coverage at current spending\n- **Debt** — net cash position (checking minus credit debt), months to debt-free at current savings rate (hidden if no debt)\n- **Retirement** — net worth, FIRE number with progress bar, Coast FIRE (years until growth alone covers retirement if you stop saving now), estimated years to FIRE\n\n| Key | Action |\n|-----|--------|\n| `↑ ↓` | Select assumption dial |\n| `← →` | Adjust selected dial value |\n| `r` | Reset selected dial to default |\n\n**Dials:** Monthly spending (±$100, default = avg past 12 months), Monthly savings (±$100, default = avg surplus), Withdrawal rate (±0.5%, default = 4%), Growth rate (±1%, default = 7%).\n\nLiquid assets = cash + brokerage (excludes 401k, IRA, pension).\n\n### Rules `[7]`\n\nThree sections, cycle with `Tab`: **Category Rules**, **Name Rules**, **Categories**.\n\n**Category Rules \u002F Name Rules:**\n\n| Key | Action |\n|-----|--------|\n| `\u002F` | Search rules |\n| `a` | Add rule |\n| `e` \u002F `Enter` | Edit selected rule |\n| `x` | Delete selected rule |\n\nCategory rules support substring and regex matching with optional min\u002Fmax amount filters. Name rules support the same matching plus optional amount filters.\n\n**Categories:**\n\n| Key | Action |\n|-----|--------|\n| `a` | Add new category |\n| `n` | Rename category (cascades to all transactions, rules, and hidden settings) |\n| `x` | Delete category (resets affected transactions to Uncategorized) |\n| `v` | Toggle hidden (hidden categories are excluded from totals) |\n| `f` | Cycle flexibility tier: none → fixed → flexible → discretionary |\n\n### Accounts `[8]`\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Cycle views: Accounts → Add Data → Dupes |\n| `↑ ↓` | Select account |\n| `e` | Edit account type \u002F subtype |\n| `n` | Set or clear a nickname (shown in place of the bank-assigned name) |\n| `v` | Update value (manual assets only) |\n| `r` | Repair Plaid link for selected account |\n| `s` | Force sync (bypasses 15-min cooldown) |\n| `x` | Delete selected account |\n| `l` | Link a new bank account via Plaid |\n\n**Add Data** options: `[l]` link bank via Plaid, `[c]` import CSV, `[m]` add manual asset (house, car, etc.), `[s]` force sync.\n\n**Dupes** tab shows CSV transactions that match Plaid imports. `[x]` deletes the selected CSV duplicate; `[X]` deletes all.\n\n## Scripts\n\n```bash\n# Link a new bank account via Plaid (also available from Accounts screen)\nnpm run link\n\n# Import a CSV file\nnpm run import-csv \u002Fpath\u002Fto\u002Ffile.csv\n\n# Seed default category rules\nnpm run seed-rules\n```\n\n## HTTP API\n\nExposes the same tools as the MCP server over HTTP — useful for scripting and automation. Starts automatically on port 3456 when you run the TUI, or run it standalone:\n\n```bash\nfungible api\n# or: npm run api\n# Listening on http:\u002F\u002Flocalhost:3456\n```\n\n**Endpoint:** `POST \u002Ftools\u002F:name` with a JSON body.\n\n```bash\ncurl -X POST http:\u002F\u002Flocalhost:3456\u002Ftools\u002Fspending_summary \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer \u003Ckey>\" \\\n  -d '{\"year\": 2026, \"month\": 5}'\n```\n\n**Configuration** (in `~\u002F.fungible\u002F.env`):\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `FUNGIBLE_API_KEY` | _(none)_ | Bearer token required on all requests. If unset, auth is skipped (dev only). |\n| `FUNGIBLE_API_PORT` | `3456` | Port to listen on. |\n\nAvailable tools: same set as the MCP server below.\n\n## MCP Server\n\nExposes your financial data to Claude via the [Model Context Protocol](https:\u002F\u002Fmodelcontextprotocol.io).\n\n**Two connection modes:**\n\n- **stdio** — Claude Desktop spawns `fungible mcp` as a child process. Always works, even when the TUI isn't open. When the TUI is running, writes notify it automatically so the UI refreshes. Use this if you're not sure which to pick.\n\n- **HTTP** — when the TUI is running, it starts an HTTP MCP server on port 3741 (`FUNGIBLE_MCP_PORT` to override). Point Claude at `http:\u002F\u002Flocalhost:3741\u002Fmcp` instead of using a command — writes are in-process so the TUI updates instantly. Only works while the TUI is open.\n\nAdd to your Claude config (`~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json`):\n\n**stdio — Homebrew:**\n```json\n{\n  \"mcpServers\": {\n    \"fungible\": {\n      \"command\": \"\u002Fopt\u002Fhomebrew\u002Fbin\u002Fnode\",\n      \"args\": [\"--no-warnings\", \"--import\", \"tsx\u002Fesm\", \"\u002Fopt\u002Fhomebrew\u002Flib\u002Fnode_modules\u002Ffungible\u002Fmcp\u002Fserver.ts\"]\n    }\n  }\n}\n```\n\n**stdio — from source:**\n```json\n{\n  \"mcpServers\": {\n    \"fungible\": {\n      \"command\": \"node\",\n      \"args\": [\"--no-warnings\", \"--import\", \"tsx\u002Fesm\", \"\u002Fpath\u002Fto\u002Ffungible\u002Fmcp\u002Fserver.ts\"]\n    }\n  }\n}\n```\n\n**HTTP (TUI must be running):**\n```json\n{\n  \"mcpServers\": {\n    \"fungible\": {\n      \"url\": \"http:\u002F\u002Flocalhost:3741\u002Fmcp\"\n    }\n  }\n}\n```\n\nAvailable tools:\n\n| Tool | Description |\n|------|-------------|\n| `spending_summary` | Income, expenses, and breakdown by category for a given month |\n| `list_transactions` | Search and filter transactions |\n| `edit_transaction` | Rename display name or change category |\n| `clear_edit` | Remove a manual category or name override |\n| `ignore_transaction` | Ignore \u002F un-ignore a transaction |\n| `list_rules` | List category rules |\n| `add_rule` | Add a category rule |\n| `delete_rule` | Delete a category rule |\n| `list_name_rules` | List name rules |\n| `add_name_rule` | Add a name rule |\n| `delete_name_rule` | Delete a name rule |\n| `list_hidden_categories` | List hidden categories |\n| `toggle_hidden_category` | Show or hide a category |\n| `list_accounts` | List connected accounts |\n| `sync` | Pull latest transactions from Plaid |\n| `uncategorized_summary` | Most common uncategorized transaction names |\n| `list_tags` | List tags with transaction counts |\n| `tag_summary` | Income \u002F expenses \u002F category breakdown for a tag |\n| `tag_transaction` | Add or remove a tag on a transaction |\n| `get_balances` | Current balances, net worth, total cash and liquid |\n| `get_financial_health` | Runway, FIRE number, years to retirement |\n| `get_drift` | Per-category spending deltas vs prior period, last year, and 12-month avg |\n| `get_trends` | Month-by-month spending trends for the last N months |\n| `get_finance_guide` | Opinionated personal finance guidance by topic |\n","fungible 是一个用于个人财务管理的终端用户界面。它支持通过 Plaid 同步银行账户交易、导入 CSV 文件，并提供交易分类、搜索、标记和分析等功能，全部操作均可通过键盘完成。其核心功能包括自动同步银行数据、灵活的 CSV 导入、资产追踪、智能分类规则以及详细的财务健康分析等。技术上采用 TypeScript 开发，确保了良好的类型安全性和代码质量。该项目适合需要在命令行环境中高效管理个人财务的用户，尤其对于偏好使用键盘操作或希望自动化处理财务数据的人来说非常有用。",2,"2026-06-11 04:05:01","CREATED_QUERY"]