Open-source, self-hosted payment gateway
The payment gatewayyou deploy and own.
Run it on your own servers. Connect payment providers and stablecoins as peer rails on one double-entry ledger, onboard your merchants, and turn on a Chainlink CRE workflow when you want anyone to check that the gateway holds what it owes.




- Self-hostedYour servers, your keys, your database.
- One ledgerEvery rail posts the same double-entry lines.
- MIT licensedRead it, run it, change it.
Why this exists
Stablecoins became a rail.
Open gateways did not follow.
Merchants who want stablecoins next to cards choose between closed, custodial processors and open-source tools that cover one rail. And a merchant who lets a gateway hold money has to trust its balance sheet.
- ~$390B
genuine stablecoin payments in the 12 months to September 2025
Source: a16z State of Crypto 2025 - $226B
of it business to business, up 733% year on year
Source: a16z State of Crypto 2025 - 32.6%
of weekly adjusted stablecoin transfer volume ran on Solana in April 2026
Source: bex.co - 2
crypto connectors in Hyperswitch, the open-source orchestrator at scale; one shut on 2026-03-31
Source: Hyperswitch docs
How a payment flows
One payment,
every line
accounted for.
- 01Payer pays on any rail
Card, UPI or a stablecoin on Solana: each rail is a connector behind the same switch.
- 02The switch routes it
An intent and an attempt, an idempotency key, and an exclusive claim so a capture is never sent twice.
- 03Ledger lines post
The payment lands as balanced double-entry lines. Balances are derived from lines, never stored.
- 04The fee posts
From a versioned fee rule, never edited in place. The payment records the rule version it paid.
- 05Settlement
Settlement is lines too, so the journal still balances and history is append-only.
- Dr Clearing · SolanaPayment100.00
- Cr Merchant balance100.00
- Dr Merchant balanceFee · rule v3, 1%1.00
- Cr Fee revenue1.00
- Dr Merchant balanceSettlement99.00
- Cr Clearing · Solana99.00
Chainlink CRE · optional
Proof the gateway
can pay what it owes.
Proof of Reserve shows what is held, not what is owed. A CRE workflow compares the ledger's liabilities with reserves on chain, writes a signed report through Chainlink's forwarder, and the gateway re-verifies it from its own RPC before showing it.
Figures are from the local end-to-end run (Anvil chain, Chainlink's Keystone mock forwarder).
- Reserve addresses come from the workflow's configuration, never from the gateway.
- A figure that does not match what the gateway served is stored as a mismatch, never shown as attested.
- Simulated reports are labelled as simulated and refused in live.
- Off by default. With CRE off, the gateway behaves exactly as it does without the module.
Stablecoins on Solana
USDC and USDT,
booked like any rail.
Each payment gets its own deposit account. The credit is the observed balance change, never the instruction amount. Wrong tokens are recorded as anomalies, never credited. Sweeps to your hot wallet survive crashes, lagging nodes and racing workers.
The deposit
Confirmed means seen. Finalized means credited.
- A null answer from a lagging node never moves the cursor.
- A deposit is dropped only when two distinct endpoints agree.
- Live refuses to boot with fewer than two RPC providers.
The sweep
A state machine that can be rebuilt from the database and the chain alone.
- Every signature is saved with its blockhash before it is sent.
- One sweep in flight per token account, enforced by a unique lock row.
- Every transition is a compare-and-set, so a stale worker changes nothing.
- Deposits become swept only when a finalized attempt is booked.
Full rules and tests ship with the Solana track write-up. RPC is treated as evidence: a deposit is credited only when two distinct providers agree.
The product
Real screens,
not renders.
A payment link with its checkout preview built by the server, so the fee shown is the fee charged, and the hosted checkout a payer sees once a USDC payment is final. Development previews with sample data.


What you get
The parts a gateway
gets wrong first.
- 01
One ledger for every rail
Card and stablecoin payments land as the same double-entry lines. Balances are derived, never stored, and the application role cannot rewrite history.
- 02
Fees you can audit
Versioned fee rules, never edited in place. Every payment records the rule version it paid.
- 03
A payment switch
Intents and attempts, idempotency keys, exclusive claims so a capture is never sent twice, and a reconciler that resolves unknown outcomes from the provider.
- 04
Payment links
A six-step builder with a checkout preview built by the server, unguessable short links and QR codes.
- 05
Live and test isolation
One environment per process. Live refuses to boot with development keys, mock providers, test databases or testnets.
- 06
RPC as evidence
Live needs two distinct RPC providers per chain. A deposit is dropped only when both agree.
Status
What is built,
what is not yet.
Every merged module went through independent review rounds; the findings and fixes are in the commit history.
Built and in main
- Double-entry ledger and versioned fee rules
- Live and test isolation
- Payment switch
- Payment links and the six-step builder
- Hosted checkout
- USDC and USDT on Solana
- Chainlink CRE contract, module and solvency workflow
- Design system and merchant dashboard
On branches, not merged
- Custody providers: self-custody fence, BitGo next
- Kuberpays (card) and Payvang (UPI) connectors
- Routing across rails
- Payment links on the switch with every method
- NOWNodes RPC preset
- One-command compose and CI
Self-host
Your servers.
Your ledger.
Install each Node workspace once, then run each service in its own terminal. The backend target loads backend/.env.
$ git clone <your-payminto-remote> payminto $ cd payminto $ make backend # API on :8090 $ make frontend # dashboard on :3003 $ make checkout # hosted checkout on :3002 $ make smoke-local
Tests, the CRE simulation and the full repository map are in the repository README.
Hackathon tracks
One product,
four tracks.
Chainlink
A CRE workflow attests what the ledger owes against reserves on chain, and the gateway re-verifies every report from its own RPC.
Solana
USDC and USDT accepted as separate assets on one ledger, with sweeps that survive crashes and racing workers.
NOWNodes
RPC treated as evidence: two distinct providers for every money decision.
AWS
Runs inside the merchant's own account, with isolated keys per environment.
Business model
Open core.
Paid operations.
- Core
Self-hosted
Payment core, dashboard, API and MCP server, plus community connectors. The merchant runs it on their own infrastructure.
- Licence
Enterprise
Managed operations and monitoring, audit reporting and compliance support, priority connectors and an SLA.
- Services
Connectors
New acquirer and chain connectors, written from the provider's API docs and paid per integration.
Proposed model. Pricing to be validated with pilot merchants.