Pulse Local
Un'app per il budget familiare dove i dati non lasciano il computer
Cosa fa
App per gestire spese ed entrate con l'aiuto dell'AI, ma tutto gira sul computer dell'utente: nessun dato finanziario viene inviato su internet.
Come guadagna
Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: app a pagamento una tantum, che con la privacy come argomento si vende bene.
Rendilo tuo
- Categorie italiane: bollette, mutuo, mensa scolastica, bollo auto, 730.
- Importa gli estratti conto delle banche italiane in PDF o CSV.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Conti di Casa": un'app per gestire spese ed entrate di famiglia in cui tutti i dati restano nel computer o nel telefono dell'utente: nessun dato finanziario viene inviato su internet. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con "I tuoi conti restano a casa tua" e il prezzo
2. Importazione dei movimenti da file CSV o Excel della banca
3. Movimenti con categorie automatiche e modificabili
4. Budget mensile per categoria con barre di avanzamento
5. Grafici dell'anno e obiettivi di risparmio
Stile: rassicurante e chiaro: sfondo bianco, verde #15803D, blu #1D4ED8, rosso #DC2626 per gli sforamenti, carattere "Inter", grafici semplici. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- nessuna tabella per i movimenti: stanno solo nel browser dell'utente (IndexedDB), con esportazione e backup su file
- "profili": solo piano (gratis o completo) per la licenza, collegato all'utente
Regole di sicurezza obbligatorie:
- i movimenti non lasciano mai il dispositivo
- il backup è un file che l'utente scarica, facoltativamente cifrato con una password
- il piano non si modifica dal browser
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Importazione e categorie, tutto nel browser
L'utente importa il file CSV o Excel scaricato dalla sua banca. Il sito riconosce le colonne (data, descrizione, importo o dare/avere) e chiede conferma una volta per banca. Tutto viene letto nel browser e salvato in IndexedDB.
Le categorie si assegnano con regole sulle parole della descrizione (codice nei Dettagli tecnici): "ESSELUNGA" → Spesa, "ENEL" → Bollette. Quando l'utente corregge una categoria, il sito propone di creare la regola, così la volta dopo è automatico.
Funziona anche offline come PWA. Mostra in grande: "I tuoi dati non vengono inviati a nessuno: puoi verificarlo staccando internet".
4. Budget, grafici e backup
Budget mensile per categoria con barre (verde, giallo all'80%, rosso oltre il 100%), grafico delle spese per mese, e obiettivi di risparmio con la stima di quando si raggiungono.
Backup: esporta tutto in un file (cifrato con una password a scelta) da salvare dove si vuole, e reimportalo su un altro dispositivo. Avviso: "Se cancelli i dati del browser senza backup, i movimenti si perdono".
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 14,99 € una volta sola. Il pagamento sblocca più conti, regole illimitate, obiettivi di risparmio e backup cifrati.
A pagamento riuscito il webhook imposta "piano" a "pro" nella tabella "profili", sulla riga dell'utente indicata in client_reference_id.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Privacy: con la scheda Rete degli strumenti del browser aperta, importa un file e usa l'app per 5 minuti: nessuna richiesta deve contenere movimenti.
2. Backup: esporta, cancella i dati del browser, reimporta: tutto deve tornare uguale.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Categorie automatiche con regole
Assegna una categoria a ogni movimento cercando parole nella descrizione. Le regole create dall'utente vengono prima di quelle predefinite.
type Regola = { parola: string; categoria: string };
type Movimento = { data: string; descrizione: string; importo: number; categoria?: string };
const PREDEFINITE: Regola[] = [
{ parola: "esselunga", categoria: "Spesa" }, { parola: "coop", categoria: "Spesa" },
{ parola: "conad", categoria: "Spesa" }, { parola: "lidl", categoria: "Spesa" },
{ parola: "enel", categoria: "Bollette" }, { parola: "hera", categoria: "Bollette" },
{ parola: "telepass", categoria: "Auto" }, { parola: "eni ", categoria: "Auto" },
{ parola: "stipendio", categoria: "Entrate" }, { parola: "netflix", categoria: "Abbonamenti" },
];
const normalizza = (s: string) => s.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
export function categorizza(movimenti: Movimento[], mieRegole: Regola[]): Movimento[] {
const regole = [...mieRegole, ...PREDEFINITE];
return movimenti.map((m) => {
if (m.categoria) return m; // già scelta dall'utente
const testo = normalizza(m.descrizione);
const regola = regole.find((r) => testo.includes(normalizza(r.parola)));
return { ...m, categoria: regola?.categoria ?? (m.importo > 0 ? "Altre entrate" : "Da classificare") };
});
}
// Totale per categoria nel mese, per le barre del budget
export function spesePerCategoria(movimenti: Movimento[], mese: string) {
const totali = new Map<string, number>();
for (const m of movimenti) {
if (!m.data.startsWith(mese) || m.importo >= 0) continue;
totali.set(m.categoria!, (totali.get(m.categoria!) ?? 0) - m.importo);
}
return totali;
}
Pezzi comuni a tutti i progetti
Glossario
- CSV
- Un file di testo con i dati separati da virgole, che si apre con Excel.
- IndexedDB
- Un piccolo database dentro il browser: i dati restano sul tuo dispositivo.
- PWA
- Un sito che si installa come un'app e funziona anche senza connessione.