Skip to content

Run a Local Network

Quick guide to running Calimero nodes locally for development and testing.

Merobox is the easiest way to run local networks. See merobox/README.md for complete documentation.

Quick start:

# Install merobox
$: pipx install merobox
> Installing to existing venv 'merobox'
>  installed package merobox 0.2.13, installed using Python 3.13.3
>  These apps are now globally available:  merobox
> done! โœจ ๐ŸŒŸ โœจ

# Start 2-node network
$: merobox run --count 2
> ...
> Deployment Summary: 2/2 nodes started successfully

# Check status
$: merobox list
> โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”€โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
> โ”ƒ            โ”ƒ         โ”ƒ           โ”ƒ          โ”ƒ RPC/Admโ€ฆ โ”ƒ           โ”ƒ          โ”ƒ
> โ”ƒ Name       โ”ƒ Status  โ”ƒ Image     โ”ƒ P2P Port โ”ƒ Port     โ”ƒ Chain ID  โ”ƒ Created  โ”ƒ
> โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”€โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
> โ”‚ calimero-โ€ฆ โ”‚ running โ”‚ ghcr.io/โ€ฆ โ”‚ 2429     โ”‚ 2529     โ”‚ testnet-1 โ”‚ 2026-01โ€ฆ โ”‚
> โ”‚            โ”‚         โ”‚           โ”‚          โ”‚          โ”‚           โ”‚ 14:22:12 โ”‚
> โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”€โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
> โ”‚ calimero-โ€ฆ โ”‚ running โ”‚ ghcr.io/โ€ฆ โ”‚ 2427     โ”‚ 2527     โ”‚ testnet-2 โ”‚ 2026-01โ€ฆ โ”‚
> โ”‚            โ”‚         โ”‚           โ”‚          โ”‚          โ”‚           โ”‚ 14:22:12 โ”‚
> โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

$: merobox health
> Checking health of 1 running node(s)...
>                  Calimero Node Health Status                 
> โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
> โ”‚ Node            โ”‚ Health โ”‚ Authenticated โ”‚ Peers โ”‚ Status  โ”‚
> โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
> โ”‚ calimero-node-1 โ”‚ alive  โ”‚ Unknown       โ”‚ 0     โ”‚ Healthy โ”‚
> โ”‚ calimero-node-2 โ”‚ alive  โ”‚ Unknown       โ”‚ 0     โ”‚ Healthy โ”‚
> โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

With workflow:

$: merobox bootstrap run workflow.yml
> ...
> ๐Ÿš€ Executing Workflow: Example Application
> ...

Using merod Directly

For more control, run nodes directly without Docker:

# Builds your crate and copies the binary into ~/.cargo/bin, so you can run it from anywhere.
$: cargo install --path ./crates/merod
> Installed package merod v0.1.0 (/Users/X/Desktop/core/crates/merod) (executable merod)
$: which merod
> /Users/X/.cargo/bin/merod

# Or
# Builds the binary inside the project only; it's not globally available unless you reference it explicitly.
$: cd crates/merod
$: cargo build --release
> Compiling merod v0.1.0 (/Users/X/Desktop/core/crates/merod)
>     Finished release [optimized + debuginfo] target(s) in 10.35s
> Installing merod v0.1.0 (/Users/X/Desktop/core/crates/merod)
> Installing /Users/X/Desktop/core/crates/merod/target/release/merod (executable)
> Installed package merod v0.1.0 (/Users/X/Desktop/core/crates/merod) (executable merod)

Initialize and run a single node:

# Initialize a node with default settings
$: merod --node node1 init
> 2025-12-16T11:47:34.861762Z  INFO merod::cli::init: Generated identity: PeerId>("12D3KooW9xPd2gxAouQ29vMfG1B3fpYPPS87VEZyrqzhuVQWc2VL")
> 2025-12-16T11:47:34.870745Z  INFO merod::cli::init: Initialized a node in "/Users/X/.calimero/node1"

# Or from binary
$: cargo run --bin merod -- --node node1 init
> 2025-12-16T11:47:34.861762Z  INFO merod::cli::init: Generated identity: PeerId("12D3KooW9xPd2gxAouQ29vMfG1B3fpYPPS87VEZyrqzhuVQWc2VL")
> 2025-12-16T11:47:34.870745Z  INFO merod::cli::init: Initialized a node in "/Users/X/.calimero/node1"

# With custom ports:

$: merod --node node1 init --server-port 2428 --swarm-port 2528
> 2025-12-16T11:52:13.841762Z  INFO merod::cli::init: Generated identity: PeerId("12D3KooW9xPd2gxAouQ29vMfG1B3fpYPPS87VEZyrqzhuVQWc2VL")
> 2025-12-16T11:52:13.840725Z  INFO merod::cli::init: Initialized a node in "/Users/X/.calimero/node1"

# Or from binary
$: cargo run --bin merod -- --node node1 init --server-port 2428 --swarm-port 2528
> 2025-12-16T11:52:13.841762Z  INFO merod::cli::init: Generated identity: PeerId("12D3KooW9xPd2gxAouQ29vMfG1B3fpYPPS87VEZyrqzhuVQWc2VL")
> 2025-12-16T11:52:13.840725Z  INFO merod::cli::init: Initialized a node in "/Users/X/.calimero/node1"

Run multiple nodes manually:

# Terminal 1: Start first node (coordinator)
merod --node node1 init --server-port 2428 --swarm-port 2528
merod --node node1 run

# Terminal 2: Start second node (peer)
merod --node node2 init --server-port 2429 --swarm-port 2529
merod --node node2 config --swarm-addrs /ip4/127.0.0.1/tcp/2528
merod --node node2 run

# Terminal 3: Start third node (peer)
merod --node node3 init --server-port 2430 --swarm-port 2530
merod --node node3 config --swarm-addrs /ip4/127.0.0.1/tcp/2528
merod --node node3 run

Configuration:

# Configure node settings
merod --node node1 config --server-host 0.0.0.0 --server-port 3000
merod --node node1 config --swarm-host 0.0.0.0 --swarm-port 2428

# Use custom home directory
merod --home ~/.calimero-custom --node node1 init

See meroctl CLI for managing contexts and use merod --help for all available node options.

Requirements

  • Docker 20.10+ (for Merobox)
  • Rust toolchain (if building from source)
  • Python 3.8+ (for Merobox)

Next Steps