Inspiration
Small rotating savings circles need a clear record of who contributed, whose turn is next, and whether a payout has been approved. CircleSats explores this for a four-member Dakar Market Circle. The scenario is illustrative; we have not yet validated it through user interviews.
What it does
Members contribute a fixed amount each round. The app tracks the round target, individual receipts, a fixed recipient rotation, and approvals from members other than the recipient. The public guided demo lets a judge complete four rounds without setup. Every sat and payout in that public demo is explicitly simulated and resets on reload.
The full Node application also supports member access codes, invoice QR and copy, an external Lightning wallet, a browser Nostr Wallet Connect (NWC) payer, and a receive-only NWC or LNbits receiver. A contribution is credited only after the receiving provider reports the expected invoice, payment hash, amount, and settled state. The full Lightning application currently runs locally; it is not part of the public Vercel demo.
How we built it
We used Node.js, JavaScript, a versioned checksummed JSON ledger, the Alby JavaScript SDK for NWC, LNbits as an alternative receiver, and GSAP for the preloader. A separate static Vercel build runs the guided simulation in each visitor's browser. Receiver credentials stay on the server, and real receiving connections must be scoped to invoice creation and lookup without spending permission.
The seeded circle has four members contributing 100 sats each. Automated tests cover a complete four-round simulated cycle, access controls, invoice validation, duplicate-payment prevention, relay reconnection, and ledger recovery. We ran 25 passing tests and built the public demo. A separate Alby Developer Sandbox check settled four 100-sat fake-sat invoices and funded one sandbox round. CircleSats also issued a genuine 100-sat Mutinynet invoice through a receive-only connection; a real Mutinynet settlement has not been verified.
Challenges and lessons
The hard part was keeping payment evidence distinct from a user's claim to have paid. Receiver confirmation proves that an invoice was paid; member sign-in or a verified payment preimage provides stronger attribution to a member account. We also separated simulated, fake-sat sandbox, and real test-network states so that the demo never presents simulated funds as Bitcoin.
What comes next
Test a real Mutinynet settlement with an independent payer, validate the workflow with actual savings-circle members, host the full Node app with durable storage, and independently verify outgoing payouts before claiming a complete live savings cycle. French and Wolof support are future goals.
Try the public guided simulation: https://circlesats-two.vercel.app/ Source and setup: https://github.com/0xNexuz/circlesats/
Built With
- alby
- bitcoin
- gsap
- javascript
- lightning-network
- lnbits
- mutinynet
- node.js
- nostr
- nostr-wallet-connect
- vercel