Core Lightning Post Mortem

February 12, 2026  |  Bitcoin  ·  Lightning  ·  Self-Hosting  ·  Linux  ·  BTC Map  ·  Projects

The Old Setup

I set up BTC Map’s first Lightning node in late 2022, and I picked CLN, mostly because it was ahead of the curve on BOLT‑12 adoption. Installing lightningd wasn’t easy, though. It only officially supports Ubuntu, and BTC Map’s fleet runs on Arch.

So let’s take a closer look at the CLN package.

tar --extract --file clightning-v24.08.1-Ubuntu-24.04.tar.xz --verbose

The CLN Shenanigans

What follows is a complete explosion of files. Dozens of binaries, plugins, Python scripts, documentation, and even .github folders with screenshots, shipped accidentally inside the package.

I’ve trimmed the output, but the picture is clear:

./
./usr/
./usr/bin/
./usr/bin/lightning-cli
./usr/bin/lightning-hsmtool
./usr/bin/lightningd
./usr/bin/reckless
./usr/libexec/
./usr/libexec/c-lightning/
./usr/libexec/c-lightning/lightning_channeld
./usr/libexec/c-lightning/lightning_closingd
./usr/libexec/c-lightning/lightning_connectd
./usr/libexec/c-lightning/lightning_dualopend
./usr/libexec/c-lightning/lightning_gossipd
./usr/libexec/c-lightning/lightning_hsmd
./usr/libexec/c-lightning/lightning_onchaind
./usr/libexec/c-lightning/lightning_openingd
./usr/libexec/c-lightning/lightning_websocketd
./usr/libexec/c-lightning/plugins/
./usr/libexec/c-lightning/plugins/autoclean
./usr/libexec/c-lightning/plugins/bcli
./usr/libexec/c-lightning/plugins/bookkeeper
./usr/libexec/c-lightning/plugins/chanbackup
./usr/libexec/c-lightning/plugins/cln-askrene
./usr/libexec/c-lightning/plugins/cln-grpc
./usr/libexec/c-lightning/plugins/cln-renepay
./usr/libexec/c-lightning/plugins/clnrest/
./usr/libexec/c-lightning/plugins/clnrest/.github/
./usr/libexec/c-lightning/plugins/clnrest/.github/screenshots/
./usr/libexec/c-lightning/plugins/clnrest/.github/screenshots/Postman-bkpr-plugin.png
./usr/libexec/c-lightning/plugins/clnrest/.github/screenshots/Postman-with-body.png
./usr/libexec/c-lightning/plugins/clnrest/.github/screenshots/Postman.png
./usr/libexec/c-lightning/plugins/clnrest/.github/screenshots/Swagger-auth.png
./usr/libexec/c-lightning/plugins/clnrest/.github/screenshots/Swagger-list-methods.png
./usr/libexec/c-lightning/plugins/clnrest/.github/screenshots/Swagger-rpc-method.png
./usr/libexec/c-lightning/plugins/clnrest/.github/screenshots/Swagger.png
./usr/libexec/c-lightning/plugins/clnrest/Makefile
./usr/libexec/c-lightning/plugins/clnrest/__init__.py
./usr/libexec/c-lightning/plugins/clnrest/clnrest
./usr/libexec/c-lightning/plugins/clnrest/clnrest.py
./usr/libexec/c-lightning/plugins/clnrest/poetry.lock
./usr/libexec/c-lightning/plugins/clnrest/pyproject.toml
./usr/libexec/c-lightning/plugins/clnrest/utilities/
./usr/libexec/c-lightning/plugins/clnrest/utilities/__init__.py
./usr/libexec/c-lightning/plugins/clnrest/utilities/generate_certs.py
./usr/libexec/c-lightning/plugins/clnrest/utilities/rpc_plugin.py
./usr/libexec/c-lightning/plugins/clnrest/utilities/rpc_routes.py
./usr/libexec/c-lightning/plugins/clnrest/utilities/shared.py
./usr/libexec/c-lightning/plugins/commando
./usr/libexec/c-lightning/plugins/funder
./usr/libexec/c-lightning/plugins/keysend
./usr/libexec/c-lightning/plugins/offers
./usr/libexec/c-lightning/plugins/pay
./usr/libexec/c-lightning/plugins/recklessrpc
./usr/libexec/c-lightning/plugins/recover
./usr/libexec/c-lightning/plugins/spenderp
./usr/libexec/c-lightning/plugins/sql
./usr/libexec/c-lightning/plugins/topology
./usr/libexec/c-lightning/plugins/txprepare
./usr/libexec/c-lightning/plugins/wss-proxy/
./usr/libexec/c-lightning/plugins/wss-proxy/Makefile
./usr/libexec/c-lightning/plugins/wss-proxy/poetry.lock
./usr/libexec/c-lightning/plugins/wss-proxy/pyproject.toml
./usr/libexec/c-lightning/plugins/wss-proxy/wss-proxy
./usr/libexec/c-lightning/plugins/wss-proxy/wss-proxy.py
./usr/libexec/c-lightning/plugins/wss-proxy/wss_proxy/
./usr/libexec/c-lightning/plugins/wss-proxy/wss_proxy/__init__.py
./usr/share/
./usr/share/doc/
./usr/share/doc/c-lightning/
./usr/share/doc/c-lightning/LICENSE
./usr/share/doc/c-lightning/README.md
./usr/share/man/... (OMITTED)

This is complete insanity. Usually, you just need a single binary, like bitcoind, and you’re done. But CLN takes an unorthodox approach: instead of one self-contained executable, you get dozens of moving parts glued together in weird ways.

Core Lightning is a maintenance nightmare.

The Dynamic Linking Problem

It gets worse. For reference, Bitcoin Core binaries work on virtually any Linux system because they’re statically linked. I expected the same from CLN, but no. CLN relies heavily on dynamic linking, which means it makes bold assumptions about the host environment.

My last attempt at updating CLN failed because the system had a newer version of libsodium or something like that, it adds completely unnecessary friction and a constant source of uncertainty.

Combine that with the convoluted packaging, and you get the least sane Lightning implementation I’ve ever dealt with.

LND Gets It Right

LND, on the other hand, is almost perfect. It follows the bitcoind playbook to the letter:

tar --extract --file lnd-linux-amd64-v0.20.0-beta.tar.gz --verbose
lnd-linux-amd64-v0.20.0-beta/lnd
lnd-linux-amd64-v0.20.0-beta/lncli

That’s it. Two binaries. No hacky plugins, no screenshots, no sprawling directory trees, no Python dependencies, no .github folders.

Check the dependencies:

ldd lnd
not a dynamic executable

Statically linked. Self-contained. Upgrade is a simple file swap. This is the only deployment pattern that makes sense for a decentralized network with a huge number of self-hosted nodes.

The Counterarguments

Of course, there are always Ubuntu maxis and the Docker crowd, ready to sell you their “solutions” while conveniently ignoring the baggage such as invasive abstraction layers and all the extra complexity.

What I Miss

The one thing LND still lacks is full BOLT‑12 support—and that’s the only reason I originally chose CLN. In practice, though, BOLT‑11 has stayed relevant far longer than I expected and it will keep being a reasonable default option for the years to come. BOLT‑12 development is progressing slowly but steadily, and we’ll get there eventually.

Conclusion

If you’re running a Lightning node and value your sanity, pick LND. It’s the only implementation that aims to be usable.