Live Bitcoin explorer — Elixir, Phoenix LiveView, and Bitcoinex.
Explore blocks, transactions, and addresses from live chain data. Paste an address, txid, block hash or height, BOLT11 invoice, or PSBT for structured output via River Financial’s Bitcoinex. URLs are deep-linked and shareable.
Chain explorer
- Home — Recent blocks, mempool stats and fee targets, optional fee heatmap and recent mempool rows, Lightning capacity graph (public mempool API); search accepts txid, block hash, height, address, invoice, or PSBT.
- Block — Header metadata, paginated txs, script-type chart (Bitcoinex-classified outputs), optional header dissect panel.
- Transaction — Fees, confirmations, size/weight, D3 flow diagram, inputs/outputs with enrichment (network, type, witness program, payloads).
- Address — Balance and history from the indexer; QR hook; Bitcoinex decode summary.
- Height shortcut —
/btcexp/block/height/<n>redirects to the canonical block URL.
Default chain backend is an Esplora-compatible HTTP API (ESPLORA_BASE_URL). Set DATA_SOURCE=rpc to use Bitcoin Core JSON-RPC plus Fulcrum for indexing — no third-party indexer required. Details: README in the repo.
Local decode (no chain lookup)
Bitcoin addresses
SegWit (bc1…, tb1…, bcrt1…) and legacy Base58 — network, script type, witness program or payload hex.
Lightning invoices
BOLT11 — amount, destination, description, expiry, timestamp, payment hash.
PSBT
Base64 PSBT — input/output counts, BIP32 hints where present; unsigned PSBTs have no valid txid until finalized.
How it works
One LiveView module (ExplorerLive) uses handle_params for URL-driven views; search uses push_patch for shareable routes. Local decode is a debounced form — Bitcoinex in-process (Segwit, Base58, LightningNetwork.Invoice, PSBT), not a separate decode service.
Chain calls go through a pluggable DataSource (Esplora via Tesla, or Core RPC + Fulcrum) chosen at deploy time. Bandit serves HTTP; Tailwind and esbuild assets; D3 and qrcode are LiveView hooks. Production runs under /btcexp/ behind nginx with WebSockets on the same prefix.