Iroh 1.0 - Dial Keys, not IPs
Iroh 1.0 is out. Now is the time to build.










Fast connections.
Anywhere.
Forever.
No VPNs, user accounts, or proprietary networks. The core peer-to-peer technology is open source and built on open standards, so you're never locked in: connect over our free community relays, self-host your own, or let us run them for you, and switch between them whenever you want.
“Doubling the network speed halves our compute budget.”
Distributed AI Training
Train foundation LLMs with compute distributed around the world, across AWS, GCP, Azure, and self-hosted infrastructure.

Video Streaming
Stream video between devices, using peer to peer technology. Create encrypted connections built on open standards, across the globe or across the room.

Real-time Sync for Mobile Applications
Powers apps for hundreds of thousands of devices around the world, even when internet access is precarious.

Point of Sale Payments
Connect payment terminals directly to point of sale systems over Bluetooth, LAN, or Wi-Fi with full PCI compliance and no additional servers.
IoT & Embedded Devices
Run iroh on ESP32, Raspberry Pi, and Linux with the same API. Devices discover each other automatically — no brokers, no gateways.
Deploy, Monitor, Fix
All commits to iroh's main branch run through a growing set of simulations & tests.
iroh provides opt-in observability and network diagnostics. Track connection health and throughput across all your devices and services.
You'll see how much of your traffic goes direct versus through a relay: a fallback server iroh uses when two devices can't reach each other directly, always end-to-end encrypted. Compare plans.
Monitor your AppDozens of open-source, composable protocols built on top of iroh. Mix & match to get the feature set you need.
// a program that creates two endpoints & sends a ping between them
use anyhow::Result;
use iroh::{Endpoint, protocol::Router};
use iroh_ping::Ping;
#[tokio::main]
async fn main() -> Result<()> {
// create the receive side
let recv_ep = Endpoint::builder().bind().await?;
let recv_router = Router::builder(recv_ep.clone())
.accept(iroh_ping::ALPN, Ping::new())
.spawn();
recv_ep.online().await;
let addr = recv_router.endpoint().addr();
// create a send side & send a ping
let send_ep = Endpoint::builder().bind().await?;
let send_pinger = Ping::new();
let rtt = send_pinger.ping(&send_ep, addr).await?;
println!("ping took: {rtt:?} to complete");
Ok(())
}A closer look at QUIC NEW_TOKEN tokens, why they exist, and what they buy you in iroh and noq.