尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Household finance for multi-currency household. Currently only USD and ILS (Plaid + Israeli Banks), self-hosted on Supabase + Vercel.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Household finance for people whose money lives in multiple countries and currencies.
Peanut is a Monarch-style personal finance app that holds dollars and shekels side by side. Every amount is stored in its own currency and converted at the day's rate only for display.
It is a personal project I use every day. It is free and open source (MIT) and built to be self-hosted on a free Supabase project plus Vercel.
Open the live demo. One click, no sign-up. It is a shared household with made-up data (two people, shekel and dollar accounts, two years of history), so click around and change whatever you like. It resets every couple of hours. Bank connections and uploads are switched off in the demo; run Peanut yourself to use it with your own accounts.
Every screenshot is the live demo household.
| Dashboard | Accounts |
|---|---|
| Transactions | Reports |
|---|---|
| Budget | Recurring |
|---|---|
| Investments | Forecasting |
|---|---|
| Source | What | How |
|---|---|---|
| Plaid | US banks, cards, brokerage (txns, balances, holdings) | /transactions/sync + /investments/holdings/get, access tokens in Supabase Vault |
| RiseUp | Israeli accounts: transactions with RiseUp's Hebrew categories | Official PAT API (input.riseup.co.il/api/external), token expires every 30 days, the UI warns at day 25. No balances endpoint yet (balances stay manual until RiseUp ships it) |
| data.gov.il | Pension/hishtalmut track yields (Gemelnet/Pensianet) | "Anchor + drift": statement balance rolled forward by published monthly yield minus fee, plus deposits |
| Financy (open-finance.ai) | Israeli banks, cards, loans and savings: accounts, balances and transactions with Financy's categories | Official REST API (api.open-finance.ai) with your own client id / secret / user id, stored in Supabase Vault. Banks are linked inside the Financy app; the API needs a paid Financy plan |
| frankfurter.dev | Daily USD/ILS (ECB) | fx_rates table, backfilled to 2019 |
RiseUp and Financy both cover Israeli accounts, so use either or both. RiseUp needs a personal token renewed every 30 days and has no balances; Financy needs a paid plan and returns balances and a year of daily history straight from the bank. Peanut keeps only the API credentials; the bank consent lives with the provider.
supabase/migrations,
in file order (supabase link then supabase db push, or paste each file
into the SQL editor). The first file is the full schema; the later ones add
small pieces on top of it..env.example to .env.local and fill it in. Plaid needs a client id
and secret for the environment you pick; CRON_SECRET is any long random string.pnpm install then pnpm dev.SEED_USERS (and optionally
SEED_SPACE_NAME, SEED_PRIMARY_CURRENCY) in .env.local, then run
node scripts/seed.mjs. It creates the users, the shared space, Monarch-style
categories plus the Israeli ones, Plaid category aliases and FX history, and
prints a first password for each new user.vercel.json schedules the daily
sync at 03:00 UTC; Vercel calls it with Authorization: Bearer $CRON_SECRET.Set DEMO_MODE=1 plus NEXT_PUBLIC_DEMO_EMAIL and NEXT_PUBLIC_DEMO_PASSWORD
on a deployment and it serves only the demo household: /demo signs visitors
in with that account, /login is never offered, unknown URLs land on the
about page, and bank connections, syncing, uploads and password changes are
off. The household is generated by src/lib/demo/seed.ts (same data on every
rebuild, dates relative to today) and rebuilt by the server when the last
rebuild is older than two hours. The demo login is public by design: the
account is a member of the demo household only, and row-level security keeps
it out of everything else. Keep the demo on its own Supabase project unless
you have read the policies yourself.
isIncome decides the sign.kind='transfer' is excluded from cash flow, budget, and reports. No pair matching.(connection_id, external_id) with upserts, so re-syncs are idempotent.peanut_vault_* RPCs (service-role only).GET /api/cron/daily at 03:00 UTC with
Authorization: Bearer $CRON_SECRET (fx → every bank connection: RiseUp,
Plaid, Financy → pensions → snapshots).Peanut is built for one household at a time: one Supabase project per household, every listed user an owner. It has not been reviewed for hosting strangers' data on a shared instance. The only hosted instance is the demo.
MIT. See LICENSE.