iroh 0.95.0 - A New Relay, Error Handling, and Connection API Improvements
Release of iroh v0.95












Rave uses iroh to stream video between millions of devices around the world every day.
Read the Rave case study →Fast, reliable, and efficient connections
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.

“Doubling the network speed halves our compute budget. That's the difference between a $1M model and a $500K model.”
Fast connections.
Anywhere.
Forever.
Dial any endpoint running anywhere, big or small — cloud servers, tablets, or Raspberry Pis.
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 RelaysThere 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.
When you build your app, iroh provides opt-in observability and custom metrics specific for your app. Get visibility into your endpoints — track connection health and throughput across all your devices and services.
Montior your App// 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(())
}Release of iroh v0.95
Release of iroh v0.94