How to Set Up iroh for Development: Complete Rust Workspace Guide
To set up iroh for development, clone the n0-computer/iroh repository, install Rust ≥1.74 and the protobuf compiler, then build the workspace with cargo build --workspace --all-features and run examples like cargo run --example echo.
The iroh project provides a peer-to-peer QUIC library, relay implementation, and DNS utilities organized as a Rust workspace. Setting up iroh for development involves building multiple interconnected crates—including iroh, iroh-relay, and iroh-dns-server—from the n0-computer/iroh repository and verifying the installation through the provided example programs and test suites.
Prerequisites
Before building the workspace, ensure your system meets the following requirements:
- Rust toolchain (stable ≥ 1.74): Install via
rustup update stable - Cargo: Included with the Rust toolchain
- Git: Required for cloning the repository
- protobuf compiler (
protoc): Needed for generated relay protocol files; install withsudo apt install protobuf-compiler(Linux) or via package manager on macOS - Optional: Nightly Rust: Required for building documentation with the
iroh_docsrsconfiguration; install withrustup toolchain install nightly - Optional:
cargo nextest: Fast parallel test runner used by CI; install withcargo install cargo-nextest
Clone the Repository and Build
The iroh repository is a Cargo workspace defined in the top-level Cargo.toml, containing crates such as iroh, iroh-relay, iroh-base, and iroh-dns-server.
Clone the repository and build the entire workspace:
git clone https://github.com/n0-computer/iroh.git
cd iroh
# Build with default features
cargo build --workspace
# Build with all Cargo features (recommended for development)
cargo build --workspace --all-features
Building with --all-features enables the full API surface, including unstable features like unstable-net-report and unstable-rustls that are gated behind feature flags in iroh/src/lib.rs and related modules.
Running Examples
The iroh/examples directory contains demonstration programs that verify your development setup. The echo example in iroh/examples/echo.rs provides a minimal client-server implementation:
Run the echo server:
cargo run --example echo
Run the client component in another terminal:
cargo run --example echo-no-router
The core pattern for creating an endpoint and establishing connections follows this structure from iroh/examples/echo.rs:
use iroh::{Endpoint, endpoint::presets};
use n0_error::Result;
#[tokio::main]
async fn main() -> Result<()> {
// Bind a local endpoint using the default relay preset
let ep = Endpoint::bind(presets::N0).await?;
// Connect to a remote endpoint using its address and ALPN
let conn = ep.connect(remote_addr, b"iroh-example/echo/0").await?;
// Open a bidirectional stream
let (mut send, mut recv) = conn.open_bi().await?;
send.write_all(b"Hello, iroh!").await?;
send.finish()?;
let response = recv.read_to_end(1024).await?;
println!("Received: {}", String::from_utf8_lossy(&response));
Ok(())
}
Testing the Workspace
Verify your development setup by running the integration tests located in iroh/tests/integration.rs:
# Standard Cargo test runner
cargo test --workspace
# Faster parallel execution with nextest (requires installation)
cargo nextest run --workspace
For feature-specific testing, pass the feature flag explicitly:
cargo test --workspace --features unstable-net-report
Working with Relays
The iroh-relay crate provides the relay protocol that transports encrypted traffic between endpoints when direct connections fail. The entry point is defined in iroh-relay/src/main.rs.
Run a local relay server for development:
cargo run -p iroh-relay -- --listen 0.0.0.0:4433
Configure a client endpoint to use your local relay by providing a custom RelayUrl via the builder API:
use iroh::{Endpoint, endpoint::Builder, RelayUrl};
let relay = RelayUrl::parse("https://127.0.0.1:4433")?;
let ep = Builder::new().relay(relay).bind().await?;
Generate Local Documentation
Build the complete API documentation matching docs.rs, including all feature-gated items:
RUSTDOCFLAGS="--cfg iroh_docsrs" cargo +nightly doc --workspace --no-deps --all-features
Open target/doc/iroh/index.html in your browser to view the generated documentation, which includes the public API exports from iroh/src/lib.rs and module documentation for iroh/src/endpoint/mod.rs.
Summary
- Install Rust ≥1.74 and
protocbefore attempting to build the workspace - Clone the n0-computer/iroh repository and use
cargo build --workspace --all-featuresto compile all crates includingiroh,iroh-relay, andiroh-dns-server - Run examples with
cargo run --example <name>to verify connectivity and understand the API patterns iniroh/examples/echo.rs - Execute tests using
cargo test --workspaceorcargo nextest run --workspaceto ensure the hole-punching and relay functionality works correctly - Build documentation with nightly Rust and the
iroh_docsrscfg flag to access feature-gated APIs
Frequently Asked Questions
What Rust version is required to build iroh?
You need Rust stable ≥1.74 to compile the iroh workspace. Install or update via rustup update stable. Some documentation builds require nightly Rust for the iroh_docsrs configuration.
How do I run the iroh relay server locally?
Use cargo run -p iroh-relay -- --listen 0.0.0.0:4433 to start a local relay instance. The binary defined in iroh-relay/src/main.rs supports TLS configuration and HTTP-to-QUIC upgrades via the iroh-relay/src/tls.rs module.
What is the purpose of the --all-features flag?
The --all-features flag enables optional Cargo features such as unstable-net-report and unstable-rustls, exposing the complete API surface and documentation. This matches the configuration used for the published crates on docs.rs and is recommended for comprehensive development.
How do I build the API documentation locally?
Run RUSTDOCFLAGS="--cfg iroh_docsrs" cargo +nightly doc --workspace --no-deps --all-features. This command requires nightly Rust and generates documentation in target/doc/ that includes all public modules from iroh/src/lib.rs and feature-gated items.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →