Your Bitcoin node runs several apps: a block explorer and a mempool viewer you open in a browser, a wallet backend your wallet connects to and, if you use Lightning, a dashboard. This guide makes them easy and safe to reach from every device in your home. You will open each web app by a name such as umbrel.local instead of an IP address that can change, over HTTPS without browser warnings, and through a single entry point. Everything stays inside your home network; from outside, you come in through a VPN. To secure the rest of the machine, see our node security guide.
Two protocols do the finding. Multicast DNS (mDNS) lets a device ask the whole home network for a name, and the device with that name answers with its address. DNS-SD (DNS Service Discovery) lets your node also announce which services it offers. On Linux, Avahi provides both. macOS and Linux typically find .local names out of the box; Windows and some Android phones may need an extra step, which Step 5 covers.
Step-by-Step Guide
Steps 1 and 2 make your node findable by name, Step 3 removes the browser warnings, Step 4 puts every web app behind one entry point, Step 5 covers devices that can’t use .local names, and Step 6 limits access to your home network and your VPN.
Step 1: Install and configure Avahi for mDNS on your node. On Linux-based Bitcoin node platforms (including Raspberry Pi setups running Umbrel, RaspiBlitz, or Start9), install the Avahi daemon if it is not already present. On Debian/Ubuntu systems, run sudo apt install avahi-daemon avahi-utils. In the Avahi configuration at /etc/avahi/avahi-daemon.conf, check that publish-addresses=yes (the default). This lets your node answer for its hostname (e.g., umbrel.local) on the local network, so other devices can find it without knowing the IP address. (publish-workstation only adds a _workstation._tcp service entry; the name works without it.) Restart the daemon with sudo systemctl restart avahi-daemon.
Step 2: Configure DNS-SD service advertisements. Create service definition files in /etc/avahi/services/ for each Bitcoin service you want to advertise. For example, create bitcoin-explorer.service with XML specifying the service type (_http._tcp), port (typically 3002 for BTC RPC Explorer or 8080 for mempool), and a human-readable name. Apps that browse these announcements, such as service-browser apps, then list your services automatically. Create separate service files for your Electrum server (the port it actually listens on: commonly 50001 for plain TCP or 50002 for TLS, but node platforms differ), Lightning dashboard, and any other web interfaces. Once the reverse proxy from Step 4 is in place, point each web entry at the proxy’s port 80, set up to redirect to HTTPS (an _http._tcp entry at 443 sends plain HTTP to the encrypted port), and give it a host-name such as explorer.local so the proxy opens the right app.
Step 3: Set up proper TLS certificates for local HTTPS access. Generate a local Certificate Authority using OpenSSL or a tool like mkcert. Create a root CA certificate and install it in the trust stores of all devices that will access your node’s services. Then generate TLS certificates signed by your local CA for each service hostname (e.g., umbrel.local, explorer.local). Only the root certificate goes onto other devices: the CA’s private key stays on the computer that made it, because anyone holding it can create certificates your devices will trust. Configure your reverse proxy (Nginx or Caddy) to use these certificates. This eliminates browser security warnings while maintaining encrypted connections to your node’s web interfaces.
Step 4: Configure a reverse proxy for unified service access. Install Nginx or Caddy on your node to serve as a reverse proxy routing requests to different backend services. Map subdomains or URL paths to each service: for example, explorer.local routes to your block explorer, mempool.local to your mempool viewer, and lightning.local to your Lightning dashboard. Publish each extra name on your network the way Avahi publishes the node’s own, for example with avahi-publish -a -R explorer.local 192.168.1.50 kept running as a service. Keep each name to one word before .local: Linux devices reject longer .local names such as explorer.umbrel.local by default. The reverse proxy handles TLS termination and provides a clean, consistent access pattern for all your services through a single entry point. With each app listening only on the node itself (127.0.0.1, BTC RPC Explorer’s default), the proxy is the only way in. For an app in Docker, what counts is the address its port is published on: mempool’s official Compose file publishes its web app as 80:8080, open on every address, so change that to 127.0.0.1:8080:8080. Use Docker 28 or later; older versions still let other devices on your network reach ports bound to 127.0.0.1.
Step 5: Handle Windows and cross-platform compatibility. Windows machines on your network may not resolve .local hostnames without additional configuration. If your router lets you add local DNS names, add one for your node, such as node.home.arpa, and one for each app, such as explorer.home.arpa, all pointing to the node’s local IP address. home.arpa is set aside for home networks; keep .local out of your router’s DNS, because that ending belongs to mDNS. Add each new name to your certificate, and add each app’s new name to that app’s route in the proxy, next to its .local name: the proxy picks the app by the name you typed, so a name or bare IP it has no route for opens its default site or an error. Android’s built-in resolver has answered .local names since November 2021, on Wi-Fi but not over a VPN or mobile data; if a phone still can’t open a .local name, use the matching home.arpa one, such as explorer.home.arpa. Test access from every device type on your network to identify and resolve platform-specific issues.
Step 6: Implement access controls and firewall rules. Restrict service access to your local network only. Configure your node’s firewall (using ufw or iptables) to accept connections to service ports only from your local subnet (e.g., 192.168.1.0/24) and, if you use a VPN, from the addresses it gives your devices. Ports that Docker publishes go around these rules: bind each web app’s port to 127.0.0.1 as in Step 4, and for a port your wallet must reach directly, such as the Electrum server’s, put the subnet rule in Docker’s DOCKER-USER chain instead. If you need remote access, use a VPN like WireGuard rather than exposing services directly to the internet. Set up authentication on sensitive interfaces—particularly your Lightning node dashboard and any services that can initiate transactions. Use strong, unique passwords and consider implementing HTTP Basic Auth or OAuth2 proxy for additional protection.
Common Mistakes to Avoid
Exposing node services directly to the internet. The most dangerous mistake is making your Bitcoin node’s web interfaces accessible from outside your local network without proper security measures. Opening firewall ports for services like your block explorer, Electrum server, or Lightning dashboard exposes them to automated scanning and exploitation attempts. Attackers specifically target known Bitcoin infrastructure ports. Always use a VPN for remote access rather than forwarding your apps’ ports, and never expose your node’s RPC interface to the public internet under any circumstances.
Ignoring mDNS hostname conflicts on the local network. mDNS doesn’t let two devices share a .local hostname: the one that starts second finds the name taken and renames itself (Avahi turns umbrel into umbrel-2), so umbrel.local keeps opening the old device while the new one answers as umbrel-2.local. This commonly occurs when users run multiple node setups (e.g., a test node and a production node) or when upgrading hardware without decommissioning the old device. Each device must have a unique hostname. To check, look up the name from another computer and compare the address with your node’s IP: run avahi-resolve-host-name -4 umbrel.local on Linux or dns-sd -G v4 umbrel.local on macOS (press Ctrl-C to stop). The node that lost the name also logs “Host name conflict, retrying with umbrel-2”, which sudo journalctl -u avahi-daemon shows.
Using self-signed certificates without a proper local CA. Many node operators generate self-signed certificates for HTTPS but never install a root CA in their devices’ trust stores. This results in persistent browser security warnings that users learn to click through—a habit that makes them vulnerable to actual man-in-the-middle attacks. Take the time to set up a proper local CA and install its root certificate on all devices that access your node. Tools like mkcert simplify this process dramatically.
Neglecting to update service configurations after network changes. When your router assigns a new IP address to your node (if using DHCP) or when you change your network subnet, service discovery can break silently. Either assign a static IP to your node or configure a DHCP reservation on your router to ensure the IP remains consistent. Update any hardcoded IP references in service configurations, reverse proxy settings, and client applications whenever network topology changes.
Frequently Asked Questions
Why can’t my Windows computer find my Bitcoin node using the .local address?
Windows does not natively support mDNS resolution in the same way macOS and Linux do. While Windows 10 and later versions have added limited mDNS support, it is inconsistent and often fails for .local addresses. The most reliable solution is to add a name for each app, such as explorer.home.arpa, in your router’s DNS settings, pointing to the node’s local IP address, and add each name to that app’s route in your proxy and to your certificate; these names work across all platforms without additional software.
Is it safe to access my Bitcoin node services over HTTP instead of HTTPS on my local network?
While the risk is lower on a local network than over the internet, using unencrypted HTTP still exposes your traffic to anyone with access to your network—including compromised IoT devices, guests on your Wi-Fi, or anyone who has cracked your wireless password. Authentication credentials sent over HTTP can be captured in plaintext. For services that handle sensitive Bitcoin operations, always use HTTPS even locally. The one-time effort of setting up a local CA and TLS certificates is worth the persistent security benefit.
Can I access my node’s services from outside my home network?
Yes, but you should never do so by exposing your apps’ ports directly to the internet. The recommended approach is to set up a WireGuard or Tailscale VPN on your node, which creates an encrypted tunnel from your remote device to your home network. Once connected to the VPN, you reach your node by its VPN address or the name your VPN gives it (with Tailscale, the node’s own Tailscale IP or its MagicDNS name); .local names work only on the home network itself. Your proxy picks apps by name and has no route for that address, so give each app its own port on the proxy (say 4431 for the explorer) and add the address to your certificate. This approach maintains your node’s security posture while providing full remote access. WireGuard has minimal performance overhead and works well even on mobile connections.
Do I need a separate device for each Bitcoin service, or can they all run on one machine?
Most self-hosted Bitcoin setups run all services on a single machine—typically a Raspberry Pi 5 or a small mini-PC. Bitcoin Core, an Electrum server, a block explorer, a mempool viewer, and a Lightning node can all coexist on one device with 8 GB or more of RAM and a 2 TB SSD. Node operating systems like Umbrel, RaspiBlitz, and Start9 are specifically designed to manage multiple services on a single device, and they set up the route to each app for you, usually one port per app (on Umbrel, the mempool app opens at umbrel.local:3006).
Related Resources
- Bitcoin Node Hardware: Requirements Guide
- Bitcoin Full Node Setup: Best Practices
- Bitcoin Node Sync: Solve Technical Challenges
- Bitcoin Node Infrastructure: Security Setup
- Why Run Your Own Bitcoin Node



