Spiccio: expenses and accounts from phone and PC, offline too, synced to my own server

An app for expenses, income and accounts: you log an expense on your phone in a few seconds, even without a connection, and find it again on your PC. It runs on Android, Windows and in the browser from the same code, syncs with my server and keeps amounts exact to the cent. Subscriptions, budgets, CSV import and optional end-to-end encryption.

Spiccio is the app I keep my own accounts with: expenses, income, transfers between accounts, subscriptions and budgets. I built it for myself and I really use it; from the link you can try it in the browser without an account, and the data stays in that browser. The interface still shows the working name, "Spese App" (Italian for "expenses app").

**What it does**

- **Quick entry**: the amount is typed from the right, like on a till; account and category are buttons, and the category comes from a rule or from history, with a note saying which. - **Subscriptions and recurring items**: a calendar of due dates to confirm, what they cost this month and over the next twelve, free trials and cancellation notice. - **Budgets by category**, with the month's net spending and what is left, on the overview too. - **CSV import** with a preview that writes nothing, rejected rows with the reason and possible duplicates to decide on; importing the same file again does not double it. - **Review**, the only place where decisions are made: duplicates, conflicts, due dates to confirm, rule suggestions. - **Balance forecast** for the end of the month, with the items behind it. - CSV, Excel and JSON export, encrypted backup, light and dark theme.

**One codebase, three platforms**

The domain is plain TypeScript and knows nothing about SQL or the interface: use cases produce a write plan that the persistence layer turns into transactions. On Windows and Android the app is Tauri with native SQLite; in the browser the same SQLite runs in WebAssembly, on OPFS. In the apps you sign in with a passkey, and the encryption phrase can be kept behind the fingerprint on the phone or Windows Hello on the PC.

**The hard part: sync**

Every write saves the data and the operation to send in the same transaction: if the app closes halfway, nothing is lost and nothing is sent twice. The server, Fastify with MongoDB, keeps an ordered log for each owner; a device moves its cursor forward only after applying a page, and the real-time channel only says that something changed. A conflict on amounts never resolves itself: it lands in Review with the value that won. Amounts are integers in cents from start to finish, never floating point, and balances are not stored: they are recomputed from the transactions. With end-to-end encryption every value reaches the server encrypted with AES-256-GCM, and the server cannot read amounts, merchants or notes.

The technical choices are written down in 34 decision records; 2,615 automated tests cover domain, persistence, client and server, and on every push a GitHub Action runs them and deploys the server and the web client.

Design, full-stack development and deployment · 2026

Vue.js, Tauri, Fastify, MongoDB, SQLite

View the site

Andrea Coppetta