Open Net Worth
Open Net Worth는 직접 운영하는 오픈소스 개인 AI 자산 비서로, 전체 재무를 하나의 원장에 기록하고 사용자가 제어하는 AI가 관리
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
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 でこの状態を試せます。