A modern monitoring dashboard for multiple Bitcoin/Litecoin nodes reachable via IP:PORT (typically 8333/9333).
- Continuously check node availability over TCP
- Measure connection latency
- Generate alerts on:
- Node going offline
- Node coming back online
- High latency threshold exceeded
- Store history (7-day rolling window)
- Display all nodes on a single overview screen
- Detect Bitcoin/Litecoin node version via P2P
versionhandshake - Per-node detail view:
- Availability chart for 24 hours or 7 days
- Latency chart for 24 hours or 7 days
- Clean light design with dark mode toggle
npm install
npm startThe dashboard runs at http://localhost:3000.
-
Copy the example config and edit it with your nodes:
cp config/nodes.example.json config/nodes.json
-
Edit
config/nodes.json:
[
{
"id": "btc-mainnet-1",
"name": "BTC Mainnet #1",
"host": "203.0.113.10",
"port": 8333,
"network": "bitcoin"
}
]The monitor reloads the config periodically; no restart needed after changes.
When overriding
NODES_PATHvia environment variables, ensure the file exists at that path.
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Server port |
NODES_PATH |
config/nodes.json |
Path to node configuration |
HISTORY_PATH |
data/history.json |
Path for persistent history storage |
CHECK_INTERVAL_MS |
60000 |
How often to check nodes (ms) |
CHECK_TIMEOUT_MS |
5000 |
TCP connection timeout (ms) |
HIGH_LATENCY_MS |
600 |
Threshold for high-latency alerts |
VERSION_REFRESH_MS |
1800000 |
How often to refresh node versions |
VERSION_TIMEOUT_MS |
8000 |
Version handshake timeout (ms) |
BitMon runs anywhere Node.js is supported. Choose the option that fits your setup.
Clone, install, and run:
git clone https://github.com/kulichr/BitMon.git
cd BitMon
cp config/nodes.example.json config/nodes.json
# Edit config/nodes.json with your nodes
npm install
npm startFor production, use a process manager (e.g. systemd, PM2) and a reverse proxy (e.g. nginx, Caddy).
cp config/nodes.example.json config/nodes.json
# Edit config/nodes.json with your nodes
docker build -t bitmon .
docker run -d -p 3000:3000 \
-v $(pwd)/config/nodes.json:/app/config/nodes.json \
-v $(pwd)/data:/app/data \
--name bitmon bitmonBlueprint – Push to GitHub, then in Render: New + → Blueprint → select this repo. The included render.yaml will configure build, start, and health check.
Manual – Create a Web Service with Build: npm install, Start: npm start, Health: /api/health.
On the free tier the filesystem is ephemeral. To persist history, add a Disk (e.g. mount at /var/data) and set HISTORY_PATH=/var/data/history.json.
Same idea as Render: set build to npm install, start to npm start, and configure PORT if required. Use a persistent volume for HISTORY_PATH if the platform supports it; otherwise history will reset on each deploy.
GET /api/nodes– Current status and metrics for all nodesGET /api/alerts?limit=10– Recent alerts (offline, online, high latency, version change)GET /api/nodes/:nodeId/history?range=24h|7d– History for chartsGET /api/health– Health check endpoint
config/nodes.jsonis gitignored. Do not commit it if it contains your real node IPs. Useconfig/nodes.example.jsonas a template.- If you previously committed
nodes.jsonwith real addresses, remove it from history:
git rm --cached config/nodes.json - Sensitive values (API keys, passwords, etc.) should be set via environment variables, not in code.
data/history.jsonand.envare ignored by git.
History is stored in data/history.json (ignored by git). The file is created automatically on first run.
