Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions src/app/blog/iroh-1-0-3/page.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { BlogPostLayout } from '@/components/BlogPostLayout'
import { MotionCanvas } from '@/components/MotionCanvas'

export const post = {
draft: false,
author: 'ramfox',
date: '2026-07-21',
title: 'iroh 1.0.3 - Steadier Connections',
description: 'Release of iroh v1.0.3, alongside noq v1.1.0',
}

export const metadata = {
title: post.title,
description: post.description,
openGraph: {
title: post.title,
description: post.description,
images: [{
url: `/api/og?title=Blog&subtitle=${post.title}`,
width: 1200,
height: 630,
alt: post.title,
type: 'image/png',
}],
type: 'article'
}
}

export default (props) => <BlogPostLayout article={post} {...props} />

Welcome to a new release of `iroh`, a modular networking stack in Rust, for building direct connections between devices.

After [last release's security fix](/blog/iroh-1-0-2), we're happy to be back to the good kind of boring. We've shipped iroh 1.0.3 together with [noq 1.1.0](https://github.com/n0-computer/noq/releases/tag/noq-v1.1.0) to give you a cleaner, smoother connection experience, without breaking any APIs.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry to give critique without a concrete counterproposal - I'll come back to this tomorrow hopefully with one - but I'm not a fan of this paragraph. Perhaps I'm just not the right audience for it and it's quite fine for our users, but let me explain where my issue with it lies.

The overall tone: It feels apologetic and defensive. From this paragraph I wouldn't really know what the release is about, the "back to the good kind of boring" to me sounds like we are back in business after a shitshow that exposed users passwords or something quite serious, but it wasn't like that, we just dealt with it and it's fine. This will happen again, probably more than a couple of times. The part about "without breaking APIs" also isn't exactly encouraging: this is a minor/patch release and we are announcing we are doing the bare minimum in the semver contract with our users.

I would expect this paragraph to focus on why this release is one worth adopting, but writing this down I see it's hard to make it sound exciting and having a narrative. I think we could say the projects are settling into a stable maintenance cadence after 1.0 (and the previous security fix if you wish to acknowledge it explicitly), with incremental improvements to reliability (a bunch of bugs fixed between the previous minor now release and this one), developer experience (docs, logs, ci feedback, contributing), and overall ecosystem quality (like Adding pkarr resolver to n0 presets in iroh, for example)

I'll try to come back later with perhaps a more grounded suggestion


## Connections hold up better under real-world conditions

This release closes up a handful of corner cases in noq: path validation is timed more correctly when a new path opens, stray packets from paths that have already been abandoned are no longer allowed to cause confusion, and a connection-accounting bug that could undercount active connections is fixed. Packet coalescing during the handshake is also more correct now, which matters most on networks that don't behave nicely.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This release closes up a handful of corner cases in noq: path validation is timed more correctly when a new path opens, stray packets from paths that have already been abandoned are no longer allowed to cause confusion, and a connection-accounting bug that could undercount active connections is fixed. Packet coalescing during the handshake is also more correct now, which matters most on networks that don't behave nicely.
This release closes up a handful of corner cases in noq: path validation is timed more consistently when a new path opens, better handling of received data referring to abandoned paths, and a connection-accounting bug that could undercount active connections is fixed. Packet coalescing during the handshake is also more correct now, which matters most on networks that don't behave nicely.

The change from correctness to consistency is one that I think more appropriately describes the change, but if it leaves the reader confused just ignore it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it might make sense to mention the error messages that you'd used to see and say they're fixed.
So that'd be:

  • panicked at noq-1.0.1/src/endpoint.rs:648:17: attempt to subtract with overflow
  • panicked at noq-proto-1.0.1/src/connection/packet_builder.rs:159:9: assertion failed: max_size >= min_size

For the other bugfix, I unfortunately don't know what a bad trace would look like...


## Fewer confusing errors, less noise

A couple of small changes make failures easier to reason about. Connecting with an empty ALPN now gives you a clear error instead of a panic. Logs are quieter in a couple of places. Small stuff, but it adds up to a better experience when looking through logs to debug.

## Know when a connection is trustworthy

noq adds a new `Connection::authenticated` method that succeeds as soon as an 0-RTT connection is proven to not be a replay attack (and always succeeds immediately in a 1-RTT connection). We still have `Connection::handshake_confirmed`, which waits longer for the client to confirm the client-side authentication. Read more [here](https://docs.rs/noq/latest/noq/struct.Connection.html#method.authenticated)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm on the fence about explicitly coming from the great work done in quinn. On one hand, the commit was cherry-picked and Benjamin is noted as main author, on the other.. the commit is not here, and I'm not sure it's worth doing that every time. Is it enough to link the commit with his name, is something like
noq brings from the work of our friends at quinn instead of noq adds less "appropriating"?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given this blog post is about iroh 1.0.3, I'd consider perhaps not mentioning this at all as long as this API hasn't made it into iroh itself. There are very few people using noq directly.


## Better defaults out of the box

The `n0` preset now includes a pkarr resolver. This means that we now, by default, have a fallback if our normal DNS resolver fails.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The `n0` preset now includes a pkarr resolver. This means that we now, by default, have a fallback if our normal DNS resolver fails.
The `n0` preset now includes an HTTPS-based pkarr resolver. This means that we now, by default, have a fallback if our normal DNS-based resolver fails.


## What's next?

We expect the next few releases to keep this rhythm: happy maintenance releases every few weeks, with small fixes for corner cases and invisible improvements. As always, the full details are in the changelogs for [iroh](https://github.com/n0-computer/iroh/releases/tag/v1.0.3) and [noq](https://github.com/n0-computer/noq/releases/tag/noq-v1.1.0).

See you at the next release, and keep [filing](https://github.com/n0-computer/iroh/issues) those bugs!
Loading