n0-computer/iroh
Summary
Iroh is a Rust library for peer-to-peer networking that simplifies connecting endpoints by public key, using hole-punching and QUIC with fallback relay servers, and provides composable protocols like blobs, gossip, and docs.
View Cached Full Text
Cached at: 06/16/26, 05:32 PM
n0-computer/iroh
Source: https://github.com/n0-computer/iroh
less net work for networks
What is iroh?
Iroh gives you an API for dialing by public key. You say “connect to that phone”, iroh will find & maintain the fastest connection for you, regardless of where it is.
Hole-punching
The fastest route is a direct connection, so if necessary, iroh tries to hole-punch. Should this fail, it can fall back to an open ecosystem of public relay servers. To ensure these connections are as fast as possible, we continuously measure iroh.
Built on QUIC
Iroh uses noq to establish QUIC connections between endpoints. This way you get authenticated encryption, concurrent streams with stream priorities, a datagram transport and avoid head-of-line-blocking out of the box.
Compose Protocols
Use pre-existing protocols built on iroh instead of writing your own:
- iroh-blobs for BLAKE3-based content-addressed blob transfer scaling from kilobytes to terabytes
- iroh-gossip for establishing publish-subscribe overlay networks that scale, requiring only resources that your average phone can handle
- iroh-docs for an eventually-consistent key-value store of iroh-blobs blobs
Getting Started
Rust Library
It’s easiest to use iroh from rust.
Install it using cargo add iroh, then on the connecting side:
const ALPN: &[u8] = b"iroh-example/echo/0";
let endpoint = Endpoint::bind().await?;
// Open a connection to the accepting endpoint
let conn = endpoint.connect(addr, ALPN).await?;
// Open a bidirectional QUIC stream
let (mut send, mut recv) = conn.open_bi().await?;
// Send some data to be echoed
send.write_all(b"Hello, world!").await?;
send.finish()?;
// Receive the echo
let response = recv.read_to_end(1000).await?;
assert_eq!(&response, b"Hello, world!");
// As the side receiving the last application data - say goodbye
conn.close(0u32.into(), b"bye!");
// Close the endpoint and all its connections
endpoint.close().await;
And on the accepting side:
let endpoint = Endpoint::bind().await?;
let router = Router::builder(endpoint)
.accept(ALPN.to_vec(), Arc::new(Echo))
.spawn()
.await?;
// The protocol definition:
#[derive(Debug, Clone)]
struct Echo;
impl ProtocolHandler for Echo {
async fn accept(&self, connection: Connection) -> Result<()> {
let (mut send, mut recv) = connection.accept_bi().await?;
// Echo any bytes received back directly.
let bytes_sent = tokio::io::copy(&mut recv, &mut send).await?;
send.finish()?;
connection.closed().await;
Ok(())
}
}
The full example code with more comments can be found at echo.rs.
Or use one of the pre-existing protocols, e.g. iroh-blobs or iroh-gossip.
Other Languages
If you want to use iroh from other languages, make sure to check out iroh-ffi, the repository for FFI bindings.
Links
Repository Structure
This repository contains a workspace of crates:
iroh: The core library for hole-punching & communicating with relays.iroh-relay: The relay client and server implementation. This is the code we run in production for the public relays (and you can, too!).iroh-base: Common types likeEndpointIdorRelayUrl.iroh-dns-server: DNS server implementation powering the DNS/Pkarr address lookup for EndpointIds, running at dns.iroh.link.
License
Copyright 2025 N0, INC.
This project is licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Similar Articles
Iroh 1.0 - Dial Keys, not IPs
Iroh 1.0 is a stable release of a peer-to-peer networking library that uses cryptographic keys instead of IP addresses, enabling direct, secure connections across diverse transports and platforms.
OxiSH: SSH server written in Rust
OxiSH is an SSH server written in Rust, providing a memory-safe alternative to traditional SSH server implementations.
@QingQ77: A high-performance IM backend written in Rust, using QUIC protocol for real-time messaging, supporting P2P hole punching and group chat broadcasting. https://github.com/nicolastinger/only-talk-rs… Built with Actix-web for RESTful …
A high-performance instant messaging backend based on Rust + Actix-web + QUIC, supporting P2P hole punching, group chat broadcasting, multiple storage backends, can be deployed as a single process or separately.
An iroh powered smart fan
The article demonstrates how to build a smart fan using an ESP32 microcontroller and the iroh networking library, enabling peer-to-peer control without a cloud service.
Async I/O in Zig 0.16, today
Zig 0.16 ships a new std.Io interface for cross-platform I/O. The library zio provides a full async implementation using stackful coroutines and OS-level async APIs, enabling efficient concurrent tasks without thread-per-task overhead.