Welcome to Part 7, where we finally graduate from fake test Bitcoin to using real BTC.
In the previous six parts, everything ran locally on regtest: a sandboxed Bitcoin network where blocks are instant, coins are free, and nothing has real consequences. That was perfect for building and learning.
Now we're going live.
In this article, I'll walk you through:
- Why we're using Voltage Cloud for our mainnet node
- Creating and configuring an LND node on mainnet using Voltage Cloud
- Downloading your node credentials (macaroon + TLS cert)
- Updating the service's
.envto point to your Voltage node instead of the local Docker one - Verifying the connection works end-to-end
Why Voltage Cloud?
Running your own mainnet Lightning node from scratch means syncing the entire Bitcoin blockchain (>600GB), managing your own hardware, keeping it online 24/7, and handling LND upgrades yourself. That's a lot of infrastructure overhead when what you really want to do is build.
Voltage Cloud handles all of that. You get a fully managed LND node with:
- A public REST and gRPC API endpoint your service can talk to
- TLS certificate and macaroons downloaded straight from the dashboard
- No hardware, no blockchain sync, no babysitting
For a learning project moving to mainnet, it's the right call.
⚠️ This is mainnet. Real Bitcoin, real money. Start with a small amount that you're comfortable losing while testing. This project is still in the experimental phase.
Step 1: Create a Voltage Account
Go to account.voltage.cloud and sign up.
After signing up, you'll land on the dashboard where you can create your first team and then your first node.
Step 2: Create Your LND Node
From the dashboard, click New Instance → Lightning Node.
Click on Launch a node
You'll be asked to configure:
| Setting | What to choose |
|---|---|
| Network | Mainnet |
| Node Type | Standard (covers most use cases) |
| Region | Closest to you |
| Node Name | Something unique. This becomes your API endpoint URL |
| Password | Strong password. Voltage cannot recover this for you. |
Back up your password immediately. Voltage does not have access to it. If you lose it, your node is gone.
Click Create Node and leave the browser tab open.
Voltage will provision your node through several stages, ie; wallet creation, syncing, initialising. You'll see the progress in a modal.
Wait until the status shows Running.
Step 3: Download Your Node Credentials
Once your node is running, you need two files to connect your service to it:
TLS Certificate: encrypts the connection between your service and the node
Admin Macaroon: authenticates your API calls (think of it as a session token baked with permissions)
To get your TLS certificate, go to the left sidebar and navigate to:
Manage Access → App Instructions
To download your admin.macaroon file, open the Voltage dashboard and go to:
Manage Access (left sidebar)
Download:
tls.certadmin.macaroon
Save them somewhere safe. For this project, I put mine in backend/creds/:
backend/
├── creds/
│ ├── tls.cert
│ └── admin.macaroon ← never commit this to Git
├── src/
├── docker-compose.yml
└── ...
Make sure that you add these files to your .gitignore file
Step 4: Note Your API Endpoint
Still on the node dashboard, under Home. It will look like:
your-node-name.m.voltageapp.io
The REST API runs on port 8080 and gRPC on port 10009. Our service uses REST, so the full base URL is:
https://your-node-name.m.voltageapp.io:8080
Step 5: Update Your .env
Open backend/.env. You'll be replacing the local Docker LND settings with your Voltage node details.
Before (regtest/local):
LND_HOST=localhost
LND_PORT=8080
LND_MACAROON_PATH=./docker/lnd/data/chain/bitcoin/regtest/admin.macaroon
LND_TLS_CERT_PATH=./docker/lnd/tls.cert
BITCOIN_NETWORK=regtest
After (mainnet/Voltage):
LND_HOST=your-node-name.m.voltageapp.io
LND_PORT=8080
LND_MACAROON_PATH=./creds/admin.macaroon
LND_TLS_CERT_PATH=./creds/tls.cert
BITCOIN_NETWORK=mainnet
Also update your Bitcoin Core connection if you're running a separate mainnet Bitcoin node or swap to a public mempool API for fee estimation depending on your setup.
Step 6: Verify the Connection
Start your backend:
cd backend && npm run dev
Then hit the Lightning info endpoint:
curl http://localhost:3000/api/v1/lightning/info
A successful response will show your Voltage node's public key, alias, and crucially "network": "mainnet":
{
"data": {
"alias": "your-node-name",
"identity_pubkey": "03abc...",
"network": "mainnet",
"synced_to_chain": true,
"block_height": 895210
}
}
If you see synced_to_chain: false, give it a few minutes. Voltage nodes sync quickly but may not be instant right after creation.
What's Different on Mainnet
A few things behave differently now compared to regtest:
You can't mine blocks on demand. Transactions wait for real confirmations. The CPFP broadcast endpoint now submits to the live Bitcoin mempool.
Invoices are real. When the service generates a Lightning invoice, it can be paid by any mainnet Lightning wallet like Muun, Phoenix, Zeus, anything. No more self-payments not allowed errors because you only have one node.
Fees are real. The fee estimation your service returns reflects actual current mempool conditions, not a synthetic regtest environment.
The lnbc... invoice string you copy from the UI is a real payable invoice.
What We've Built Across This Series
It's worth taking a moment to look back at how far this has come:
- Parts 1–2: Understanding what anchor outputs are and why Lightning needs them
- Part 3: Setting up the backend, Bitcoin RPC, and Docker environment
- Part 4: Integrating LND for invoice creation and payment verification
- Part 5: Building the CPFP transaction constructor and broadcast endpoint
- Part 6: Walking through the React frontend end-to-end on regtest
- Part 7 (this article): Moving the whole thing to mainnet with a real hosted LND node
The full source code is on GitHub and the deployed frontend is live at ln-anchor-outputs.netlify.app.
Thanks for following along. If you've been building with me from Part 1, you now have a working Lightning-powered fee bumping service running on the real Bitcoin network.
That's not nothing.








Top comments (0)