skills/eclair/SKILL.md
Run and interact with eclair Lightning Network daemon in Docker. Use for Lightning development, testing payment channels on regtest, managing eclair containers, and calling eclair API endpoints (getinfo, connect, open/close channels, pay/receive).
npx skillsauth add roasbeef/claude-files eclairInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Eclair is a Scala implementation of the Lightning Network. This skill helps you run eclair in Docker for development and testing, primarily on regtest.
Start the full regtest stack (Bitcoin Core + Eclair):
cd ~/.claude/skills/eclair/templates
docker-compose up -d --build # First time: builds eclair from source (~5-10 min)
docker-compose up -d # Subsequent runs: uses cached image
This starts:
bitcoind: Bitcoin Core 30 in regtest mode with ZMQeclair: Eclair 0.14.0-SNAPSHOT (built from local source)Notes:
/Users/roasbeef/codez/eclair because Docker Hub images have a "kill switch" for older versionslightninglabs/bitcoin-core:30Check status:
docker exec eclair eclair-cli -p devpassword getinfo
~/.claude/skills/eclair/scripts/docker-build.sh [--source /path/to/eclair]
Or pull pre-built image:
docker pull acinq/eclair:latest
Using docker-compose (recommended for regtest):
cd ~/.claude/skills/eclair/templates
docker-compose up -d
Using a custom image (e.g., from PR build):
cd ~/.claude/skills/eclair/templates
ECLAIR_IMAGE=eclair:pr-3144 docker-compose up -d
Single eclair container (requires external bitcoind):
~/.claude/skills/eclair/scripts/docker-start.sh --network regtest
cd ~/.claude/skills/eclair/templates
docker-compose down
# To also remove volumes:
docker-compose down -v
docker logs -f eclair
docker logs -f bitcoind
docker exec eclair eclair-cli -p devpassword <command>
docker exec bitcoind bitcoin-cli -regtest <command>
All commands use the eclair REST API. Default password in regtest: devpassword
# Get node info (nodeId, alias, blockHeight, etc.)
docker exec eclair eclair-cli -p devpassword getinfo
# List connected peers
docker exec eclair eclair-cli -p devpassword peers
# Connect by URI
docker exec eclair eclair-cli -p devpassword connect --uri=<nodeId>@<host>:<port>
# Connect by nodeId (requires DNS or known address)
docker exec eclair eclair-cli -p devpassword connect --nodeId=<nodeId>
# Disconnect
docker exec eclair eclair-cli -p devpassword disconnect --nodeId=<nodeId>
# Open channel (amount in satoshis)
docker exec eclair eclair-cli -p devpassword open \
--nodeId=<pubkey> \
--fundingSatoshis=1000000
# List all channels
docker exec eclair eclair-cli -p devpassword channels
# List channels (short format)
docker exec eclair eclair-cli -p devpassword -s channels
# Get specific channel
docker exec eclair eclair-cli -p devpassword channel --channelId=<id>
# Get channel balances
docker exec eclair eclair-cli -p devpassword channelbalances
# Close channel gracefully
docker exec eclair eclair-cli -p devpassword close --channelId=<id>
# Force close channel
docker exec eclair eclair-cli -p devpassword forceclose --channelId=<id>
# Create invoice (amount in millisatoshis)
docker exec eclair eclair-cli -p devpassword createinvoice \
--description="test payment" \
--amountMsat=100000000
# Parse invoice to see details
docker exec eclair eclair-cli -p devpassword parseinvoice --invoice=<bolt11>
# Pay invoice
docker exec eclair eclair-cli -p devpassword payinvoice --invoice=<bolt11>
# Check sent payment status
docker exec eclair eclair-cli -p devpassword getsentinfo --paymentHash=<hash>
# Check received payment status
docker exec eclair eclair-cli -p devpassword getreceivedinfo --paymentHash=<hash>
# Get new address
docker exec eclair eclair-cli -p devpassword getnewaddress
# Get on-chain balance
docker exec eclair eclair-cli -p devpassword onchainbalance
# Get global balance (on-chain + channels)
docker exec eclair eclair-cli -p devpassword globalbalance
# Send on-chain
docker exec eclair eclair-cli -p devpassword sendonchain \
--address=<btc_address> \
--amountSatoshis=50000 \
--confirmationTarget=6
# Check how much you can send across all channels
docker exec eclair eclair-cli -p devpassword usablebalances
cd ~/.claude/skills/eclair/templates
docker-compose up -d
# Generate blocks to have spendable coins
docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin generatetoaddress 101 $(docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin getnewaddress)
# Get eclair address
ECLAIR_ADDR=$(docker exec eclair eclair-cli -p devpassword getnewaddress)
# Send funds to eclair
docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin sendtoaddress $ECLAIR_ADDR 10
# Mine a block to confirm
docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin generatetoaddress 1 $(docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin getnewaddress)
# Verify eclair balance
docker exec eclair eclair-cli -p devpassword onchainbalance
To test channels, you'll need a second Lightning node. You can start another eclair instance or use a different implementation.
# Connect to peer
docker exec eclair eclair-cli -p devpassword connect --uri=<nodeId>@<host>:9735
# Open 1M sat channel
docker exec eclair eclair-cli -p devpassword open --nodeId=<nodeId> --fundingSatoshis=1000000
# Mine blocks to confirm channel
docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin generatetoaddress 6 $(docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin getnewaddress)
# Check channel status
docker exec eclair eclair-cli -p devpassword -s channels
# On receiving node: create invoice
INVOICE=$(docker exec eclair2 eclair-cli -p devpassword createinvoice --amountMsat=50000000 --description="test" | jq -r .serialized)
# On sending node: pay invoice
docker exec eclair eclair-cli -p devpassword payinvoice --invoice=$INVOICE
Build eclair Docker image from source (useful for ARM64/Apple Silicon):
~/.claude/skills/eclair/scripts/docker-build.sh --source /path/to/eclair
Build from a specific branch, commit, or GitHub PR (for interop testing):
# Build from a specific branch
~/.claude/skills/eclair/scripts/docker-build.sh --branch taproot-feature-bit
# Build from a GitHub PR (requires gh CLI)
~/.claude/skills/eclair/scripts/docker-build.sh --pr 3144
# Build from a specific commit
~/.claude/skills/eclair/scripts/docker-build.sh --commit ea9c4ca8dc1403bca6c6dcbe9bc4f3bd81d76513
# Combine with custom tag
~/.claude/skills/eclair/scripts/docker-build.sh --pr 3144 --tag eclair:taproot
Quick convenience wrapper for building from a GitHub PR:
~/.claude/skills/eclair/scripts/build-pr.sh 3144 # Builds and tags as eclair:pr-3144
Start eclair with custom configuration:
~/.claude/skills/eclair/scripts/docker-start.sh \
--network regtest \
--api-password mypassword \
--data-dir /tmp/eclair-data
Stop and optionally clean up:
~/.claude/skills/eclair/scripts/docker-stop.sh
~/.claude/skills/eclair/scripts/docker-stop.sh --clean # Also removes volumes
Convenient wrapper for eclair API:
~/.claude/skills/eclair/scripts/eclair-cli.sh getinfo
~/.claude/skills/eclair/scripts/eclair-cli.sh channels
~/.claude/skills/eclair/scripts/eclair-cli.sh createinvoice --amountMsat=100000000 --description="test"
Initialize regtest environment with funded wallet:
~/.claude/skills/eclair/scripts/regtest-setup.sh
Mine blocks in regtest:
~/.claude/skills/eclair/scripts/mine.sh # Mine 1 block
~/.claude/skills/eclair/scripts/mine.sh 6 # Mine 6 blocks (confirm channel)
~/.claude/skills/eclair/scripts/mine.sh 100 # Mine 100 blocks (coinbase maturity)
Wrapper for Bitcoin Core commands:
~/.claude/skills/eclair/scripts/bitcoin-cli.sh getblockchaininfo
~/.claude/skills/eclair/scripts/bitcoin-cli.sh getbalance
~/.claude/skills/eclair/scripts/bitcoin-cli.sh sendtoaddress <address> <amount>
The bitcoind container is fully accessible for controlling the regtest blockchain.
# Using the helper script
~/.claude/skills/eclair/scripts/mine.sh 6
# Or directly
docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin \
generatetoaddress 6 $(docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin getnewaddress)
~/.claude/skills/eclair/scripts/bitcoin-cli.sh getblockchaininfo
~/.claude/skills/eclair/scripts/bitcoin-cli.sh getmempoolinfo
~/.claude/skills/eclair/scripts/bitcoin-cli.sh getblockcount
# Get balance
~/.claude/skills/eclair/scripts/bitcoin-cli.sh getbalance
# Generate address
~/.claude/skills/eclair/scripts/bitcoin-cli.sh getnewaddress
# Send funds
~/.claude/skills/eclair/scripts/bitcoin-cli.sh sendtoaddress <address> 1.0
The bitcoind container exposes all ports to the host, allowing other Lightning implementations to connect:
| Port | Protocol | Usage | |------|----------|-------| | 18443 | RPC | Bitcoin Core RPC (regtest) | | 18444 | P2P | Bitcoin Core P2P (regtest) | | 28332 | ZMQ | Block notifications | | 28333 | ZMQ | Transaction notifications |
Example lnd configuration to connect to the shared bitcoind:
[Bitcoin]
bitcoin.active=1
bitcoin.regtest=1
bitcoin.node=bitcoind
[Bitcoind]
bitcoind.rpchost=localhost:18443
bitcoind.rpcuser=bitcoin
bitcoind.rpcpass=bitcoin
bitcoind.zmqpubrawblock=tcp://localhost:28332
bitcoind.zmqpubrawtx=tcp://localhost:28333
Example c-lightning/CLN configuration:
network=regtest
bitcoin-rpcconnect=localhost
bitcoin-rpcport=18443
bitcoin-rpcuser=bitcoin
bitcoin-rpcpassword=bitcoin
Key configuration options (set via environment variables or eclair.conf):
| Option | Description | Default |
|--------|-------------|---------|
| eclair.chain | Network: mainnet, testnet, signet, regtest | regtest |
| eclair.api.enabled | Enable REST API | true |
| eclair.api.password | API authentication password | (required) |
| eclair.api.port | API port | 8080 |
| eclair.node-alias | Node name visible on network | eclair |
| eclair.bitcoind.host | Bitcoin Core host | bitcoind |
| eclair.bitcoind.rpcuser | Bitcoin Core RPC user | bitcoin |
| eclair.bitcoind.rpcpassword | Bitcoin Core RPC password | bitcoin |
See templates/eclair.conf.template for full configuration.
| Port | Service | Description | |------|---------|-------------| | 9735 | Lightning | Peer-to-peer Lightning protocol | | 8080 | API | REST API and WebSocket | | 18443 | Bitcoin RPC | Bitcoin Core RPC (regtest) | | 28332 | Bitcoin ZMQ | Bitcoin Core ZMQ notifications |
docker psdocker logs eclaireclair.api.password in configdevpassworddocker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin generatetoaddress 6 $(docker exec bitcoind bitcoin-cli -regtest -rpcuser=bitcoin -rpcpassword=bitcoin getnewaddress)eclair-cli onchainbalancedocker psUse the docker-build.sh script which handles ARM64 builds:
~/.claude/skills/eclair/scripts/docker-build.sh --source /path/to/eclair
For testing in-development features across Lightning implementations:
# Build and tag from PR #3144 (taproot feature bit)
~/.claude/skills/eclair/scripts/build-pr.sh 3144
# Or manually with docker-build.sh
~/.claude/skills/eclair/scripts/docker-build.sh --pr 3144 --tag eclair:taproot
# Start the stack with the PR image
cd ~/.claude/skills/eclair/templates
ECLAIR_IMAGE=eclair:pr-3144 docker-compose up -d --build
# Build from taproot-feature-bit branch
~/.claude/skills/eclair/scripts/docker-build.sh --branch taproot-feature-bit --tag eclair:taproot
# Start the stack
cd ~/.claude/skills/eclair/templates
ECLAIR_IMAGE=eclair:taproot docker-compose up -d
| Variable | Description | Default |
|----------|-------------|---------|
| ECLAIR_SOURCE | Path to eclair source directory | /Users/roasbeef/codez/eclair |
| ECLAIR_IMAGE | Docker image tag to use | eclair:local |
development
Clear-writing guide distilled from Steven Pinker's "The Sense of Style." Use when writing or revising prose that must be clear to a reader — documentation, design docs, specs, explanations, essays, emails, reports, RFCs, release notes — or when asked to make writing clearer, tighter, less academic, or less jargon-laden. Activate for "make this clearer", "tighten this", "why is this hard to read", "edit this for clarity", or any prose-quality pass.
development
Interactively debug Go programs in a single context using Delve (dlv) driven through tmux. Use when a bug requires runtime inspection — stepping through code, examining variables, walking goroutines, attaching to a live process, or debugging a hanging integration test — rather than just reading the source. Triggers include "step through this", "set a breakpoint", "attach to the running server", "why is this goroutine stuck", "debug this failing test".
development
Find similar vulnerabilities and bugs across codebases using pattern-based analysis. Use when hunting bug variants, building CodeQL/Semgrep queries, analyzing security vulnerabilities, or performing systematic code audits after finding an initial issue.
development
Refines an existing Go test suite — removes trivial/duplicate tests, strengthens weak assertions, reshapes tests around invariants, and closes branch-coverage gaps. Uses code-guided coverage and (when available) gremlins mutation-testing survivor data rather than relying on line coverage alone. Use when test quality is uneven, after a test-generation pass, before opening a PR, or as a quality gate on critical paths (consensus, channel state, payment flows). Triggers: "refine these tests", "tests are bloated", "tighten assertions", "remove trivial tests", "audit test quality", "/test-refine".