master
md 644 lines 50.2 KB
Rendered Raw
1 # Kubo changelog v0.40
2
3 <a href="https://ipshipyard.com/"><img align="right" src="https://github.com/user-attachments/assets/39ed3504-bb71-47f6-9bf8-cb9a1698f272" /></a>
4
5 This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
6
7 - [v0.40.0](#v0400)
8 - [v0.40.1](#v0401)
9
10 ## v0.40.0
11
12 [<img align="right" width="256px" src="https://github.com/user-attachments/assets/c065d5e5-2a8a-4651-8142-d7baf3106623" />](https://github.com/user-attachments/assets/c065d5e5-2a8a-4651-8142-d7baf3106623)
13
14 - [Overview](#overview)
15 - [🔦 Highlights](#-highlights)
16 - [🔢 IPIP-499: UnixFS CID Profiles](#-ipip-499-unixfs-cid-profiles)
17 - [🧹 Automatic cleanup of interrupted imports](#-automatic-cleanup-of-interrupted-imports)
18 - [🌍 Light clients can now use your node for delegated routing](#-light-clients-can-now-use-your-node-for-delegated-routing)
19 - [📊 See total size when pinning](#-see-total-size-when-pinning)
20 - [🔀 IPIP-523: `?format=` takes precedence over `Accept` header](#-ipip-523-format-takes-precedence-over-accept-header)
21 - [🚫 IPIP-524: Gateway codec conversion disabled by default](#-ipip-524-gateway-codec-conversion-disabled-by-default)
22 - [✅ More reliable IPNS over PubSub](#-more-reliable-ipns-over-pubsub)
23 - [🗄️ New `ipfs diag datastore` commands](#️-new-ipfs-diag-datastore-commands)
24 - [🔍 New `ipfs swarm addrs autonat` command](#-new-ipfs-swarm-addrs-autonat-command)
25 - [🚇 Improved `ipfs p2p` tunnels with foreground mode](#-improved-ipfs-p2p-tunnels-with-foreground-mode)
26 - [📊 Friendlier `ipfs dag stat` output](#-friendlier-ipfs-dag-stat-output)
27 - [🔑 `ipfs key` improvements](#-ipfs-key-improvements)
28 - [🤝 More reliable content providing after startup](#-more-reliable-content-providing-after-startup)
29 - [🌐 No unnecessary DNS lookups for AutoTLS addresses](#-no-unnecessary-dns-lookups-for-autotls-addresses)
30 - [⏱️ Configurable gateway request duration limit](#️-configurable-gateway-request-duration-limit)
31 - [🔧 Recovery from corrupted MFS root](#-recovery-from-corrupted-mfs-root)
32 - [📡 RPC `Content-Type` headers for binary responses](#-rpc-content-type-headers-for-binary-responses)
33 - [🔖 New `ipfs name get|put` commands](#-new-ipfs-name-getput-commands)
34 - [📋 Long listing format for `ipfs ls`](#-long-listing-format-for-ipfs-ls)
35 - [🖥️ WebUI Improvements](#-webui-improvements)
36 - [📉 Fixed Prometheus metrics bloat on popular subdomain gateways](#-fixed-prometheus-metrics-bloat-on-popular-subdomain-gateways)
37 - [📢 libp2p announces all interface addresses](#-libp2p-announces-all-interface-addresses)
38 - [🗑️ Badger v1 datastore slated for removal this year](#-badger-v1-datastore-slated-for-removal-this-year)
39 - [🐹 Go 1.26](#-go-126)
40 - [📦️ Dependency updates](#-dependency-updates)
41 - [📝 Changelog](#-changelog)
42 - [👨‍👩‍👧‍👦 Contributors](#-contributors)
43
44 ### Overview
45
46 This release brings reproducible file imports (CID Profiles), automatic cleanup of interrupted operations, better connectivity diagnostics, and improved gateway behavior. It also ships with Go 1.26, lowering memory usage and GC overhead across the board.
47
48 ### 🔦 Highlights
49
50 #### 🔢 IPIP-499: UnixFS CID Profiles
51
52 CID Profiles are presets that pin down how files get split into blocks and organized into directories, so you get the same CID for the same data across different software or versions. Defined in [IPIP-499](https://specs.ipfs.tech/ipips/ipip-0499/).
53
54 **New configuration [profiles](https://github.com/ipfs/kubo/blob/master/docs/config.md#profiles)**
55
56 - `unixfs-v1-2025`: modern CIDv1 profile with improved defaults
57 - `unixfs-v0-2015` (alias `legacy-cid-v0`): best-effort legacy CIDv0 behavior
58
59 Apply with: `ipfs config profile apply unixfs-v1-2025`
60
61 The `test-cid-v1` and `test-cid-v1-wide` profiles have been removed. Use `unixfs-v1-2025` or manually set specific `Import.*` settings instead.
62
63 **New [`Import.*`](https://github.com/ipfs/kubo/blob/master/docs/config.md#import) options**
64
65 - `Import.UnixFSHAMTDirectorySizeEstimation`: estimation mode (`links`, `block`, or `disabled`)
66 - `Import.UnixFSDAGLayout`: DAG layout (`balanced` or `trickle`)
67
68 **New [`ipfs add`](https://docs.ipfs.tech/reference/kubo/cli/#ipfs-add) CLI flags**
69
70 - `--dereference-symlinks` resolves all symlinks to their target content, replacing the deprecated `--dereference-args` which only resolved CLI argument symlinks
71 - `--empty-dirs` / `-E` controls inclusion of empty directories (default: true)
72 - `--hidden` / `-H` includes hidden files (default: false)
73 - `--trickle` implicit default can be adjusted via `Import.UnixFSDAGLayout`
74
75 **`ipfs files write` fix for CIDv1 directories**
76
77 When writing to MFS directories that use CIDv1 (via `--cid-version=1` or `ipfs files chcid`), single-block files now produce raw block CIDs (like `bafkrei...`), matching the behavior of `ipfs add --raw-leaves`. Previously, MFS would wrap single-block files in dag-pb even when raw leaves were enabled. CIDv0 directories continue to use dag-pb.
78
79 **Block size limit raised to 2MiB**
80
81 `ipfs block put`, `ipfs dag put`, and `ipfs dag import` now accept blocks up to 2MiB without `--allow-big-block`, matching the [bitswap spec](https://specs.ipfs.tech/bitswap-protocol/#block-sizes). The previous 1MiB limit was too restrictive and broke `ipfs dag import` of 1MiB-chunked non-raw-leaf data (protobuf wrapping pushes blocks slightly over 1MiB). The max `--chunker` value for `ipfs add` is `2MiB - 256 bytes` to leave room for protobuf framing. IPIP-499 profiles use lower chunk sizes (256KiB and 1MiB) and are not affected.
82
83 **HAMT Threshold Fix**
84
85 HAMT directory sharding threshold changed from `>=` to `>` to match the Go docs and JS implementation ([ipfs/boxo@6707376](https://github.com/ipfs/boxo/commit/6707376002a3d4ba64895749ce9be2e00d265ed5)). A directory exactly at 256 KiB now stays as a basic directory instead of converting to HAMT. This is a theoretical breaking change, but unlikely to impact real-world users as it requires a directory to be exactly at the threshold boundary. If you depend on the old behavior, adjust [`Import.UnixFSHAMTShardingSize`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfshamtshardingsize) to be 1 byte lower.
86
87 #### 🧹 Automatic cleanup of interrupted imports
88
89 If you cancel `ipfs add` or `ipfs dag import` mid-operation, Kubo now automatically cleans up incomplete data on the next daemon start. Previously, interrupted imports would leave orphan blocks in your repository that were difficult to identify and remove without pins and running explicit garbage collection.
90
91 Batch operations also use less memory now. Block data is written to disk immediately rather than held in RAM until the batch commits.
92
93 Under the hood, the block storage layer (flatfs) was rewritten to use atomic batch operations via a temporary staging directory. See [go-ds-flatfs#142](https://github.com/ipfs/go-ds-flatfs/pull/142) for details.
94
95 #### 🌍 Light clients can now use your node for delegated routing
96
97 The [Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) is now exposed by default at `http://127.0.0.1:8080/routing/v1`. This allows light clients in browsers to use Kubo Gateway as a delegated routing backend instead of running a full DHT client. Support for [IPIP-476: Delegated Routing DHT Closest Peers API](https://specs.ipfs.tech/ipips/ipip-0476/) is included. Can be disabled via [`Gateway.ExposeRoutingAPI`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewayexposeroutingapi).
98
99 #### 📊 See total size when pinning
100
101 `ipfs pin add --progress` now shows the total size of the pinned DAG as it fetches blocks.
102
103 Example output:
104
105 ```
106 Fetched/Processed 336 nodes (83 MB)
107 ```
108
109 #### 🔀 IPIP-523: `?format=` takes precedence over `Accept` header
110
111 The `?format=` URL query parameter now always wins over the `Accept` header ([IPIP-523](https://specs.ipfs.tech/ipips/ipip-0523/)), giving you deterministic HTTP caching and protecting against CDN cache-key collisions. Browsers can also use `?format=` reliably even when they send `Accept` headers with specific content types.
112
113 The only breaking change is for edge cases where a client sends both a specific `Accept` header and a different `?format=` value for an explicitly supported format (`tar`, `raw`, `car`, `dag-json`, `dag-cbor`, etc.). Previously `Accept` would win. Now `?format=` always wins.
114
115 #### 🚫 IPIP-524: Gateway codec conversion disabled by default
116
117 Gateways no longer convert between codecs by default ([IPIP-524](https://specs.ipfs.tech/ipips/ipip-0524/)). This removes gateways from a gatekeeping role: clients can adopt new codecs immediately without waiting for gateway operator updates. Requests for a format that differs from the block's codec now return `406 Not Acceptable`.
118
119 **Migration**: Clients should fetch raw blocks (`?format=raw` or `Accept: application/vnd.ipld.raw`)
120 and convert client-side using libraries like [@helia/verified-fetch](https://www.npmjs.com/package/@helia/verified-fetch).
121
122 Set [`Gateway.AllowCodecConversion`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewayallowcodecconversion)
123 to `true` to restore previous behavior.
124
125 #### ✅ More reliable IPNS over PubSub
126
127 [IPNS over PubSub](https://specs.ipfs.tech/ipns/ipns-pubsub-router/) implementation in Kubo is now more reliable. Duplicate messages are rejected even in large networks where messages may cycle back after the in-memory cache expires.
128
129 Kubo now persists the maximum seen sequence number per peer to the datastore ([go-libp2p-pubsub#BasicSeqnoValidator](https://pkg.go.dev/github.com/libp2p/go-libp2p-pubsub#BasicSeqnoValidator)), providing stronger duplicate detection that survives node restarts. This addresses message flooding issues reported in [#9665](https://github.com/ipfs/kubo/issues/9665).
130
131 IPNS over PubSub is opt-in via [`Ipns.UsePubsub`](https://github.com/ipfs/kubo/blob/master/docs/config.md#ipnsusepubsub). Kubo's pubsub is optimized for IPNS use case. For custom pubsub applications requiring different validation logic, use [go-libp2p-pubsub](https://github.com/libp2p/go-libp2p-pubsub) directly in a dedicated binary.
132
133 #### 🗄️ New `ipfs diag datastore` commands
134
135 New experimental commands for low-level datastore inspection:
136
137 - `ipfs diag datastore get <key>` - Read raw value at a datastore key (use `--hex` for hex dump)
138 - `ipfs diag datastore count <prefix>` - Count entries matching a datastore prefix
139
140 The daemon must not be running when using these commands. Run `ipfs diag datastore --help` for usage examples.
141
142 #### 🔍 New `ipfs swarm addrs autonat` command
143
144 The new `ipfs swarm addrs autonat` command shows the network reachability status of your node's addresses as verified by AutoNAT V2. AutoNAT V2 leverages other nodes in the IPFS network to test your node's external public reachability, providing a self-service way to debug connectivity.
145
146 Public reachability is important for:
147
148 - **Direct data fetching**: Other nodes can fetch data directly from your node without NAT hole punching.
149 - **Browser access**: Web browsers can connect to your node directly for content retrieval.
150 - **DHT participation**: Your node can act as a DHT server, helping to maintain the distributed hash table and making content routing more robust.
151
152 The command displays:
153
154 - Overall reachability status (public, private, or unknown)
155 - Per-address reachability showing which specific addresses are reachable, unreachable, or unknown
156
157 Example output:
158 ```
159 AutoNAT V2 Status:
160 Reachability: public
161
162 Per-Address Reachability:
163 Reachable:
164 /ip4/203.0.113.42/tcp/4001
165 /ip4/203.0.113.42/udp/4001/quic-v1
166 Unreachable:
167 /ip6/2001:db8::1/tcp/4001
168 Unknown:
169 /ip4/203.0.113.42/udp/4001/webrtc-direct
170 ```
171
172 This helps diagnose connectivity issues and understand if your node is publicly reachable. See the [AutoNAT V2 spec](https://github.com/libp2p/specs/blob/master/autonat/autonat-v2.md) for more details.
173
174 #### 🚇 Improved `ipfs p2p` tunnels with foreground mode
175
176 P2P tunnels can now run like SSH port forwarding: start a tunnel, use it, and it cleans up automatically when you're done.
177
178 The new `--foreground` (`-f`) flag for `ipfs p2p listen` and `ipfs p2p forward` keeps the command running until interrupted. When you Ctrl+C, send SIGTERM, or stop the service, the tunnel is removed automatically:
179
180 ```console
181 $ ipfs p2p listen /x/ssh /ip4/127.0.0.1/tcp/22 --foreground
182 Listening on /x/ssh, forwarding to /ip4/127.0.0.1/tcp/22, waiting for interrupt...
183 ^C
184 Received interrupt, removing listener for /x/ssh
185 ```
186
187 Without `--foreground`, commands return immediately and tunnels persist until explicitly closed (existing behavior).
188
189 See [docs/p2p-tunnels.md](https://github.com/ipfs/kubo/blob/master/docs/p2p-tunnels.md) for usage examples.
190
191 #### 📊 Friendlier `ipfs dag stat` output
192
193 The `ipfs dag stat` command has been improved for better terminal UX:
194
195 - Progress output now uses a single line with carriage return, avoiding terminal flooding
196 - Progress is auto-detected: shown only in interactive terminals by default
197 - Human-readable sizes are now displayed alongside raw byte counts
198
199 Example progress (interactive terminal):
200 ```
201 Fetched/Processed 84 blocks, 2097152 bytes (2.1 MB)
202 ```
203
204 Example summary output:
205 ```
206 Summary
207 Total Size: 2097152 (2.1 MB)
208 Unique Blocks: 42
209 Shared Size: 1048576 (1.0 MB)
210 Ratio: 1.500000
211 ```
212
213 Use `--progress=true` to force progress even when piped, or `--progress=false` to disable it.
214
215 #### 🔑 `ipfs key` improvements
216
217 `ipfs key ls` is now the canonical command for listing keys, matching `ipfs pin ls` and `ipfs files ls`. The old `ipfs key list` still works but is deprecated.
218
219 Listing also became more resilient: bad keys are now skipped with an error log instead of failing the entire operation.
220
221 #### 🤝 More reliable content providing after startup
222
223 Previously, provide operations could start before the Accelerated DHT Client discovered enough peers, causing sweep mode to lose its efficiency benefits. Now, providing waits for the initial network crawl (about 10 minutes). Your content will be properly distributed across DHT regions after initial DHT map is created. Check `ipfs provide stat` to see when providing begins.
224
225 #### 🌐 No unnecessary DNS lookups for AutoTLS addresses
226
227 Kubo no longer makes DNS queries for [AutoTLS](https://web.archive.org/web/20260112031855/https://blog.libp2p.io/autotls/) addresses like `1-2-3-4.peerid.libp2p.direct`. Since the IP is encoded in the hostname (`1-2-3-4` means `1.2.3.4`), Kubo extracts it locally. This reduces load on the public good DNS servers at `libp2p.direct` run by [Shipyard](https://ipshipyard.com), reserving them for web browsers which lack direct DNS access and must rely on the browser's resolver.
228
229 To disable, set [`AutoTLS.SkipDNSLookup`](https://github.com/ipfs/kubo/blob/master/docs/config.md#autotlsskipdnslookup) to `false`.
230
231 #### ⏱️ Configurable gateway request duration limit
232
233 [`Gateway.MaxRequestDuration`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaymaxrequestduration) sets an absolute deadline for gateway requests. Unlike `RetrievalTimeout` (which resets on each data write and catches stalled transfers), this is a hard limit on the total time a request can take.
234
235 The default 1 hour limit (previously hardcoded) can now be adjusted to fit your deployment needs. This is a fallback that prevents requests from hanging indefinitely when subsystem timeouts are misconfigured or fail to trigger. Returns 504 Gateway Timeout when exceeded.
236
237 #### 🔧 Recovery from corrupted MFS root
238
239 If your daemon fails to start because the MFS root is not a directory (due to misconfiguration, operational error, or disk corruption), you can now recover without deleting and recreating your repository in a new `IPFS_PATH`.
240
241 The new `ipfs files chroot` command lets you reset the MFS (Mutable File System) root or restore it to a known valid CID:
242
243 ```console
244 # Reset MFS to an empty directory
245 $ ipfs files chroot --confirm
246
247 # Or restore from a previously saved directory CID
248 $ ipfs files chroot --confirm QmYourBackupCID
249 ```
250
251 See `ipfs files chroot --help` for details.
252
253 #### 📡 RPC `Content-Type` headers for binary responses
254
255 HTTP RPC endpoints that return binary data now set appropriate `Content-Type` headers, making it easier to integrate with HTTP clients and tooling that rely on MIME types. On CLI these commands behave the same as before, but over HTTP RPC you now get proper headers:
256
257 | Endpoint | Content-Type |
258 |------------------------|-------------------------------------------|
259 | `/api/v0/get` | `application/x-tar` or `application/gzip` |
260 | `/api/v0/dag/export` | `application/vnd.ipld.car` |
261 | `/api/v0/block/get` | `application/vnd.ipld.raw` |
262 | `/api/v0/name/get` | `application/vnd.ipfs.ipns-record` |
263 | `/api/v0/diag/profile` | `application/zip` |
264
265 #### 🔖 New `ipfs name get|put` commands
266
267 You can now backup, restore, and share IPNS records without needing the private key.
268
269 ```console
270 $ ipfs name get /ipns/k51... > record.bin
271 $ ipfs name get /ipns/k51... | ipfs name inspect
272 $ ipfs name put k51... record.bin
273 ```
274
275 These are low-level tools primarily for debugging and testing IPNS.
276
277 The `put` command validates records by default. Use `--force` to skip validation and test how routing systems handle malformed or outdated records. Note that `--force` only bypasses this command's checks; the routing system may still reject invalid records.
278
279 #### 📋 Long listing format for `ipfs ls`
280
281 The `ipfs ls` command now supports `--long` (`-l`) flag for displaying Unix-style file permissions and modification times. This works with files added using `--preserve-mode` and `--preserve-mtime`. See `ipfs ls --help` for format details and examples.
282
283 #### 🖥️ WebUI Improvements
284
285 IPFS Web UI has been updated to [v4.11.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.11.0).
286
287 ##### Search and filter files
288
289 You can now search and filter files directly in the Files screen. Type a name, CID, or file extension and the list narrows down in real time. Works in both list and grid view.
290
291 > ![Search and filter files](https://github.com/user-attachments/assets/cc266dbc-8424-4a8a-a6b7-a80a5a25683b)
292
293 ##### DHT Provide diagnostic screen
294
295 New screen under Diagnostics that shows the health of DHT Provide operations. You can see reprovide cycle progress, worker utilization, queue status, and network throughput at a glance, without having to use the [`ipfs provide stat`](https://docs.ipfs.tech/reference/kubo/cli/#ipfs-provide-stat) CLI.
296
297 > ![DHT Provide diagnostic screen](https://github.com/user-attachments/assets/c577309a-2249-46f8-87d9-f0da42955f32)
298
299 ##### Better path handling in Files
300
301 The Inspect button now resolves `/ipfs/` and `/ipns/` paths to their final CID before opening the IPLD Explorer. The Explore form also accepts `ipfs://` and `ipns://` protocol URLs. Previously, these would show a blank screen or an infinite spinner. Path resolution errors now also show better error pages:
302
303 > ![Better path handling in Files](https://github.com/user-attachments/assets/3494835b-0b93-4990-9971-078273671928)
304
305 #### 📉 Fixed Prometheus metrics bloat on popular subdomain gateways
306
307 Most Kubo users are unaffected by this change. It matters if you run Kubo as a public subdomain gateway (with [`Gateway.PublicGateways`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaypublicgateways) and `UseSubdomains: true`), where the `otelhttp` instrumentation was including the raw `Host` header as the `server_address` metric label. Every unique hostname (e.g., each `CID.ipfs.dweb.link`) created a separate time series, resulting in millions of metric lines, multi-gigabyte `/debug/metrics/prometheus` responses, and Prometheus scrape timeouts.
308
309 **What changed:**
310
311 - `http_server_*` metrics replace the unbounded `server_address` label with a new `server_domain` label that groups requests by gateway domain:
312 - Gateway: matched [`Gateway.PublicGateways`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaypublicgateways) suffix (e.g., `dweb.link`, `ipfs.io`), or `localhost`, `loopback`, `other`
313 - RPC API: `api` / Libp2p Gateway: `libp2p`
314 - Prometheus exemplars are disabled to prevent log noise from long subdomain hostnames. Tracing spans are unaffected.
315
316 If you use [Rainbow](https://github.com/ipfs/rainbow) for your public gateway (recommended), this issue never applied to you -- Rainbow uses its own low-cardinality HTTP metrics.
317
318 #### 📢 libp2p announces all interface addresses
319
320 go-libp2p [v0.47.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.47.0) includes a rewritten routing library ([`go-netroute`](https://github.com/libp2p/go-netroute/pull/64)) that fixes interop with VPN and WireGuard/Tailscale setups. A side effect: when listening on `0.0.0.0`, libp2p now returns addresses from all network interfaces instead of just the primary one ([go-libp2p#3460](https://github.com/libp2p/go-libp2p/issues/3460)).
321
322 This means easier connectivity and less manual configuration for most desktop, VPN, and self-hosted users. However, if you don't run with the [`server` profile](https://github.com/ipfs/kubo/blob/master/docs/config.md#server-profile) and have an empty [`Addresses.NoAnnounce`](https://github.com/ipfs/kubo/blob/master/docs/config.md#addressesnoannounce), your node may now announce internal addresses (e.g. Docker bridge `172.17.0.0/16` or Tailscale `100.64.0.0/10`) to the DHT. In the default setup, AutoNAT will probe and mark unreachable ones as offline and they won't be listed, but you can also filter them out explicitly.
323
324 To check what your node announces and filter out unwanted ranges:
325
326 ```console
327 $ ipfs swarm addrs local
328 $ ipfs config --json Addresses.NoAnnounce '["/ip4/172.17.0.0/ipcidr/16"]'
329 ```
330
331 The [`server` profile](https://github.com/ipfs/kubo/blob/master/docs/config.md#server-profile) already [filters common private ranges](https://github.com/ipfs/kubo/blob/master/config/profile.go#L24-L43) via `Addresses.NoAnnounce`.
332
333 #### 🗑️ Badger v1 datastore slated for removal this year
334
335 The `badgerds` datastore (based on badger 1.x) is slated for removal. Badger v1 has not been maintained by its upstream maintainers for years and has known bugs including startup timeouts, shutdown hangs, and file descriptor exhaustion. Starting with this release, every daemon start with a badger-based repository prints a loud deprecation error on stderr.
336
337 See the [`badgerds` profile documentation](https://github.com/ipfs/kubo/blob/master/docs/config.md#badgerds-profile) for migration guidance, and [#11186](https://github.com/ipfs/kubo/issues/11186) for background.
338
339 #### 🐹 Go 1.26
340
341 This release is built with [Go 1.26](https://go.dev/doc/go1.26).
342
343 You should see lower memory usage and reduced GC pauses thanks to the new Green Tea garbage collector (10-40% less GC overhead). Reading block data and API responses is faster due to `io.ReadAll` improvements (~2x faster, ~50% less memory). On 64-bit platforms, heap base address randomization adds a layer of security hardening.
344
345 > **Note:** [v0.40.1](#v0401) downgrades to Go 1.25 due to a Windows stability issue. If you run Kubo on Linux or macOS, staying on v0.40.0 is fine and you benefit from Go 1.26's GC improvements.
346
347 #### 📦️ Dependency updates
348
349 - update `go-libp2p` to [v0.47.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.47.0) (incl. [v0.46.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.46.0))
350 - Reduced WebRTC log noise by using debug level for pion errors ([go-libp2p#3426](https://github.com/libp2p/go-libp2p/pull/3426)).
351 - Fixed mDNS discovery on Windows and macOS by filtering addresses to reduce packet size ([go-libp2p#3434](https://github.com/libp2p/go-libp2p/pull/3434)).
352 - AutoTLS addresses no longer get marked unreachable when peers lack WebSockets support. Swarm heals over time ([go-libp2p#3435](https://github.com/libp2p/go-libp2p/pull/3435)).
353 - Fixed `stream.Close()` blocking indefinitely on unresponsive peers ([go-libp2p#3448](https://github.com/libp2p/go-libp2p/pull/3448)).
354 - update `quic-go` to [v0.59.0](https://github.com/quic-go/quic-go/releases/tag/v0.59.0) (incl. [v0.58.0](https://github.com/quic-go/quic-go/releases/tag/v0.58.0) + [v0.57.0](https://github.com/quic-go/quic-go/releases/tag/v0.57.0))
355 - update `p2p-forge` to [v0.7.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.7.0)
356 - update `go-ds-pebble` to [v0.5.9](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.9)
357 - updates `github.com/cockroachdb/pebble` to [v2.1.4](https://github.com/cockroachdb/pebble/releases/tag/v2.1.4) to enable Go 1.26 support
358 - update `go-libp2p-pubsub` to [v0.15.0](https://github.com/libp2p/go-libp2p-pubsub/releases/tag/v0.15.0)
359 - update `go-ipld-prime` to [v0.22.0](https://github.com/ipld/go-ipld-prime/releases/tag/v0.22.0)
360 - update `boxo` to [v0.37.0](https://github.com/ipfs/boxo/releases/tag/v0.37.0) (incl. [v0.36.0](https://github.com/ipfs/boxo/releases/tag/v0.36.0))
361 - update `go-libp2p-kad-dht` to [v0.38.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.38.0) (includes [v0.37.1](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.37.1), [v0.37.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.37.0))
362 - update `ipfs-webui` to [v4.11.1](https://github.com/ipfs/ipfs-webui/releases/tag/v4.11.1) (incl. [v4.11.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.11.0))
363 - update `gateway-conformance` tests to [v0.10](https://github.com/ipfs/gateway-conformance/releases/tag/v0.10.0) (incl. [v0.9](https://github.com/ipfs/gateway-conformance/releases/tag/v0.9.0))
364
365 ### 📝 Changelog
366
367 <details><summary>Full Changelog</summary>
368
369 - github.com/ipfs/kubo:
370 - fix(metrics): disable otel exemplars to prevent rune overflow (#11211) ([ipfs/kubo#11211](https://github.com/ipfs/kubo/pull/11211))
371 - fix: drop high-cardinality server.address from http_server metrics (#11208) ([ipfs/kubo#11208](https://github.com/ipfs/kubo/pull/11208))
372 - chore: set version to 0.40.0-rc2
373 - fix(version): produce shorter user agent for tagged release builds
374 - chore: update webui to v4.11.1 (#11204) ([ipfs/kubo#11204](https://github.com/ipfs/kubo/pull/11204))
375 - fix: improve `ipfs name put` for IPNS record republishing (#11199) ([ipfs/kubo#11199](https://github.com/ipfs/kubo/pull/11199))
376 - Upgrade to Boxo v0.37.0 (#11201) ([ipfs/kubo#11201](https://github.com/ipfs/kubo/pull/11201))
377 - chore: set version to v0.40.0-rc1
378 - refactor: apply go fix modernizers from Go 1.26 (#11190) ([ipfs/kubo#11190](https://github.com/ipfs/kubo/pull/11190))
379 - feat: update to Go 1.26 (#11189) ([ipfs/kubo#11189](https://github.com/ipfs/kubo/pull/11189))
380 - docs: clarify LevelDB compaction limitations and StorageMax scope (#11188) ([ipfs/kubo#11188](https://github.com/ipfs/kubo/pull/11188))
381 - docs: loud deprecation of badger v1 datastore (#11187) ([ipfs/kubo#11187](https://github.com/ipfs/kubo/pull/11187))
382 - docs(changelog): add highlight for libp2p AllAddrs behavior change (#11183) ([ipfs/kubo#11183](https://github.com/ipfs/kubo/pull/11183))
383 - fix: allow dag import of 1MiB chunks wrapped in dag-pb (#11185) ([ipfs/kubo#11185](https://github.com/ipfs/kubo/pull/11185))
384 - feat: `swarm addrs autonat` command (#11184) ([ipfs/kubo#11184](https://github.com/ipfs/kubo/pull/11184))
385 - feat(gateway): IPIP-0524 Gateway.AllowCodecConversion config option (#11090) ([ipfs/kubo#11090](https://github.com/ipfs/kubo/pull/11090))
386 - feat: update ipfs-webui to v4.11.0 (#11182) ([ipfs/kubo#11182](https://github.com/ipfs/kubo/pull/11182))
387 - feat(config): add Import.* for CID Profiles from IPIP-499 (#11148) ([ipfs/kubo#11148](https://github.com/ipfs/kubo/pull/11148))
388 - chore: replace libp2p.io URL with Internet Archive (#11181) ([ipfs/kubo#11181](https://github.com/ipfs/kubo/pull/11181))
389 - test: IPIP-523 format query precedence over Accept header (#11086) ([ipfs/kubo#11086](https://github.com/ipfs/kubo/pull/11086))
390 - docs: update go-libp2p changelog entry to v0.47.0
391 - feat(rpc): Content-Type headers and IPNS record get/put (#11067) ([ipfs/kubo#11067](https://github.com/ipfs/kubo/pull/11067))
392 - feat(key): add 'ipfs key ls' as alias for 'ipfs key list' (#11147) ([ipfs/kubo#11147](https://github.com/ipfs/kubo/pull/11147))
393 - docs: cleanup broken links and outdated content (#11100) ([ipfs/kubo#11100](https://github.com/ipfs/kubo/pull/11100))
394 - feat(dns): skip DNS lookups for AutoTLS hostnames (#11140) ([ipfs/kubo#11140](https://github.com/ipfs/kubo/pull/11140))
395 - Upgrade to Boxo v0.36.0 (#11175) ([ipfs/kubo#11175](https://github.com/ipfs/kubo/pull/11175))
396 - chore: upgrade go-ds-pebble to v0.5.9 (#11170) ([ipfs/kubo#11170](https://github.com/ipfs/kubo/pull/11170))
397 - fix(commands/reprovide): update manual reprovide error message (#11151) ([ipfs/kubo#11151](https://github.com/ipfs/kubo/pull/11151))
398 - feat(cli): ls --long (#11103) ([ipfs/kubo#11103](https://github.com/ipfs/kubo/pull/11103))
399 - feat(pubsub): persistent validation and diagnostic commands (#11110) ([ipfs/kubo#11110](https://github.com/ipfs/kubo/pull/11110))
400 - feat(config): add Gateway.MaxRequestDuration option (#11138) ([ipfs/kubo#11138](https://github.com/ipfs/kubo/pull/11138))
401 - feat(provider): info log AcceleratedDHTClient crawl (#11143) ([ipfs/kubo#11143](https://github.com/ipfs/kubo/pull/11143))
402 - ipfswatch: fix panic on broken link (#11145) ([ipfs/kubo#11145](https://github.com/ipfs/kubo/pull/11145))
403 - upgrade go-libp2p-pubsub to v0.15.0 (#11144) ([ipfs/kubo#11144](https://github.com/ipfs/kubo/pull/11144))
404 - feat(mfs): chroot command to change the root (#8648) ([ipfs/kubo#8648](https://github.com/ipfs/kubo/pull/8648))
405 - feat: improved go-ds-flatfs (#11092) ([ipfs/kubo#11092](https://github.com/ipfs/kubo/pull/11092))
406 - test: fix flaky ipfswatch test (#11142) ([ipfs/kubo#11142](https://github.com/ipfs/kubo/pull/11142))
407 - docs: clarify Routing.Type=custom as experimental (#11111) ([ipfs/kubo#11111](https://github.com/ipfs/kubo/pull/11111))
408 - fix(routing): defensive clone of AddrInfo from provider channel (#11120) ([ipfs/kubo#11120](https://github.com/ipfs/kubo/pull/11120))
409 - fix(provider): wait for fullrt crawl completion before providing (#11137) ([ipfs/kubo#11137](https://github.com/ipfs/kubo/pull/11137))
410 - fix(provide): do not output keystore error on shutdown (#11130) ([ipfs/kubo#11130](https://github.com/ipfs/kubo/pull/11130))
411 - feat(p2p): add --foreground flag to listen and forward commands (#11099) ([ipfs/kubo#11099](https://github.com/ipfs/kubo/pull/11099))
412 - feat(cli): improve ipfs dag stat output UX (#11097) ([ipfs/kubo#11097](https://github.com/ipfs/kubo/pull/11097))
413 - docs: add production deployment guidance for gateway (#11117) ([ipfs/kubo#11117](https://github.com/ipfs/kubo/pull/11117))
414 - fix(routing): use LegacyProvider for HTTP-only custom routing (#11112) ([ipfs/kubo#11112](https://github.com/ipfs/kubo/pull/11112))
415 - shutdown daemon after test (#11135) ([ipfs/kubo#11135](https://github.com/ipfs/kubo/pull/11135))
416 - fix(ci): parallelize gotest, cleanup output, flakiness (#11113) ([ipfs/kubo#11113](https://github.com/ipfs/kubo/pull/11113))
417 - test: replace `go-clock` with `testing/synctest` (#11131) ([ipfs/kubo#11131](https://github.com/ipfs/kubo/pull/11131))
418 - docs: improve README for first-time users (#11133) ([ipfs/kubo#11133](https://github.com/ipfs/kubo/pull/11133))
419 - keys: skip bad keys when listing (#11115) ([ipfs/kubo#11115](https://github.com/ipfs/kubo/pull/11115))
420 - docs: add developer guide for local development workflow (#11128) ([ipfs/kubo#11128](https://github.com/ipfs/kubo/pull/11128))
421 - datastore: upgrade go-ds-pebble to v0.5.8 (#11129) ([ipfs/kubo#11129](https://github.com/ipfs/kubo/pull/11129))
422 - output stdout and stderr on example test failure (#11119) ([ipfs/kubo#11119](https://github.com/ipfs/kubo/pull/11119))
423 - chore: update go-libp2p 0.46 (#11105) ([ipfs/kubo#11105](https://github.com/ipfs/kubo/pull/11105))
424 - fix(ipfswatch): loading datastore plugins (#11078) ([ipfs/kubo#11078](https://github.com/ipfs/kubo/pull/11078))
425 - Add bytes progress tracker for ipfs pin add (#11074) ([ipfs/kubo#11074](https://github.com/ipfs/kubo/pull/11074))
426 - docs: link sweep blogpost in Provide.DHT.SweepEnabled
427 - docs: note sweep+accelerated DHT client limitation (#11084) ([ipfs/kubo#11084](https://github.com/ipfs/kubo/pull/11084))
428 - refactor: replace context.WithCancel with t.Context (#11083) ([ipfs/kubo#11083](https://github.com/ipfs/kubo/pull/11083))
429 - chore: remove deprecated go-ipfs Docker image publishing (#11081) ([ipfs/kubo#11081](https://github.com/ipfs/kubo/pull/11081))
430 - Merge release v0.39.0 ([ipfs/kubo#11080](https://github.com/ipfs/kubo/pull/11080))
431 - docs: move IPIP-476 feature to v0.40 changelog
432 - upgrade go-libp2p-kad-dht to v0.36.0 (#11079) ([ipfs/kubo#11079](https://github.com/ipfs/kubo/pull/11079))
433 - fix(docker): include symlinks in scanning for init scripts (#11077) ([ipfs/kubo#11077](https://github.com/ipfs/kubo/pull/11077))
434 - Update deprecation message for Reprovider fields (#11072) ([ipfs/kubo#11072](https://github.com/ipfs/kubo/pull/11072))
435 - fix doc string (#11068) ([ipfs/kubo#11068](https://github.com/ipfs/kubo/pull/11068))
436 - feat: support GetClosesPeers (IPIP-476) and ExposeRoutingAPI by default (#10954) ([ipfs/kubo#10954](https://github.com/ipfs/kubo/pull/10954))
437 - chore: start v0.40.0 release cycle
438 - github.com/gammazero/chanqueue (v1.1.1 -> v1.1.2):
439 - require go1.24 or later (#9) ([gammazero/chanqueue#9](https://github.com/gammazero/chanqueue/pull/9))
440 - update workflow (#7) ([gammazero/chanqueue#7](https://github.com/gammazero/chanqueue/pull/7))
441 - prefer range loops (#6) ([gammazero/chanqueue#6](https://github.com/gammazero/chanqueue/pull/6))
442 - github.com/gammazero/deque (v1.2.0 -> v1.2.1):
443 - fix panic after IterPopX leaves buffer exactly full (#51) ([gammazero/deque#51](https://github.com/gammazero/deque/pull/51))
444 - fix panic if copying in exactly the buffer size (#50) ([gammazero/deque#50](https://github.com/gammazero/deque/pull/50))
445 - refactor: prefer range loops (#49) ([gammazero/deque#49](https://github.com/gammazero/deque/pull/49))
446 - github.com/ipfs/boxo (v0.35.2 -> v0.37.0):
447 - Release v0.37.0 ([ipfs/boxo#1109](https://github.com/ipfs/boxo/pull/1109))
448 - update dependencies (#1107) ([ipfs/boxo#1107](https://github.com/ipfs/boxo/pull/1107))
449 - refactor: modernize code (#1105) ([ipfs/boxo#1105](https://github.com/ipfs/boxo/pull/1105))
450 - ensure http response body is closed (#1103) ([ipfs/boxo#1103](https://github.com/ipfs/boxo/pull/1103))
451 - update multiaddr dns and otel (#1102) ([ipfs/boxo#1102](https://github.com/ipfs/boxo/pull/1102))
452 - fix: raise block size limits from 1MiB to 2MiB (#1101) ([ipfs/boxo#1101](https://github.com/ipfs/boxo/pull/1101))
453 - test(gateway): add dag-pb to dag-json codec conversion tests
454 - feat(gateway): IPIP-0524 + AllowCodecConversion config option (#1077) ([ipfs/boxo#1077](https://github.com/ipfs/boxo/pull/1077))
455 - feat(unixfs): configurable CID Profiles from IPIP-499 (#1088) ([ipfs/boxo#1088](https://github.com/ipfs/boxo/pull/1088))
456 - feat(gateway): IPIP-523 format query over Accept header (#1074) ([ipfs/boxo#1074](https://github.com/ipfs/boxo/pull/1074))
457 - Release v0.36.0 ([ipfs/boxo#1099](https://github.com/ipfs/boxo/pull/1099))
458 - upgrade go-libp2p-kad-dht to v0.37.1 (#1097) ([ipfs/boxo#1097](https://github.com/ipfs/boxo/pull/1097))
459 - fix(routing): defensive nil checks for multiaddr handling (#1081) ([ipfs/boxo#1081](https://github.com/ipfs/boxo/pull/1081))
460 - fix: flaky TestSessionBetweenPeers with shuffle enabled (#1022) ([ipfs/boxo#1022](https://github.com/ipfs/boxo/pull/1022))
461 - upgrade to go-libp2p v0.47.0 (#1095) ([ipfs/boxo#1095](https://github.com/ipfs/boxo/pull/1095))
462 - update dependencies (#1091) ([ipfs/boxo#1091](https://github.com/ipfs/boxo/pull/1091))
463 - refactor: rewrite some flaky tests to testing/synctest (#1087) ([ipfs/boxo#1087](https://github.com/ipfs/boxo/pull/1087))
464 - fix(routing): fix unknown record bytes unmarshalling (#1090) ([ipfs/boxo#1090](https://github.com/ipfs/boxo/pull/1090))
465 - refactor: replace `go-clock` with `synctest` (#1082) ([ipfs/boxo#1082](https://github.com/ipfs/boxo/pull/1082))
466 - chore: fix gofumpt formatting in dagreader.go
467 - cosmetic fixes (#1086) ([ipfs/boxo#1086](https://github.com/ipfs/boxo/pull/1086))
468 - feat(gateway): configurable fallback timeout for MaxRequestDuration (#1079) ([ipfs/boxo#1079](https://github.com/ipfs/boxo/pull/1079))
469 - fix(bitswap/network): `stream.Close()` blocks indefinitely on unresponsive peers (#1083) ([ipfs/boxo#1083](https://github.com/ipfs/boxo/pull/1083))
470 - test: cleanup goroutines at end of test (#1084) ([ipfs/boxo#1084](https://github.com/ipfs/boxo/pull/1084))
471 - keystore: improve error messages and include key file name (#1080) ([ipfs/boxo#1080](https://github.com/ipfs/boxo/pull/1080))
472 - docs: update deprecation comments to reference IPIP-526 (#1076) ([ipfs/boxo#1076](https://github.com/ipfs/boxo/pull/1076))
473 - feat(ipld/merkledag): add total size of visited nodes in progress tracker ([ipfs/boxo#1071](https://github.com/ipfs/boxo/pull/1071))
474 - upgrade to go-libp2p-kad-dht v0.36.0 ([ipfs/boxo#1072](https://github.com/ipfs/boxo/pull/1072))
475 - routing/http: add support for GetClosestPeers (IPIP-476) (#1021) ([ipfs/boxo#1021](https://github.com/ipfs/boxo/pull/1021))
476 - tar: fix name filter on windows ([ipfs/boxo#1047](https://github.com/ipfs/boxo/pull/1047))
477 - github.com/ipfs/go-cidutil (v0.1.0 -> v0.1.1):
478 - new version (#55) ([ipfs/go-cidutil#55](https://github.com/ipfs/go-cidutil/pull/55))
479 - update dependencies (#53) ([ipfs/go-cidutil#53](https://github.com/ipfs/go-cidutil/pull/53))
480 - ci: uci/copy-templates ([ipfs/go-cidutil#43](https://github.com/ipfs/go-cidutil/pull/43))
481 - ci: uci/copy-templates ([ipfs/go-cidutil#42](https://github.com/ipfs/go-cidutil/pull/42))
482 - github.com/ipfs/go-datastore (v0.9.0 -> v0.9.1):
483 - new version (#266) ([ipfs/go-datastore#266](https://github.com/ipfs/go-datastore/pull/266))
484 - update opentelemetry to v1.40.0 (#265) ([ipfs/go-datastore#265](https://github.com/ipfs/go-datastore/pull/265))
485 - refactor: modernize code (#264) ([ipfs/go-datastore#264](https://github.com/ipfs/go-datastore/pull/264))
486 - test suite: use a non-cancelled context to delete all keys (#259) ([ipfs/go-datastore#259](https://github.com/ipfs/go-datastore/pull/259))
487 - Document not to reuse batch (#258) ([ipfs/go-datastore#258](https://github.com/ipfs/go-datastore/pull/258))
488 - Revert "Test that a second batch commit does not error (#256)" (#257) ([ipfs/go-datastore#257](https://github.com/ipfs/go-datastore/pull/257))
489 - Test that a second batch commit does not error (#256) ([ipfs/go-datastore#256](https://github.com/ipfs/go-datastore/pull/256))
490 - github.com/ipfs/go-ds-flatfs (v0.5.5 -> v0.6.0):
491 - new version (#144) ([ipfs/go-ds-flatfs#144](https://github.com/ipfs/go-ds-flatfs/pull/144))
492 - refactor: rewrite batch mode to use temp directory (#142) ([ipfs/go-ds-flatfs#142](https://github.com/ipfs/go-ds-flatfs/pull/142))
493 - Clarify the usage of RLock and why RUnlock is missing when applying ops (#141) ([ipfs/go-ds-flatfs#141](https://github.com/ipfs/go-ds-flatfs/pull/141))
494 - update dependencies (#134) ([ipfs/go-ds-flatfs#134](https://github.com/ipfs/go-ds-flatfs/pull/134))
495 - github.com/ipfs/go-ds-pebble (v0.5.7 -> v0.5.9):
496 - new version (#79) ([ipfs/go-ds-pebble#79](https://github.com/ipfs/go-ds-pebble/pull/79))
497 - update error checks to use errors.Is (#78) ([ipfs/go-ds-pebble#78](https://github.com/ipfs/go-ds-pebble/pull/78))
498 - new version (#76) ([ipfs/go-ds-pebble#76](https://github.com/ipfs/go-ds-pebble/pull/76))
499 - github.com/ipfs/go-dsqueue (v0.1.1 -> v0.2.0):
500 - release v0.2.0 (#33) ([ipfs/go-dsqueue#33](https://github.com/ipfs/go-dsqueue/pull/33))
501 - update dependencies and required go version (#32) ([ipfs/go-dsqueue#32](https://github.com/ipfs/go-dsqueue/pull/32))
502 - new version (#31) ([ipfs/go-dsqueue#31](https://github.com/ipfs/go-dsqueue/pull/31))
503 - refactor: put queued item decoding logic into function (#30) ([ipfs/go-dsqueue#30](https://github.com/ipfs/go-dsqueue/pull/30))
504 - use testing/synctest for artificial clock (#29) ([ipfs/go-dsqueue#29](https://github.com/ipfs/go-dsqueue/pull/29))
505 - github.com/ipfs/go-ipfs-cmds (v0.15.0 -> v0.16.0):
506 - new version (#325) ([ipfs/go-ipfs-cmds#325](https://github.com/ipfs/go-ipfs-cmds/pull/325))
507 - update to use WaitGroup.Go (#324) ([ipfs/go-ipfs-cmds#324](https://github.com/ipfs/go-ipfs-cmds/pull/324))
508 - refactor: modernize code (#322) ([ipfs/go-ipfs-cmds#322](https://github.com/ipfs/go-ipfs-cmds/pull/322))
509 - feat: add --dereference-symlinks flag for recursive symlink resolution (#315) ([ipfs/go-ipfs-cmds#315](https://github.com/ipfs/go-ipfs-cmds/pull/315))
510 - fix: add remaining binary content types to MIMEEncodings
511 - fix: recognize content-type application/x-tar (#320) ([ipfs/go-ipfs-cmds#320](https://github.com/ipfs/go-ipfs-cmds/pull/320))
512 - feat(http): ability to control Content-Type of binary responses (#311) ([ipfs/go-ipfs-cmds#311](https://github.com/ipfs/go-ipfs-cmds/pull/311))
513 - update dependencies and fix test (#318) ([ipfs/go-ipfs-cmds#318](https://github.com/ipfs/go-ipfs-cmds/pull/318))
514 - update dependencies (#296) ([ipfs/go-ipfs-cmds#296](https://github.com/ipfs/go-ipfs-cmds/pull/296))
515 - github.com/ipfs/go-ipfs-pq (v0.0.3 -> v0.0.4):
516 - new version (#23) ([ipfs/go-ipfs-pq#23](https://github.com/ipfs/go-ipfs-pq/pull/23))
517 - fix broken test (#22) ([ipfs/go-ipfs-pq#22](https://github.com/ipfs/go-ipfs-pq/pull/22))
518 - Update readme links (#21) ([ipfs/go-ipfs-pq#21](https://github.com/ipfs/go-ipfs-pq/pull/21))
519 - github.com/ipfs/go-log/v2 (v2.9.0 -> v2.9.1):
520 - new version (#179) ([ipfs/go-log#179](https://github.com/ipfs/go-log/pull/179))
521 - github.com/ipfs/go-peertaskqueue (v0.8.2 -> v0.8.3):
522 - new version ([ipfs/go-peertaskqueue#51](https://github.com/ipfs/go-peertaskqueue/pull/51))
523 - update dependencies ([ipfs/go-peertaskqueue#50](https://github.com/ipfs/go-peertaskqueue/pull/50))
524 - Add README.md ([ipfs/go-peertaskqueue#49](https://github.com/ipfs/go-peertaskqueue/pull/49))
525 - replace go-clock with synctest ([ipfs/go-peertaskqueue#47](https://github.com/ipfs/go-peertaskqueue/pull/47))
526 - github.com/ipfs/go-unixfsnode (v1.10.2 -> v1.10.3):
527 - new version ([ipfs/go-unixfsnode#92](https://github.com/ipfs/go-unixfsnode/pull/92))
528 - refactor: modernize code ([ipfs/go-unixfsnode#91](https://github.com/ipfs/go-unixfsnode/pull/91))
529 - github.com/ipld/go-ipld-prime (v0.21.0 -> v0.22.0):
530 failed to fetch repo
531 - github.com/ipshipyard/p2p-forge (v0.6.1 -> v0.7.0):
532 - chore: release v0.7.0 (#81) ([ipshipyard/p2p-forge#81](https://github.com/ipshipyard/p2p-forge/pull/81))
533 - feat: add IP denylist plugin for abuse prevention (#79) ([ipshipyard/p2p-forge#79](https://github.com/ipshipyard/p2p-forge/pull/79))
534 - refactor/test/fix: ipparser hardening (#75) ([ipshipyard/p2p-forge#75](https://github.com/ipshipyard/p2p-forge/pull/75))
535 - github.com/libp2p/go-libp2p (v0.45.0 -> v0.47.0):
536 - Release v0.47.0 (#3454) ([libp2p/go-libp2p#3454](https://github.com/libp2p/go-libp2p/pull/3454))
537 - rcmgr: expose resource limits to Prometheus (#3433) ([libp2p/go-libp2p#3433](https://github.com/libp2p/go-libp2p/pull/3433))
538 - update webtransport-go to v0.10.0 and quic-go to v0.59.0 (#3452)f
539 - fix: handle error from mh.Sum in IDFromPublicKey
540 - fix(basic_host): set read deadline before multistream Close to prevent blocking
541 - update simnet dependency
542 - rename simconlibp2p package to simlibp2p
543 - simlibp2p: add GetBasicHostPair helper
544 - run synctest with Go 1.25
545 - fix(autonatv2): secondary addrs inherit reachability from primary (#3435) ([libp2p/go-libp2p#3435](https://github.com/libp2p/go-libp2p/pull/3435))
546 - Release v0.46.0
547 - chore: update quic-go to v0.57.1 (#3439) ([libp2p/go-libp2p#3439](https://github.com/libp2p/go-libp2p/pull/3439))
548 - fix(mdns): filter addresses to reduce packet size (#3434) ([libp2p/go-libp2p#3434](https://github.com/libp2p/go-libp2p/pull/3434))
549 - chore: update quic-go to v0.56.0 (#3425) ([libp2p/go-libp2p#3425](https://github.com/libp2p/go-libp2p/pull/3425))
550 - fix(webrtc): use debug level for pion errors (#3426) ([libp2p/go-libp2p#3426](https://github.com/libp2p/go-libp2p/pull/3426))
551 - github.com/libp2p/go-libp2p-kad-dht (v0.36.0 -> v0.38.0):
552 - Release v0.38.0 (#1236) ([libp2p/go-libp2p-kad-dht#1236](https://github.com/libp2p/go-libp2p-kad-dht/pull/1236))
553 - fix(provider/keystore): protect keystore size during reset (#1227) ([libp2p/go-libp2p-kad-dht#1227](https://github.com/libp2p/go-libp2p-kad-dht/pull/1227))
554 - update dependencies and minimum go version (#1230) ([libp2p/go-libp2p-kad-dht#1230](https://github.com/libp2p/go-libp2p-kad-dht/pull/1230))
555 - refactor: apply go fix modernizers from Go 1.26 (#1231) ([libp2p/go-libp2p-kad-dht#1231](https://github.com/libp2p/go-libp2p-kad-dht/pull/1231))
556 - chore: go-libdht org transfer (#1229) ([libp2p/go-libp2p-kad-dht#1229](https://github.com/libp2p/go-libp2p-kad-dht/pull/1229))
557 - fix(provider): close datastore results (#1226) ([libp2p/go-libp2p-kad-dht#1226](https://github.com/libp2p/go-libp2p-kad-dht/pull/1226))
558 - new version (#1225) ([libp2p/go-libp2p-kad-dht#1225](https://github.com/libp2p/go-libp2p-kad-dht/pull/1225))
559 - replace multierr with errors.Join (#1224) ([libp2p/go-libp2p-kad-dht#1224](https://github.com/libp2p/go-libp2p-kad-dht/pull/1224))
560 - fix(routing): add per-peer timeouts for PutValue and Provide (#1222) ([libp2p/go-libp2p-kad-dht#1222](https://github.com/libp2p/go-libp2p-kad-dht/pull/1222))
561 - chore: release v0.37.0 (#1221) ([libp2p/go-libp2p-kad-dht#1221](https://github.com/libp2p/go-libp2p-kad-dht/pull/1221))
562 - fix(provider): keyspace exploration should succeed with a single peer (#1220) ([libp2p/go-libp2p-kad-dht#1220](https://github.com/libp2p/go-libp2p-kad-dht/pull/1220))
563 - fix(provider): hold scheduleLk when reading schedule.Size() in test (#1219) ([libp2p/go-libp2p-kad-dht#1219](https://github.com/libp2p/go-libp2p-kad-dht/pull/1219))
564 - fix(provider): close worker pool before wg.Wait() (#1218) ([libp2p/go-libp2p-kad-dht#1218](https://github.com/libp2p/go-libp2p-kad-dht/pull/1218))
565 - chore: remove deprecated providers pkg (#1211) ([libp2p/go-libp2p-kad-dht#1211](https://github.com/libp2p/go-libp2p-kad-dht/pull/1211))
566 - fix(provider): don't discard peers if they all share CPL during exploration (#1216) ([libp2p/go-libp2p-kad-dht#1216](https://github.com/libp2p/go-libp2p-kad-dht/pull/1216))
567 - fix(records): clone addresses received from peerstore (#1210) ([libp2p/go-libp2p-kad-dht#1210](https://github.com/libp2p/go-libp2p-kad-dht/pull/1210))
568 - tests: fix flaky TestOptimisticProvide (#1213) ([libp2p/go-libp2p-kad-dht#1213](https://github.com/libp2p/go-libp2p-kad-dht/pull/1213))
569 - tests: fix flaky TestHandleRemotePeerProtocolChanges (#1212) ([libp2p/go-libp2p-kad-dht#1212](https://github.com/libp2p/go-libp2p-kad-dht/pull/1212))
570 - chore: bump go-libp2p to v0.46 (#1209) ([libp2p/go-libp2p-kad-dht#1209](https://github.com/libp2p/go-libp2p-kad-dht/pull/1209))
571 - github.com/libp2p/go-libp2p-pubsub (v0.14.2 -> v0.15.0):
572 - release v0.15.0
573 - Fix data race in test
574 - Skip flaky floodsub test
575 - pubsub: remove redundant sends of hello packet
576 - gossipsub: implement extensions
577 - test: add skeleton gossipsub to drive a gossipsub peer
578 - gossipsub: add plumbing for Gossipsub v1.3 support
579 - pubsub: AddPeer now accepts reference to hello packet
580 - pb: add extensions protobufs
581 - feat: add px peer record reducer + pub addrs filter
582 - Migrate to `log/slog`
583 - chore: add params.Dscore validation
584 - Release v0.14.3
585 - Unexport Params.Validate to maintain patch release semantics
586 - Merge pull request #642 for GossipSub Params validation
587 - fix: Select ctx.Done() when preprocessing to avoid blocking on cancel (#635) ([libp2p/go-libp2p-pubsub#635](https://github.com/libp2p/go-libp2p-pubsub/pull/635))
588 - github.com/libp2p/go-netroute (v0.3.0 -> v0.4.0):
589 - v0.4.0
590 - gofmt ([libp2p/go-netroute#65](https://github.com/libp2p/go-netroute/pull/65))
591 - linux: use rtnetlink directly ([libp2p/go-netroute#64](https://github.com/libp2p/go-netroute/pull/64))
592 - github.com/multiformats/go-multiaddr-dns (v0.4.1 -> v0.5.0):
593 - Release v0.5.0
594 - refactor: remove miekg/dns dep (#72) ([multiformats/go-multiaddr-dns#72](https://github.com/multiformats/go-multiaddr-dns/pull/72))
595
596 </details>
597
598 ### 👨‍👩‍👧‍👦 Contributors
599
600 | Contributor | Commits | Lines ± | Files Changed |
601 |-------------|---------|---------|---------------|
602 | [@lidel](https://github.com/lidel) | 62 | +18446/-3513 | 406 |
603 | [@gammazero](https://github.com/gammazero) | 84 | +5719/-2815 | 374 |
604 | [@MarcoPolo](https://github.com/MarcoPolo) | 24 | +1275/-311 | 58 |
605 | [@guillaumemichel](https://github.com/guillaumemichel) | 14 | +392/-967 | 41 |
606 | [@hsanjuan](https://github.com/hsanjuan) | 4 | +1093/-43 | 15 |
607 | [@sneaxhuh](https://github.com/sneaxhuh) | 2 | +840/-19 | 7 |
608 | [@cortze](https://github.com/cortze) | 1 | +367/-35 | 2 |
609 | [@schomatis](https://github.com/schomatis) | 1 | +288/-17 | 5 |
610 | [@rifeplight](https://github.com/rifeplight) | 1 | +92/-195 | 18 |
611 | [@sukunrt](https://github.com/sukunrt) | 3 | +22/-211 | 7 |
612 | [@2color](https://github.com/2color) | 1 | +207/-2 | 5 |
613 | [@djdv](https://github.com/djdv) | 8 | +96/-65 | 10 |
614 | [@vlerdman](https://github.com/vlerdman) | 4 | +90/-38 | 8 |
615 | [@v1rtl](https://github.com/v1rtl) | 1 | +71/-3 | 2 |
616 | [@VedantMadane](https://github.com/VedantMadane) | 1 | +23/-8 | 4 |
617 | [@dozyio](https://github.com/dozyio) | 1 | +26/-4 | 2 |
618 | [@infrmtcs](https://github.com/infrmtcs) | 1 | +24/-1 | 2 |
619 | [@marten-seemann](https://github.com/marten-seemann) | 1 | +5/-1 | 2 |
620 | [@web3-bot](https://github.com/web3-bot) | 2 | +3/-2 | 2 |
621 | [@MozirDmitriy](https://github.com/MozirDmitriy) | 1 | +4/-1 | 1 |
622 | [@aschmahmann](https://github.com/aschmahmann) | 1 | +2/-1 | 1 |
623 | [@willscott](https://github.com/willscott) | 1 | +1/-1 | 1 |
624 | [@lbarrettanderson](https://github.com/lbarrettanderson) | 1 | +1/-1 | 1 |
625 | [@filipremb](https://github.com/filipremb) | 1 | +1/-1 | 1 |
626
627 ## v0.40.1
628
629 ### 🔦 Highlights
630
631 #### Windows stability fix
632
633 If you run Kubo on Windows, v0.40.0 can crash after running for a while. The daemon starts fine and works normally at first, but eventually hits a memory corruption in Go's network I/O layer and dies. This is likely caused by an upstream Go 1.26 regression in overlapped I/O handling that has known issues ([go#77142](https://github.com/golang/go/issues/77142), [#11214](https://github.com/ipfs/kubo/issues/11214)).
634
635 This patch release downgrades the Go toolchain from 1.26 to 1.25, which does not have this bug. If you are running Kubo on Windows, upgrade to v0.40.1. We will switch back to Go 1.26.x once the upstream fix lands.
636
637 ### 📝 Changelog
638
639 <details><summary>Full Changelog v0.40.1</summary>
640
641 - github.com/ipfs/kubo:
642 - chore: downgrade to Go 1.25 to fix Windows crash ([ipfs/kubo#11215](https://github.com/ipfs/kubo/pull/11215))
643
644 </details>