Piggybank — budget familiare
Il budget della famiglia in quattro pagine: spese, entrate, bilancio con grafico e obiettivi di risparmio.
spazio dati «casa» — il collante della suite: sul tuo dispositivo, multi-utente con un invito (link o QR), cifrato end-to-end.
oppure aprila come app unica
Si integra con: Hearth — stesso spazio dati.
Cosa registra
- Cosa hai comprato
- Categoria...
- Importo (€)
- Stipendio, rimborso, regalo...
- Importo (€)
- Obiettivo (vacanza, fondo emergenza...)
- Traguardo (€)
- Già da parte (€)
Composta da 5 micro app
Un compito ciascuna, sugli stessi dati: ogni micro app legge e scrive lo spazio dati condiviso «casa» (col tuo consenso, chiesto alla prima apertura). Tutto resta sul tuo dispositivo — e con un solo invito l'intera suite diventa multi-utente, cifrata end-to-end.
Le micro app condivise sono il ponte tra le soluzioni: gli stessi dati alimentano anche Hearth.
Come funziona
Questa è un'app Reactive: un semplice documento di testo che il browser trasforma in un'app funzionante — moduli, dati dal vivo, tabelle, statistiche e persino grafici, senza installare né configurare nulla.
- Usala subito. Premi «Usa questa app»: si apre subito nel tuo browser, già pronta, con i dati salvati solo sul tuo dispositivo.
- I tuoi dati restano tuoi. Tutto è memorizzato in locale sul dispositivo, separato per ogni app: niente account, niente server, niente da configurare.
- Rendila tua. Il testo qui sotto è l'app per intero: copialo, cambia campi, viste e parole, e le modifiche diventano subito interattive.
- Condividila come file. Un'app è un semplice file: salvalo, esportalo o condividilo con un link; e con la collaborazione cifrata più persone modificano gli stessi dati in tempo reale.
Il testo dell'app
# 🐷 Piggybank
Il budget della famiglia in quattro pagine: spese, entrate, bilancio con grafico e obiettivi di risparmio.
:::::page{title="Spese" icon="💸"}
## Registra le uscite
::::form{path="spese" id="fsp"}
::input{form="fsp" field="data" type="date" legend="Quando"}
::input{form="fsp" field="voce" placeholder="Cosa hai comprato" required="true"}
:::select{form="fsp" field="categoria" placeholder="Categoria..."}
- Casa
- Cibo
- Trasporti
- Salute
- Svago
- Altro
:::
::input{form="fsp" field="importo" type="number" placeholder="Importo (€)" required="true"}
::add-form{form="fsp" path="spese" label="Aggiungi spesa"}
::::
:::table{path="spese" headers="Quando,Voce,Categoria,Importo" deletable="true" editform="fsp"}
{data} | {voce} | {categoria} | € {importo}
:::
**Totale uscite: € :sum[usc]{path="spese" field="importo"}**
:::::
:::::page{title="Entrate" icon="💰"}
## Registra le entrate
::::form{path="entrate" id="fen"}
::input{form="fen" field="data" type="date" legend="Quando"}
::input{form="fen" field="voce" placeholder="Stipendio, rimborso, regalo..." required="true"}
::input{form="fen" field="importo" type="number" placeholder="Importo (€)" required="true"}
::add-form{form="fen" path="entrate" label="Aggiungi entrata"}
::::
:::list{path="entrate" deletable="true"}
{data} — **{voce}**: € {importo}
:::
**Totale entrate: € :sum[ent]{path="entrate" field="importo"}**
:::::
:::::page{title="Bilancio" icon="📊"}
## Come stiamo andando
Entrate: **€ :sum[be]{path="entrate" field="importo"}** ·
Uscite: **€ :sum[bu]{path="spese" field="importo"}**
:::python{data="spese,entrate" packages="matplotlib"}
```
import matplotlib.pyplot as plt
spese = data.get("spese", [])
entrate = data.get("entrate", [])
tot_u = sum(float(r.get("importo", 0) or 0) for r in spese)
tot_e = sum(float(r.get("importo", 0) or 0) for r in entrate)
print(f"Saldo: € {tot_e - tot_u:.2f}")
if spese:
percat = {}
for r in spese:
c = r.get("categoria") or "Altro"
percat[c] = percat.get(c, 0) + float(r.get("importo", 0) or 0)
fig, ax = plt.subplots(figsize=(6, 3.2))
ax.bar(list(percat.keys()), list(percat.values()))
ax.set_ylabel("€")
ax.set_title("Uscite per categoria")
plt.xticks(rotation=20)
plt.tight_layout()
else:
print("Aggiungi qualche spesa per vedere il grafico per categoria.")
```
:::
:::::
:::::page{title="Obiettivi" icon="🎯"}
## I traguardi di risparmio
::::form{path="obiettivi" id="fob"}
::input{form="fob" field="nome" placeholder="Obiettivo (vacanza, fondo emergenza...)" required="true"}
::input{form="fob" field="traguardo" type="number" placeholder="Traguardo (€)" required="true"}
::input{form="fob" field="messo" type="number" placeholder="Già da parte (€)"}
::add-form{form="fob" path="obiettivi" label="Aggiungi obiettivo"}
::::
:::list{path="obiettivi" deletable="true" editform="fob"}
**{nome}** — € {messo} su € {traguardo}
:::
Da parte in totale: **€ :sum[obm]{path="obiettivi" field="messo"}** su
**€ :sum[obt]{path="obiettivi" field="traguardo"}** di traguardi.
:::::