Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
音声入力やレシート読み込みで手軽に家計簿を記録し、家族と共有できるツール
Translation pending
AI summary · website content
FinanceJavaScript · CSSGitHub @yoo15kpr-dotcomOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗公開版: https://zuborakakeibo.vercel.app/ (スマホで開いて「ホーム画面に追加」)
旧URL(GitHub Pages): https://yoo15kpr-dotcom.github.io/zubora-kakeibo/ はアプリを止め、移転のお知らせページにしています(gh-pages ブランチ)。そのURLに記録が残っている端末では、お知らせページの「残しとく」で保存して新しいURLで読み込めます。
話し言葉(音声または文字)をそのまま入力すると記録される、ズボラ向けの家計簿。
目標金額との差と、ゆるい応援の言葉を表示します。データは端末の localStorage(キー zubora_v1)に保存します。「2人で共有」を使うと、暗号化した記録を Vercel Blob にも置きます(下記)。
public/ ブラウザで動く部分(静的ファイルだけでも動作)
index.html
style.css
app.js 画面・記録・集計
parse.js 入力の解釈(amount / dateOf / split / normalize / cat)。DOM 非依存
data.js バックアップの書き出し・読み込み。DOM 非依存
sync.js 2人で共有: まとめ方(足し算+消した印)と暗号化。DOM 非依存
sw.js Service Worker(オフライン用)
manifest.webmanifest, icons/
lib/receipt.js レシート画像 → {store, total, date, category}(Anthropic API)
api/sync.js 2人で共有の保存場所(Vercel Function → Vercel Blob。暗号文だけを置く)
server.js 静的配信 + POST /api/receipt + /api/sync(手元ではメモリに置く)
test/ node:test の単体テスト
npm install
ANTHROPIC_API_KEY=sk-ant-... npm start # http://localhost:8787
npm test
npm install のときに、端末内の文字認識(Tesseract.js)の部品が public/vendor/ocr/ にコピーされます(npm run vendor:ocr でも可)。public/ だけを静的ホスティングに置いても動きます。その場合も先に npm install して public/vendor/ を含めて置いてください。localhost でのみ有効です。| 変数 | 既定 | 内容 |
|---|---|---|
ANTHROPIC_API_KEY | なし | レシート読み取りに使用。ブラウザには渡りません |
PORT | 8787 | 待ち受けポート |
RECEIPT_MODEL | claude-sonnet-5-5 | 読み取りに使うモデル |
RECEIPT_ACCESS_KEY | なし | 合言葉。設定するとレシート読み取りに必須になる(日本語可)。公開するなら設定推奨 |
RECEIPT_LIMIT_PER_HOUR | 30 | IP ごとの1時間あたり上限(合言葉の誤りも数える。プロセス内メモリなので複数台構成では効かない) |
CLIENT_IP_HEADER | なし | 中継サーバーの後ろで動かすとき、利用者の IP が入るヘッダー名。未設定なら接続元アドレスを使う |
RECEIPT_ACCESS_KEY を設定すると、アプリで初めて 📷 を押したときに合言葉を聞かれます(端末ごとに1回だけ)。
https://<あなたのURL>/#key=<合言葉> で開くと入力を省けます(読み込んだあと URL からは消えます)。
iPhone ではホーム画面に追加したアプリと Safari の保存領域が別なので、ホーム画面のアプリ側で一度入力してください。
未設定のままだと全員が中継サーバーの同じ IP に見え、回数上限が全員で共有になります。
利用者の IP を入れるヘッダーをサービスの仕様で確認し、CLIENT_IP_HEADER に指定してください。
true-client-ip(Render サポートが案内しているとされるヘッダー。公式ドキュメントでは未確認なので、デプロイ後に実際の値を確かめてください)読み取り方法は自動で決まります。
| 条件 | 方法 | 費用 |
|---|---|---|
サーバーに ANTHROPIC_API_KEY がある | Anthropic API(下記) | API 利用料 |
| ない(静的ホスティングも含む) | 端末内の文字認識(Tesseract.js、日本語軽量データ) | なし。画像は端末の外に出ない |
端末内の文字認識について:
parse.js の receiptFromText)。小計・預り・お釣り・合計点数は除外します。貼り付けでも読めます: iPhone のテキスト認識表示や Google レンズでコピーしたレシートの文字を入力欄に貼ると、「合計」などの言葉と数字が3つ以上ある場合はレシートとして確認画面を出します。
GET /api/receipt → {"enabled": true|false, "locked": true|false}(📷 ボタンの表示と、合言葉が必要かの判定)
POST /api/receipt
{ "image": "<base64。data: 接頭辞なし>", "mediaType": "image/jpeg" }
合言葉ありのときはヘッダー X-Access-Key: <encodeURIComponent した合言葉> が必要です。
→ { "store": "店名", "total": 1234, "date": "YYYY-MM-DD" | null, "category": "食費|交通|日用品|趣味|固定費|その他" }
fallbacks: "default")を有効にしています。{"error": "bad_request" | "unsupported_type" | "too_large" | "rate_limited" | "unauthorized" | "refused" | "unreadable" | "upstream" | "disabled"}。public/parse.js の INCOME / isIncome)。in: 1 の印を付けるだけなので、バックアップと2人で共有でもそのまま届きます。public/data.js の backupDue)。読み込みは今のデータに足すだけで、同じ記録は増えません。新しい端末(記録が空)に読み込んだときは目標金額も移ります。形の崩れた記録は読み込みません(public/data.js)。🎤 を押すと、ブラウザの音声認識(Web Speech API、ja-JP)で聞き取ってそのまま記録します。
非対応のブラウザや、マイクを使えない画面(埋め込み表示など)では、入力欄にカーソルを置いて「キーボードのマイクで話してね」と案内します(iPhone・Android の標準キーボードの音声入力を使う)。
test/parse.test.js に例をそのままテストとして書いています。
円 で区切って1件ずつ(「コンビニ500円 コンビニ1000円」→2件)1,200 3千 1万2千 15万明日 あさって N日 来月N日 来月 今日(後続の項目にも引き継ぐ)毎月N日 / 隔週 / 毎週(曜日指定可: 隔週月曜)。登録月以降のみ表示、今月分は未来日でも「使った額」に含めるvercel.json の設定で、Vercel が npm ci → npm run vendor:ocr(文字認識の部品のコピー)を実行し、public/ をそのまま公開します。サーバー版のコード(server.js・lib/)は .vercelignore で除外しています。
zubora-kakeibo-blond.vercel.app)。Settings → Domains の「Edit」で空いている 〜.vercel.app に変えられる(このプロジェクトは zuborakakeibo.vercel.app)〜-<ハッシュ>-<チーム名>.vercel.app など)は Vercel へのログインが必要。普段は本番URLを使うgh-pages ブランチには移転のお知らせページ(index.html / 404.html)と、前のアプリの Service Worker を解除する sw.js だけを置いています。アプリ本体は Vercel で公開します。
public/ のファイルを変えたら sw.js の CACHE の値(zubora-vN)を上げると、古いキャッシュが確実に消えます(ネット優先で取得するので、上げなくてもオンライン時は新しい版が表示されます)。
今月画面の「2人で共有」→「👥 共有をはじめる」で、もう1人と同じ家計簿を使えます。
https://zuborakakeibo.vercel.app/#join=<鍵> を送り、相手が開くと参加します。iPhone でホーム画面のアイコンから使う人は、リンクを入力欄に貼って「記録」でも参加できます(Safari とアイコンで保存場所が別のため)。del)」。どちらの順番でまとめても同じ結果になるので、同時に入力しても消えません。消した記録・よく使うは相手からも消えます。目標金額はあとで変えたほうになります(public/sync.js の mergeState)。# 以降にだけ入り、サーバーには送りません。鍵から HKDF で「暗号化の鍵(AES-GCM)」と「合図(token)」を作り、サーバーには暗号文と合図だけを送ります。保存場所は合図の SHA-256 で決まるので、合図を知らない人は読めず、上書きもできません。リンクを持っている人は全部読めるので、リンクは共有したい相手にだけ送ってください。BLOB_READ_WRITE_TOKEN など)が入ったあとに一度公開し直す用意する前は「共有の保存場所がまだ用意されていないみたい」と表示され、共有は始まりません(/api/sync が 503)。手元では SYNC_OFF=1 npm start でこの状態を試せます。