[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-76273":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":17,"compositeScore":18,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":21,"topics":22,"createdAt":8,"pushedAt":8,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":14,"starSnapshotCount":14,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},76273,"Spent","Shaya16\u002FSpent","Shaya16",null,"TypeScript",131,39,3,10,0,4,43,1,45.11,false,"main",true,[],"2026-06-12 04:01:21","\u003Cdiv align=\"center\">\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"public\u002Flogo_darkmode.svg\">\n  \u003Cimg src=\"public\u002Flogo_lightmode.svg\" alt=\"Spent\" width=\"84\">\n\u003C\u002Fpicture>\n\n# Spent\n\n**Local-only personal finance for Israeli bank accounts.**\nEncrypted. AI-categorized. Yours.\n\n[![Website](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%F0%9F%8C%90%20Website-1F4D33?style=for-the-badge&labelColor=1F4D33)](https:\u002F\u002Fshaya16.github.io\u002FSpent\u002F)\n[![Docs](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%F0%9F%93%96%20Docs-1F4D33?style=for-the-badge&labelColor=1F4D33)](https:\u002F\u002Fshaya16.github.io\u002FSpent\u002Fgetting-started)\n[![Install](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%E2%AC%87%20Install-28C75B?style=for-the-badge&labelColor=28C75B)](https:\u002F\u002Fshaya16.github.io\u002FSpent\u002Finstall\u002Fmac)\n\n[![Next.js](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNext.js-16-000?logo=nextdotjs&logoColor=white&style=flat-square)](https:\u002F\u002Fnextjs.org\u002F)\n[![React](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact-19-149ECA?logo=react&logoColor=white&style=flat-square)](https:\u002F\u002Freact.dev\u002F)\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-5-3178C6?logo=typescript&logoColor=white&style=flat-square)](https:\u002F\u002Fwww.typescriptlang.org\u002F)\n[![SQLite](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSQLite-WAL-003B57?logo=sqlite&logoColor=white&style=flat-square)](https:\u002F\u002Fsqlite.org\u002F)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg?style=flat-square)](#license)\n[![Status: Beta](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FStatus-Beta-blueviolet?style=flat-square)](#features)\n\n\u003C\u002Fdiv>\n\n> [!WARNING]\n> Personal, local-only tool. Scraping financial institutions may violate their Terms of Service. Use only for your own accounts on your own machine. **Do not deploy as a hosted service.**\n\n\u003Cdiv align=\"center\">\n\n![Spent dashboard](public\u002Fscreenshots\u002Fdashboard-light.png)\n\n\u003C\u002Fdiv>\n\n## Why Spent?\n\nIsraeli banks have terrible exports, YNAB doesn't speak ILS gracefully, and every \"cloud finance\" app wants you to hand over your bank password. Spent is the answer for people who'd rather just run something on their own laptop.\n\nYour transactions get pulled directly from your bank with [`israeli-bank-scrapers`](https:\u002F\u002Fgithub.com\u002Feshaham\u002Fisraeli-bank-scrapers), stored in a local SQLite file you can `cp` and back up like any other file, and categorized by an AI provider you choose: paid Claude, free local Ollama, or nothing at all.\n\nThe trade-off is honest: you self-host, you trust the scraper, and you accept that banks may not love automation. In return you get a fast, beautiful, fully offline dashboard that never phones home.\n\n## Features\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### 🏦 Israeli bank integration\nIsracard, Bank Hapoalim, and Max work out of the box. Visa Cal and Bank Leumi are on the roadmap.\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### 🤖 AI categorization\nChoose Claude (Anthropic) for best accuracy, Ollama for fully local LLMs, or skip and categorize manually.\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### 🔒 Local-only & encrypted\nCredentials encrypted with AES-256-GCM. Server binds to `127.0.0.1` only — never reachable from your LAN or the internet.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd valign=\"top\">\n\n### 📊 Budgets with pacing\nHierarchical categories, monthly targets, \"ahead of pace\" hero card, and per-category drilldown.\n\n\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n### 🌓 Light & dark theme\nPolished buttercream-and-sage palette in light mode, warm charcoal in dark. System-aware by default.\n\n\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n### 🍎 Menu bar \u002F tray app\nNative companion in your menu bar (macOS) or notification area (Windows). Status indicator, one-click open dashboard, sync, and start\u002Fstop\u002Frestart the service.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd valign=\"top\">\n\n### 🎯 Auto-detected transfers\nCredit card payments and inter-account moves are recognized and excluded from spending totals.\n\n\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n### 📅 Multi-month history\nPull up to 3 months of transactions per sync (configurable). Most banks support 12 months total.\n\n\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n### 🔍 Merchant memory\nOnce you correct an AI categorization, Spent remembers — same merchant goes to the right category next time.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"3\" valign=\"top\">\n\n### 🌐 English & Hebrew (RTL)\nToggle between English (default) and עברית from **Settings → Appearance**. Hebrew flips the entire app to right-to-left with translated UI, bank names, predefined categories, currency, and date formatting. Powered by [`next-intl`](https:\u002F\u002Fnext-intl.dev\u002F) — drop in a new `\u003Clocale>.json` under [`src\u002Fi18n\u002Fmessages\u002F`](src\u002Fi18n\u002Fmessages\u002F) to add another language.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Screenshots\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"50%\" align=\"center\">\u003Cb>Dashboard — light\u003C\u002Fb>\u003C\u002Ftd>\n\u003Ctd width=\"50%\" align=\"center\">\u003Cb>Dashboard — dark\u003C\u002Fb>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cimg src=\"public\u002Fscreenshots\u002Fdashboard-light.png\" alt=\"Dashboard light mode\">\u003C\u002Ftd>\n\u003Ctd>\u003Cimg src=\"public\u002Fscreenshots\u002Fdashboard-dark.png\" alt=\"Dashboard dark mode\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"center\">\u003Cb>Transactions\u003C\u002Fb>\u003C\u002Ftd>\n\u003Ctd align=\"center\">\u003Cb>Setup wizard\u003C\u002Fb>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cimg src=\"public\u002Fscreenshots\u002Ftransactions-light.png\" alt=\"Transactions page\">\u003C\u002Ftd>\n\u003Ctd>\u003Cimg src=\"public\u002Fscreenshots\u002Fsetup-bank-light.png\" alt=\"Setup wizard bank picker\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"center\">\u003Cb>Categories\u003C\u002Fb>\u003C\u002Ftd>\n\u003Ctd align=\"center\">\u003Cb>AI provider\u003C\u002Fb>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cimg src=\"public\u002Fscreenshots\u002Fsettings-categories-light.png\" alt=\"Category management\">\u003C\u002Ftd>\n\u003Ctd>\u003Cimg src=\"public\u002Fscreenshots\u002Fsettings-ai-light.png\" alt=\"AI provider settings\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"2\" align=\"center\">\u003Cb>Bank accounts\u003C\u002Fb>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"2\">\u003Cimg src=\"public\u002Fscreenshots\u002Fsettings-bank-light.png\" alt=\"Bank accounts settings\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## How it works\n\n```mermaid\nflowchart LR\n    Bank[\"🏦 Israeli bank\u003Cbr\u002F>(Isracard \u002F Hapoalim \u002F Max)\"]\n    Scraper[\"Puppeteer scraper\u003Cbr\u002F>(israeli-bank-scrapers)\"]\n    DB[(\"📦 SQLite\u003Cbr\u002F>data\u002Fspent.db\u003Cbr\u002F>(WAL mode)\")]\n    AI{\"🤖 AI provider\u003Cbr\u002F>Claude · Ollama · None\"}\n    UI[\"🖥 Dashboard\u003Cbr\u002F>http:\u002F\u002Fspent.localhost:41234\"]\n\n    Bank -->|HTTPS\u003Cbr\u002F>credentials encrypted| Scraper\n    Scraper -->|new transactions| DB\n    DB -->|uncategorized batch| AI\n    AI -->|category proposals| DB\n    DB --> UI\n\n    subgraph local[\"🔒 Your machine — 127.0.0.1 only\"]\n        Scraper\n        DB\n        UI\n    end\n```\n\nEverything inside the dashed box stays on your laptop. The only outbound traffic is to your bank (for scraping) and optionally `api.anthropic.com` (if you chose Claude) or `localhost:11434` (if you chose Ollama).\n\n## Supported banks\n\n| Bank | Type | Status |\n|---|---|---|\n| **Isracard** | Credit card | ✅ Supported |\n| **Bank Hapoalim** (incl. Poalim wallets) | Bank | ✅ Supported |\n| **Max** (formerly Leumi Card) | Credit card | ✅ Supported |\n| Visa Cal | Credit card | 🚧 Planned |\n| Bank Leumi | Bank | 🚧 Planned |\n\nDon't see your bank? Adding a scraper is a small wrapper around `israeli-bank-scrapers` — see [Contributing](#contributing).\n\n## AI providers\n\n| | **Claude** (Anthropic) | **Ollama** (local) | **None** |\n|---|---|---|---|\n| Cost | ~₪0.004 per sync | Free | Free |\n| Accuracy | Best | Good (depends on model) | Manual |\n| Network | `api.anthropic.com` | `localhost:11434` | Offline |\n| Setup | API key | Install Ollama + pull a model | Nothing |\n\nDefault model when Claude is selected: `claude-haiku-4-5` (cheap, fast, accurate for categorization). For Ollama, `llama3.2:3b` is the recommended default.\n\nYou can change providers any time from **Settings → AI provider**. Existing categorizations are kept.\n\n## Requirements\n\n- **Node.js 22+**\n- **macOS 13+**, **Ubuntu 22+** (with systemd), or **Windows 11**\n- **Build tools for the menubar** (only if you want the tray; `npm run setup` will offer to install these for you if they're missing):\n  - macOS: Xcode Command Line Tools (`xcode-select --install`)\n  - Windows: .NET 8 SDK (`winget install Microsoft.DotNet.SDK.8`)\n- A bank account with **2FA disabled** (most Israeli banks require this for automation — OneZero is the exception)\n\n## Install\n\n> Prefer a screenshot-by-screenshot walkthrough? The [step-by-step install guides](https:\u002F\u002Fshaya16.github.io\u002FSpent\u002Fgetting-started\u002F) on the docs site cover macOS and Windows separately, with build-tool setup and tray-app gotchas spelled out.\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FShaya16\u002FSpent.git\ncd spent\nnpm install\nnpm run setup\n```\n\n`npm run setup` does everything: builds the Next.js app, installs the always-on service (LaunchAgent on macOS \u002F systemd on Linux \u002F Task Scheduler on Windows), builds the platform menubar from source, installs it to the standard location, registers it to auto-start at login, and opens the dashboard. On Windows it also writes a `127.0.0.1 spent.localhost` line to your hosts file (the only step that asks for Administrator). macOS and Linux resolve `*.localhost` natively, so setup runs sudo-free there.\n\nOn Linux there is no native menubar. `npm run setup` installs the service and opens the browser. Control the service with `npm run service:*` (see below).\n\nFirst launch of the menubar on macOS\u002FWindows shows an unsigned-binary warning (Gatekeeper \u002F SmartScreen). That's expected: you built it locally and didn't pay for a code-signing certificate. Right-click → Open (macOS) or \"More info\" → \"Run anyway\" (Windows). One-time.\n\nOpen **`http:\u002F\u002Fspent.localhost:41234`** and bookmark it.\n\n## First-time setup\n\nIn the browser:\n\n1. **Connect your bank** — credentials are AES-256-GCM encrypted before they touch disk.\n2. **Choose an AI provider** — Claude (default), Ollama, or none.\n3. **Set your monthly ceiling** — total spend you want to stay under each month.\n4. **Set per-category budgets** — type an amount on any category to budget it; leave blank to track without a limit.\n5. **Done.** Sync starts automatically: 3 months of transactions, then AI categorization.\n\n## How you'll use it\n\n| What you want | Run |\n|---|---|\n| Just use the app (no coding) | Open `http:\u002F\u002Fspent.localhost:41234` |\n| Code and see changes instantly | `npm run dev` → `http:\u002F\u002F127.0.0.1:3000` |\n| Update the always-on app after editing | `npm run service:reload` |\n\nRare cases:\n\n- Changed the menu bar app source → `npm run menubar:install:mac` (or `:windows`) to rebuild and reinstall.\n- Changed install scripts or hostname → `npm run service:uninstall && npm run service:install`.\n\n## Service commands\n\n| Command | What it does |\n|---|---|\n| `npm run service:status` | Running? Bound to loopback? |\n| `npm run service:start` \u002F `:stop` | Start\u002Fstop now |\n| `npm run service:reload` | Rebuild and restart |\n| `npm run service:logs` | Tail server logs |\n| `npm run service:open` | Open the app in your browser |\n| `npm run service:uninstall` | Remove auto-start and hosts entry. `data\u002F` is untouched. |\n\n## Uninstall\n\n```bash\nnpm run uninstall\n```\n\nReverses everything `npm run setup` installed:\n\n- Stops the background service and removes the LaunchAgent \u002F Task Scheduler entry \u002F systemd unit.\n- Windows: removes the `127.0.0.1 spent.localhost` line from your hosts file (asks for Administrator). macOS\u002FLinux don't have a hosts entry to remove unless you're upgrading from an older install — in that case the legacy `spent.local` line is cleaned up automatically.\n- Quits the menubar, removes the installed app, and removes it from Login Items \u002F Startup.\n\n**Kept on purpose:**\n\n- `data\u002F`: your transactions, budgets, and encryption key. To wipe your data: `rm -rf data\u002F`.\n- The repo itself. To remove Spent entirely: `rm -rf data\u002F && cd .. && rm -rf spent\u002F`.\n\nIf you only want to remove the menubar but keep the always-on web app:\n\n- **macOS**: `rm -rf ~\u002FApplications\u002FSpent.app` and remove \"Spent\" from System Settings → General → Login Items.\n- **Windows**: delete `%LOCALAPPDATA%\\Programs\\Spent\\` and remove `Spent.lnk` from `shell:startup`.\n\nIf you only want to remove the always-on service but keep the menubar (so it's there if you reinstall later): `npm run service:uninstall`.\n\n## Security at a glance\n\n| Concern | Defense |\n|---|---|\n| Credentials at rest | AES-256-GCM, encryption key file mode `0600` (server refuses to start otherwise) |\n| Network exposure | Bound to `127.0.0.1` only — not reachable from your LAN or the internet |\n| Browser CSRF | Origin \u002F Referer validation on every mutation |\n| Bot detection | Chromium sandbox on by default (`SPENT_DISABLE_CHROMIUM_SANDBOX=1` to opt out) |\n| Bundle integrity | `israeli-bank-scrapers`, `better-sqlite3`, and `@anthropic-ai\u002Fsdk` pinned to exact versions |\n| Browser hardening | Strict CSP, `X-Frame-Options: DENY`, `Permissions-Policy` locks down camera\u002Fmic\u002Fgeo\u002Fpayment |\n\n**Turn on full-disk encryption** (FileVault \u002F BitLocker \u002F LUKS). The encryption key file sits next to the database, so disk-level protection is your last line of defense if the laptop is lost.\n\nFull threat model and responsible-disclosure policy → [SECURITY.md](SECURITY.md).\n\n## Where your data lives\n\n- `data\u002Fspent.db` — transactions, categories, budgets, settings\n- `data\u002F.encryption-key` — 32-byte AES key, mode `0600`\n- `~\u002FLibrary\u002FLogs\u002FSpent\u002F` (macOS) \u002F `~\u002F.local\u002Fstate\u002Fspent\u002Flog\u002F` (Linux) — service logs\n\nBack up `data\u002F` like any other folder. To migrate to a new machine, copy `data\u002F` over and run `npm run service:install`.\n\n## Architecture & code map\n\n```\nspent\u002F\n├── src\u002F\n│   ├── app\u002F                  Next.js App Router (routes + API)\n│   │   ├── (dashboard)\u002F      Dashboard, transactions, settings pages\n│   │   ├── api\u002F              Sync (SSE), summary, transactions, setup\n│   │   └── setup\u002F            First-run wizard\n│   ├── components\u002F\n│   │   ├── dashboard\u002F        Hero card, category grid, budget drawer\n│   │   ├── setup\u002F            Bank, AI, target, budgets steps\n│   │   └── settings\u002F         Per-tab settings panels\n│   ├── lib\u002F                  Shared client-side types and helpers\n│   └── server\u002F\n│       ├── ai\u002F               Claude + Ollama provider implementations\n│       ├── db\u002F               SQLite singleton, migrations, query helpers\n│       ├── lib\u002F              Encryption, dedup, transfer detection, pace\n│       └── scrapers\u002F         Wrapper around israeli-bank-scrapers\n├── menubar\u002F                  Tray companions (built locally by `npm run setup`)\n│   ├── mac\u002F                  Swift MenuBarExtra app\n│   └── windows\u002F              C# WinForms NotifyIcon app\n├── scripts\u002Fservice\u002F          LaunchAgent \u002F systemd \u002F Task Scheduler installer\n├── website\u002F                  Astro + Starlight docs site (auto-deploys to GitHub Pages)\n├── .github\u002Fworkflows\u002F        CI — docs site deploy\n├── Spent.sln                 Visual Studio solution for the Windows menubar project\n└── data\u002F                     SQLite + encryption key (gitignored)\n```\n\n## Troubleshooting\n\n> The [Troubleshooting docs](https:\u002F\u002Fshaya16.github.io\u002FSpent\u002Ftroubleshooting\u002F) cover Defender, Gatekeeper, Cloudflare bot challenges, and bank-specific quirks in more depth.\n\n- **Port 41234 in use** → `lsof -nP -iTCP:41234 -sTCP:LISTEN` (Unix) or `netstat -ano | findstr :41234` (Windows). Kill the offender and re-run install.\n- **Gatekeeper blocks `Spent.app`** → right-click → Open → Open. One-time.\n- **Linux: \"systemd user instance not available\"** → `loginctl enable-linger $USER`.\n- **Windows: hosts edit fails \u002F `spent.localhost` doesn't resolve** → re-run install from an elevated PowerShell (Win+X → \"Terminal (Admin)\") so it can edit `C:\\Windows\\System32\\drivers\\etc\\hosts`. After the edit, the installer flushes the DNS cache automatically; if you edited hosts manually, run `ipconfig \u002Fflushdns`. `http:\u002F\u002F127.0.0.1:41234` always works as a fallback.\n- **Bank scrape fails with \"Cloudflare\"** → temporarily run with `SPENT_DISABLE_CHROMIUM_SANDBOX=1` to let Puppeteer use a real Chrome profile.\n\n## Roadmap\n\n- [x] Hebrew UI with full RTL layout\n- [ ] Visa Cal scraper\n- [ ] Bank Leumi scraper\n- [ ] CSV \u002F OFX export\n- [ ] Custom user-defined categories\n- [ ] Mobile companion (Phase 2)\n- [ ] Multiple workspaces in the menu bar \u002F tray app\n\n## Contributing\n\nSpent is built for personal use first, open-source second. PRs welcome for:\n\n- **New bank integrations** — add to `BANK_PROVIDERS` in [src\u002Flib\u002Ftypes.ts](src\u002Flib\u002Ftypes.ts), map to `CompanyTypes` in [src\u002Fserver\u002Fscrapers\u002Findex.ts](src\u002Fserver\u002Fscrapers\u002Findex.ts), flip `enabled: true`.\n- **New AI providers** — implement the `AIProvider` interface from [src\u002Fserver\u002Fai\u002Ftypes.ts](src\u002Fserver\u002Fai\u002Ftypes.ts), register in [src\u002Fserver\u002Fai\u002Ffactory.ts](src\u002Fserver\u002Fai\u002Ffactory.ts), and add an option to the setup wizard.\n- **New languages** — add `\u003Clocale>.json` under [src\u002Fi18n\u002Fmessages\u002F](src\u002Fi18n\u002Fmessages\u002F), mirroring the keys in `en.json`, and append the locale to [src\u002Fi18n\u002Frouting.ts](src\u002Fi18n\u002Frouting.ts). Toggle wires itself up automatically.\n- **UI polish, bug fixes, documentation.**\n\nConventions:\n\n- TypeScript strict mode. No `any` without a comment.\n- Conventional commits: `feat:`, `fix:`, `chore:`, `docs:`, `refactor:`.\n- Comments only where the \"why\" isn't obvious. No em dashes in code, commits, or docs.\n\n## License\n\nMIT\n\n## Acknowledgments\n\nBuilt on the shoulders of:\n\n- [`israeli-bank-scrapers`](https:\u002F\u002Fgithub.com\u002Feshaham\u002Fisraeli-bank-scrapers) — the heart of every bank integration\n- [Next.js 16](https:\u002F\u002Fnextjs.org\u002F) and [React 19](https:\u002F\u002Freact.dev\u002F)\n- [`shadcn\u002Fui`](https:\u002F\u002Fui.shadcn.com\u002F) on top of [`base-ui`](https:\u002F\u002Fbase-ui.com\u002F)\n- [`better-sqlite3`](https:\u002F\u002Fgithub.com\u002FWiseLibs\u002Fbetter-sqlite3)\n- [`next-intl`](https:\u002F\u002Fnext-intl.dev\u002F) for English \u002F Hebrew i18n\n- [Anthropic Claude](https:\u002F\u002Fwww.anthropic.com\u002F) and the local-LLM crew at [Ollama](https:\u002F\u002Follama.com\u002F)\n","Spent 是一个专为以色列银行账户设计的本地个人财务管理工具。它使用 TypeScript 构建，并集成了 Next.js、React 和 SQLite 等技术，提供高效且美观的用户体验。核心功能包括直接从用户的银行账户抓取交易记录、本地存储数据以及通过 AI 进行分类。用户可以选择付费的 Claude 或免费的 Ollama 作为 AI 分类服务，也可以手动进行分类。所有数据都存储在本地并经过 AES-256-GCM 加密，确保隐私安全。该工具适用于希望在本地管理财务而不依赖云端服务的用户，特别是那些对银行导出功能不满或担心隐私泄露的人士。",2,"2026-06-11 03:54:52","CREATED_QUERY"]