Offline & PWA
PWA Installation
Finapp is a Progressive Web App (PWA). You can install it on your device for a native app-like experience:
- Desktop - click the install icon in your browser's address bar
- Mobile - use "Add to Home Screen" from the browser menu
The installed app runs in standalone mode without browser UI.
Working Offline
Finapp is offline-first. All your data lives in a local SQLite database in the browser (backed by PowerSync, persisted in IndexedDB). You can create, edit, and delete transactions, wallets, and categories while offline - reads and writes always hit the local database first, so the UI never waits on the network.
How writes sync
Every write goes to local SQLite immediately and is recorded in PowerSync's built-in upload queue. While you are offline the queue simply waits.
When connectivity is restored, PowerSync drains the queue to the server (Supabase) automatically and in order. There is no manual queue and no client-generated temporary IDs to remap - every row carries the client-generated UUID it was created with, on both the device and the server.
If the server permanently rejects a write (for example a row-level-security or constraint violation), that change is discarded so the queue is not blocked forever, and the app shows a sync-error toast so you know your local copy is now ahead of the server.
How reads stay fresh
The app subscribes to the local database. Any change - whether it came from your own write or from an incoming sync from another device - re-runs the relevant queries and updates the UI. The same subscription handles the initial load and live updates, so a second device sees your changes shortly after they sync.
Sync Strategy
PowerSync replicates each user's rows incrementally: after the first full sync it streams only the changes (inserts, updates, and deletes) for the tables you are subscribed to. Exchange rates are a shared, read-only stream available to every user. You do not pick a strategy per data type - it is incremental for everything.
Demo mode is the one exception: it has no backend and persists to localforage instead, so a reload works without signing in.