IP addresses break, dial keys instead

Modular networking stack trusted by thousands of developers and millions of users worldwide.

Trusted at scale by the world's most innovative teams

spacedrive logo
nous logo
shaga logo
rave logo
delta_chat logo
recall logo

Rave uses iroh to stream video between millions of devices around the world every day.

Fast, reliable, and efficient connections

Save cloud costs worldwide

Bypass NATs and firewalls to secure direct connections between devices when possible using iroh, a modular networking stack in Rust.

Sync anything, anywhere

Build APIs that are flexible and modular. Supports files, structured data, video streaming, and RPC between cloud and edge — or write your own protocol.

E2E Encrypted, Always

All connections are end-to-end encrypted, with an access control layer that builds up from public keys over QUIC connections.

Deploy a dedicated relay

Run your own relay server for guaranteed availability and lower latency. Self-host anywhere or use our managed relay infrastructure across multiple regions.

Fast connections.
Anywhere.
Forever.

Dial any endpoint running anywhere, big or small — cloud servers, tablets, or Raspberry Pis. When a direct connection isn't possible, relays keep your app running smoothly.

The core technology is open source, and relays are stateless. That means you can pluralize with hosting across regions and clouds, or self-host anywhere in the world.

Learn about Relays

Modular toolkit

Iroh provides a reliable connectivity API for building systems that reach any device, anywhere. The rest is up to you. There are dozens of open source ready-made, composable protocols are built on top of iroh. Mix & match to get the feature set you need.

Deploy, Monitor, Fix

All commits to iroh's main branch run through a growing set of simulations & tests.

Get visibility into your endpoints — track connection health and throughput across all your devices and services. Build custom metrics specific for your app.

Montior your App

Build something amazing, today.

Read the Docs

main.rs

// a program that creates two endpoints & sends a ping between them
use anyhow::Result;
use iroh::{Endpoint, protocol::Router};
use iroh_ping::{ALPN as PingALPN, Ping};

#[tokio::main]
async fn main() -> Result<()> {
    // create the receive side
    let recv_endpoint = Endpoint::bind().await?;
    let recv_router = Router::builder(recv_endpoint)
      .accept(PingALPN, Ping::new())
      .spawn();

    // get the receive side's address:
    let addr = recv_router.endpoint().addr().await?;

    // create the send side & send a ping!
    let send_ep = Endpoint::bind().await?;
    let send_pinger = Ping::new();
    send_pinger.ping(&send_ep, addr).await?;

    // ok!
    Ok(())
}

From the Blog