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/.
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 URLVerify it's live:
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 Variables → Settings → Networking → Generate Domain.
Option B — Fly.io (requires a card)
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 deploycurl 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:
FAUCET_PRIVATE_KEY=0x<your_key> cargo run
# copy the "faucet address" line, then Ctrl+CPart 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.
| Variable | Purpose | Example |
|---|---|---|
NEXT_PUBLIC_RPC_URL | The node's RPC base URL | https://pay3-l1-testnet.fly.dev |
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 --prodVercel 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
cd l1_node/client
RPC_URL=https://<your-node-url> node wallet.js balance <faucet_address>Should match what the Vercel dashboard shows.
Pay3