Private personal-finance tracker for imported investments, portfolio calculations, net-worth assets, salary records, and financial reports.
apps/web: React 19 and Vite web client.apps/api: Express API backed by PostgreSQL and Prisma.apps/electron-desktop: Electron desktop package.apps/tauri-desktop: Tauri 2 desktop package.
There is currently no mobile client, offline database, event log, loan module, invoice module, or budgeting module.
- Node.js 24 or another version supported by the dependencies.
- pnpm 10.26.0.
- PostgreSQL.
qpdfto decrypt password-protected salary PDFs.- Rust and the Tauri system dependencies when building Tauri.
On Debian/Ubuntu, Tauri additionally needs the WebKitGTK 4.1 development packages described in the Tauri prerequisites. Electron does not require the Rust or WebKitGTK toolchain.
Install the exact dependency graph:
pnpm install --frozen-lockfileCreate apps/api/.env from apps/api/.env.example and replace all three cryptographic placeholders with independent random 32-byte hexadecimal values. In non-production development, the API can create a local .env with unique random secrets on its first start.
Create or update the database:
pnpm --filter api db:migrateStart the API and web client:
pnpm devThe web client uses http://localhost:3001 by default. Override it with VITE_API_URL when the API is hosted elsewhere.
pnpm dev # API and web
pnpm dev:electron # API, web, and Electron
pnpm dev:tauri # API and Tauri
pnpm build # API and web production builds
pnpm build:electron # Electron and its web dependency
pnpm build:tauri # Tauri and its web dependency
pnpm lint
pnpm test
pnpm check # lint, tests, and API/web builds
pnpm audit --prod- User-owned imports are deduplicated within each user account.
- Monetary database columns use fixed-precision decimal storage.
- Portfolio totals become unavailable when a required historical exchange rate is missing; the API does not assume a 1:1 conversion.
- Net-worth values are reported separately by currency.
- Salary uploads accept PDF, JPEG, and PNG files up to 10 MB.
- JWT, password pepper, and encryption keys are mandatory in production.
Prisma migrations live in apps/api/prisma/migrations. Existing installations created from the legacy db/init.sql must baseline the initial migration before running prisma migrate deploy; new installations can deploy migrations directly.
Proprietary and private. See LICENSE.