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.
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 RelaysIroh 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// 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