SolidPay

Money is trust.
SolidPay makes it routable.

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.

A payment, routed through trust
Aalice Bbob Ccarol
Bob trusts alice for 1,000. Carol trusts bob for 500. So alice can pay carol 300 through bob — using only credit already granted. Nobody mid-path approves anything; that's the whole trick.
solidpay.org · an idea from 2018, an engine from 2026 · grown out of the JSS plugin experiment and trustline.v1

How it works

Three verbs, one graph

Fugger's 2004 insight: trust relationships between people are the payment network. SolidPay keeps the model exactly that small.

+Extend trust

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.

Pay through it

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.

Settle outside

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

What 2004 didn't have

Every user is a URI

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.

A ledger that proves itself

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.

Signatures, not sessions

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.

A network of nodes

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

A testnet in one file, one dependency

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
  1. Create an account

    Open the app, pick a name — you are now …/u/you#me, a URI that dereferences.

  2. Extend trust

    Give a friend a credit limit in any currency — USD, SATS, HRS, anything [A-Z0-9].

  3. Pay through the graph

    Type a name and an amount; the route previews live before you commit, then settles atomically.

Roadmap

Testnet first, then the hard parts