IP addresses break, dial keys instead

Add peer-to-peer connectivity to your app, agent, or workflow.

No VPNs, user accounts, or proprietary networks.

Connect any platform, cloud, or device.

Raspberry Pi
Espressif
Linux
Windows
Apple
Android
Cloudflare
AWS
Azure

Fast connections.
Anywhere.
Forever.

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.”

Ari Lotter
Principal Engineer at Nous
Read the Case Study

Reach every device, on any network

Write your app once and connect it everywhere, with one API.

  • Connect over Wi-Fi, cellular, ethernet, LAN, or Bluetooth, or bring your own transport.

  • Direct peer-to-peer links bypass NATs and firewalls, with relays as automatic fallback, so you lean on the cloud less and cut egress costs.

  • The same code runs from an ESP32 or Raspberry Pi up to a Linux server, in Rust, Swift, Kotlin, and JavaScript.

  • Every connection is end-to-end encrypted, with opt-in observability.

AWSGCPAzureSelf-HostEdgeHybridPrivate

How are people using iroh?

spacedrive logo
nous logo
shaga logo
paycode logo
rave logo
delta_chat logo
holochain logo

Ready for production

Monitor your App
ConnectionsLatencyThroughputCustomΣAggregatorDashboardMobileServerIoT

Modular toolkit

Dozens of open-source, composable protocols built on top of iroh. Mix & match to get the feature set you need.

SwiftRustJavaScriptKotlin

Start building.

Read the Docs
App.swift
import IrohLib

@main
struct App {
    static func main() async throws {
        // Dial a peer and echo a message over a bidirectional stream.
        let endpoint = try await Endpoint.bind(
            options: EndpointOptions(preset: presetN0())
        )

        let conn = try await endpoint.connect(addr: serverAddr, alpn: ALPN)
        let bi = try await conn.openBi()

        try await bi.send().writeAll(buf: Data("hello iroh".utf8))
        try await bi.send().finish()

        let echoed = try await bi.recv().readToEnd(sizeLimit: 64)
        print(String(decoding: echoed, as: UTF8.self))
    }
}

From the Blog