v0.96.0
n0-computer/irohv0.96.0Jan 28, 2026by github-actions[bot]
AI Summary
Major release with significant API restructuring including Connection type parameters, renaming of discovery module to address_lookup, and removal of several types. Introduces EndpointHooks for connection event interception and adds support for multiple IP transports with interface filtering.
Key Highlights
- Connection now uses type parameters (Connection<HandshakeCompleted>, IncomingZeroRttConnection, OutgoingZeroRttConnection)
- Discovery module renamed to address_lookup with all related types renamed
- Removed ConnectionType in favor of TransportAddr with Relay/Ip variants
- New EndpointHooks feature for intercepting connection events
- Multiple IP transports support with interface filtering
- NetReport module made private, renamed to iroh::NetReport
Breaking Changes
- Removed enums: AddEndpointAddrError, GetMappingAddressError, ConnectionType, ControlMsg, AuthenticationError, DirectAddrInfo
- Removed structs: CryptoServerConfig, RetryError, WeakConnectionConfig
- Connection now has type parameter for handshake state
- Discovery module renamed to address_lookup (all types renamed)
- ServerConfig and TransportConfig refactored to newtype wrappers
- bind_addr_v4/v6 replaced with unified bind_addr method
- No longer falls back to random free port for unusable ports
- Bind addrs with prefix len 0 are now default routes
- Feature flags renamed: discovery-local-network to address-lookup-mdns, discovery-pkarr-dht to address-lookup-pkarr-dht
New Features
- Introduce EndpointHooks for connection event interception
- Add fast-apple-datapath feature enabled by default
- Allow multiple IP transports including filtering by interface
- Implement latency based connection updates
- Ping paths and trigger holepunching on network change
- Qlog support added
- Expose known remote addresses
- Relay only configuration support
- Improve RelayMap and RelayMode configuration
- Basic holepunch metrics
Full Release Notes
## ⚠️ Breaking Changes
### removed
- enum `iroh::endpoint::AddEndpointAddrError`
- enum `iroh::endpoint::GetMappingAddressError`
- mod `iroh::net_report`:
- struct `iroh::net_report::Metrics`
- enum `iroh::net_report::Probe`
- struct `iroh::net_report::RelayLatencies`
- struct `iroh::net_report::Options`
- struct `iroh::net_report::QuicConfig`
- enum `iroh::endpoint::ConnectionType` was removed, the closest equivalent is `iroh::TransportAddr`, which has variants `Relay` and `Ip`,- note: now that we can have multiple paths per connection, these types now describe *paths* not *connections*. Look at the `iroh::endpoint::Connection::paths` method and the `iroh::endpoint::PathInfo` struct for more details on how you can learn the type of the currently selected path.
- enum `iroh::endpoint::ControlMsg`
- enum `iroh::endpoint::AuthenticationError`
- enum `iroh::endpoint::AddEndpointAddrError`
- enum `iroh::endpoint::DirectAddrInfo`
- enum `iroh::endpoint::GetMappingAddressError`
- struct `iroh::endpoint::CryptoServerConfig`
- struct `iroh::endpoint::RetryError`
- struct `iroh::endpoint::WeakConnectionHandle`
- fn `iroh::endpoint::AuthenticationError::from(source: iroh_quinn_proto::connection::ConnectionError) -> Self`
- fn `iroh::endpoint::Endpoint::conn_type(&self, endpoint_id: iroh_base::key::EndpointId) -> Option<n0_watcher::Direct<iroh::endpoint::ConnectionType>>`
- fn `iroh::endpoint::Endpoint::latency(&self, endpoint_id: iroh_base::key::EndpointId) -> Option<core::time::Duration>`
- variant `iroh::endpoint::AuthenticationErrro::ConnectionError`
- variant `iroh::endpoint::ConnectWithOptsError::AddEndpointAddr`
- variant `iroh::endpoint::Source::Saved`
### Changed
Connection Changes
- struct `iroh::endpoint::Connection` now has a type parameter:
- `iroh::endpoint::Connection` is aliased from `Connection<HandshakeCompleted>`
- `iroh::endpoint::IncomingZeroRttConnection` is aliased from `Connection<IncomingZeroRtt>`
- `iroh::endpoint::IncomingZeroRttConnection` is aliased from `Connection<OutgoingZeroRtt>`
- fn `iroh::endpoint::Incoming::accept_with(self, server_config: Arc<iroh_quinn_proto::config::ServerConfig>) -> Result<iroh::endpoint::Accepting, iroh_quinn_proto::connection::ConnectionError>` changed to `iroh::endpoint::Incoming::accept_with(self, server_config: Arc<iroh::endpoint::ServerConfig) -> Result<iroh::endpoint::Accepting, iroh::endpoint::ConnectionError>`
- fn `iroh::endpoint::Incoming::retry(self) -> core::result::Result<(), iroh_quinn::incoming::RetryError>` changed to `iroh::endpoint::Incoming::retry(self) -> Result<(), iroh::endpoin::RetryError>`
- variant `iroh::endpoint::ConnectWithOptsError::NoAddress: source iroh::endpoint::GetMappingAddressError` changed to `iroh::endpoint::ConnectWithOptsError::NoAddress: source iroh::discovery::DiscoveryError`
Net Report
- struct `iroh::net_report::Report` is now `iroh::NetReport`
- const `iroh::net_report::TIMEOUT` is now `iroh::NET_REPORT_TIMEOUT`
Server & Transport Config
- struct `iroh::endpoint::ServerConfig`, use the `iroh::endpoint::Endpoint::create_server_config_builder` to get a `ServerConfigBuilder`, which allows you to add custom configuration for when the endpoint acts as a server that accepts connections
- struct `iroh::endpoint::TransportConfig` is now `iroh::endpoint::QuicTransportConfig`, use the `iroh::endpoint::QuicTransportConfig::builder` method to get a `QuicTransportConfigBuilder` to add custom configuration for the QUIC transport
- fn `iroh::endpoint::Builder::transport_config(self, transport_config: iroh_quinn_proto::config::transport::TransportConfig) -> Self` changed to `fn iroh::endpoint::Builder::transport_config(self, transport_config: iroh::endpoint::QuicTransportConfig) -> Self`
Bind Address
- `iroh::endpoint::Builder::bind_addr_v4(self, addr: SocketAddrV4)` was replaced by `iroh::endpoint::Builder::bind_addr(self, addr: ToSocketAddr)-> Result<Self, InvalidSocketAddr>`
- `iroh::endpoint::Builder::bind_addr_v6(self, addr: SocketAddrV6)` was replaced by `iroh::endpoint::Builder::bind_addr(self, addr: ToSocketAddr)-> Result<Self, InvalidSocketAddr>`
Metrics
- `iroh::metrics::MagicsockMetrics` has entirely new set of fields
Discovery → AddressLookup
- module `iroh::discovery` renamed to `iroh::address_lookup`
- trait `iroh::discovery::Discovery` renamed to `iroh::address_lookup::AddressLookup`
- fn `iroh::endpoint::Endpoint::discovery` renamed to `iroh::endpoint::Endpoint::address_lookup`
- fn `iroh::endpoint::Builder::set_user_data_for_discovery` renamed to `iroh::endpoint::Builder::set_user_data_for_address_lookup`
- fn `iroh::endpoint::Builder::discovery` renamed to `iroh::endpoint::Builder::address_lookup`
- struct `iroh::discovery::MdnsDiscovery` renamed to `iroh::address_lookup::MdnsAddressLookup`
- struct `iroh::discovery::DhtDiscovery` renamed to `iroh::address_lookup::DhtAddressLookup`
- struct `iroh::discovery::StaticDiscovery` renamed to `iroh::address_lookup::MemoryLookup`
- trait `iroh::discovery::DynIntoDiscovery` renamed to `iroh::address_lookup::DynIntoAddressLookup`
- trait `iroh::discovery::IntoDiscovery` renamed to `iroh::address_lookup::IntoAddressLookup`
- struct `iroh::discovery::DnsDiscovery` renamed to `iroh::address_lookup::DnsAddressLookup`
- enum `iroh::discovery::DiscoveryError` renamed to `iroh::address_lookup::AddressLookupError`
- enum `iroh::discovery::IntoDiscoveryError` renamed to `iroh::address_lookup::IntoAddressLookupError`
- struct `iroh::discovery::DiscoveryItem` renamed to `iroh::address_lookup::AddressLookupItem`
- struct `iroh::discovery::ConcurrentDiscovery` renamed to `iroh::address_lookup::ConcurrentAddressLookup`
- feature `discovery-local-network` renamed to `address-lookup-mdns`
- feature `discovery-pkarr-dht` renamed to `address-lookup-pkarr-dht`
## ⛰️ Features
- *(example)* Improve path stat printing in transfer example ([#3860](https://github.com/n0-computer/iroh/issues/3860)) - ([c168e73](https://github.com/n0-computer/iroh/commit/c168e7322ea6745d3846f8e2dbfab2992e83e429))
- *(iroh)* Introduce EndpointHooks ([#3688](https://github.com/n0-computer/iroh/issues/3688)) - ([1efd2b5](https://github.com/n0-computer/iroh/commit/1efd2b5aabba1bf1456c02a857ee4e588f1ab65c))
- *(iroh)* Add fast-apple-datapath feature and enable it by default ([#3724](https://github.com/n0-computer/iroh/issues/3724)) - ([a5f4a08](https://github.com/n0-computer/iroh/commit/a5f4a0821348afce88c96bdb5bc741be03efd1b8))
- *(iroh)* [**breaking**] Encapsulate the `quinn::TransportConfig` to enforce certain minimums when used with multipath ([#3721](https://github.com/n0-computer/iroh/issues/3721)) - ([cc932ef](https://github.com/n0-computer/iroh/commit/cc932eff9f6153edc396bc08b5e049d88888a0aa))
- *(iroh)* Improve shutdown handling - ([bb3e94a](https://github.com/n0-computer/iroh/commit/bb3e94a09ded9b5a3b3ae914f842cf667960a1fa))
- *(iroh)* [**breaking**] Newtype `ServerConfig` and `RetryError`, organize the quinn re-exports ([#3757](https://github.com/n0-computer/iroh/issues/3757)) - ([aa6b918](https://github.com/n0-computer/iroh/commit/aa6b9180b6bff0069d8d29db923d95b2c56d5c02))
- *(iroh)* Implement latency based connection updates ([#3797](https://github.com/n0-computer/iroh/issues/3797)) - ([5cb5716](https://github.com/n0-computer/iroh/commit/5cb5716185a233eaffe735aa591ef58962916849))
- *(iroh)* Ping paths and trigger holepunching on networkchange ([#3796](https://github.com/n0-computer/iroh/issues/3796)) - ([ff24cfc](https://github.com/n0-computer/iroh/commit/ff24cfce2a632ee8f830952a96f69a4620537707))
- *(iroh)* [**breaking**] Allow multiple IP transports, including filtering by interface ([#3692](https://github.com/n0-computer/iroh/issues/3692)) - ([2359acf](https://github.com/n0-computer/iroh/commit/2359acfd44d31981c751f9c599a1c644075d53dc))
- *(metrics)* Add connection latency tracking ([#3606](https://github.com/n0-computer/iroh/issues/3606)) - ([b7e5bb0](https://github.com/n0-computer/iroh/commit/b7e5bb0035418178b32fe4ac24a7453feaa30ebc))
- *(multipath)* Add back basic metrics ([#3672](https://github.com/n0-computer/iroh/issues/3672)) - ([faa2119](https://github.com/n0-computer/iroh/commit/faa21194a081249bd494aa72e8ed63227c938a8c))
- *(relay,dns)* Add healthz routes ([#3783](https://github.com/n0-computer/iroh/issues/3783)) - ([31a6b10](https://github.com/n0-computer/iroh/commit/31a6b10e0cc6332e804ac37922e01181d9f27b58))
- Do not force relay URLs to be absolute ([#3623](https://github.com/n0-computer/iroh/issues/3623)) - ([9bae228](https://github.com/n0-computer/iroh/commit/9bae228190f0b55d88b3ecd79c8d9d822bfa3dbb))
- Add AcceptError::from_boxed ([#3620](https://github.com/n0-computer/iroh/issues/3620)) - ([280cfc6](https://github.com/n0-computer/iroh/commit/280cfc6df3c074d91272691660d09f150d9f48db))
- Relay only configuration - ([7f17d98](https://github.com/n0-computer/iroh/commit/7f17d983829a90a54a3f09286630448112a391fb))
- Instead of duplicating the entire connection API, have a type parameter ([#3619](https://github.com/n0-computer/iroh/issues/3619)) - ([5809a56](https://github.com/n0-computer/iroh/commit/5809a566a15d24e66d2f66d4174f59002dd94ef4))
- Prune old, inactive paths ([#3666](https://github.com/n0-computer/iroh/issues/3666)) - ([7fb80b9](https://github.com/n0-computer/iroh/commit/7fb80b9beda1eaabfedd73309ccf471279ba4f4b))
- Qlog support in iroh - ([2d9681c](https://github.com/n0-computer/iroh/commit/2d9681cc85890792668be14ed12cba23ad974448))
- Expose known remote addrs ([#3752](https://github.com/n0-computer/iroh/issues/3752)) - ([4c4f242](https://github.com/n0-computer/iroh/commit/4c4f242818ae5b75e89e187fd2e6d3733a6c0f10))
- Add must_use attributes to Router::spawn ([#3772](https://github.com/n0-computer/iroh/issues/3772)) - ([0a9b7a0](https://github.com/n0-computer/iroh/commit/0a9b7a0ca3bd2b859b5f2df4370dcd4d7c0506df))
- Improve RelayMap and RelayMode configuration ([#3734](https://github.com/n0-computer/iroh/issues/3734)) - ([c0dacd0](https://github.com/n0-computer/iroh/commit/c0dacd09489569c90ef17032382fedf008292996))
- Basic holepunch metrics ([#3748](https://github.com/n0-computer/iroh/issues/3748)) - ([37bda14](https://github.com/n0-computer/iroh/commit/37bda145a2c3091cf06ae36aa0ca98300dcbd9ea))
- Update to released iroh-quinn ([#3834](https://github.com/n0-computer/iroh/issues/3834)) - ([e25c5da](https://github.com/n0-computer/iroh/commit/e25c5da002cdbb2b60666860cba4626442e9a5c2))
## 🐛 Bug Fixes
- *(ci)* Better cli caching ([#3779](https://github.com/n0-computer/iroh/issues/3779)) - ([94caac0](https://github.com/n0-computer/iroh/commit/94caac026e7ed96b4cce1a87a9c8ac1d360d7750))
- *(deps)* Update to newest quinn main and fix api usage ([#3802](https://github.com/n0-computer/iroh/issues/3802)) - ([8e9b5c0](https://github.com/n0-computer/iroh/commit/8e9b5c03b0a8f368d45584f678acf8a2bc6bb05d))
- *(docs)* Fix link to EndpointTicket ([#3814](https://github.com/n0-computer/iroh/issues/3814)) - ([ccf876e](https://github.com/n0-computer/iroh/commit/ccf876e0477fba4df076535ea33ffa42feb4b894))
- *(iroh)* Typo(s) ([#3630](https://github.com/n0-computer/iroh/issues/3630)) - ([1cc5897](https://github.com/n0-computer/iroh/commit/1cc5897c4c94075d60123350ee49f206cfea5f09))
- *(iroh)* Clear `EndpointStateActor::selected_path` once the last connection closes ([#3650](https://github.com/n0-computer/iroh/issues/3650)) - ([4b6824c](https://github.com/n0-computer/iroh/commit/4b6824c8a72e5d7efe5f3a14fcc7214a5b27bcdb))
- *(iroh)* [**breaking**] Correct the error structure ([#3663](https://github.com/n0-computer/iroh/issues/3663)) - ([dab9d5f](https://github.com/n0-computer/iroh/commit/dab9d5f229c558a6faf1f331b4a02de3500c3aa2))
- *(iroh)* Only switch paths if the new path is actually better - ([fbdf2c7](https://github.com/n0-computer/iroh/commit/fbdf2c75db1b26ceada4e61451803ec301458348))
- *(iroh)* Accurately set `RecvMeta::dst_ip`, remove `normalized_local_addr` ([#3770](https://github.com/n0-computer/iroh/issues/3770)) - ([692bb53](https://github.com/n0-computer/iroh/commit/692bb53b6767a29dfd262259ee448f3cc0fff43b))
- *(iroh)* Ensure the selected holepunched path is set to `PathStatus::Available` ([#3771](https://github.com/n0-computer/iroh/issues/3771)) - ([561d2fd](https://github.com/n0-computer/iroh/commit/561d2fdfa87f603333aa2d4da89fc7538d0de76e))
- *(iroh)* Retry holepunching - ([a58aff4](https://github.com/n0-computer/iroh/commit/a58aff4e20f74647b472f12ebef8ee765770f6a2))
- *(iroh)* Improve handling of no available transports - ([5e79a56](https://github.com/n0-computer/iroh/commit/5e79a56765e076be96d33176db59add86b6f300a))
- *(iroh)* Actually use user-provided bind addrs ([#3835](https://github.com/n0-computer/iroh/issues/3835)) - ([fecc909](https://github.com/n0-computer/iroh/commit/fecc90994ba9add79c6a0ddcd28f276f8f184afa))
- *(iroh)* Properly set quinn paths to available when holepunched ([#3864](https://github.com/n0-computer/iroh/issues/3864)) - ([a774841](https://github.com/n0-computer/iroh/commit/a7748411dfb361a68e44376347e340b0bfd669e5))
- *(iroh-bench)* Gracefully close the quinn benchmark ([#3621](https://github.com/n0-computer/iroh/issues/3621)) - ([0799d4f](https://github.com/n0-computer/iroh/commit/0799d4f41ea7c7358c06aec1c48c9b217db02441))
- *(iroh-dns-server)* Inverted validation logic in DoH JSON response handler ([#3737](https://github.com/n0-computer/iroh/issues/3737)) - ([2efbff6](https://github.com/n0-computer/iroh/commit/2efbff6a21398753136cb1c8aed4e63d86e625d5))
- *(multipath)* Fix remote state actor termination ([#3676](https://github.com/n0-computer/iroh/issues/3676)) - ([d328bf2](https://github.com/n0-computer/iroh/commit/d328bf231307e98d3d9d8fb7b5d406f79418e645))
- *(tests)* Also run the tests in isolation in the default profile ([#3664](https://github.com/n0-computer/iroh/issues/3664)) - ([13fe787](https://github.com/n0-computer/iroh/commit/13fe7873160b46e36698d9398bb09f89083698ff))
- Stop polling transports when the magicsock is closing ([#3615](https://github.com/n0-computer/iroh/issues/3615)) - ([e101d26](https://github.com/n0-computer/iroh/commit/e101d26a9cc68f461c082f624cfd44b3f49ca46d))
- Update to main net-tools ([#3726](https://github.com/n0-computer/iroh/issues/3726)) - ([1d6e453](https://github.com/n0-computer/iroh/commit/1d6e453db9b57153cc59c8d00633145f4452e697))
- Update deny warnings ([#3819](https://github.com/n0-computer/iroh/issues/3819)) - ([99242af](https://github.com/n0-computer/iroh/commit/99242af88373d3b1bb136bf7af1f67f418d94f4e))
## 🚜 Refactor
- *(deps)* Remove rustls-pemfile ([#3747](https://github.com/n0-computer/iroh/issues/3747)) - ([06772c3](https://github.com/n0-computer/iroh/commit/06772c396822bfd34625c885e9ecead83d4798ff))
- *(example)* Reduce timeouts and add close - ([e750ccf](https://github.com/n0-computer/iroh/commit/e750ccf259a1a09ae97055729cb71cbf75e9acb5))
- *(iroh)* Simplify internal transports sending ([#3708](https://github.com/n0-computer/iroh/issues/3708)) - ([8d56889](https://github.com/n0-computer/iroh/commit/8d568895c16cd0c2ff67b072e65f663fe7268766))
- *(iroh)* Avoid storing the TransportsSender ([#3712](https://github.com/n0-computer/iroh/issues/3712)) - ([3f4d365](https://github.com/n0-computer/iroh/commit/3f4d365740d05b4b930e3cf6c0d70d1aafa620d3))
- *(iroh)* [**breaking**] Remove Endpoint::latency ([#3717](https://github.com/n0-computer/iroh/issues/3717)) - ([783e2ef](https://github.com/n0-computer/iroh/commit/783e2ef5d56ece910ba0f49c731c852929667e25))
- *(iroh)* [**breaking**] Make net-report private ([#3758](https://github.com/n0-computer/iroh/issues/3758)) - ([5b616f0](https://github.com/n0-computer/iroh/commit/5b616f045fa11125b46cb18ac4b07c5b29b3920e))
- *(iroh)* Do not export quinn-proto encoding traits ([#3803](https://github.com/n0-computer/iroh/issues/3803)) - ([f12467b](https://github.com/n0-computer/iroh/commit/f12467b7e494a0778bde3b76ffb1b56aa6824851))
- *(iroh)* Spawn `RemoteStateActor` in `JoinSet` and remove `guarded_channel.rs` ([#3681](https://github.com/n0-computer/iroh/issues/3681)) - ([37f69e0](https://github.com/n0-computer/iroh/commit/37f69e03577cd088f9ecf0b467c052a828664c8f))
- *(iroh)* [**breaking**] Improve BindError ([#3837](https://github.com/n0-computer/iroh/issues/3837)) - ([acbca8c](https://github.com/n0-computer/iroh/commit/acbca8cc3032f8f8654f34a154a491930d4e52b8))
- *(iroh)* [**breaking**] No longer fall back to a random free port when using `endpoint::Builder::bind_addr` with an unusable port ([#3836](https://github.com/n0-computer/iroh/issues/3836)) - ([f2b6026](https://github.com/n0-computer/iroh/commit/f2b6026d70fd5431054a1bfed410af2b8d863be1))
- *(iroh)* [**breaking**] Bind addrs with prefix len 0 are default routes ([#3838](https://github.com/n0-computer/iroh/issues/3838)) - ([e0fcf7d](https://github.com/n0-computer/iroh/commit/e0fcf7dba99a96566523756be08508390965cda3))
- *(iroh)* Remove mutexes from `RemoteMap` ([#3841](https://github.com/n0-computer/iroh/issues/3841)) - ([99268b8](https://github.com/n0-computer/iroh/commit/99268b8d515e14d397796191d8ec7cb5f869d1da))
- *(iroh)* Move socket actor_sender out of shared socket state ([#3890](https://github.com/n0-computer/iroh/issues/3890)) - ([a738ac7](https://github.com/n0-computer/iroh/commit/a738ac7788a7f837eebd856824d45d32ff94e487))
- *(iroh-dns-server)* [**breaking**] Add storage path config and add tests for DNS-over-HTTPS ([#3745](https://github.com/n0-computer/iroh/issues/3745)) - ([3bf1e24](https://github.com/n0-computer/iroh/commit/3bf1e24d24179d890a5191a6bfa2a9eb586dda19))
- *(multipath)* Make registering connections with the magicsock async ([#3629](https://github.com/n0-computer/iroh/issues/3629)) - ([e0f10ce](https://github.com/n0-computer/iroh/commit/e0f10ce7f2d645bded18621ef5b7ca31ff1ad721))
- *(multipath)* Stop inactive endpoint actors ([#3643](https://github.com/n0-computer/iroh/issues/3643)) - ([25fe805](https://github.com/n0-computer/iroh/commit/25fe805979806b8102ab5b00e98ce96e6e0ab1c7))
- *(multipath)* Rename EndpointMap/EndpointState to RemoteMap/RemoteState ([#3673](https://github.com/n0-computer/iroh/issues/3673)) - ([34f52c6](https://github.com/n0-computer/iroh/commit/34f52c65f2c12f451d8be48cd3c5e0a0e2f4cc1e))
- *(multipath)* Move discovery into `EndpointStateActor` ([#3645](https://github.com/n0-computer/iroh/issues/3645)) - ([01545ee](https://github.com/n0-computer/iroh/commit/01545ee6b0ec5355f95a478220182699c0ad2d84))
- Improve path watching, add path stats ([#3622](https://github.com/n0-computer/iroh/issues/3622)) - ([d1c1dab](https://github.com/n0-computer/iroh/commit/d1c1dab01eb3963a901bb34510e2423cf877ffb9))
- Minor cleanups in endpoint state ([#3626](https://github.com/n0-computer/iroh/issues/3626)) - ([7887fb5](https://github.com/n0-computer/iroh/commit/7887fb599541ce5268471cb89879d83f449e9202))
- Use Connection::on_closed in endpoint state actor ([#3627](https://github.com/n0-computer/iroh/issues/3627)) - ([1d5937c](https://github.com/n0-computer/iroh/commit/1d5937ca8624077d5e346f1198339e7712ea2406))
- Remove the TransportsSenderActor - ([6380246](https://github.com/n0-computer/iroh/commit/638024621cf2c414f0f3775afb44c6e446263c55))
- Disallow certain Source variants to be constructed externally - ([50fdda3](https://github.com/n0-computer/iroh/commit/50fdda393a9a58c352cec05c859d603edbbae030))
- Remove Endpoint::conn_type ([#3647](https://github.com/n0-computer/iroh/issues/3647)) - ([2f924d9](https://github.com/n0-computer/iroh/commit/2f924d90f903e029045432d7762db976934ccd8c))
- Use boxed watcher, not watchable, on connection ([#3632](https://github.com/n0-computer/iroh/issues/3632)) - ([492b74e](https://github.com/n0-computer/iroh/commit/492b74ea4d43d6245b6b5c822265ec008e38ea22))
- Remove Endpoint::path_selection ([#3668](https://github.com/n0-computer/iroh/issues/3668)) - ([1a7a88b](https://github.com/n0-computer/iroh/commit/1a7a88b113cea094ee75690d06a5b588d08f303e))
- Prefer EndpointAddr::from_parts over EndpointAddr { ... } ([#3662](https://github.com/n0-computer/iroh/issues/3662)) - ([25c2d4d](https://github.com/n0-computer/iroh/commit/25c2d4d85cc2719e5361edd622a06d1ffa48b3eb))
- Add Side re-export ([#3739](https://github.com/n0-computer/iroh/issues/3739)) - ([136ff04](https://github.com/n0-computer/iroh/commit/136ff041f54a08074a5149dae0fb19214b1ea365))
- Use qlog_from_env in iroh bench ([#3743](https://github.com/n0-computer/iroh/issues/3743)) - ([3eff16d](https://github.com/n0-computer/iroh/commit/3eff16d41307c02ef230687056400717d9ce0da9))
- Adapt to new UnorderedRecvStream in iroh-quinn - ([952b50e](https://github.com/n0-computer/iroh/commit/952b50eaf0a55d422f29960d11ab3f3d76d2eeda))
- [**breaking**] Goodbye magic ([#3887](https://github.com/n0-computer/iroh/issues/3887)) - ([2d8b2d4](https://github.com/n0-computer/iroh/commit/2d8b2d4904b39442184981768200ce045ca7f5f1))
## 📚 Documentation
- *(endpoint::Builder)* Clarify that clearing relay transport doesn't alter holepunching ([#3833](https://github.com/n0-computer/iroh/issues/3833)) - ([52c4284](https://github.com/n0-computer/iroh/commit/52c4284eebe749c94374830e3f9f8423d2018f3f))
- *(iroh)* Improve builder docs about discovery ([#3801](https://github.com/n0-computer/iroh/issues/3801)) - ([56fc0f7](https://github.com/n0-computer/iroh/commit/56fc0f73ab54f86e015dd1fa938198ec52d18d86))
- *(iroh)* Add detail & example to online method ([#3722](https://github.com/n0-computer/iroh/issues/3722)) - ([94f8a83](https://github.com/n0-computer/iroh/commit/94f8a83121baa7e9c9ce42643aed83f6cbe5b345))
- *(iroh-relay)* Add section on how to use as a library ([#3715](https://github.com/n0-computer/iroh/issues/3715)) - ([40a5ce6](https://github.com/n0-computer/iroh/commit/40a5ce6618f5f00d64832222b323acda27244c0d))
## ⚡ Performance
- Various improvements - ([8d819f0](https://github.com/n0-computer/iroh/commit/8d819f08d1e7fb7ea0dd7d98f0657c42b66d4c87))
## 🧪 Testing
- *(iroh)* Fix `test_two_devices_setup_teardown` hanging ([#3675](https://github.com/n0-computer/iroh/issues/3675)) - ([59a7e85](https://github.com/n0-computer/iroh/commit/59a7e851fdb5c40b5000beeeb4aa8470610a9f33))
- *(iroh)* Fix `test_active_relay_inactive` test being flaky ([#3680](https://github.com/n0-computer/iroh/issues/3680)) - ([160d535](https://github.com/n0-computer/iroh/commit/160d535b185716323c6a507759f829412c50a689))
- *(iroh)* Fix doctests for bind_addr to use port 0 ([#3839](https://github.com/n0-computer/iroh/issues/3839)) - ([0dba0ff](https://github.com/n0-computer/iroh/commit/0dba0ff701b6c742290a3f9478078fa07698b448))
- *(iroh)* Reduce flakyness of holepunching test ([#3877](https://github.com/n0-computer/iroh/issues/3877)) - ([8ed8cfa](https://github.com/n0-computer/iroh/commit/8ed8cfaa4cafa942319ffa28cee10d3c1b7619e2))
- Mark test_active_relay_inactive as non flaky - ([e620b5e](https://github.com/n0-computer/iroh/commit/e620b5effcd7205d11a7d5e4ed89b4fa72bcf2ff))
- Reduce testing rounds in potentially slow tests ([#3782](https://github.com/n0-computer/iroh/issues/3782)) - ([45a8b7d](https://github.com/n0-computer/iroh/commit/45a8b7d8b06ef87aacabc192ddb803c340afc699))
- Improve timeouts for shutdown and reduce some more test rounds - ([95dee08](https://github.com/n0-computer/iroh/commit/95dee086dd3b27d5ff4bfa7e3020694b37c5211c))
## ⚙️ Miscellaneous Tasks
- *(ci)* Cache more deps ([#3773](https://github.com/n0-computer/iroh/issues/3773)) - ([f0ab853](https://github.com/n0-computer/iroh/commit/f0ab85374da0eed79ba754d2d21b712a4b52e60b))
- *(ci)* Improve netsim perf and logging + update to lld ([#3793](https://github.com/n0-computer/iroh/issues/3793)) - ([f0e5094](https://github.com/n0-computer/iroh/commit/f0e50945d55e1e76535c36c25db2e60dadfaf1af))
- *(dependabot)* Skip patch versions ([#3885](https://github.com/n0-computer/iroh/issues/3885)) - ([6975379](https://github.com/n0-computer/iroh/commit/697537920ede4c46584d93b7a57a3884fbdd2e1b))
- Only patch quinn directly - ([1a5c4dd](https://github.com/n0-computer/iroh/commit/1a5c4dd58166feb2439564e25f6b945860b9d18e))
- Fixup deny - ([d0707e8](https://github.com/n0-computer/iroh/commit/d0707e88fada54e6d6e63c8a4b1e2868909bd7ff))
- Fixup wasm test - ([a28d1fb](https://github.com/n0-computer/iroh/commit/a28d1fb89d4f2128b23d4aa84ab023f830df5cc6))
- Update to quinn@main-iroh ([#3716](https://github.com/n0-computer/iroh/issues/3716)) - ([e22c001](https://github.com/n0-computer/iroh/commit/e22c0018d6aa2219442c08bd8c20887736cf92e9))
- Update iroh-quinn ([#3718](https://github.com/n0-computer/iroh/issues/3718)) - ([2cf93a5](https://github.com/n0-computer/iroh/commit/2cf93a5abfb3e8d3c67ba63bc80911a9c4445be3))
- Cargo update ([#3744](https://github.com/n0-computer/iroh/issues/3744)) - ([dd280b8](https://github.com/n0-computer/iroh/commit/dd280b81ea73967ffb9410eda2b19d4ce2613d83))
- Update iroh-quinn ([#3753](https://github.com/n0-computer/iroh/issues/3753)) - ([9e34569](https://github.com/n0-computer/iroh/commit/9e345697799fb471f4319b78f1b8730ad08b8743))
- Update quinn to use main branch ([#3777](https://github.com/n0-computer/iroh/issues/3777)) - ([ff7118e](https://github.com/n0-computer/iroh/commit/ff7118eb1a87211de503a6d61ad1776408c3c971))
- Update quinn ([#3781](https://github.com/n0-computer/iroh/issues/3781)) - ([116513d](https://github.com/n0-computer/iroh/commit/116513d4182ccdc2aa83d73841bd36dcb2be87d8))
- Switch from tracing-test to n0-tracing-test ([#3787](https://github.com/n0-computer/iroh/issues/3787)) - ([e45600b](https://github.com/n0-computer/iroh/commit/e45600b5eb8ea493ef508d4fbb746bafe535f43a))
- Update to latest iroh-quinn ([#3795](https://github.com/n0-computer/iroh/issues/3795)) - ([b68c057](https://github.com/n0-computer/iroh/commit/b68c057344c36e9f42de7bf76cd114f885bae52e))
- [**breaking**] Rename `Discovery` to `AddressLookup` ([#3853](https://github.com/n0-computer/iroh/issues/3853)) - ([6ad5ac4](https://github.com/n0-computer/iroh/commit/6ad5ac4238a3cc101791922167aab952d4c99c1e))
- Release prep ([#3889](https://github.com/n0-computer/iroh/issues/3889)) - ([9130711](https://github.com/n0-computer/iroh/commit/91307115997027fd05bcea5bf5ada703c08f4492))
## Bench
- Add ipv6 option and metrics feature - ([147e6bb](https://github.com/n0-computer/iroh/commit/147e6bb248fa4fc9f364e9d9ffef62242e69f679))
## Deps
- *(multipath)* Bump netdev ([#3667](https://github.com/n0-computer/iroh/issues/3667)) - ([6ef582d](https://github.com/n0-computer/iroh/commit/6ef582dc32942a008aca6ac350597d61391ebb73))
- Bump quinn in feat-multipath ([#3723](https://github.com/n0-computer/iroh/issues/3723)) - ([51ba699](https://github.com/n0-computer/iroh/commit/51ba6998d94e03e998d10b0377b5dd4460b8d4b5))
## Example
- Add qlog support to transfer example - ([6bca5d0](https://github.com/n0-computer/iroh/commit/6bca5d0f43b1687b3044ea08532e12efe4eb2ea3))
- *(iroh)* In transfer example print stats independent of endpoint shutdown ([#3872](https://github.com/n0-computer/iroh/issues/3872)) - ([5c4b9b4](https://github.com/n0-computer/iroh/commit/5c4b9b433f5eaa74b190bc7cd7dcc82de82368e6))
- Improve transfer example ([#3873](https://github.com/n0-computer/iroh/issues/3873)) - ([f4bfc9d](https://github.com/n0-computer/iroh/commit/f4bfc9d7b77fdfc2202f93048cefa1b70728846e))
## Multipath
- Merge main ([#3674](https://github.com/n0-computer/iroh/issues/3674)) - ([d538b11](https://github.com/n0-computer/iroh/commit/d538b11a4e437207d97100f21f12901d5a194122))