尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A finance cockpit for personal‑finance nerds who enjoy giving themselves a well‑earned pat on the back.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗The net worth spreadsheet you've outgrown. If you track your wealth in a spreadsheet that has sprawled across brokers, banks, and currencies, Quantive replaces it: net worth over time, asset allocation, and a forecast of where it's heading, on any device, with no bank logins to set up. And because it's your money, every byte of portfolio data is encrypted in your browser before it reaches the server.
Live: https://usequantive.app · Try the demo without signing up: https://usequantive.app/demo · Changelog: https://usequantive.app/changelog
A spreadsheet is where most people start tracking net worth, and for a while it's fine. It stops being fine when the assets pile up: a brokerage in one country, a pension in another, some cash in a third currency, a flat you can only mark to market by hand, a couple of things a bank dashboard will never see. You end up maintaining FX columns and copy-pasting balances once a month, and the sheet you built to give you clarity now just nags at you.
Quantive is that sheet, rebuilt. Enter balances by hand or import them, tag each source by volatility and liquidity, and read your net worth over time, your allocation, and a forecast without rebuilding a single formula. Historical snapshots stay valued at the exchange rate of their original date, so last year's number doesn't drift when today's rates move. There are no bank logins and nothing to connect to an aggregator, which is the point: it tracks the illiquid and cross-border holdings a bank dashboard can't, and it works the same on your laptop and your phone.
This is the reason to pick Quantive over the next spreadsheet replacement. Most finance apps store your data in plaintext on the server. Quantive doesn't.
When you set up an account, a random 256-bit data key (DK) is generated in your browser. That DK is wrapped (encrypted) by a key-encryption key (KEK) derived from your password via Argon2id (t=3, m=64 MiB, p=1). The KEK is never stored. It is re-derived on each login. The server only ever receives the wrapped DK and the encrypted snapshot.
Password → Argon2id(salt) → KEK
KEK → XChaCha20-Poly1305 → wrapped DK (stored in user_keys)
DK + random 24-byte nonce → XChaCha20-Poly1305 → encrypted_data (stored in portfolio_snapshots)
This separation matters: changing your password re-wraps the DK under a new KEK, but does not re-encrypt your entire history.
Each ciphertext includes AAD bound to your user ID and schema version, so even with full database write access an attacker cannot transplant one user's ciphertext into another's row. The AEAD tag check fails before any plaintext is exposed.
A 24-word BIP-39 mnemonic serves as a recovery path: a second KEK derived from the mnemonic wraps the same DK, so you can regain access without your password. The mnemonic is shown once and never stored. If you skip it and forget your password, your data is gone by design.
The crypto module (src/lib/crypto/) is pure TypeScript, with no I/O and no side effects, and is licensed MIT for independent auditing.
Free
Pro (€9/month or €90/year, ~€7.50/mo)
Family (€14/month or €120/year)
| Layer | Choice |
|---|---|
| Frontend | React 18 + TypeScript 5, Vite 5 (SWC) |
| Routing / state | React Router 6, TanStack Query 5 |
| UI | Tailwind CSS 3 + shadcn/ui + Radix UI |
| Charts | Recharts 2 |
| Animation | CSS transitions, off under reduced motion |
| Crypto | libsodium-wrappers-sumo (XChaCha20-Poly1305, Argon2id) |
| Backend | Supabase (Postgres + Auth + Edge Functions on Deno) |
| Payments | Stripe |
| Tests | Vitest (unit) + Playwright (E2E) |
Requires Node.js ≥ 20 (use nvm).
git clone https://github.com/pedromlsreis/quantive
cd quantive
npm install
cp .env.example .env # fill in your Supabase keys
npm run dev # the dev server runs on http://localhost:8080
.env.example
VITE_SUPABASE_URL=https://<project-id>.supabase.co
VITE_SUPABASE_PUBLISHABLE_KEY=<anon-key>
VITE_POSTHOG_KEY= # optional, analytics
VITE_POSTHOG_HOST= # optional, e.g. https://eu.i.posthog.com
npm run dev # dev server
npm run build # production build
npm run preview # preview production build locally
npm run typecheck # tsc --noEmit (must pass before PRs)
npm run lint # ESLint (zero errors required)
npm run test # unit tests via Vitest (~20 s, crypto-heavy)
npm run test:watch # watch mode
npm run test:e2e # Playwright headless
npm run test:e2e:ui # Playwright with interactive UI
npm run test:all # unit + E2E
All four gates must pass before a pull request is mergeable: lint, typecheck, test, build.
src/
├── lib/crypto/ # Pure crypto module (MIT): AEAD, KDF, recovery, key wrapping
├── lib/ # forecast, fxConvert, dataProcessor (Excel parser), types
├── contexts/ # Auth, Portfolio, KeySession, Currency, Preferences
├── pages/ # Dashboard, Allocations, Forecast, Sources, Settings, Admin
├── components/ # charts/, dashboard/, auth/, layout/, ui/ (shadcn)
└── hooks/
supabase/
├── migrations/ # forward-only SQL migrations
└── functions/ # Deno edge functions: Stripe webhook, FX ingest, admin APIs
docs/legal/{impressum,privacy-policy,terms-of-service}.md are the canonical source for the rendered Impressum, Privacy and Terms pages. They are imported via ?raw by src/components/legal/MarkdownLegal.tsx and rendered with ReactMarkdown. Edit the markdown, not the React page.
Found a vulnerability? Please report it privately. See SECURITY.md.
Crypto patches must reference the relevant section of docs/security/encryption.md by heading. New crypto primitives or parameter changes require a written rationale.
Quantive is source-available, not OSI-approved open source. The application code is released under the PolyForm Noncommercial 1.0.0 licence; the crypto module (src/lib/crypto/) is released under the MIT licence. Commercial use requires a separate licence: contact [email protected].