Bitcoin observatory — kernel signals and chain facts in one dashboard.
Watch your Bitcoin Core node through two lenses: live JSON-RPC semantics (height, peers, mempool, recent blocks) and optional eBPF tracing of bitcoind syscalls and file I/O. Built with Elixir, Phoenix LiveView, and a Rust Aya loader.
Dashboard
- Overview — Chain height, peer counts, mempool size and min fee, fee-rate histogram from the latest block.
- Recent blocks — Rolling history with fees and transaction counts.
- Peers — Address, version, ping, bytes sent/receive, inbound/outbound.
- Mempool — Transaction count, size, and a short history sparkline.
- Kernel I/O (bitcoind) — When eBPF is enabled: syscall counts, path-prefix buckets, read/write latency histograms, and recent file paths (requires tracefs permissions for the loader).
The app is served under /node-probe/ on this host (reverse proxy to Phoenix). This page is only the landing copy — use Open node-probe for the live UI.
Operations
JSON-RPC
Polls getblockchaininfo, getpeerinfo, getmempoolinfo, and getblock (verbosity 2) on a timer — same facts you would query with bitcoin-cli.
eBPF loader
Optional Rust process attaches to bitcoind’s PID for syscall and VFS latency probes; events aggregate into in-memory metrics so the UI stays responsive.
Lite mode
CPU sampler and heavy taps can be disabled on small hardware; the RPC dashboard still runs.
How it works
RpcCollector publishes chain, peer, mempool, and block snapshots on an internal pub/sub channel; Aggregator forwards them to LiveView subscribers. EbpfCollector reads NDJSON from the loader and records counters/histograms in ETS so high-frequency kernel events do not flood the LiveView mailbox. Production here uses nginx with WebSockets on the /node-probe/ prefix.