A lightweight, self-hosted dashboard that displays information from your Bitcoin, Litecoin, Monero, or other Bitcoin Core-compatible node.
- Clean display of essential node and network statistics
- Built-in support for Bitcoin, Litecoin, and Monero, plus any Bitcoin Core-compatible coin via custom network configs
- Filesystem-based caching to reduce RPC I/O
- Minimal and easy setup
- Fully responsive for desktop and mobile devices
- Light and dark mode with several built-in themes (Dark, Light, Nord, Solarized, Dracula), remembered across visits
- Configurable default theme, with the option to lock it and hide the switcher for fixed/branded deployments
- Tooltip explanations for every stat (hover over a stat label)
- JSON API (
?format=json) for Home Assistant, Grafana, scripts, and other tools
- Place
index.phpin a PHP-enabled web directory. - Ensure the web server has read/write access to the directory for the cache files.
- Configure your nodes with the correct RPC credentials and IP allowlist.
- Update the configuration section at the top of
index.phpto match your node's configuration. - Navigate to
index.phpin a web browser of your choice.
The dashboard can also be run as a container. Configuration is provided through environment variables, so no code changes are needed.
Prebuilt multi-arch images (linux/amd64 and linux/arm64) are published on Docker Hub and the GitHub Container Registry:
docker pull techtoshi/simple-node-dashboard
# or
docker pull ghcr.io/tech1k/simple-node-dashboard
docker run -d \
--name=simple-node-dashboard \
--restart=unless-stopped \
-p 80:80 \
-e NETWORK=XMR \
-e NODE_IP=127.0.0.1 \
-e RPC_PORT=18081 \
techtoshi/simple-node-dashboardTo build the image yourself instead:
docker build -t simple-node-dashboard .Supported environment variables (all optional; the defaults match the configuration at the top of index.php):
| Variable | Default | Description |
|---|---|---|
NETWORK |
CHANGE_ME |
Network to display: BTC, LTC, XMR, a testnet (tBTC, tLTC, tXMR, sXMR), or a custom ticker (see Custom Networks) |
NODE_IP |
CHANGE_ME |
Node IP address (usually 127.0.0.1) |
RPC_PORT |
CHANGE_ME |
RPC port. Mainnet/testnet: BTC 8332/18332, LTC 9332/19332, XMR 18081/28081 (stagenet 38081) |
RPC_USER |
CHANGE_ME |
RPC username (not usually needed for XMR) |
RPC_PASS |
CHANGE_ME |
RPC password (not usually needed for XMR) |
SHOW_NODE_INFO |
true |
Show the Node Info section |
SHOW_BLOCKCHAIN |
true |
Show the Blockchain section |
SHOW_MEMPOOL |
true |
Show the Mempool section |
SHOW_MINING |
true |
Show the Mining section |
SHOW_TRANSACTIONS |
true |
Show the Transactions section |
SHOW_FEES |
true |
Show the Transaction Feerates section |
THEME |
dark |
Default theme: dark, light, nord, solarized, or dracula |
SHOW_THEME_SWITCHER |
true |
Set false to lock the theme and hide the switcher |
REFRESH_SECONDS |
60 |
Auto-refresh interval in seconds (0 disables auto-refresh) |
ENABLE_JSON |
true |
Set false to disable the ?format=json API |
SHOW_CONNECT |
false |
Show a "Connect to this Node" box (for advertising a public node) |
CONNECT_ADDRESS |
(empty) | Public node address shown in that box, e.g. node.example.com:18089 |
CONNECT_NOTE |
(empty) | Optional note in that box (e.g. a Tor address or usage notes) |
Beyond the built-in BTC, LTC, and XMR, the dashboard works with any
Bitcoin Core-compatible coin (Bitcoin Cash, Dash, Digibyte, etc.) that speaks the standard Bitcoin JSON-RPC. There are two ways to add one.
1. Add an entry to the $networks array near the top of index.php:
'BCH' => ['name' => 'Bitcoin Cash', 'family' => 'bitcoin', 'unit' => 'BCH', 'halving_interval' => 210000, 'initial_subsidy' => 50, 'fee_unit' => 'sat/vB', 'decimals' => 8],Then set network (or the NETWORK env var) to BCH.
2. Define one via environment variables (handy for Docker). Set NETWORK to the
ticker, plus any of the CUSTOM_* overrides below:
docker run -d -p 80:80 \
-e NETWORK=BCH \
-e NODE_IP=127.0.0.1 \
-e RPC_PORT=8332 \
-e CUSTOM_NAME="Bitcoin Cash" \
-e CUSTOM_UNIT=BCH \
-e CUSTOM_HALVING_INTERVAL=210000 \
-e CUSTOM_INITIAL_SUBSIDY=50 \
-e CUSTOM_FEE_UNIT=sat/vB \
-e CUSTOM_DECIMALS=8 \
techtoshi/simple-node-dashboard| Variable | Default | Description |
|---|---|---|
CUSTOM_NAME |
the ticker | Display name (e.g. "Bitcoin Cash") |
CUSTOM_UNIT |
the ticker | Currency unit shown alongside amounts |
CUSTOM_HALVING_INTERVAL |
210000 |
Blocks between reward halvings |
CUSTOM_INITIAL_SUBSIDY |
50 |
Initial block reward |
CUSTOM_FEE_UNIT |
sat/vB |
Label for the fee-rate column |
CUSTOM_DECIMALS |
8 |
Decimal places shown for the mempool total-fee amount |
The supply, block-reward, and next-halving stats assume a Bitcoin-style halving schedule. Coins with a different emission model will show those particular figures inaccurately; block height, sync status, mempool, fees, and hashrate are unaffected.
Test networks are built in: tBTC, tLTC, tXMR, and sXMR (Monero stagenet). Set
NETWORK to one of these and point RPC_PORT at the corresponding test daemon (ports above).
Monero is handled as a special case and cannot be used as a template for custom coins.
Append ?format=json to the dashboard URL for a machine-readable snapshot of the current
stats, e.g. http://your-host/index.php?format=json. Values are raw and unformatted, which
makes them easy to consume from Home Assistant, Grafana, scripts, or anything else. It exposes
the same public node data already shown on the dashboard, nothing more.
Example Home Assistant REST sensor (configuration.yaml):
sensor:
- platform: rest
name: Bitcoin Node
resource: http://192.168.1.10/index.php?format=json
scan_interval: 60
value_template: "{{ value_json.block_height }}"
json_attributes:
- connections
- difficulty
- network_hashps
- mempool_txns
- mempool_bytes
- verification_progressThe response always includes network, coin, unit, family, and updated (Unix time).
The remaining fields depend on the coin family (e.g. block_height, connections,
difficulty, network_hashps, mempool_txns, mempool_bytes, mempool_total_fee,
total_transactions, and fee estimates). Disabled sections or failed RPC calls report null.
Monetary amounts (mempool_total_fee, Monero supply) are in whole coins; fee rates are in
native units (sat/vB for Bitcoin, piconero/kB for Monero). Very large estimates such as
network_hashps may be rendered in scientific notation, which is still valid JSON.
The endpoint serves only the same public data already shown on the dashboard. To turn it off
entirely (for example on a public host), set ENABLE_JSON=false; ?format=json then just
returns the normal dashboard page.
- Make sure to protect the dashboard if you’re displaying sensitive node info.
- Use firewall rules or other methods to restrict access, especially for public deployments.
This project is released under the MIT License. See the LICENSE file for more details.