How it works

How paying inside a world works, step by step. One character, one game, one payment: 21 sats for one more round, and a 5-sat prize back.

What your world does, what the pocket does, and what crosses between them. One example, seven stops: connect, allowance, pay, settled result, and the way out.

The pocket opens in rounds. Early access: hello@satrium.org.

A · the flat screenEvery session starts flat, even in a headset: the pocket's own page, the PIN, and the button that enters the world. The PIN is only ever typed here.
B · immersive mode, VR or ARThen the world is around you, VR or AR. Paying happens here, on the panel, where you are already looking. A world like The Atrium is waiting in there.

Two states, one link: the flat page, then the immersive session. You never take the headset off.

Get a pocket.

Add the SDK.

You open wallet.satrium.org in any browser, even the one inside your headset, choose a PIN and write down your recovery words. No account, no app store.

Add the SDK and a Connect button to your 2D entry screen. Entering VR stays optional: the same button works on a flat screen.

<button id="connect">Connect</button>

// the shape of the SDK — a preview, not yet published

wallet.satrium.org

An empty pocket, ready to be yours.

DEMO · no real payment

Put pocket money in.

Open the pocket.

Tap Receive. Pay the invoice from any Lightning wallet (the mint turns it into nuts), or paste ecash from any ecash wallet.

connect() opens the embedded pocket frame. The pocket runs at its own origin; your scene never holds a key, a balance or a PIN.

connectBtn.onclick = () =>
  pocket.connect();   // the pocket frame

// the shape of the SDK — a preview, not yet published

wallet.satrium.org

Empty pocket. Nothing to show yet.

DEMO · no real payment

Go anywhere.

Still just a URL.

A WebXR world is a website: open the link, press Enter VR or AR, you are in. Nothing asks about money until you decide to spend.

Your world is a URL and a session. Nothing about money runs until your scene asks, so a visitor who never spends never meets the bridge. The SDK adds no wallet code to your bundle; the pocket is never in your scene.

a-world.example

Target Rangea WebXR game

DEMO · no real payment

Give a world an allowance.

The allowance is the origin's.

The first time you want to pay somewhere, the world's Connect button opens your pocket's own page. You type your PIN there and say how much this world may spend: 500 sats. The world's address is printed on it. The world never learns your balance.

The user sets the allowance in the pocket's own UI, against the origin that asked. You never pass an amount. You can see what's left; you can't change it, raise it or spend past it. Today it lasts for the session; keeping it between visits is built and being verified.

a-world.example

Target Range wants to be able to ask you for sats.

DEMO · no real payment

Pay without leaving.

Ask, and wait.

Out of shots; one more round is 21 sats. The panel appears where you are already looking. You approve. It settles when the rail answers, the check lands, 479 left, you are back in the round.

requestPay({ paymentRequest, amountSats }) renders the panel: a 2D overlay, or the in-scene component the SDK ships. It resolves with a settled result, or a plain no: the player said no · more than they allowed · not connected yet · not enough in the pocket · the rail didn't answer. Grant the round after the result, not before.

const r = await pocket.requestPay({
  paymentRequest: invoice, amountSats: 21 });
if (r.settled) game.grantRound();

// the shape of the SDK — a preview, not yet published

DEMO · no real payment

Same everywhere.

Build for every device.

The same world on your phone in AR, or on a laptop: same link, same panel. And when you win, the world can pay you: an offer appears in the session, you accept, +5 lands in your pocket. No app switching, no invoice pasting.

One link, built for every device-and-reality combo. Your job is the fun part: make the world feel right on each of them: hands in the headset, a tilt on the phone, a click on the laptop. requestPay() is the same call on all of them; the panel adapts, not your code.

headset · immersive VR · the panel floats in the world

DEMO · no real payment

Take it out.

Get paid. Zero custody.

Pocket money goes back to your main wallet whenever you like. Your pocket is not a trap. Press Send and either paste a Lightning invoice from any Lightning wallet (the mint pays it, your nuts are spent) or export it as ecash and paste it into any other ecash wallet.

Your world has no Satrium pocket and never will. Each payment lands in your own wallet, as a Lightning payment or as ecash. Satrium holds nothing, so there is nothing of yours to take out.

More: Can I take sats out? on the Questions page.

wallet.satrium.org · Send

Coins pay the invoice; nuts leave as ecash. Either goes anywhere.

DEMO · no real payment

the world asks you approve the rail answers done 21 sats · one round on the panel, 500 left a real result 479 left, back in the origin line the world's side the pocket's side
World SDK pocket frame rail coins: your keys sign the invoice nuts: the mint swaps the ecash requestPay({ … }) request the user approves on the panel pay the invoice, or spend the nut settled settled + ref, or a typed error the origin line

What crosses the origin line

CROSSES

  • amount
  • origin
  • verdict
  • allowance left

NEVER CROSSES

  • PIN
  • keys
  • balance
  • recovery words
  • history

The pocket

  • Worlds can pay you back — accepted in-sceneCOOKING
  • Allowances per world — set in your pocketLIVE
  • Allowances kept between visits, until you reset themBUILT · VERIFYING