Postman-style JSON-RPC playground for testing blockchain RPC endpoints. It is 100% client-side and talks directly to the providers you choose.
👉 Live playground: https://krainode.krissemmy.com/playground 👉 Docs page (local): http://localhost:3000/docs
- Multi-chain: curated endpoints across public/test networks
- Provider choice: use bundled endpoints or your own URL
- Probe first: connectivity check before firing a request
- JSON viewer/editor with pretty responses and error states
- Local persistence: recent requests + selections stay in-browser
- Zero backend: build once, host anywhere static
git clone https://github.com/krissemmy/krainode-rpc-proxy.git
cd krainode-rpc-proxy/web
npm install
npm run dev # Vite on http://localhost:3000What happens under the hood:
chains.yamlin the repo root is transformed intoweb/public/chains.jsonbypredev/prebuild(no manual step needed).- The order you keep in
chains.yamlis preserved; the first provider for a network becomes the default.
To preview a production build locally:
npm run build
npm run preview- Dev (hot reload on :8000):
make docker-dev - Stop dev stack:
make docker-down - Prod stack (Caddy + static app):
cp env.example .env && make docker-upEMAILandAPP_HOSTdrive Caddy TLS; seeenv.example.- Logs:
make docker-logs
- Build:
cd web && npm install && npm run build(outputs toweb/dist) - Host the
distfolder on any static host.
Vercel (monorepo):
- Project root:
web - Build command:
npm install && npm run build - Output directory:
dist - SPA fallback: keep the provided
vercel.jsonrewrite.
Netlify:
- Base directory:
web - Build command:
npm install && npm run build - Publish directory:
dist
- Chains/providers: edit
chains.yaml; restart dev or rebuild to regenerateweb/public/chains.json. - Analytics (optional): set in
web/.env.localVITE_PUBLIC_POSTHOG_KEY= VITE_PUBLIC_POSTHOG_HOST=
krainode-rpc-proxy/
├── chains.yaml # Source of truth for networks/providers
├── web/ # Vite + React frontend
│ ├── src/ # Components, pages, lib, data
│ ├── public/ # Static assets + generated chains.json
│ ├── scripts/ # build-chains-json.mjs
│ └── package.json # App scripts/deps
├── Dockerfile # Multi-stage build -> static bundle
├── docker-compose*.yml # Dev/prod stacks (Caddy for TLS)
└── Makefile # Helpful commands
make devStart Vite dev server (local)make buildBuild production bundlemake cleanRemoveweb/distandweb/node_modulesmake docker-devDockerized dev server on :8000make docker-upProd stack (Caddy + app)make docker-logsTail container logs
- arbitrum (one, nova, sepolia)
- avail (mainnet, testnet-turing)
- avalanche-c-chain (mainnet, fuji)
- base (mainnet, sepolia)
- berachain (mainnet, bepolia)
- blast (mainnet, sepolia)
- celo (mainnet, sepolia)
- ethereum (mainnet, sepolia, hoodi)
- gnosis (mainnet, chiado)
- hyperevm (mainnet, testnet)
- linea (mainnet, sepolia)
- mantle (mainnet, sepolia)
- monad (mainnet, testnet)
- optimism (mainnet, sepolia)
- plasma (mainnet, testnet)
- sei-evm (mainnet, testnet)
- scroll (mainnet, sepolia)
- tempo (testnet)
- unichain (mainnet, sepolia)
- CORS/network errors: try another provider or your own endpoint.
- Chains not updating: ensure you restarted after editing
chains.yaml(the pre-scripts regeneratechains.jsonon dev/build). - Docker dev port in use: adjust
docker-compose-dev.ymlport mapping if 8000 is occupied.
- Fork and branch
npm run dev(ormake dev) to iterate- Keep chains/providers in
chains.yaml - Open a PR when ready
MIT License - see LICENSE.