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.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Prototype/foundation Next.js untuk mengubah foto struk belanja menjadi catatan keuangan terstruktur. Dibangun sebagai pondasi yang akan diperluas ke pelaporan keuangan perusahaan (multi-akun, multi-user, laporan periodik, dst).Read the full README ↗
Prototype/foundation Next.js untuk mengubah foto struk belanja menjadi catatan keuangan terstruktur. Dibangun sebagai pondasi yang akan diperluas ke pelaporan keuangan perusahaan (multi-akun, multi-user, laporan periodik, dst).
@anthropic-ai/sdk) untuk
diekstrak jadi data terstruktur (merchant, tanggal, item, total).Next.js 16 (App Router, TypeScript, Tailwind v4)
Prisma 7 + SQLite (@prisma/adapter-libsql — dipilih karena binary-nya
prebuilt per platform, jadi npm install tidak butuh Python/C++ build tools
di Windows) — lihat
src/lib/db.ts dan src/lib/receipts.ts. Semua akses data lewat
src/lib/receipts.ts; ganti ke Postgres nanti cukup ubah DATABASE_URL,
adapter di db.ts, dan datasource.provider di prisma/schema.prisma.
LLM provider pluggable — lihat src/lib/llm/. getReceiptParser()
memilih implementasi berdasarkan env var LLM_PROVIDER:
gemini → @google/genai, butuh GEMINI_API_KEY
(free tier, tanpa kartu kredit)anthropic → @anthropic-ai/sdk, butuh ANTHROPIC_API_KEYUntuk menambah provider lain, buat adapter baru yang mengimplementasikan
ReceiptParser (satu method: parseReceipt), pakai normalizeReceipt() dari
src/lib/llm/normalize.ts untuk merapikan hasilnya, lalu daftarkan di
src/lib/llm/index.ts. Tidak ada file lain yang perlu disentuh.
cp .env.example .env
# isi GEMINI_API_KEY (atau ANTHROPIC_API_KEY, sesuai LLM_PROVIDER)
npm install # postinstall otomatis menjalankan `prisma generate`
npx prisma migrate dev # sekali di awal / setiap ubah schema
npm run dev
Di Windows PowerShell, pakai npm.cmd / npx.cmd kalau kena error execution
policy, atau jalankan Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser.
Buka http://localhost:3000.
Serverless punya filesystem read-only, jadi SQLite di disk tidak bisa dipakai di produksi. Databasenya pindah ke Turso (SQLite yang di-host, adapter-nya sama).
Buat database di turso.tech (free tier), catat URL
libsql://... dan auth token-nya.
Terapkan skema sekali. prisma migrate deploy tidak bisa dipakai di sini
karena Prisma 7 hanya menerima URL biasa untuk migration, jadi jalankan isi
prisma/migrations/20260918164830_init/migration.sql langsung:
turso db shell <nama-db> < .../migration.sql
di bash/zsh. Di PowerShell operator < tidak ada, pakai:
Get-Content .../migration.sql | turso db shell <nama-db>Di Vercel, isi environment variables:
| Key | Value |
|---|---|
DATABASE_URL | libsql://...turso.io |
TURSO_AUTH_TOKEN | token dari Turso (tandai sensitif) |
LLM_PROVIDER | gemini |
GEMINI_API_KEY | API key kamu (tandai sensitif) |
Biarkan Build/Output/Install Command memakai default Vercel.
Foto struk tidak tersimpan di produksi. saveReceiptImage() gagal diam-diam
di filesystem read-only dan struk tetap tercatat tanpa foto — saat ini tidak ada
bagian UI yang menampilkan foto tersimpan, jadi tidak ada fitur yang hilang.
Untuk menyimpannya secara permanen, ganti isi src/lib/image.ts ke object
storage (Vercel Blob / S3).
prisma/schema.prisma # model Receipt & ReceiptItem
src/lib/db.ts # Prisma client singleton + driver adapter
src/lib/receipts.ts # satu-satunya modul yang bicara ke database
src/lib/llm/ # interface ReceiptParser + adapter Claude
src/lib/image.ts # simpan foto struk ke public/uploads/receipts
src/app/api/receipts/parse/ # POST: foto -> data terstruktur (belum disimpan)
src/app/api/receipts/ # GET: daftar struk, POST: simpan struk
src/components/receipt-app.tsx # UI: upload -> review/edit -> riwayat
public/uploads/receipts), cukup untuk
prototype single-instance. Pindah ke object storage (S3, dll) kalau app
sudah jalan di lebih dari satu instance.category di ReceiptItem), belum ada
taksonomi/master data kategori — ditambahkan saat kebutuhan pelaporan jadi
jelas, bukan diasumsikan sekarang.public/uploads/receipts/. Belum ada
pembersihan otomatis — cukup untuk prototype, perlu ditangani sebelum produksi.