RTL v0.15.14-beta is a multi-node correctness and Eclair 0.14 release: a session on one node can no longer act on, or be broken by, another node; Eclair 0.14's new audit format is read; payments and rebalances get a fee limit that is shown before sending; and several session, logout and link-handling gaps are closed. Operators running Eclair 0.14 need this release (see Compatibility). Nothing else needs a config change.
Full detail, entry by entry, in release-notes/Release-notes-0.15.14.md.
Compatibility
- Eclair 0.14 needs RTL 0.15.14. Eclair 0.14 reworked its audit database; RTL 0.15.13 and earlier fail on its Payments, Forwarding History and Reports pages. RTL now reads both the 0.13 and 0.14 formats (#1739, closes #1735). Eclair itself stops showing payments made before its upgrade.
- The block explorer URL is set in
RTL-Config.jsonorBLOCK_EXPLORER_URLonly (#1753). RTL's server fetches the explorer for fee estimates and transaction lookups, so the URL now comes from the operator's config, not from the settings UI or either settings endpoint. An explorer already saved through the UI is kept; Node Settings shows it read-only.
One session, one node
On a multi-node RTL, state that belonged to one request or one session leaked into another:
- A tab left on one node sent its requests to the node another tab switched to; such requests are now refused with a 409 that names the node and asks for a reload (#1743, fixes #1742).
- Switching to an unknown node index broke the login page for every client, and leaving a node a session was never on could unload another session's database; both are fixed, and the database unloaded is the one the session was actually on (#1748).
- Nine LND and Eclair handlers made follow-up node calls through a module-level options variable that any concurrent request could replace; each now works from a copy of its own request's options (#1750).
- One LND node's failed channel backup threw out of every other node's getinfo and overwrote that node's last good
channel-all.bakwith an empty file; a failing node is now skipped and the stored backup is left alone, with writes going through a temp file (#1745). - Every LND getinfo opened a new invoice subscription per open invoice with no limit; subscriptions are now kept per node, deduplicated and aborted past 10 minutes (#1751).
- A token that outlived its session failed with an empty 400 instead of sending the user back to login; it now answers 401 (#1746).
Fees shown before sending
- LND payments from the Send Payment dialog and from Home share a default fee limit (5% of the amount, the whole amount up to 100 sats, following
lncli), shown next to the amount; a "No Route" failure explains the limit and the cheapest route's fee (#1769). - Eclair Circular Rebalance had no fee limit at all and reported a failed or pending rebalance as successful. It now has the same Fee Limits choice, passes
maxFeeMsat, reports Failed with the reason or Unknown when the status cannot be read, and no longer crashes the server when the route lookup fails with no earlier invoice to reuse (#1773). - LND Circular Rebalance sent a fractional percentage limit such as 2.5 as that many sats; it is now a percentage of the amount, shown as "Max fee: N Sats" (#1775).
- On-chain send in all three implementations shows an amount entered in BTC or fiat as Sats with the rate used, and sends only on Confirm Send;
/api/conf/ratespasses on only finite, positive rates (#1774).
Session, logout and link handling
- Logout is a POST under the CSRF check, so another site can no longer log a user out, and a password reset refuses a non-string password that would have locked password login (#1752).
- The unused
POST /api/authenticate/tokenroute, which never answered and held each connection open for 300 s, is removed (#1772, reported by iblitzc0de). - Download CSV quotes fields per RFC 4180 and neutralises text that a spreadsheet would evaluate as a formula, such as a peer alias starting with
=(#1771, reported by iblitzc0de). - External links open with
noopener,noreferrer, enforced by a lint rule (#1765). - A confirmation dialog closed by browser navigation now counts as Cancel (#1763), and on Eclair a refused peer disconnect no longer fires on the next confirmation (#1766, fixes #1764).
- Eclair relays that are not payment relays are no longer relabelled as trampoline (#1760, fixes #1741).
Core Lightning
Closing channels show "Sweep in N blocks" while onchaind waits out the timelock, and Channel Information shows who closed the channel, the close transaction and the status history (#1734, closes #1733).
Dependencies and tooling
A batched dependency pass (#1761) resolved Dependabot PRs #1754–#1759; the one runtime fix is proxy-addr 2.0.8 under express (IP spoofing through an IPv4-mapped IPv6 address in the trust proxy check). piscina and webpack-dev-middleware are pinned to their patched versions under Angular 20 (#1740). npm audit --omit=dev is at 0; the 20 remaining findings are all dev-only build tooling under Angular's v20 builder, which only an Angular 22 migration moves.
CI now runs the full checks on an open PR once a maintainer approves the run (#1749), fails when the committed backend/ or frontend/ does not rebuild from source (#1747, #1767), and tests on Node 20, 22 and 24. The docker regtest fixture builds Eclair 0.14.2 and Bitcoin Core 31.1 from official releases (#1736), seeds deterministically and keeps peers across down/up (#1738), and defaults to the v0.15.13 image (#1762).
The backend regression suite grew from 275 to 381 tests this cycle and the frontend specs from 248 to 358.
Contributors:
@SIDHARTH20K4 @saubyk
PGP Key: https://keybase.io/suheb
Retrieve the source code repository, check for the latest release and verify the code signature
$ git clone https://github.com/Ride-The-Lightning/RTL.git
$ cd RTL
$ git checkout v0.15.14
$ git verify-tag v0.15.14
gpg: Signature made Mon Oct 19 21:15:06 2026 PDT
gpg: using RSA key 3E9BD4436C288039CA827A9200C9E2BC2E45666F
gpg: Good signature from "saubyk (added uid) <39208279+saubyk@users.noreply.github.com>" [ultimate]
gpg: aka "Suheb <39208279+saubyk@users.noreply.github.com>" [ultimate]
gpg: aka "RTL Security <security@ridethelightning.info>" [ultimate]
Install RTL via npm ci
npm ci --omit=dev --legacy-peer-deps
Docker images available at https://hub.docker.com/r/shahanafarooqui/rtl/tags