Skip to content

FAQ

Does RPC Plane add latency?

Sub-millisecond overhead. Health scores are pre-computed by background tasks and stored in a shared atomic snapshot. The router reads the snapshot and makes an O(N) sort — no I/O in the hot path.

Can I use a single provider?

Yes. With one provider you still get health monitoring, slot drift detection, circuit breaker, auto-retry on transient errors, and Prometheus metrics.

What happens if all providers are down?

When all circuits are open, the proxy routes to all providers anyway — it tries them all rather than returning an immediate error. Degraded behaviour is better than refusing to attempt.

Can I send JSON-RPC batches?

Yes — a JSON-RPC batch array is forwarded to a single provider and its batch response is returned unchanged. A batch is routed as one unit and treated as a read, so a sendTransaction bundled into a batch is not broadcast and gets no write-path failover. Submit transactions as individual (non-batched) requests so they take the write path.

Does it support WebSocket?

Not yet. The proxy handles HTTP JSON-RPC only. WebSocket support is planned.

Does it work with devnet or testnet?

Yes. Use devnet or testnet provider URLs in your config. Running against multiple networks requires separate proxy instances (each with its own config and port).

Can I run it in Docker?

Yes:

docker run \
  -v $(pwd)/rpc-plane.toml:/etc/rpc-plane.toml \
  -p 9400:9400 \
  -p 9401:9401 \
  ghcr.io/rpcplane/rpc-plane

Set server.listen = "0.0.0.0:9400" in your config when running in Docker so the port is reachable from the host.

How do I reload the config without restarting?

Edit rpc-plane.toml. Changes apply within 2 seconds — no restart needed.

Only the server socket and runtime settings — listen, metrics_listen, listen_backlog, and worker_threads — require a restart.

Is it production-safe?

Yes. Panics are caught at the request handler level so one bad request or provider response cannot crash the proxy.

Its health and routing state is bounded — the error rate uses a fixed sliding window and slot state is a fixed set of per-commitment slot heights per provider — so control-plane memory does not grow with uptime or request volume. The data plane is separate: it buffers each in-flight response body in full before returning it, so peak memory tracks concurrency × response size (working set, not a leak). Size your memory limits for your busiest response mix — large getBlock/getProgramAccounts responses under high concurrency are the ones to watch.

Does it phone home?

No. By default the free binary makes zero outbound connections beyond the provider URLs you configure. Two features add outbound traffic, and both are off by default and require you to opt in explicitly: the optional [reporting] block (telemetry to an endpoint you set) and [health] reference_url (an external slot checkpoint that is probed but never routed to). Leave them unset — the default — and nothing leaves the box except calls to your own providers.

What is the license?

The binary is Elastic License 2.0 (ELv2) — source-available. You can use, modify, and self-host it. You cannot offer it as a managed/hosted service to third parties.