The original Ripple — Ryan Fugger, 2004 — rebuilt with Solid ideas. Extend credit to people you trust; pay anyone your network can reach. Every user is a URI, every transition is hash-chained, and signatures come from keys you hold. No blockchain. No token. No bank in the middle.
How it works
Fugger's 2004 insight: trust relationships between people are the payment network. SolidPay keeps the model exactly that small.
A trustline is one-way credit: "you may owe me up to 500 USD." Only the creditor creates, resizes, or removes it — it's their risk, nobody else's signature required.
Payments route hop-by-hop through unused credit. Every hop rides a grant its next node already made, so intermediaries need no per-payment consent. Owed-to-you credit spends with no line at all — paying back clears debt first.
IOUs clear out-of-band — cash, sats, a favour returned. The creditor records repayment, and only a claim you hold can shrink. Books are one signed number per pair: they cannot desync.
The Solid ideas
Your identity is an address, not a row in someone's database: a WebID, a
did:nostr, or this node's own /u/name#me — which dereferences to a real
profile document. One agent, one canonical spelling, globally linkable.
Every transition is hash-chained — seq, prev, SHA-256 over the
RFC 8785-canonical entry. Anyone can re-derive the whole chain from
/api/log; the UI shows the verification badge live.
Live: every transition is a schnorr-signed nostr event — sign with any
nostr key (extension or xlogin), POST /api/tx, done. The node verifies, never
attributes: authorship is provable by anyone replaying the log. The server is a coordinator,
not an authority — verify, don't trust.
Two nodes live. Cross-node payments flow through did:nostr gateway agents — signatures are the only coordination — and both nodes' audited tips are anchored to Bitcoin testnet4 on a Blocktrails trail. Atomic routes (hold/commit) are the next protocol level.
Run a node
The whole node — engine, API, product UI — is plain Node.js. Clone it, run it, open the app, and start a trust network with your friends. Testnet: play money, real protocol.
# get a node running git clone https://github.com/JavaScriptSolidServer/solidpay cd solidpay node server.js solidpay node listening on port 3480 # behind a reverse proxy (the solidpay.<domain> convention) PUBLIC_URL=https://solidpay.yourdomain TRUST_PROXY=1 HOST=127.0.0.1 node server.js
Open the app, pick a name — you are now
…/u/you#me, a URI that dereferences.
Give a friend a credit limit in any currency — USD, SATS, HRS,
anything [A-Z0-9].
Type a name and an amount; the route previews live before you commit, then settles atomically.
Roadmap
Trustlines, routed payments, settle, hash-chained ledger, product UI, URIs for users, nostr sign-in. Live nodes: solidpay.melvin.me · solidpay.melvincarvalho.com · solidpay.nostr.social — the solidpay. subdomain convention.
Shipped: schnorr-signed transitions as nostr events (kinds 8801–8804) — the ledger is verify-don't-trust, and spec §9 is normative. Remaining in v1: per-agent privacy views, WebID agents, custody export.
Two live nodes; cross-node payments through did:nostr gateways — demonstrated on the open internet (spec §13). Next: atomic routes (hold/commit).
Both nodes' audited tips anchored to Bitcoin testnet4 on a
Blocktrails federation trail —
chained P2TR marks, served at /api/anchors.