IP addresses break, dial keys instead
- -Add peer-to-peer connectivity to your app, anywhere: servers, mobile apps, agents, desktops, and embedded systems.
++ Add peer-to-peer connectivity to your app, agent, or workflow. +
- 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. -
-@@ -95,67 +130,87 @@ export default function Page() {
Built for environments where connectivity is unreliable or intermittent
+-
+
-
+
+
Use all the radios: Wi-Fi, cellular, ethernet, LAN, or Bluetooth, or bring your own transport.
+
+ -
+
+
Lean on the cloud less with direct links that bypass NATs and firewalls, with stateless relays as fallback.
+
+ -
+
+
Secure end-to-end encryption, with opt-in observability to diagnose issues and improve performance.
+
+
How are people using iroh?
Distributed AI Training
-Train foundation LLMs with compute distributed around the world, across AWS, GCP, Azure, and self-hosted infrastructure.
-
- 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.
-
- 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.
-
- 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.
-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.
-IoT & Embedded Devices
+Run iroh on ESP32, Raspberry Pi, and Linux with the same API. Devices discover each other automatically. No brokers, no gateways.
+File Transfer & Sync
+Move files and large blobs directly between devices with content-addressed, resumable transfers that verify every byte.
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 AppReady for production
+-
+
-
+
+
+ Performant. Every commit to iroh's main branch runs through a growing set of simulations & tests. +
+
+ -
+
+
+ Monitored. Observability and network diagnostics track connection health and throughput. +
+
+ -
+
+
+ Supported. Every major release is supported for multiple years with extended support contracts available. +
+
+
Modular toolkit
-- Dozens of open-source, composable protocols built on top of iroh. Mix & match to get the feature set you need.
-
+ Open source.
+
+ 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, let us run them for you, and switch between them whenever you want. +
+Start building.
@@ -212,10 +291,18 @@ export default function Page() {Modular toolkit
++ Dozens of open-source, composable protocols built on top of iroh. Mix & match to get the feature set you need.
+From the Blog
@@ -230,26 +317,122 @@ export default function Page() { } -const codeSample = `// a program that creates two endpoints & sends a ping between them -use anyhow::Result; -use iroh::{Endpoint, protocol::Router}; -use iroh_ping::Ping; +// Minimal "dial a peer and echo a message" flow in each language. +// APIs match the iroh-ffi endpoint tests and the Rust quickstart docs. +const codeSnippets = [ + { + title: 'Swift', + label: 'App.swift', + language: 'swift', + code: `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)) + } +}`, + }, + { + title: 'Rust', + label: 'main.rs', + language: 'rust', + code: `use anyhow::Result; +use iroh::{Endpoint, endpoint::presets}; #[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"); + // Dial a peer and echo a message over a bidirectional stream. + let endpoint = Endpoint::bind(presets::N0).await?; + + let conn = endpoint.connect(server_addr, ALPN).await?; + let (mut send, mut recv) = conn.open_bi().await?; + + send.write_all(b"hello iroh").await?; + send.finish()?; + let echoed = recv.read_to_end(64).await?; + println!("{}", String::from_utf8_lossy(&echoed)); Ok(()) -}` +}`, + }, + { + title: 'JavaScript', + label: 'index.js', + language: 'javascript', + code: `const { Endpoint } = require('@number0/iroh') + +async function main() { + // Dial a peer and echo a message over a bidirectional stream. + const builder = Endpoint.builder() + builder.applyN0() + const endpoint = await builder.bind() + + const conn = await endpoint.connect(serverAddr, ALPN) + const bi = await conn.openBi() + + await bi.send.writeAll(Array.from(Buffer.from('hello iroh'))) + await bi.send.finish() + + const echoed = await bi.recv.readToEnd(64) + console.log(Buffer.from(echoed).toString()) +} + +main()`, + }, + { + title: 'Kotlin', + label: 'Main.kt', + language: 'kotlin', + code: `import computer.iroh.* +import kotlinx.coroutines.runBlocking + +fun main() = runBlocking { + // Dial a peer and echo a message over a bidirectional stream. + val endpoint = Endpoint.bind(EndpointOptions(preset = presetN0())) + + val conn = endpoint.connect(serverAddr, ALPN) + val bi = conn.openBi() + + bi.send().writeAll("hello iroh".toByteArray()) + bi.send().finish() + + val echoed = bi.recv().readToEnd(64u) + println(String(echoed)) +}`, + }, + { + title: 'Python', + label: 'main.py', + language: 'python', + code: `import asyncio +from iroh import Endpoint, EndpointOptions, preset_n0 + +async def main(): + # Dial a peer and echo a message over a bidirectional stream. + endpoint = await Endpoint.bind(EndpointOptions(preset=preset_n0())) + + conn = await endpoint.connect(server_addr, ALPN) + bi = await conn.open_bi() + + await bi.send().write_all(b"hello iroh") + await bi.send().finish() + + echoed = await bi.recv().read_to_end(64) + print(echoed.decode()) + +asyncio.run(main())`, + }, +] diff --git a/src/app/pricing/page.jsx b/src/app/pricing/page.jsx index ae7fa616..737fb98d 100644 --- a/src/app/pricing/page.jsx +++ b/src/app/pricing/page.jsx @@ -128,7 +128,7 @@ export default function PricingPage() {- “Media over QUIC has real legs. It works on mobile and handles packet loss so much better.” + “Media over QUIC has real legs. It works on mobile and handles packet loss so much better than WebRTC.”
{article.title}
- + @@ -40,7 +40,7 @@ export function BlogPostLayout({ article, references = [], children }) { {references.length > 0 && (To get started, take a look at our docs, dive directly into the code, or chat with us in our discord channel.
+ ))}
+