Pay3 L1 is in active development — a single-node testnet prototype runs today, see Run It Yourself.
Pay3Pay3Docs
Testnet

Deploying

Two separate deployments: l1_node needs to run continuously, so it goes on Railway or Fly.io. testnet-dashboard is a normal Next.js frontend, so it goes on Vercel — pointed at the node's public URL.

Deploy order matters

Deploy the node first. The dashboard needs the node's live URL before it's useful, so doing it in the other order just means redoing a step.

Part 1 — Deploying the node

Either host works the same way once live: a public HTTPS URL the dashboard and wallet.js point at.

Option A — Railway (no card required to start)

Railway's free trial (~$5 of usage credit, ~30 days) doesn't ask for a card at signup. It auto-detects the Dockerfile already in l1_node/.

bash
npm i -g @railway/cli
railway login

# generate a stable faucet key (do this once)
cd l1_node
openssl rand -hex 32

railway init
railway up
railway variable set FAUCET_PRIVATE_KEY=0x<paste_the_hex_above>
railway domain   # prints your node's public URL

Verify it's live:

bash
curl https://<your-railway-url>/health
# → {"status":"ok"}

Prefer clicking through a UI? Push l1_node/ to GitHub, then in Railway: New Project → Deploy from GitHub repo → set env vars under VariablesSettings → Networking → Generate Domain.

The $5 trial credit runs a small service like this for a while, but not forever — once it's used up, Railway asks for a card to continue (Hobby tier is $5/mo).

Option B — Fly.io (requires a card)

bash
curl -L https://fly.io/install.sh | sh
flyctl auth login

cd l1_node
openssl rand -hex 32   # stable faucet key, once

flyctl launch --no-deploy   # reuse the existing fly.toml when asked
flyctl secrets set FAUCET_PRIVATE_KEY=0x<paste_the_hex_above>
flyctl deploy
bash
curl https://<your-app-name>.fly.dev/health
# → {"status":"ok"}

To get the faucet's address (not just its private key), run the node locally once with that same key and copy the printed address:

bash
FAUCET_PRIVATE_KEY=0x<your_key> cargo run
# copy the "faucet address" line, then Ctrl+C
Redeploys wipe the chain, on either host. State lives entirely in RAM — every deploy, and any crash/restart, resets the chain to genesis. The faucet address stays the same (it's tied to the env var/secret), but its balance resets to 1,000,000 and every transaction since genesis is gone. See Current Limitations.

Part 2 — Deploying the dashboard

testnet-dashboard is a Next.js + Tailwind app: check balances, view history, send transactions (signed client-side — the key never leaves the browser), and generate new wallets. One page, four tabs — Balance, History, Send, New Wallet — all backed by a single environment variable.

VariablePurposeExample
NEXT_PUBLIC_RPC_URLThe node's RPC base URLhttps://pay3-l1-testnet.fly.dev
bash
npm install -g vercel
cd testnet-dashboard
vercel env add NEXT_PUBLIC_RPC_URL
# paste your node's URL from Part 1 — no trailing slash
# select Production, Preview, and Development

vercel --prod

Vercel prints a URL like https://testnet-dashboard-xyz.vercel.app. Open it, go to the Balance tab, and paste in the faucet address from Part 1 — it should show 1000000.

Prefer GitHub over the CLI? Push both folders to a repo, then in Vercel: Add New → Project → Import, set Root Directory to testnet-dashboard, and add NEXT_PUBLIC_RPC_URL under Settings → Environment Variables before deploying. Every push to main auto-deploys after that.

Sanity check once both are live

bash
cd l1_node/client
RPC_URL=https://<your-node-url> node wallet.js balance <faucet_address>

Should match what the Vercel dashboard shows.