Run your private blockchain explorer with BTC RPC Explorer. Trust your node, not some external services.

After the MiniBolt runs your own fully validated node, and even acts as a backend for your hardware wallet with Fulcrum, the last important puzzle piece to improve privacy and financial sovereignty is your own Blockchain Explorer. It lets you query transactions, addresses, and blocks of your choice. You no longer need to leak information by querying a third-party blockchain explorer that can be used to get your location and cluster addresses.
BTC RPC Explorer provides a lightweight and easy-to-use web interface to accomplish just that. It's a database-free, self-hosted Bitcoin blockchain explorer, querying Bitcoin Core and Fulcrum via RPC.
admin, check if you have already installed Nodenode -v
Example of expected output:
v18.16.0
npm -v
Example of expected output:
9.5.1
{% hint style="info" %}
-> If the "node -v" output is >=18, you can move to the next section.
-> If Nodejs is not installed (-bash: /usr/bin/node: No such file or directory), follow this Node + NPM bonus guide to install it
sudo apt update && sudo apt full-upgrade
enter or directly enter when the prompt asks yousudo apt install build-essential
In the security section, we set up Nginx as a reverse proxy. Now we can add the BTC RPC Explorer configuration.
Enable the Nginx reverse proxy to route external encrypted HTTPS traffic internally to the BTC RPC Explorer. The error_page 497 directive instructs browsers that send HTTP requests to resend them over HTTPS.
admin, create the reverse proxy configurationsudo nano /etc/nginx/sites-available/btcrpcexplorer-reverse-proxy.conf
server {
listen 4000 ssl;
error_page 497 =301 https://$host:$server_port$request_uri;
location / {
proxy_pass http://127.0.0.1:3002;
}
}
sites-enabledsudo ln -s /etc/nginx/sites-available/btcrpcexplorer-reverse-proxy.conf /etc/nginx/sites-enabled/
sudo nginx -t
Expected output:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx
sudo ufw allow 4000/tcp comment 'allow BTC RPC Explorer SSL from anywhere'
For improved security, we will create a new user btcrpcexplorer that will run the block explorer. Using a dedicated user limits potential damage in case there's a security vulnerability in the code. An attacker could not do much within this user's permission settings. We will install BTC RPC Explorer in the home directory since it doesn't need too much space.
btcrpcexplorer user and groupsudo adduser --disabled-password --gecos "" btcrpcexplorer
btcrpcexplorer user to the "bitcoin" group, allowing the btcrpcexplorer user reads the bitcoind .cookie filesudo adduser btcrpcexplorer bitcoin
btcrpcexplorer usersudo su - btcrpcexplorer
curl https://github.com/janoside.gpg | gpg --import
Example of expected output:
gpg: directory '/home/btcrpcexplorer/.gnupg' created
gpg: keybox '/home/btcrpcexplorer/.gnupg/pubring.kbx' created
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 9837 100 9837 0 0 21640 0 --:--:-- --:--:-- --:--:-- 21619
gpg: /home/btcrpcexplorer/.gnupg/trustdb.gpg: trustdb created
gpg: key B326ACF51F317B69: public key "Dan Janosik <dan@47.io>" imported
gpg: key 846311D3D259BFF1: public key "Dan Janosik <dan@47.io>" imported
gpg: key 70C0B166321C0AF8: public key "Dan Janosik <dan@47.io>" imported
gpg: Total number processed: 3
gpg: imported: 3
btc-rpc-explorer foldergit clone https://github.com/janoside/btc-rpc-explorer.git && cd btc-rpc-explorer
git verify-commit $(git rev-parse HEAD)
Example of expected output:
gpg: Signature made Mon 28 Jul 2025 05:01:59 PM UTC
gpg: using RSA key F579929B39B119CC7B0BB71FB326ACF51F317B69
gpg: Good signature from "Dan Janosik <dan@47.io>" [unknown]
gpg: aka "keybase.io/danjanosik <danjanosik@keybase.io>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: F579 929B 39B1 19CC 7B0B B71F B326 ACF5 1F31 7B69
npm install
{% hint style="info" %}
Installation can take some time; be patient. There might be a lot of confusing output, but if you see something similar to the following, the installation was successful
{% hint style="warning" %}
Not to run the npm audit fix command, which could break the original code!!
Example of expected output:
Installed to /home/btcrpcexplorer/btc-rpc-explorer/node_modules/node-sass/vendor/linux-amd64-83/binding.node
added 480 packages from 307 contributors and audited 482 packages in 570.14s
43 packages are looking for funding
run `npm fund` for details
found 12 vulnerabilities (8 moderate, 4 high)
run `npm audit fix` to fix them, or `npm audit` for details
head -n 3 /home/btcrpcexplorer/btc-rpc-explorer/package.json | grep version
Example of expected output:
"version": "3.4.0",
cp .env-sample .env
.env file.nano .env
{% hint style="info" %}
Activate any setting by removing the # at the beginning of the line or by editing directly
# Uncomment & replace the value of this line
BTCEXP_BITCOIND_COOKIE=/data/bitcoin/.cookie
# Uncomment & replace the value of these lines
BTCEXP_ADDRESS_API=electrum
BTCEXP_ELECTRUM_SERVERS=tcp://127.0.0.1:50001
BTCEXP_SLOW_DEVICE_MODE=false
{% hint style="info" %}
You can set additional features of Privacy / Security and customize the Theme at this moment by going to the Extra section
btcrpcexplorer user session to return to the admin user sessionexit
Now we'll ensure our blockchain explorer starts as a service on the PC so that it's always running.
admin, create the service filesudo nano /etc/systemd/system/btcrpcexplorer.service
# MiniBolt: systemd unit for BTC RPC Explorer
# /etc/systemd/system/btcrpcexplorer.service
[Unit]
Description=BTC RPC Explorer
Requires=bitcoind.service fulcrum.service
After=bitcoind.service fulcrum.service
[Service]
WorkingDirectory=/home/btcrpcexplorer/btc-rpc-explorer
ExecStart=/usr/bin/npm start
User=btcrpcexplorer
Group=btcrpcexplorer
# Hardening Measures
####################
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
PrivateDevices=true
[Install]
WantedBy=multi-user.target
sudo systemctl enable btcrpcexplorer
Ctrl-Cjournalctl -fu btcrpcexplorer
To keep an eye on the software movements, start your SSH program (eg, PuTTY) a second time, connect to the MiniBolt node, and log in as "admin"
sudo systemctl start btcrpcexplorer
journalctl -fu btcrpcexplorer ⬇️Jul 18 11:08:29 minibolt systemd[1]: Started BTC RPC Explorer.
Jul 18 11:08:30 minibolt npm[140449]: > btc-rpc-explorer@3.4.0 start
Jul 18 11:08:30 minibolt npm[140449]: > node ./bin/www
Jul 18 11:08:30 minibolt npm[140461]: 2023-07-18T11:08:30.765Z btcexp:app Searching for config files...
Jul 18 11:08:30 minibolt npm[140461]: 2023-07-18T11:08:30.767Z btcexp:app Config file not found at /home/btcrpcexplorer/.config/btc-rpc-explorer.env, continuing...
Jul 18 11:08:30 minibolt npm[140461]: 2023-07-18T11:08:30.767Z btcexp:app Config file not found at /etc/btc-rpc-explorer/.env, continuing...
Jul 18 11:08:30 minibolt npm[140461]: 2023-07-18T11:08:30.767Z btcexp:app Config file found at /home/btcrpcexplorer/btc-rpc-explorer/.env, loading...
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.086Z btcexp:app Default cacheId '3.4.0'
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.122Z btcexp:app Enabling view caching (performance will be improved but template edits will not be reflected)
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.133Z btcexp:app Session config: {"secret":"*****","resave":false,"saveUninitialized":true,"cookie":{"secure":false}}
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.142Z btcexp:app Environment(development) - Node: v18.16.1, Platform: linux, Versions: {"node":"18.16.1","acorn":"8.8.2","ada":"1.0.4","ares":"1.19.1","brotli":"1.0.9","cldr":"42.0","icu":"72.1","llhttp":"6.0.11","modules":"108","napi":"8","nghttp2":"1.52.0","nghttp3":"0.7.0","ngtcp2":"0.8.1","openssl":"3.0.9+quic","simdutf":"3.2.2","tz":"2022g","undici":"5.21.0","unicode":"15.0","uv":"1.44.2","uvwasi":"0.0.15","v8":"10.2.154.26-node.26","zlib":"1.2.13"}
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.193Z btcexp:app Using sourcecode metadata as cacheId: '2023-06-14-bfc9f97715'
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.193Z btcexp:app Starting BTC RPC Explorer, v3.4.0 (commit: 'bfc9f97715', date: 2023-06-14) at http://127.0.0.1:3002/
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.194Z btcexp:app RPC Credentials: {
Jul 18 11:08:33 minibolt npm[140461]: "host": "127.0.0.1",
Jul 18 11:08:33 minibolt npm[140461]: "port": "8332",
Jul 18 11:08:33 minibolt npm[140461]: "authType": "cookie",
Jul 18 11:08:33 minibolt npm[140461]: "username": "__cookie__",
Jul 18 11:08:33 minibolt npm[140461]: "password": "*****",
Jul 18 11:08:33 minibolt npm[140461]: "authCookieFilepath": "/data/bitcoin/.cookie",
Jul 18 11:08:33 minibolt npm[140461]: "timeout": 5000
Jul 18 11:08:33 minibolt npm[140461]: }
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.194Z btcexp:app Connecting to RPC node at [127.0.0.1]:8332
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.195Z btcexp:app RPC Connection properties: {
Jul 18 11:08:33 minibolt npm[140461]: "host": "127.0.0.1",
Jul 18 11:08:33 minibolt npm[140461]: "port": "8332",
Jul 18 11:08:33 minibolt npm[140461]: "username": "__cookie__",
Jul 18 11:08:33 minibolt npm[140461]: "password": "*****",
Jul 18 11:08:33 minibolt npm[140461]: "timeout": 5000
Jul 18 11:08:33 minibolt npm[140461]: }
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.196Z btcexp:app RPC authentication is cookie based; watching for changes to the auth cookie file...
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.198Z btcexp:app Verifying RPC connection...
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.201Z btcexp:app Loading mining pools config
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.365Z btcexp:app RPC Connected: version=250000 subversion=/Satoshi:25.0.0/, parsedVersion(used for RPC versioning)=25.0.0, protocolversion=70016, chain=main, services=[NETWORK, BLOOM, WITNESS, COMPACT_FILTERS, NETWORK_LIMITED]
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.365Z btcexp:app Loading historical data for chain=main
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.365Z btcexp:app Loading holiday data
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.370Z btcexp:app txindex check: trying getindexinfo
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.371Z btcexp:app ATH difficulty: 53911173001054.59
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.376Z btcexp:app txindex check: getindexinfo={"txindex":{"synced":true,"best_block_height":799232},"coinstatsindex":{"synced":true,"best_block_height":799232},"basic block filter index":{"synced":true,"best_block_height":799232}}
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.377Z btcexp:app txindex check: available!
Jul 18 11:08:33 minibolt npm[140461]: 2023-07-18T11:08:33.426Z btcexp:app Refreshed utxo summary: {"height":799232,"bestblock":"00000000000000000000882023825176273fb8ae3ba10ab5e7bccb3f1d7e7a49","txouts":110323290,"bogosize":8350852748,"muhash":"a4a8e5dd85de604fe5c05ef0018b4eec06f5cf475ed565fd7334828759f365b5","total_amount":19432486.84621219,"total_unspendable_amount":219.40378781,"block_info":{"prevout_spent":4444.44336697,"coinbase":6.32505263,"new_outputs_ex_coinbase":4444.36831434,"unspendable":0,"unspendables":{"genesis_block":0,"bip30":0,"scripts":0,"unclaimed_rewards":0}},"usingCoinStatsIndex":true,"lastUpdated":1689678513425}
Jul 18 11:08:35 minibolt npm[140461]: 2023-07-18T11:08:35.135Z btcexp:app Network volume: {"d1":{"amt":"947555.33623057","blocks":159,"startBlock":799232,"endBlock":799074,"startTime":1689678236,"endTime":1689592319}}
3002 port and the HTTPS 4000 portsudo ss -tulpn | grep -E '(:4000|:3002)'
Expected output:
tcp LISTEN 0 511 0.0.0.0:4000 0.0.0.0:* users:(("nginx",pid=992796,fd=6),("nginx",pid=992795,fd=6),("nginx",pid=992794,fd=6),("nginx",pid=992793,fd=6),("nginx",pid=992792,fd=6))
tcp LISTEN 0 511 127.0.0.1:3002 0.0.0.0:* users:(("node",pid=1241652,fd=26))
Now point your browser to the secure access point provided by the NGINX web proxy, for example,
"https://minibolt.local:4000"(or your node IP address) like"https://192.168.x.xxx:4000". You should see the home page of BTC RPC Explorer
Your browser will display a warning because we use a self-signed SSL certificate. We can do nothing about that because we would need a proper domain name (e.g. https://yournode.com) to get an official certificate that browsers recognize. Click on "Advanced" and proceed to the Block Explorer web interface
If you see a lot of errors on the MiniBolt command line, then Bitcoin Core might still be indexing the blockchain. You need to wait until reindexing is done before using the BTC RPC Explorer
{% hint style="success" %}
Congrats! Now you have a Blockchain Explorer: BTC RPC Explorer running to check the Bitcoin network information directly from your node
You can decide whether you want to optimize for more information or more privacy.
admin user, edit the .env configuration filesudo nano /home/btcrpcexplorer/btc-rpc-explorer/.env
# Uncomment these lines
BTCEXP_PRIVACY_MODE=true
BTCEXP_NO_RATES=true
# Replace these lines
BTCEXP_PRIVACY_MODE=false
BTCEXP_NO_RATES=false
You can add password protection to the web interface. Simply add your password [D] for the following option, for which the browser will then prompt you. You can enter any user name; only the password is checked
admin user, edit the .env configuration filesudo nano /home/btcrpcexplorer/btc-rpc-explorer/.env
# Replace with YourPassword [D] in this line
BTCEXP_BASIC_AUTH_PASSWORD=YourPassword [D]
Decide whether you prefer a light or dark theme by default
admin user, edit the .env configuration filesudo nano /home/btcrpcexplorer/btc-rpc-explorer/.env
BTCEXP_UI_THEME=dark
Extend the timeout period and enable slow device mode due to the limited resources
admin user, edit the .env configuration filesudo nano /home/btcrpcexplorer/btc-rpc-explorer/.env
BTCEXP_BITCOIND_RPC_TIMEOUT=10000
#BTCEXP_SLOW_DEVICE_MODE=false
You may want to share your BTC RPC Explorer onion address with confident people and limited Bitcoin Core RPC access requests (sensitive data requests will be kept disabled, don't trust, verify. Enabling DEMO mode, you will not have to provide a password, and RPC requests will be allowed (discarding rpcBlacklist commands)
admin user, edit the .env configuration filesudo nano /home/btcrpcexplorer/btc-rpc-explorer/.env
BTCEXP_DEMO=true
{% hint style="warning" %}
You will need to set password authentication following the Security section; if not, a banner shows you this:
RPC Terminal / Browser require authentication. Set an authentication password via the 'BTCEXP_BASIC_AUTH_PASSWORD' environment variable (see .env-sample file for more info).
-> Remember to give them the password [D] if you added password protection in the reference step
{% hint style="info" %}
With DEMO mode enabled, the user will see the next message:
"Sorry, that RPC command is blacklisted. If this is your server, you may allow this command by removing it from the 'rpcBlacklist' setting in config.js."
Do you want to access your personal blockchain explorer remotely? You can easily do so by adding a Tor hidden service on the MiniBolt and accessing the BTC RPC Explorer with the Tor browser from any device.
admin , edit the torrc filesudo nano +63 /etc/tor/torrc --linenumbers
## This section is just for location-hidden services ##" in the torrc file. Save and exit# Hidden Service BTC RPC Explorer
HiddenServiceDir /var/lib/tor/hidden_service_btcrpcexplorer/
HiddenServiceEnableIntroDoSDefense 1
HiddenServicePoWDefensesEnabled 1
HiddenServicePort 80 127.0.0.1:3002
sudo systemctl reload tor
sudo cat /var/lib/tor/hidden_service_btcrpcexplorer/hostname
Example of expected output:
abcdefg..............xyz.onion
You may want to expose your BTC RPC Explorer publicly using a clearnet address. To do this, follow the next steps:

Select the CNAME type
Type the selected subdomain (i.e service name "explorer") as the Name field
Type the tunnel
<UUID>of your previously obtained in the Create a tunnel and give it a name section as the Target field
Ensure you enable the switch on the
Proxy statusfield to be "Proxied"
Click on the [Save] button to save the new DNS registry
config.ymlsudo nano /home/admin/.cloudflared/config.yml
config.yml# BTC RPC Explorer
- hostname: <subdomain>.<domain.com>
service: http://localhost:3002
You can choose the subdomain you want; the above information is an example, but keep in mind to use the port
3002and always maintaining the "- service: http_status:404" line at the end of the file
sudo systemctl restart cloudflared
{% hint style="info" %}
Try to access the newly created public access to the service by going to the https://<subdomain>.<domain.com>, i.e, https://explorer.domain.com
admin user, stop the servicesudo systemctl stop btcrpcexplorer
btcrpcexplorer usersudo su - btcrpcexplorer
btc-rpc-explorer foldercd btc-rpc-explorer
git fetch origin
git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
git clean -fd
npm install
head -n 3 /home/btcrpcexplorer/btc-rpc-explorer/package.json | grep version
Example of expected output:
"version": "3.4.0",
admin userexit
sudo systemctl start btcrpcexplorer
admin , stop btcrpcexplorersudo systemctl stop btcrpcexplorer
sudo systemctl disable btcrpcexplorer
sudo rm /etc/systemd/system/btcrpcexplorer.service
btcrpcexplorer user. Do not worry about the userdel: btcrpcexplorer mail spool (/var/mail/btcrpcexplorer) not foundsudo userdel -rf btcrpcexplorer
admin and delete or comment on the following lines in the "location hidden services" section, below "## This section is just for location-hidden services ##" in the torrc file. Save and exitsudo nano +63 /etc/tor/torrc --linenumbers
# Hidden Service BTC RPC Explorer
#HiddenServiceDir /var/lib/tor/hidden_service_btcrpcexplorer/
#HiddenServiceEnableIntroDoSDefense 1
#HiddenServicePoWDefensesEnabled 1
#HiddenServicePort 80 127.0.0.1:3002
sudo systemctl reload tor
admin, delete the reverse proxy config filesudo rm /etc/nginx/sites-available/btcrpcexplorer-reverse-proxy.conf
sudo rm /etc/nginx/sites-enabled/btcrpcexplorer-reverse-proxy.conf
sudo nginx -t
Expected output:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx
sudo ufw status numbered
Expected output:
[Y] 4000 ALLOW IN Anywhere # allow BTC RPC Explorer SSL from anywhere
yes"sudo ufw delete X
| Port | Protocol | Use |
|---|---|---|
| 3002 | TCP | Default HTTP port |
| 4000 | SSL | HTTPS port (encrypted) |