Topic · Privacy local-first

I tuoi soldi non devono passare dai nostri server.

La maggior parte degli expense tracker presuppone che tu carichi i dati su un server perché "così è più facile sincronizzare". È vero, ma è anche uno scambio sproporzionato. Balance Helper prova un'altra strada: IndexedDB locale, niente account obbligatorio, sync opzionale e cifrata.

Cosa significa local-first in pratica

Quando apri l'app per la prima volta non c'è alcun login. I dati vanno in IndexedDB — un database integrato nel browser, sotto il dominio balancehelper.it, isolato da ogni altro sito. Quando chiudi la pagina, i dati sono ancora lì. Quando torni domani, sono ancora lì. Nessuna chiamata di rete con dentro i tuoi importi.

Questo significa anche che se chiudi la finestra in modalità anonima o cancelli i dati del sito, i record vengono persi. È coerente con il modello local-first: la fonte di verità è il tuo browser. Per chi usa l'app intensivamente consigliamo (a) di installarla come PWA — su iOS, Android o desktop — e (b) di esportare ogni tanto un backup JSON.

La sync opzionale (Pro), cifrata end-to-end

Chi vuole vedere lo stesso registro sul telefono e sul laptop può attivare la sync — è inclusa in Pro. Tecnicamente funziona così:

  1. La prima volta che attivi la sync, il browser genera una chiave AES-GCM casuale a 256 bit usando la Web Crypto API.
  2. La chiave viene salvata in IndexedDB locale. Non lascia mai il dispositivo.
  3. Prima di inviare un record al server, il browser lo cifra con la chiave. Quello che esce è un blob opaco di byte (ciphertext + IV).
  4. Sul server (Supabase) c'è una riga con il blob cifrato e nient'altro di sensibile. Importi, note, categorie sono completamente illeggibili dal server.
  5. Su un altro tuo dispositivo, dopo il login, importi la chiave (la esporti da un device, la importi sull'altro come file). A quel punto il nuovo browser può decifrare i record.

Se perdi la chiave, non possiamo recuperarla. È il prezzo onesto della E2EE: l'unico modo per essere veramente impossibilitato a leggere i tuoi dati è non avere la chiave, e questo include anche non avere un meccanismo di recovery. Per questo l'app ti suggerisce di esportare la chiave appena la generi e di custodirla come faresti con un backup di un password manager.

Niente cookie, niente PII

Per capire come usare l'app raccogliamo metriche aggregate tramite Plausible Analytics (open-source, GDPR-friendly, niente cookie, niente PII). Le proprietà degli eventi sono categoriche: nomi di pagina, tipologie di trigger, contatori. Mai importi, descrizioni o ID utente.

Gli unici dati associati a un account che teniamo sono: email (per il login Google), il flag plan in app_metadata (free o pro) e le righe cifrate della sync. Niente di più.

Cosa non facciamo

  • Niente connessione bancaria. Non chiediamo l'accesso al tuo conto. I dati li inserisci a mano.
  • Niente vendita di dati. Anche volendo, non avremmo materiale: vediamo solo ciphertext.
  • Niente “consulenza”. Non suggeriamo prodotti finanziari, non abbiamo affiliazioni con banche.
  • Niente AI sui tuoi numeri. Niente embedding, niente fine-tuning, niente “riassunto AI delle tue spese”.

Stima dei dati che ti riguardano

Sotto trovi un piccolo strumento per visualizzare cosa effettivamente lascia il tuo browser nel caso peggiore (sync attiva, sessione attiva).

Cosa esce dal browser

caso peggiore
#
B

Domande tecniche frequenti

"Il browser è sicuro per dati così sensibili?" IndexedDB è sandboxed per origine. Altri siti non possono leggere i tuoi dati Balance Helper. Su un dispositivo condiviso, però, chi accede al tuo profilo browser accede ai dati — esattamente come accederebbe a un file su disco. Considera la sessione del browser come la sessione del sistema operativo.

"E se Balance Helper sparisce?" Esporti il backup JSON e i dati restano leggibili anche senza l'app — sono in chiaro nel file, con uno schema documentato. Non c'è lock-in. La sync cifrata su Supabase invece, ovviamente, richiede la chiave per essere decifrata; per questo l'export E2E key è una funzione di prima classe.

"Open-source?" Il client è proprietario, ma il modello dei dati è documentato e l'export JSON è leggibile. Stiamo valutando il rilascio del client come open-source una volta stabilizzato.

Approfondimenti

Niente account, niente connessione bancaria.

Apri l'app, inserisci la prima spesa. Tutto resta nel tuo browser.

Apri l'app