Finance App PWA *working title

About

What is Finance App PWA?

Finance App PWA — transaction list with expenses, income and budget overview on a mobile screen

Finance App PWA (further — "the App") is a personal finance tracker that runs entirely in your browser. No server, no signup, no tracking. Your financial data never leaves your device — it is stored locally and works fully offline.

Built for people who want a simple, private way to track their money without handing their data to a cloud service.

Features

How your data is stored

All data lives in your browser's IndexedDB — a local database on your device. There is no server, no cloud sync, and no account to create. The app works entirely client-side using WebAssembly.

Because your data is local, you are responsible for backups. Use the built-in backup feature (Menu → DB:Backup / DB:Restore) to save a backup regularly. The backup is a simple ZIP archive containing a plain JSON file — no proprietary or binary format, fully readable and portable. Each backup is named with a date (finapp_backup_YYYYMMDD.json), so you can keep multiple files and maintain a history of changes. If you clear your browser data or switch devices, the backup is your only recovery option.

The database is lightweight — around 1–2 MB for 10,000 transactions, a dozen accounts, and a couple dozen categories. A compressed backup is under 200 KB. The app will periodically remind you to create a backup, so you won't forget.

Backup JSON structure
{
  "version": 0,                        // schema version
  "backup_dt": "2026-03-29T14:30:00Z", // backup timestamp (ISO 8601)

  "currencies": [{
    "i": 1,                             // id
    "n": "US Dollar",                   // name
    "s": "$",                           // symbol
    "m": true,                          // is main currency
    "e": "1.0"                          // exchange rate to main
  }],

  "accounts": [{
    "i": 1,                             // id
    "n": "My Wallet",                   // name
    "t": "1",                           // type: "1"=Cash "2"=Card
                                        //   "3"=BankDeposit "4"=Investing
    "c": 1,                             // currency id
    "ib": "100.50",                     // initial balance
    "b": "75.25",                       // current balance
    "h": false,                         // is hidden
    "l": "l",                           // liquidity: "l" "m" "h"
    "p": false                          // show in transactions page header
  }],

  "categories": [{
    "i": 1,                             // id
    "t": "Expense",                     // "Expense" | "Income" | "Transfer"
    "n": "Food"                         // name
  }],

  "sub_categories": [{
    "i": 1,                             // id
    "c": 1,                             // parent category id
    "n": "Groceries"                    // name
  }],

  "transactions": [{
    "i": 1,                             // id
    "t": {                              // type (one of):
      "e": {                            //   expense:
        "fi": 1,                        //     from account id
        "fa": "25.25"                   //     amount
      }
      // "i": { "ti", "ta" }            //   income: to account
      // "t": { "fi","fa","ti","ta","f" } // transfer: both + fee
    },
    "c": [{                             // categories
      "c": 1,                           //   category id
      "s": 1,                           //   subcategory id
      "a": "25.25"                      //   amount (null if single)
    }],
    "p": null,                          // project id (optional)
    "n": "Weekly groceries",            // note (optional)
    "d": "2026-03-29T14:00:00Z",        // datetime (ISO 8601)
    "f": false                          // is future (default: false)
  }],

  "projects": [{
    "i": 1,                             // id
    "n": "Renovation",                  // name
    "h": false                          // is hidden
  }],

  "budget_v3": [{
    "y": 2026,                          // year
    "m": 3,                             // month
    "t": "5000.00",                     // total budget
    "c": [{                             // per-category budgets
      "i": 1,                           //   category id
      "b": "2000.00"                    //   budget amount
    }]
  }]
}

Amounts are decimal strings for precision. Dates use ISO 8601 format. Short field names (i, n, t, etc.) keep the backup file compact.

No tracking

The App does not use cookies, analytics, or any third-party tracking scripts. It loads no external resources at runtime.

The site is hosted on Cloudflare Pages, which may set technical cookies (e.g. for bot protection), but Cloudflare Analytics is disabled. Read more in the Privacy Policy.

Install as an app

  1. Open finance-app-pwa.pages.dev in your browser
  2. On mobile: tap "Add to Home Screen" (iOS Safari share menu or Android Chrome menu)
  3. On desktop: click the install icon in the address bar (Chrome, Edge)
  4. The app will launch in its own window and work offline

Quick test drive

Want to explore the App without entering real data? Use the built-in demo mode:

  1. Open the App and tap the ... menu (bottom-right)
  2. Tap DB:Reset Test — this loads sample accounts, categories, projects, and a budget
  3. Tap DB:Rand Tx — this generates random transactions so you can see how everything looks with real data

You can repeat DB:Rand Tx multiple times to add more transactions. To start fresh, use DB:Reset Test again or clear your browser data.

Under the hood

The App is written in Rust using the Leptos framework and compiled to WebAssembly. There is no JavaScript application code — the entire UI runs as a single WASM binary in your browser.

Contact & Feedback

Found a bug, have a suggestion, or just want to say something? Fill out the feedback form — it helps make the app better.