One tag, a few lines. No backend, no payment processor, no middleman that can freeze your funds or shut you down.
<peer-pay> is a single Web Component that lets visitors send you
stablecoins (USDC/USDT) across several chains, straight from their wallet to yours.
It's the whole integration — no SDK, no API keys, no server to run.
No Stripe, no PayPal, no processor between you and your money — nobody who can freeze funds, take a cut, or de-platform you. Payments go peer to peer, wallet to wallet.
It's a static script. Reference our hosted bundle or self-host it. Nothing to deploy, nothing to secure, nothing that can go down.
One self-contained file, ~30 KB, with no runtime dependencies (no ethers/web3 bloat). Host it yourself and you depend on no one, not even us.
Plain HTML, React, a no-code site builder — it's a standard custom element. A non-technical person (or their AI) can wire it up by changing one address.
This demo runs against a fake wallet: click the button, approve nothing, spend nothing. You'll see the exact transaction PeerPay would send on-chain.
Click the button…
Want to restyle it and grab the snippet? Head to the Playground.
<script src="https://peerpay.publicwerx.org/peerpay.js"></script>
One hosted bundle, no build step. Prefer to self-host? Drop the same file on your own server — it's a single static script with zero dependencies.
<peer-pay recipient="0xYourWallet" amount="5" theme="dark"></peer-pay>
That's the whole integration. Change 0xYourWallet to the address you want paid.
| Attribute | Default | Notes |
|---|---|---|
recipient | required | Wallet that receives the payment |
amount | 1 | Whole dollars (stablecoins are 6-decimal) |
token | USDC | USDC or USDT — or USDC,USDT to let the payer choose |
chains | all | mantle,base,arbitrum,optimism,polygon,avalanche (first = default) |
theme | light | light · dark · minimal · rounded |
label | Tip $N TOKEN | Button text |
qr | on | qr="off" hides the "pay with a phone" QR (mobile / no-extension) |
peer-pay {
--peerpay-accent: #e91e63;
--peerpay-radius: 14px;
--peerpay-font: 'Poppins', sans-serif;
}
Six CSS variables (--peerpay-accent · -bg · -text · -radius · -font · -width) plus
::part(button) for full control. They pierce the shadow DOM, so they just work.
document.querySelector('peer-pay')
.addEventListener('paid', (e) => {
// e.detail = { txHash, chain, token, amountUnits, explorer }
// Honor-system only. Re-verify server-side before unlocking value.
});
When a visitor has no wallet browser extension, PeerPay automatically shows a QR code
(an EIP-681 payment
URI) that they scan with any wallet app — no WalletConnect, no SDK, no relay server. A
“📱 Pay with a phone” toggle also reveals it on desktop. Hide it entirely with
qr="off".
One caveat to know: a QR / phone payment happens inside the wallet app, so it does not
fire the paid event — the page can't observe it. That's fine for tips and donations; if you
need confirmation, re-verify the transfer on-chain. You can try a real one in the
Playground (“Test it for real”).