Installation Issues
kaleido: command not found
kaleido: command not found
kaleidoCause: the directory holding the launcher is not on your PATH. The installer says so on its last line: If 'kaleido' is not found yet, add <dir> to your PATH and restart your shell.Solutions:- Restart the shell first — a new entry on
PATHis not visible to an already-running session - For a
uvinstall, confirm the tool directory is onPATH:uv tool diranduv tool list - For the bootstrap installer, add the printed directory to
PATHin your shell profile (~/.bashrc,~/.zshrc) - On Windows, use WSL — the shell bootstrap targets macOS, Linux, and WSL
pip install kaleido-cli cannot find the package
pip install kaleido-cli cannot find the package
ERROR: Could not find a version that satisfies the requirement kaleido-cliCause: the CLI is not published on PyPI. It installs from source only.Solution:uv and falls back to an isolated virtual environment. See Installation.Kaleido CLI requires Python 3.10 or newer
Kaleido CLI requires Python 3.10 or newer
- Check what you have:
python3 --version - Install a newer Python, or let
uvmanage it:uv python install 3.12 - Re-run the installer once
python3resolves to 3.10 or newer
Setup And Environments
Docker is not installed or not in PATH.
Docker is not installed or not in PATH.
node lifecycle command, or from bare kaleido setupCause: the CLI shells out to docker compose, so both the binary and a running daemon are required.Solutions:- Verify the client and the daemon:
docker version— the “Server” block must be present - Start Docker Desktop, or
sudo systemctl start dockeron Linux - Confirm the Compose v2 plugin is available:
docker compose version - If you do not want Docker at all, run market-only setup:
kaleido setup --mode market --defaults
No docker-compose.yml found in …
No docker-compose.yml found in …
No docker-compose.yml found in <dir>, followed by Run 'kaleido node create' to generate it., or Environment directory not found: <dir>Causes:- The environment was never created, or was created under a different base directory
spawn-dirin the config points somewhere else than where the environment lives
- List what the CLI can actually see:
kaleido node list - Check the base directory:
kaleido config show— environments live underspawn-dir, default~/.kaleido - Recreate it:
kaleido node create <name>
Multiple environments exist — specify one:
Multiple environments exist — specify one:
No environments found. Run 'kaleido node create' first. means the opposite problem — nothing has been created yet.Environment '<name>' already exists at …
Environment '<name>' already exists at …
kaleido setup stops with that message and Choose a different environment name with --env-name to create a new node.Solutions:- Reuse the existing environment:
kaleido node up <name>thenkaleido node use <name> - Or create a separate one:
kaleido setup --env-name taker-2
kaleido node create offers to overwrite the compose file instead, which leaves the data volumes untouched.Containers start but the node never answers
Containers start but the node never answers
node up succeeds, node info failsSolutions:- Check container state:
kaleido node ps <name> - Read the node’s own logs:
kaleido node logs <name> --service rgb_node_1 --no-follow - Look for a port conflict — node 1 binds 3001 and 9735, node 2 binds 3002 and 9736. If something else holds those ports, recreate the environment with different base ports through
kaleido node create - Give the node a moment after
up: it has to open its database before serving requests
Node Connectivity
Node URL not configured.
Node URL not configured.
Use --node-url or: kaleido config set node-url http://localhost:3001Cause: the command needs a node, and no node URL was found in flags, environment, or config.Solutions:- Point at an environment’s node:
kaleido node use <name> - Or set it directly:
kaleido config set node-url http://localhost:3001 - Or override for one command:
kaleido --node-url http://localhost:3002 wallet balance
Connection refused, or the wrong node answers
Connection refused, or the wrong node answers
wallet, asset, channel, or payment, or balances that belong to a different nodeCauses:- The containers are not running
node-urlstill points at the node you used lastKALEIDO_NODE_URLis exported in the shell and silently overrides the stored config
- Confirm which node is active:
kaleido config show, andkaleido node list— the active one is marked● - Start the environment:
kaleido node up <name> - Check for a stale override:
echo $KALEIDO_NODE_URL - Remember the precedence: flag, then environment variable, then config
Node N does not exist in '<name>' — environment has M node(s).
Node N does not exist in '<name>' — environment has M node(s).
kaleido node use <name> --node 2 refusesCause: --node is a 1-based index into the nodes the compose file actually defines.Solution: run kaleido node list to see how many nodes the environment has. To get more, recreate it and answer the node-count prompt with a higher number.The related No nodes found in environment '<name>'. Is the compose file present? means the compose file exists but defines no rgb_node_* service.Error unlocking wallet, or every call reports the wallet is locked
Error unlocking wallet, or every call reports the wallet is locked
Error unlocking wallet: …, or node commands failing right after a restartCauses:- The node was restarted and never unlocked —
unlockis needed every time - The bitcoind or indexer the unlock request points at is unreachable
- The wallet was never initialised on this node
-
Unlock it:
kaleido node unlock -
If the services are the problem, follow the chain from the indexer instead of a bitcoind:
-
If it was never initialised, run
kaleido node initonce first -
Confirm the result with
kaleido node info
Error initializing wallet
Error initializing wallet
Error initializing wallet: …Causes:- The wallet was already initialised on this node —
initruns once per node, not once per session - A restore was attempted with an invalid
--mnemonic
- If the node is already initialised, skip straight to
kaleido node unlock - To start over from a clean node,
kaleido node clean <name>deletes the volumes — irreversibly — and theninitcan run again - When restoring, quote the mnemonic so the shell does not split it:
--mnemonic "word1 word2 …"
Wallet And Assets
Sends fail even though the balance looks sufficient
Sends fail even though the balance looks sufficient
wallet send or asset sendCauses:- The balance is not confirmed yet
- There are no spare UTXOs to allocate for the RGB assignment
- The fee could not be covered on top of the amount
- Check what is actually spendable:
kaleido wallet balanceandkaleido wallet utxos - Create colored UTXOs before RGB operations:
kaleido wallet create-utxos --num 10 --size 3000 - Fund the node from the Mutiny faucet on signet, using an address from
kaleido wallet address - Check the going rate with
kaleido wallet estimate-fee --blocks 6and pass--fee-rateexplicitly
RGB transfers stay pending
RGB transfers stay pending
kaleido asset transfers <asset-id> shows a transfer that never settlesSolutions:- Advance pending transfers:
kaleido asset refresh - Resynchronise the RGB wallet:
kaleido asset sync - Inspect the state again:
kaleido asset transfers <asset-id> - Only if a transfer is genuinely dead, release its allocations:
kaleido asset fail-transfers --batch-idx <idx>
--skip-sync, drop it: the command is returning cached state on purpose.File not found, or Invalid JSON, on asset send-batch
File not found, or Invalid JSON, on asset send-batch
File not found: <path> or Invalid JSON: …Cause: asset send-batch takes a path to a JSON file describing the recipients, not inline flags.Solution:PATH argument is required in non-interactive mode.
PATH argument is required in non-interactive mode.
wallet backup or wallet restore refuses under --agentCause: the destination path is a positional argument, and prompts are disabled.Solution: pass it explicitly, along with the password.Channels And LSP Orders
Peer must be in pubkey@host:port format in non-interactive mode.
Peer must be in pubkey@host:port format in non-interactive mode.
channel open or peer connect refusesCause: the peer was passed as a bare pubkey. Interactively the CLI asks for the address; non-interactively it requires the full form.Solutions:- Use the complete peer string:
kaleido channel open 03abc...@peer.host:9735 --capacity 100000 - Connect first and confirm reachability:
kaleido peer connect 03abc...@peer.host:9735thenkaleido peer list
PEER argument is required in non-interactive mode. and --capacity is required in non-interactive mode.--asset-amount requires --asset-id.
--asset-amount requires --asset-id.
--push-asset-amount, and to --lsp-asset-amount / --client-asset-amount on LSP orders.Solution:--lsp-asset-amount is required when --asset-id is set. and --client-asset-amount must be less than or equal to --lsp-asset-amount. are the two constraints to respect.--peer is required in non-interactive mode. (channel close)
--peer is required in non-interactive mode. (channel close)
channel close <channel-id> refusesCause: closing needs both the channel ID and the peer pubkey.Solution:--force only when the peer is unresponsive: a unilateral close locks funds until the timelock expires.Asset '<asset-id>' is not available from the LSP.
Asset '<asset-id>' is not available from the LSP.
channel order create or estimate-fees refuses the assetCause: the LSP only opens colored channels for the assets it supports.Solution: list what it offers and use one of those asset IDs.LSP did not report a connection URL. points at the other side of the same conversation — the LSP metadata came back without a peer address, so the order cannot proceed.An order is not awaiting a wallet payment
An order is not awaiting a wallet payment
channel order pay returns This order is not awaiting a wallet payment. Current payment state: <state>Causes:- The order was already paid
- It expired before funding
- It is waiting on a rate decision rather than a payment
- Read the current state:
kaleido channel order get <order-id> --access-token <token> - If it is waiting on a rate, decide:
kaleido channel order decide <order-id> --accept - If it expired, create a new order —
--funding-withinand--expiry-blockscontrol those windows - Non-interactively, pick the funding source explicitly, or you will get
Specify exactly one of --onchain or --offchain in non-interactive mode.
Market And Swaps
Pair '<pair>' not found.
Pair '<pair>' not found.
Pair 'BTC/USD' not found. Use 'kaleido market pairs' to list available pairs.Causes:- A typo, or a ticker that is not listed
- The pair is written the wrong way round — order matters
- List them:
kaleido market pairs - Use the exact
BASE/QUOTEticker from that output
No trading pairs are currently available. is different: the maker returned an empty list, so the problem is upstream rather than in your command.Provide exactly one of --from-amount or --to-amount.
Provide exactly one of --from-amount or --to-amount.
Provide --from-amount or --to-amount in non-interactive mode.Cause: a quote is anchored on one side only — you fix what you send or what you receive, and the maker prices the other.Solutions:- Pass exactly one of the two
- Remember these are display units:
--from-amount 0.001is 0.001 BTC, not 1000 sat - If the amount is rejected as invalid, check the pair’s limits in
kaleido market pairs
Swapstring must contain 6 slash-separated fields.
Swapstring must contain 6 slash-separated fields.
Swapstring fields must not be empty or whitespace., or Swapstring contains invalid numeric fields.Cause: the swapstring was truncated or mangled. Its shape is:- Copy the whole string from the
swap atomic initoutput, without wrapping it across lines - Quote it, so the shell does not touch it:
--swapstring '30/rgb:abc.../10/rgb:def.../600/<hash>' - Or skip the manual step entirely with
kaleido swap atomic run <pair>
Auto-whitelist validation failed
Auto-whitelist validation failed
Auto-whitelist validation failed: …, or messages like Swapstring from_amount 30 does not match quote amount 31.Cause: before whitelisting on your node, the CLI checks the swapstring against the quote you accepted. A mismatch means the swapstring belongs to a different swap, or the quote moved.Solutions:- Re-run
swap atomic initand use the swapstring and payment hash from that same response — never mix them across runs - Do not reuse an old swapstring after a re-quote
Maker returned no swap payload for --payment-hash; refusing to auto-whitelist.means the maker has no swap for that payment hash: check it withkaleido swap atomic status <payment-hash>
Execute fails because the swap was never whitelisted
Execute fails because the swap was never whitelisted
swap atomic init succeeded, swap atomic execute failsCause: the taker node has to accept the swap before the maker can settle it, and that step runs against your node, not the maker.Solution: the three steps must run in order.--auto-whitelist to execute, or use kaleido swap atomic run <pair>.A swap stays pending after execute
A swap stays pending after execute
execute returned, but the assets have not arrivedSolutions:- Poll the maker’s view:
kaleido swap atomic status <payment-hash> - Poll your node’s view:
kaleido node swap status <payment-hash> --taker - List what the node knows:
kaleido node swap list - Advance pending RGB transfers:
kaleido asset refresh
kaleido channel list for capacity on that specific asset, not just the total balance.Scripting And Automation
A command hangs instead of returning
A command hangs instead of returning
--agent, which turns every prompt into an error instead:PAIR argument is required in non-interactive mode. or <option> is required in non-interactive mode., naming exactly what to pass.--yes is required in non-interactive mode
--yes is required in non-interactive mode
--yes is required in non-interactive mode to accept the quoted price., … to accept the RFQ price., … to pay the order., or the JSON-mode variantsCause: anything that spends money or accepts a price asks for confirmation, and there is no one to ask.Solutions:- Add
--yesonce you are satisfied with the parameters - Price-check first with
kaleido market quoteorkaleido channel order estimate-fees, then execute with--yes kaleido node cleanandkaleido config resettake--yestoo
Mutually exclusive flags
Mutually exclusive flags
Must specify exactly one of --accept or --reject, Must specify at most one of --taker or --maker, or Specify exactly one of --onchain or --offchain in non-interactive mode.Cause: these pairs are choices, not toggles, and the CLI refuses to guess when neither or both are given.Solution: pass exactly one. Interactively, omitting both makes the CLI prompt instead.Debugging
When a command fails and the message is not enough, work outward from the CLI’s own view of the world:echo $KALEIDO_NODE_URL and echo $KALEIDO_API_URL as well: an exported variable overrides the stored config and is easy to forget.
Get Help
Check the FAQ for questions rather than errors, and Additional Resources for upstream documentation and links. For anything else, report a problem through your preferred channel from the options below, including:- How you installed the CLI, and the output of
uv tool list(there is no--versionflag) - Python version (
python --version) and your operating system - The exact command you ran, plus its output with
--jsonadded - Whether the node is a local Docker environment or a remote one, and the network
kaleido config showandkaleido node psoutput, with passwords removed