Case study · in daily use since September 2026

VibeCoders Paradise

Lightning Node Dashboard

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.

11
sections, from balances to payments
≈ 1,300
lines of code, backend and page
0
npm dependencies
5
macaroons, one per feature scope
Dashboard header with node status, balance tiles and a force-closing channel with fee bump button

All screenshots on this page show randomized demo data. Aliases, keys, amounts and hashes are invented.

How far it has come

Every section is collapsible, refreshes every 30 seconds, and keeps whatever you were typing across the refresh.

01 · Channels

Every channel on one line

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.

  • Fee policy edit: base fee and ppm per channel
  • Uptime from LND's lifetime counters
  • Unannounced channels tagged with confirmation count
Open channels table with balance bars, fee columns, uptime and close buttons
02 · Force closes

The part that used to hurt

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.

  • Mempool.space package rate, confirmed or stuck
  • Pending opens get a funding CPFP the same way
  • Every bump is written to an audit log
Force closing channel row with limbo balance, mempool package rate and bump button
03 · Routing

What the node earns

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.

  • Pulls the full forwarding log through LND's paged API
  • Closed channels stay in the table, tagged
Routing section with forwards, sats routed and fees earned tiles plus two daily bar charts
04 · Actions

Peers and channels without the CLI

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.

  • Peer list with ping, inbound tag and onion addresses shortened
  • Force close only offered when the peer is offline
Peers table and the sticky open-channel card with amount and fee chips
05 · Payments

Receive and send, with a warm green sign when it worked

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.

  • Liquidity tiles: what can be sent and received right now
  • Multi-path payments, 60-second route search, plain-words failure reasons
Receive card with a paid invoice and send card with a delivered payment
06 · History

Thousands of payments, 21 at a time

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.

  • Shows 21 rows, then 21 more or all
  • Filters remembered per browser
Payment history with direction, minimum and period filters

Watch, act, pay

Three groups of features, each behind its own narrowly scoped credential. Grey items are on the list, not built.

Watch

  • Node status, sync, block height, peer and channel counts
  • On-chain, local, remote, limbo and total balances
  • Open channels with uptime, fees and balance bars
  • Pending opens, waiting and cooperative closes, force closes
  • Pending sweeps and recently closed channels
  • Routing stats, charts and per-channel table

Act

  • Fee bump for stuck force closes and pending opens
  • Per-channel fee policy: base fee and ppm
  • Connect, reconnect and disconnect peers
  • Open channels with cost preview and caps
  • Cooperative close, force close when the peer is offline
  • Audit log for every write action

Pay

  • Invoices with QR, memo, expiry and paid detection
  • Pay bolt11 with decoded preview and fee limit
  • Liquidity tiles: can send, can receive, largest single
  • History with direction, minimum and period filters
  • On-chain send and receive
  • Keysend and LNURL

Small on purpose

No framework, no package manager, nothing to update on a Saturday night. The whole thing is readable in an evening.

One Node file, built-ins only

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.

A macaroon per feature

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.

readonlybumppolicychannelspayments

Caps and cooldowns on the server

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.

open ≤ 2.1 M satsbump ≤ 50 sat/vBpay ≤ 210 k sats

Login, not tokens

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.

Eight weeks, 46 commits

Built for one node, used every day, extended whenever the node needed something. Honest list of what is done and what is not.

Channel overview

Balances, open and closing channels, uptime, sweeps, mempool status per transaction.

Routing and fee bump

Forwarding history with charts; CPFP bump for stuck force closes and pending opens.

Fee policy editing

Base fee and ppm per channel, first real edit accepted by the network.

Login, peers, channel open and close

Password login replaces per-action tokens; peer management and the open-channel card.

Payments

Receive with QR and paid detection, send with decoded preview, history with filters and period frames. Verified with real sats both ways.

On-chain send and receive

Deliberately left out of the first payments release.

First real fee bump and channel open

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.

Want one for your node?

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.