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.
Zero dependencies, hand-rolled (no ethers/web3 bloat), about 6 KB. It's a single static file — 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.
<peer-pay recipient="0x…" amount="3" theme="light">
Click the button…
<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 |
chains | all | base,polygon,mantle,avalanche |
theme | light | light · dark · minimal · rounded |
label | Tip $N TOKEN | Button text |
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.
});