Spese condivise su Nostr. Pagamenti in Bitcoin. Zero server.
- Auth — Nostr NIP-07 (Alby / nos2x)
- Dati — Relay Nostr pubblici (kind:9000, kind:30001)
- Pagamenti — Bitcoin Lightning via WebLN + LNURL-pay
- Frontend — React + Vite
- State — Zustand + localStorage (cache)
npm install
npm run devPer verificare le regole dei saldi prima di una PR:
npm test
npm run buildApri http://localhost:5173 con l'estensione Alby installata.
npm run build
vercel --prodOppure connetti il repo su vercel.com → deploy automatico ad ogni push.
src/
├── App.jsx # Root + routing
├── store/index.js # Zustand store (auth, groups, expenses)
├── lib/
│ ├── nostr.js # publishEvent, Nostr subscriptions
│ ├── relay-pool.js # NIP-20 ACK, retry on reconnect, subscriptions
│ ├── lightning.js # WebLN, LNURL-pay
│ ├── balances.js # Calcolo e semplificazione debiti
│ ├── storage.js # localStorage cache
│ └── constants.js # Relay list, event kinds
├── views/ # Schermate principali
└── components/ # UI primitives + modals
Le richieste di pagamento (anche WebLN) rimangono in attesa finché il destinatario non firma una conferma Nostr. Una risposta WebLN da sola non prova la ricezione. I vecchi pagamenti non confermati non vengono più sottratti ai saldi: verifica la migrazione prima del deploy. Dettagli: docs/PAYMENT-CONFIRMATION.md.
La pubblicazione degli eventi attende un ACK OK da almeno un relay Nostr. In assenza di ACK entro 12 secondi l'esito è incerto, quindi bisogna controllare il gruppo prima di riprovare. Non inviare nuovamente satoshi solo perché la pubblicazione su Nostr non è stata confermata. Dettagli: docs/RELAY-PUBLICATION.md.
| Kind | Uso |
|---|---|
| 0 | Profilo utente (NIP-01) |
| 9000 | Spesa |
| 9001 | Dichiarazione di pagamento (in attesa) |
| 9002 | Conferma del destinatario |
| 30001 | Definizione gruppo |