GoblinPay
Free & open source · Receive only

Get paid in Grin.

GoblinPay is a self-hosted, receive-only payment server for Grin. Your shop shows a code, the customer scans it, and confidential digital cash lands in your wallet. No processor, no custodian, no checkout scripts.

One Rust binary · zero-JS checkout · WooCommerce ready · SQLite inside

A till, not a bank

GoblinPay does one thing: it takes Grin payments in. It cannot do anything else, and that is the point.

It only receives. GoblinPay completes the receiver half of a standard Grin transaction and nothing more: it never spends, never forwards, never freezes. Funds land in a wallet whose keys stay on your machine.

Payments travel sealed. A payment arrives as an encrypted Nostr gift-wrap, riding Tor to hide your server's IP. No checkout page leaks amounts to the wire, and no third party sits between you and the payer.

Every payment is provable. Each confirmed payment is backed by a Grin payment proof and a receiver-signed receipt anchored to the chain. When someone asks whether a payment really happened, you show them, not tell them.

How you pay

Three steps, one scan. The wallet does the rest.

  1. Scan or tap

    The shop shows a GoblinPay code at checkout. Scan it with the Goblin wallet, or tap it on your phone and Goblin opens with the payment ready.

  2. Approve

    Your wallet sends the payment as a sealed gift-wrap over Nostr. GoblinPay answers in seconds, your wallet finalizes, and the transaction posts to the Grin chain.

  3. Done

    The shop watches the chain, sees the payment confirm, and marks the order paid. You keep the payment proof: your receipt, signed by the receiver.

No Goblin? GoblinPay speaks standard Grin. Any Grin wallet can settle at the counter by exchanging slatepacks, so the whole Grin ecosystem can pay, not just Goblin.

Pay with GoblinPay

The GoblinPay button. Wherever a shop shows a familiar tap-to-pay button, a GoblinPay badge means the same thing: tap it, your wallet opens, you pay. It is live at checkout today.

Plug it into your store

GoblinPay runs as a single Rust binary, with SQLite inside and secrets delivered as files that never leave your box. The checkout page is server-rendered with zero JavaScript, so it works in any browser, including hardened ones.

Point your store at it, and orders flip to paid when the Grin chain says so.

Grab it from the repository and run it as a single binary. It is open source and self-hosted.

Get GoblinPay

WooCommerce plugin

A drop-in payment gateway for WordPress. Checkout button, embedded or hosted pay page, and HMAC-signed webhooks that mark the order paid on confirmation.

REST API + webhooks

Create an invoice, get a pay link and QR, then poll the status or receive a signed webhook when the payment confirms on-chain. A few endpoints, everything else optional.

Payment proofs

Every confirmed payment stores a Grin payment proof you can export: amount, kernel, and receiver signature. Auditable income without exposing your books.

Up and running in three steps

One Rust binary, SQLite inside. Install it, answer a few questions, paste three values into your shop. Nothing else to run.

1

Install GoblinPay

One package on your server. It brings its own database, so there is nothing else to set up.

curl -sSL get.goblin.st/pay | sh
2

Answer a few questions

The setup wizard has you choose your wallet password and write down your seed, generates the service tokens, makes your till wallet, and wires everything together. You never edit a config file.

sudo gp-server setup
3

Paste into your shop

The wizard hands you three values. Paste them into the GoblinPay panel in WooCommerce, switch it on, and your orders settle in Grin.

GoblinPay URL · API Token · Webhook Secret

The wizard is grin-wallet-faithful about the two things that are yours: you choose your wallet password (entered twice and confirmed to match, never auto-generated), and it shows your 24-word seed once for you to write down and acknowledge before continuing (or you paste your existing recovery phrase). After that the seed lives only encrypted at rest, and the password never sits in the service's environment. Then it asks how the till should restart: unattended (default) seals your password to the host so the service comes back on its own after a reboot, or manual keeps nothing on disk and has you re-enter the password at each start — maximum protection against disk or machine theft. Put it behind your reverse proxy, or set GP_TLS=rustls and let it terminate TLS itself.

Run the till hot but light: it has its own seed, so keep only a small working balance on it and sweep to your own wallet regularly. Grin receives are interactive, so the till holds live keys by design; a small float and frequent sweeps keep what is exposed small.

Prefer to configure by hand, or build from source? See the docs for the full env-var reference and the manual setup path.

Made for the whole Grin ecosystem

The smoothest way to pay is Goblin, a private wallet for Grin: scan, approve, done. But GoblinPay is standard Grin underneath, so any wallet that speaks slatepack can pay a GoblinPay counter.

goblin.st