Privacy-first, offline-first family finance planner. Tauri v2 + Rust (SQLite, Argon2id) + React/TypeScript + shadcn/ui + Lucide.
crates/vaulty-core: all data and security logic, with no Tauri dependency.cargo test -p vaulty-coreruns anywhere.profiles.rs: family members, passwords, setup codes, 2FA (TOTP plus backup codes), biometric tokens, lockout.accounts.rs,transactions.rs,categories.rs,settings.rs,export.rs: finance data.migrations/registry,migrations/data: SQL migrations (append-only).
src-tauri: thin desktop shell. It holds the signed-in session, shows the OS biometric prompt and uses the OS keychain.ui: React + Vite + Tailwind v4 + shadcn/ui (new-york, zinc) + Lucide icons. It talks to Rust only throughui/src/api.ts. Add shadcn components withnpx shadcn@latest add <name>fromui/.
assets/brand/logo.svg: master logo (brand blue#235BAA).ui/public/logo.svgis a copy used as the favicon.- In the app the logo is drawn inline by
ui/src/components/Logo.tsxand follows the accent colour chosen in Settings (CSS variables--logo/--logo-detailinui/src/index.css). On the neutral accent it stays brand blue. If you change the master SVG, regenerateLogo.tsxfrom it. assets/brand/app-icon-1024.png(macOS/Linux tile) andapp-icon-small-1024.png(tight crop for small sizes and Windows) are the sources forsrc-tauri/icons/. To regenerate after a logo change:npx @tauri-apps/cli icon assets/brand/app-icon-1024.png -o src-tauri/icons, then re-export the small sizes andicon.icofrom the tight crop.
- Directory of banks, card issuers, brokers and wallets per country:
crates/vaulty-core/data/banks/<COUNTRY>.json(community-maintained). - Optional logo files go in
ui/public/institutions/(see the README there). Without one, the app shows a monogram badge; users can also attach their own image to an account. - Names and logos belong to their owners and are not covered by the MIT licence; see
TRADEMARKS.md.
- Languages: English and Hindi. Each family member picks their own; the sign-in screen has a
language switch too. Adding a language is one JSON file: see
ui/src/i18n/README.md. - Countries and currencies: any country and every ISO 4217 currency. Numbers, money and dates follow the chosen region (₹12,34,567.50 in India, $1,234,567.50 in the US).
- Tax planner: tax rules are data files in
crates/vaulty-core/data/tax/. India (old and new regime) ships first; see that folder's README to add a country. Results are estimates, not advice.
Turning it on is the only thing that makes Vaulty go online. It sends the symbols you choose and nothing about your money. Crypto prices come from CoinGecko (no key needed). Stock prices need a free key from Twelve Data, which you add in Settings; it's stored in your profile's database and never shown again. The last prices are kept so the ticker still shows something offline.
<app data dir>/
registry.db # who's on this device: names, password hashes, wrapped keys (no finances)
users/<id>.db # each member's finances, encrypted with their own key (SQLCipher, AES-256)
household.db # what members chose to share, encrypted with the family key
snapshots/<id>/*.db # encrypted safety copies of each member's data
Signing in unwraps only that member's key and opens only their database. Every change is
recorded in their encrypted database so it can be undone; deleted items stay restorable for 30
days. See decisions 1 and 1b in ROADMAP.md for how keys and recovery work.
- Amounts are integers in minor units (paise, cents…); each currency's decimal places come from
money.rsand thecurrenciestable (JPY 0, INR/USD 2, KWD 3…). Floats are never stored. - Every income, expense, transfer and opening balance is a double-entry
entrywhosepostingssum to zero per currency (ledger.rs, migration0004_ledger.sql). Account balances are sums of postings, never stored. - The
transactionsview presents entries in the simple shape the UI uses (one row per income / expense / transfer). Admins manage who's on the device but can't open other members' data.
SQLCipher is built with a vendored OpenSSL, so no system crypto library is needed. Building it needs Perl and a C compiler (preinstalled on macOS and Linux; on Windows install Strawberry Perl).
cargo test -p vaulty-core
npm --prefix ui install
cargo install tauri-cli --version "^2"
cargo tauri dev
- Linux needs the Tauri system deps (webkit2gtk-4.1 etc.): https://v2.tauri.app/start/prerequisites/
- On Linux, biometric/system unlock goes through polkit. For local testing, install the policy once:
sudo install -Dm644 src-tauri/packaging/com.vaulty.app.policy /usr/share/polkit-1/actions/(the .deb and .rpm bundles do this automatically).
See ROADMAP.md for phases, architecture decisions and feature ideas.