Relay outage: A post-mortem
Post mortem of our first outage
less net work for networks
Iroh gives you an API for dialing by public key. You say “connect to that phone”, iroh will find & maintain the fastest connection for you, regardless of where it is.
“In stark contrast to other p2p & dweb technologies we've played with - which are exciting due to their implications for the future - Iroh brought instant gains in our present."
An ecosystem of ready-made, composable protocols are built on top of iroh.
Mix & match to get the feature set you need.
Don't see a protocol you need? Build your own! Iroh gives you a reliable foundation for building distributed systems that reach the edge. The rest is up to you.
Protocol DocsAll commits to iroh's main branch run through a growing set of simulations & tests
Iroh Perf SiteIroh is running in production on hundreds of thousands of devices, on all major platforms.
Iroh supports a growing set of languages, embedding nodes directly in your project without any need to call out to an external API
Start Building
import { argv } from 'process'
import { Iroh, BlobTicket } from '@number0/iroh'
// serve & fetch data with iroh, from any two devices in the world
// run this example from any two computers, and iroh will connect them!
(async () => {
// create a new node with default protocols
const node = await Iroh.memory();
// Choose between client & server roles based on the presence of a download CLI argument
if (argv.length > 2) {
// we have a download argument. Fetch some data!
let ticket = BlobTicket.fromString(argv[2]);
console.log(`fetching hash '${ticket.hash}' from node: '${ticket.nodeAddr.nodeId.toString()};`);
// download the data
await node.blobs.download(ticket.hash, ticket.asDownloadOptions(), (_err) => {});
// read the data
const data = await node.blobs.readToBytes(ticket.hash);
console.log("data:", new TextDecoder().decode(new Uint8Array(data)));
} else {
// no download argument. Serve some data that says "Hello, world!"
const data = Array.from(new TextEncoder().encode('Hello, World!'));
const result = await node.blobs.addBytes(data);
// create a "ticket" for sharing data with another node
const ticket = await node.blobs.share(result.hash, result.format, 'RelayAndAddresses');
console.log(`server running. in another terminal run:\n\nnode hello.js ${ticket.toString()}`);
// wait for ctrl+c
await new Promise((resolve) => {
process.on('SIGINT', () => { resolve() });
setInterval(() => {}, 1000);
});
process.exit();
}
})();
Post mortem of our first outage
Iroh 0.28 release