Running iroh on an ESP32
Running iroh on an ESP32 microcontroller.










Fast connections.
Anywhere.
Forever.
Send data to any device running anywhere, big or small — cloud servers, tablets, or embedded systems. The core peer-to-peer technology is open source and built on open standards, so you're never locked in.
“Doubling the network speed halves our compute budget.”
Save cloud costs
Peer-to-peer connections bypass NATs and firewalls. Relays keep data flowing when direct connections can't be made.
Sync any kind of data
Files, structured data, video, RPC — or write your own protocol.
E2E Encrypted, Always
Every connection is end-to-end encrypted over QUIC.
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.

Data sync & P2P Web Apps
Powers in-chat 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.
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.
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(())
}Running iroh on an ESP32 microcontroller.
Introducing noq: n0's QUIC implementation