A self-hosted control room for an LND node: channels and uptime, stuck force-closes with a one-click fee bump, routing income, peer and channel actions, and sending and receiving payments. One HTML file, one zero-dependency Node backend, running on the LAN behind a login.

All screenshots on this page show randomized demo data. Aliases, keys, amounts and hashes are invented.
Every section is collapsible, refreshes every 30 seconds, and keeps whatever you were typing across the refresh.
Capacity, local and remote balance bar, both fee policies, uptime percentage, age and update count. Our fee is editable in place; a close button opens a cooperative or force close with its own confirmation step.

A force-closing channel shows its limbo balance, blocks to maturity and the live mempool status of the closing transaction. If the package fee rate sits below the next block, a bump button builds a CPFP child on the anchor output, with caps for budget and rate and a confirm step.

Forwarding history over 7 days to one year, bucketed by day, week or month: forwards, sats routed, fees earned, average ppm. Two bar charts and a per-channel table with in and out volume, fees and how the local balance shifted.

Connect to a peer by address, keep the connection, reconnect a stuck one. Open a channel from a sticky card: pick a connected peer, amount chips, fee chips from the current mempool, a cost summary and a confirm. Caps on size and fee rate live on the server, not in the browser.

Create an invoice with amount, memo and expiry, get the QR and the bolt11 string, and watch it flip to Paid the moment it settles. Paste an invoice to pay: payee, amount and memo are decoded before you confirm, a fee limit is set, and a success card shows fee, hops and the preimage.

Received and sent, merged and newest first. Filter by direction, minimum amount, and period: this week, this month, any earlier frame, or a custom date range. Frames are fetched from LND by creation date, so a month with thousands of micro payments still loads.

Three groups of features, each behind its own narrowly scoped credential. Grey items are on the list, not built.
No framework, no package manager, nothing to update on a Saturday night. The whole thing is readable in an evening.
The backend talks to LND's REST API over TLS and serves one page. It uses http, https, fs, crypto and path from Node itself. The page is streamed per request, so most changes need no restart.
Reading uses a read-only macaroon. Fee bumps, fee policy, channel actions and payments each have their own, baked with exactly the LND methods they need and nothing else. No macaroon on the box can move on-chain funds.
Every write has a ceiling that lives in the environment, not the browser: sats per channel open, sat/vB for bumps and closes, sats and fee per payment. Cooldowns per target, a lockout after wrong passwords, and a JSON-lines audit log for each action.
The dashboard sits behind one password with an HttpOnly cookie, optional 30-day session, and the API answers 401 without it. It is LAN-only by design. StartOS fronts LND's REST with its own certificate chain, so the backend trusts that root instead of LND's own cert.
Built for one node, used every day, extended whenever the node needed something. Honest list of what is done and what is not.
Balances, open and closing channels, uptime, sweeps, mempool status per transaction.
Forwarding history with charts; CPFP bump for stuck force closes and pending opens.
Base fee and ppm per channel, first real edit accepted by the network.
Password login replaces per-action tokens; peer management and the open-channel card.
Receive with QR and paid detection, send with decoded preview, history with filters and period frames. Verified with real sats both ways.
Deliberately left out of the first payments release.
The code paths are verified against LND, but no stuck close has shown up since they were built. They get watched closely the first time.
The same approach works for any LND node you can reach over REST: a small, readable dashboard with exactly the actions you want, each behind its own scoped credential. Tell me what your node needs.