| 1 | # Kubo changelog v0.41 |
| 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.41.0](#v0410) |
| 8 | |
| 9 | ## v0.41.0 |
| 10 | |
| 11 | - [Overview](#overview) |
| 12 | - [🔦 Highlights](#-highlights) |
| 13 | - [🗑️ Faster Provide Queue Disk Reclamation](#-faster-provide-queue-disk-reclamation) |
| 14 | - [✨ New `ipfs cid inspect` command](#-new-ipfs-cid-inspect-command) |
| 15 | - [🔤 `--cid-base` fixes across all commands](#-cid-base-fixes-across-all-commands) |
| 16 | - [🔄 Built-in `ipfs update` command](#-built-in-ipfs-update-command) |
| 17 | - [🖥️ WebUI Improvements](#-webui-improvements) |
| 18 | - [🔧 Correct provider addresses for custom HTTP routing](#-correct-provider-addresses-for-custom-http-routing) |
| 19 | - [🔀 `Provide.Strategy` modifiers: `+unique` and `+entities`](#-providestrategy-modifiers-unique-and-entities) |
| 20 | - [📌 `pin add` and `pin update` now fast-provide root CID](#-pin-add-and-pin-update-now-fast-provide-root-cid) |
| 21 | - [🌳 New `--fast-provide-dag` flag for fine-tuned provide control](#-new---fast-provide-dag-flag-for-fine-tuned-provide-control) |
| 22 | - [🛡️ Hardened `Provide.Strategy` parsing](#-hardened-providestrategy-parsing) |
| 23 | - [🔧 Filestore now respects `Provide.Strategy`](#-filestore-now-respects-providestrategy) |
| 24 | - [🛡️ `ipfs object patch` validates UnixFS node types](#-ipfs-object-patch-validates-unixfs-node-types) |
| 25 | - [🔗 MFS: fixed CidBuilder preservation](#-mfs-fixed-cidbuilder-preservation) |
| 26 | - [📂 FUSE Mount Improvements](#-fuse-mount-improvements) |
| 27 | - [📦 CARv2 import over HTTP API](#-carv2-import-over-http-api) |
| 28 | - [🌐 HTTPS proxy support](#-https-proxy-support) |
| 29 | - [🛡️ `server` profile no longer announces loopback and non-public IPv6 addresses](#-server-profile-no-longer-announces-loopback-and-non-public-ipv6-addresses) |
| 30 | - [🐹 Go 1.26, Once More with Feeling](#-go-126-once-more-with-feeling) |
| 31 | - [🐛 Fixed long-standing random daemon crashes during DHT lookups](#-fixed-long-standing-random-daemon-crashes-during-dht-lookups) |
| 32 | - [📦️ Dependency updates](#-dependency-updates) |
| 33 | - [📝 Changelog](#-changelog) |
| 34 | - [👨👩👧👦 Contributors](#-contributors) |
| 35 | |
| 36 | ### Overview |
| 37 | |
| 38 | ### 🔦 Highlights |
| 39 | |
| 40 | #### 🗑️ Faster Provide Queue Disk Reclamation |
| 41 | |
| 42 | Nodes with significant amount of data and DHT provide sweep enabled |
| 43 | (`Provide.DHT.SweepEnabled`, the default since Kubo 0.39) could see their |
| 44 | `datastore/` directory grow continuously. |
| 45 | Each reprovide cycle rewrote the provider keystore inside the shared repo |
| 46 | datastore, generating tombstones faster than the storage engine could compact |
| 47 | them, and in default configuration Kubo was slow to reclaim this space. |
| 48 | |
| 49 | The provider keystore now lives in a dedicated datastore under |
| 50 | `$IPFS_PATH/provider-keystore/`. After each reprovide cycle the old datastore |
| 51 | is removed from disk entirely, so space is reclaimed immediately regardless |
| 52 | of storage backend. |
| 53 | |
| 54 | On first start after upgrading, stale keystore data is cleaned up from the |
| 55 | shared datastore automatically. |
| 56 | |
| 57 | To learn more, see [kubo#11096](https://github.com/ipfs/kubo/issues/11096), |
| 58 | [kubo#11198](https://github.com/ipfs/kubo/pull/11198), and |
| 59 | [go-libp2p-kad-dht#1233](https://github.com/libp2p/go-libp2p-kad-dht/pull/1233). |
| 60 | |
| 61 | #### ✨ New `ipfs cid inspect` command |
| 62 | |
| 63 | New subcommand for breaking down a CID into its components. Works offline, supports `--enc=json`. |
| 64 | |
| 65 | ```console |
| 66 | $ ipfs cid inspect bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi |
| 67 | CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi |
| 68 | Version: 1 |
| 69 | Multibase: base32 (b) |
| 70 | Multicodec: dag-pb (0x70) |
| 71 | Multihash: sha2-256 (0x12) |
| 72 | Length: 32 bytes |
| 73 | Digest: c3c4733ec8affd06cf9e9ff50ffc6bcd2ec85a6170004bb709669c31de94391a |
| 74 | CIDv0: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR |
| 75 | CIDv1: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi |
| 76 | ``` |
| 77 | |
| 78 | See `ipfs cid --help` for all CID-related commands. |
| 79 | |
| 80 | #### 🔤 `--cid-base` fixes across all commands |
| 81 | |
| 82 | `--cid-base` is now respected by every command that outputs CIDs. Previously `block stat`, `block put`, `block rm`, `dag stat`, `refs local`, `pin remote`, and `files chroot` ignored the flag. |
| 83 | |
| 84 | CIDv0 values are now auto-upgraded to CIDv1 when a non-base58btc base is requested, because CIDv0 can only be represented in base58btc. |
| 85 | |
| 86 | #### 🔄 Built-in `ipfs update` command |
| 87 | |
| 88 | Kubo now ships with a built-in `ipfs update` command that downloads release binaries from GitHub and swaps the current one in place. It supersedes the external [`ipfs-update`](https://github.com/ipfs/ipfs-update) tool, deprecated since [v0.37](https://github.com/ipfs/kubo/blob/master/docs/changelogs/v0.37.md#-repository-migration-from-v16-to-v17-with-embedded-tooling). |
| 89 | |
| 90 | ```console |
| 91 | $ ipfs update check |
| 92 | Update available: 0.40.0 -> 0.41.0 |
| 93 | Run 'ipfs update install' to install the latest version. |
| 94 | ``` |
| 95 | |
| 96 | See `ipfs update --help` for the available subcommands (`check`, `versions`, `install`, `revert`, `clean`). |
| 97 | |
| 98 | #### 🖥️ WebUI Improvements |
| 99 | |
| 100 | IPFS Web UI has been updated to [v4.12.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.12.0). |
| 101 | |
| 102 | ##### IPv6 peer geolocation and Peers screen optimizations |
| 103 | |
| 104 | The Peers screen now resolves IPv6 addresses to geographic locations, and the geolocation database has been updated to `GeoLite2-City-CSV_20260220`. ([ipfs-geoip v9.3.0](https://github.com/ipfs-shipyard/ipfs-geoip/releases/tag/v9.3.0)) |
| 105 | |
| 106 | Peer locations load faster thanks to UX optimizations in the underlying ipfs-geoip library. |
| 107 | |
| 108 | #### 🔧 Correct provider addresses for custom HTTP routing |
| 109 | |
| 110 | Nodes using custom routing (`Routing.Type=custom`) with [IPIP-526](https://github.com/ipfs/specs/pull/526) could end up publishing unresolved `0.0.0.0` addresses in provider records. Addresses are now resolved at provide-time, and when AutoNAT V2 has confirmed publicly reachable addresses, those are preferred automatically. See [#11213](https://github.com/ipfs/kubo/issues/11213). |
| 111 | |
| 112 | #### 🔀 `Provide.Strategy` modifiers: `+unique` and `+entities` |
| 113 | |
| 114 | Experimental opt-in optimizations for content providers with large repositories where multiple recursive pins share most of their DAG structure (e.g. append-only datasets, versioned archives like dist.ipfs.tech). |
| 115 | |
| 116 | - `+unique`: bloom filter dedup across recursive pins. Shared subtrees are traversed only once per reprovide cycle instead of once per pin, cutting I/O from O(pins * blocks) to O(unique blocks) at ~4 bytes/CID. |
| 117 | - `+entities`: announces only entity roots (files, directories, HAMT shards), skipping internal file chunks. Far fewer DHT provider records while keeping all content discoverable by file/directory CID. Implies `+unique`. |
| 118 | |
| 119 | Example: `Provide.Strategy = "pinned+mfs+entities"` |
| 120 | |
| 121 | The default `Provide.Strategy=all` is unchanged. See [`Provide.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providestrategy) for configuration details and caveats. |
| 122 | |
| 123 | The bloom filter precision is tunable via [`Provide.BloomFPRate`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providebloomfprate) (default ~1 false positive per 4.75M lookups, ~4 bytes per CID). |
| 124 | |
| 125 | #### 📌 `pin add` and `pin update` now fast-provide root CID |
| 126 | |
| 127 | `ipfs pin add` and `ipfs pin update` announce the pinned root CID to the routing system immediately after pinning, same as `ipfs add` and `ipfs dag import`. This matters for selective strategies like `pinned+mfs`, where previously the root CID was not announced until the next reprovide cycle (see [`Provide.DHT.Interval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providedhtinterval)). With the default `Provide.Strategy=all`, the blockstore already provides every block on write, so this is a no-op. |
| 128 | |
| 129 | Both commands now accept `--fast-provide-root`, `--fast-provide-dag`, and `--fast-provide-wait` flags, matching `ipfs add` and `ipfs dag import`. See [`Import`](https://github.com/ipfs/kubo/blob/master/docs/config.md#import) for defaults and configuration. |
| 130 | |
| 131 | #### 🌳 New `--fast-provide-dag` flag for fine-tuned provide control |
| 132 | |
| 133 | Users with a custom [`Provide.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providestrategy) (e.g. `pinned`, `pinned+mfs+entities`) now have finer control over which CIDs are announced immediately on `ipfs add`, `ipfs dag import`, `ipfs pin add`, and `ipfs pin update`. |
| 134 | |
| 135 | By default, only the root CID is provided right away (`--fast-provide-root=true`). Child blocks are deferred until the next [reprovide cycle](https://github.com/ipfs/kubo/blob/master/docs/config.md#providedhtinterval). This keeps bulk imports fast and avoids overwhelming online nodes with provide traffic. |
| 136 | |
| 137 | Pass `--fast-provide-dag=true` (or set [`Import.FastProvideDAG`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importfastprovidedag)) to provide the full DAG immediately during add, using the active `Provide.Strategy` to determine scope. |
| 138 | |
| 139 | `Provide.Strategy=all` (default) is unaffected. It provides every block at the blockstore level regardless of this flag. |
| 140 | |
| 141 | > [!NOTE] |
| 142 | > **Faster default imports for `Provide.Strategy=pinned` and `pinned+mfs` users.** Previously, `ipfs add --pin` eagerly announced every block of newly added content as it was written, through an internal DAG service wrapper. This release routes add-time providing through the new `--fast-provide-dag` code path, which defaults to `false`. The result is faster bulk imports and less provide traffic during add: only the root CID is announced immediately (via [`Import.FastProvideRoot`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importfastprovideroot)), and child blocks are picked up by the next reprovide cycle (see [`Provide.DHT.Interval`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providedhtinterval), default 22h). To restore the previous eager-provide behavior on `ipfs add`, set [`Import.FastProvideDAG=true`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importfastprovidedag) (or pass `--fast-provide-dag=true` per command); the walker honors the active `Provide.Strategy`. `Provide.Strategy=all` (the default) is unaffected. |
| 143 | |
| 144 | #### 🛡️ Hardened `Provide.Strategy` parsing |
| 145 | |
| 146 | Unknown strategy tokens (e.g. typo `"uniuqe"`), malformed delimiters (`"pinned+"`), and invalid combinations (`"all+pinned"`) now produce a clear error at startup instead of being silently ignored. |
| 147 | |
| 148 | #### 🔧 Filestore now respects `Provide.Strategy` |
| 149 | |
| 150 | Blocks added via the [filestore](https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#ipfs-filestore) or [urlstore](https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#ipfs-urlstore) (`ipfs add --nocopy`) used to ignore [`Provide.Strategy`](https://github.com/ipfs/kubo/blob/master/docs/config.md#providestrategy) and were always announced at write time. The filestore is now gated on the strategy the same way the regular blockstore is, so selective strategies get the same [fast-provide knobs](#-new---fast-provide-dag-flag-for-fine-tuned-provide-control) for filestore-backed content that they already had for regular `ipfs add`. |
| 151 | |
| 152 | #### 🛡️ `ipfs object patch` validates UnixFS node types |
| 153 | |
| 154 | As part of the ongoing deprecation of the legacy `ipfs object` API (which |
| 155 | predates HAMTShard directories and CIDv1), the `add-link` and `rm-link` |
| 156 | subcommands now validate the root node before mutating it. |
| 157 | |
| 158 | These commands operate at the raw `dag-pb` level and can only safely mutate |
| 159 | small, flat UnixFS directories. They are unable to update UnixFS metadata |
| 160 | (HAMT bitfields, file `Blocksizes`), so using them on files or sharded |
| 161 | directories would silently produce invalid DAGs. This is now rejected: |
| 162 | |
| 163 | - **File** nodes: rejected (corrupts `Blocksizes`, content lost on read-back) |
| 164 | - **HAMTShard** nodes: rejected (HAMT bitfield not updated, corrupts directory) |
| 165 | - **Non-UnixFS `dag-pb`** nodes: rejected by default |
| 166 | - **Directory** nodes: allowed (the only safe case) |
| 167 | |
| 168 | Use `ipfs files` commands (`mkdir`, `cp`, `rm`, `mv`) instead. They handle all |
| 169 | directory types correctly, including large sharded directories. |
| 170 | |
| 171 | A `--allow-non-unixfs` flag is available on both `ipfs object patch` commands to bypass validation. |
| 172 | |
| 173 | #### 🔗 MFS: fixed CidBuilder preservation |
| 174 | |
| 175 | `ipfs files` commands now correctly preserve the configured CID version and hash function (`Import.CidVersion`, `Import.HashFunction`) in all MFS operations. Previously, the `CidBuilder` could be silently lost when modifying file contents, creating nested directories with `mkdir -p`, or restarting the daemon, causing some entries to fall back to CIDv0/sha2-256. |
| 176 | |
| 177 | Additionally, the MFS root directory itself now respects [`Import.CidVersion`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importcidversion) and [`Import.HashFunction`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importhashfunction) at daemon startup. Before this fix, the root always used CIDv0/sha2-256 regardless of config. Because the MFS root CID format is now managed by these config options, `ipfs files chcid` no longer accepts the root path `/`. It continues to work on subdirectories. |
| 178 | |
| 179 | See [boxo#1125](https://github.com/ipfs/boxo/pull/1125) and [kubo#11273](https://github.com/ipfs/kubo/pull/11273). |
| 180 | |
| 181 | #### 📂 FUSE Mount Improvements |
| 182 | |
| 183 | The FUSE implementation has been rewritten on top of [`hanwen/go-fuse` v2](https://github.com/hanwen/go-fuse), replacing the unmaintained `bazil.org/fuse`. This fixes long-standing architectural limitations and aligns FUSE mounts with what standard tools expect. FUSE support is still experimental. See [docs/fuse.md](https://github.com/ipfs/kubo/blob/master/docs/fuse.md) for setup instructions, and report problems at [kubo/issues](https://github.com/ipfs/kubo/issues). |
| 184 | |
| 185 | - **`fsync` works.** Editors (vim, emacs) and databases that call `fsync` after writing no longer get a silent no-op. Data is flushed through the open file descriptor to the DAG. The full vim save sequence (O_TRUNC + write + fsync + chmod) is tested. |
| 186 | - **`ftruncate` works.** Tools like `rsync --inplace` that shrink or grow files via `ftruncate(fd, size)` no longer get ENOTSUP. Opening existing files with `O_TRUNC` also works correctly. |
| 187 | - **`chmod` and `touch` no longer drop file content.** With `Mounts.StoreMode`/`StoreMtime` enabled, setting mode or mtime previously replaced the DAG node without preserving content links, leaving the file empty. |
| 188 | - **Symlink creation on writable mounts.** `ln -s target link` now works on `/mfs` and `/ipns`. Symlinks are stored as UnixFS TSymlink nodes, the same format used by `ipfs add`. |
| 189 | - **Rename-over-existing works.** Renaming a file onto an existing name (the pattern used by rsync and atomic-save editors) now correctly replaces the target. |
| 190 | - **Faster reads on `/ipfs`.** Files are read sequentially from the block graph instead of re-resolving from the root on every read call. |
| 191 | - **Interrupting a stuck `cat` works.** Ctrl-C or `kill` on a read cancels in-flight block fetches instead of hanging. |
| 192 | - **External unmount detected.** Running `fusermount -u` from outside the daemon now correctly marks the mount as inactive. |
| 193 | - **Files are no longer owned by root.** Mounts report the uid/gid of the daemon process, so access works without `allow_other`. |
| 194 | - **Offline IPNS writes succeed.** IPNS records are stored locally and published when connectivity returns. |
| 195 | - **Empty directories list correctly.** Listing an empty directory on `/ipfs` or `/ipns` no longer returns an error. |
| 196 | - **Bare file CIDs work on `/ipfs`.** Accessing a file by its CID directly under the `/ipfs` mount now works. This was a [long-standing regression](https://github.com/ipfs/kubo/issues/9044). |
| 197 | - **Rename works on `/mfs` and `/ipns`.** Renaming a file within the same directory no longer leaves the source behind. |
| 198 | - **IPNS FUSE publish works.** Writing files to `/ipns/local/` now correctly publishes the updated DAG. Previously IPNS publishing from the FUSE mount was silently blocked. |
| 199 | - **Concurrent IPNS file operations no longer race.** The `/ipns` file handle serializes Read, Write, Flush, and Release, matching the `/mfs` mount. |
| 200 | - **IPNS directory operations flush immediately.** Remove and Rename on `/ipns` flush changes to the MFS root, preventing data loss on daemon restart. |
| 201 | - **New files use the correct CID version.** Files created on `/ipns` inherit the parent's CID settings instead of falling back to CIDv0. |
| 202 | - **UnixFS mode and mtime visible in stat.** All three mounts show POSIX mode and mtime from [UnixFS](https://specs.ipfs.tech/unixfs/) metadata when present. When absent, sensible POSIX defaults are used (files: `0644`/`0444`, directories: `0755`/`0555`). |
| 203 | - **Opt-in `Mounts.StoreMtime` and `Mounts.StoreMode`.** Writable mounts can persist mtime on file creation/write and POSIX mode on `chmod` for both files and directories. `touch` on directories also works, which tools like `tar` and `rsync` rely on. Both flags are off by default because they change the resulting CID. See [`Mounts.StoreMtime`](https://github.com/ipfs/kubo/blob/master/docs/config.md#mountsstoremtime) and [`Mounts.StoreMode`](https://github.com/ipfs/kubo/blob/master/docs/config.md#mountsstoremode). |
| 204 | - **`ipfs.cid` xattr on all mounts.** All three mounts expose the node's CID via the `ipfs.cid` extended attribute on files and directories. The legacy `ipfs_cid` xattr name (used in earlier versions of `/mfs`) is no longer supported; use `ipfs.cid` instead. |
| 205 | - **`statfs` works.** All three mounts report the free space of the volume backing the local IPFS repo, so `/mfs` correctly reflects how much new data fits. Fixes macOS Finder refusing copies with "not enough free space". |
| 206 | - **Per-entry `st_blocks` and `st_blksize` reflect UnixFS.** All three mounts fill `st_blocks` from the UnixFS file size so `du`, `ls -s`, `stat`, and "size on disk" in file managers match `ls -l`. Directories report a nominal 1 block so tools that treat 0 as "unsupported" behave correctly. `st_blksize` advertises a chunk-aligned preferred I/O size: `/mfs` and `/ipns` use [`Import.UnixFSChunker`](https://github.com/ipfs/kubo/blob/master/docs/config.md#importunixfschunker), so `cp`, `dd`, and `rsync` buffer writes at the chunker boundary; `/ipfs` uses a stable 1 MiB hint since published CIDs have no single chunker. |
| 207 | - **Platform compatibility.** macOS detection updated from OSXFUSE 2.x to macFUSE 4.x. Linux no longer needs a `fusermount` symlink; [`hanwen/go-fuse`](https://github.com/hanwen/go-fuse) finds `fusermount3` natively. |
| 208 | |
| 209 | #### 📦 CARv2 import over HTTP API |
| 210 | |
| 211 | `ipfs dag import` of CARv2 files now works over the HTTP API. Previously it failed with `operation not supported`: the HTTP multipart stream falsely advertised seek support, which go-car needs for the CARv2 payload offset. See [#11253](https://github.com/ipfs/kubo/pull/11253). |
| 212 | |
| 213 | #### 🌐 HTTPS proxy support |
| 214 | |
| 215 | Kubo's outbound HTTP clients and libp2p `/ws`+`/wss` peer dials have long honored the standard `HTTPS_PROXY`, `HTTP_PROXY`, and `NO_PROXY` environment variables; this release extends the WebSocket transport to also accept `https://` proxy URLs (TLS to the proxy itself), matching what Kubo's HTTP clients already supported. See [`docs/environment-variables.md`](https://github.com/ipfs/kubo/blob/master/docs/environment-variables.md#https_proxy). |
| 216 | |
| 217 | #### 🛡️ `server` profile no longer announces loopback and non-public IPv6 addresses |
| 218 | |
| 219 | The opt-in [`server` profile](https://github.com/ipfs/kubo/blob/master/docs/config.md#server-profile) now also blocks IPv4 loopback (`127.0.0.0/8`) and the IANA-reserved `0000::/3` IPv6 block. Since [v0.40.0](https://github.com/ipfs/kubo/blob/master/docs/changelogs/v0.40.md#-libp2p-announces-all-interface-addresses), libp2p has enumerated all local interfaces, causing public `server`-profile nodes (including the default IPFS bootstrappers) to leak loopback and unallocated IPv6 prefixes like `1e::/16` through libp2p identify and DHT self-records (see [go-libp2p#3460](https://github.com/libp2p/go-libp2p/issues/3460)). |
| 220 | |
| 221 | Default-configured nodes are unaffected. To pick up the new entries on an existing `server`-profile node: |
| 222 | |
| 223 | ```console |
| 224 | $ ipfs config profile apply server |
| 225 | ``` |
| 226 | |
| 227 | The command is idempotent. See the [`server` profile docs](https://github.com/ipfs/kubo/blob/master/docs/config.md#server-profile) for the full filter list, RFC references, and override guidance. |
| 228 | |
| 229 | > [!WARNING] |
| 230 | > The `server` profile disables local peer discovery ([`Discovery.MDNS`](https://github.com/ipfs/kubo/blob/master/docs/config.md#discoverymdns) off, loopback filtered), so co-located daemons on the same host and peers on the same LAN will no longer find each other automatically. Apply only on public-internet nodes where that is intended. |
| 231 | |
| 232 | > [!CAUTION] |
| 233 | > If a manually configured libp2p listener (for example `/ip4/127.0.0.1/tcp/.../ws` fronted by a local nginx or Caddy reverse proxy) terminates inbound on `127.0.0.1`, the new loopback entry in [`Swarm.AddrFilters`](https://github.com/ipfs/kubo/blob/master/docs/config.md#swarmaddrfilters) makes the gater RST every inbound from the proxy before the libp2p handshake. Remove `/ip4/127.0.0.0/ipcidr/8` (and `/ip6/::1/ipcidr/128`, `/ip6/::/ipcidr/3` if the proxy uses IPv6 loopback) from `Swarm.AddrFilters` only; keep them in [`Addresses.NoAnnounce`](https://github.com/ipfs/kubo/blob/master/docs/config.md#addressesnoannounce) so the loopback addresses are still stripped from identify and DHT records. |
| 234 | |
| 235 | #### 🐹 Go 1.26, Once More with Feeling |
| 236 | |
| 237 | Kubo first shipped with [Go 1.26](https://go.dev/doc/go1.26) in v0.40.0, but [v0.40.1](https://github.com/ipfs/kubo/blob/master/docs/changelogs/v0.40.md#v0401) had to downgrade to Go 1.25 because of a Windows crash in Go's overlapped I/O layer ([#11214](https://github.com/ipfs/kubo/issues/11214)). Go 1.26.2 fixes that regression upstream ([golang/go#78041](https://github.com/golang/go/issues/78041)), so Kubo is back on Go 1.26 across all platforms. |
| 238 | |
| 239 | 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. |
| 240 | |
| 241 | #### 🐛 Fixed long-standing random daemon crashes during DHT lookups |
| 242 | |
| 243 | Long-running daemons could exit with `invalid memory address or nil pointer dereference` or similar memory errors while handling DHT traffic. The cause was a data race in the routing layer that had been latent for years: `PublishQueryEvent` handed `QueryEvent.Responses` to subscribers (like `findprovs`) by pointer while the publisher kept mutating the same `AddrInfo.Addrs` slices. |
| 244 | |
| 245 | Two recent changes likely tipped the race into frequent visible crashes: [go-multiaddr v0.15](https://github.com/multiformats/go-multiaddr/releases/tag/v0.15.0) turned `Multiaddr` from an interface into a slice-backed struct, and [Go 1.26](https://go.dev/doc/go1.26) added heap base address randomization and a new garbage collector. Both likely made torn concurrent reads more likely to dereference unmapped memory. |
| 246 | |
| 247 | This release picks up the targeted fix in [go-libp2p-kad-dht#1244](https://github.com/libp2p/go-libp2p-kad-dht/pull/1244). A broader fix for the whole class of routing publish races is proposed upstream in [go-libp2p#3490](https://github.com/libp2p/go-libp2p/pull/3490). |
| 248 | |
| 249 | #### 📦️ Dependency updates |
| 250 | |
| 251 | - update `go-libp2p` to [v0.48.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.48.0) |
| 252 | - update `go-libp2p-kad-dht` to [v0.39.1](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.39.1) (incl. [v0.39.0](https://github.com/libp2p/go-libp2p-kad-dht/releases/tag/v0.39.0)) |
| 253 | - update `ipfs-webui` to [v4.12.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.12.0) |
| 254 | - update `gateway-conformance` tests to [v0.13](https://github.com/ipfs/gateway-conformance/releases/tag/v0.13.0) (incl. [v0.12](https://github.com/ipfs/gateway-conformance/releases/tag/v0.12.0), [v0.11](https://github.com/ipfs/gateway-conformance/releases/tag/v0.11.0)) |
| 255 | - update `boxo` to [v0.39.0](https://github.com/ipfs/boxo/releases/tag/v0.39.0) (incl. [v0.38.0](https://github.com/ipfs/boxo/releases/tag/v0.38.0)) |
| 256 | - update `go-cid` to [v0.6.1](https://github.com/ipfs/go-cid/releases/tag/v0.6.1) (pulls in `go-multibase` [v0.3.0](https://github.com/multiformats/go-multibase/releases/tag/v0.3.0) with up to 5x faster base58 encoding for CIDv0) |
| 257 | - update `p2p-forge/client` to [v0.8.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.8.0) |
| 258 | |
| 259 | ### 📝 Changelog |
| 260 | |
| 261 | <details><summary>Full Changelog</summary> |
| 262 | |
| 263 | - github.com/ipfs/kubo: |
| 264 | - fix(pins): snapshot index before emitting pins (#11290) ([ipfs/kubo#11290](https://github.com/ipfs/kubo/pull/11290)) |
| 265 | - Upgrade to Boxo v0.39.0 (#11294) ([ipfs/kubo#11294](https://github.com/ipfs/kubo/pull/11294)) |
| 266 | - fix(log): scope provide logs to "provider" subsystem (#11289) ([ipfs/kubo#11289](https://github.com/ipfs/kubo/pull/11289)) |
| 267 | - chore: set version to v0.41.0-rc2 |
| 268 | - fix(defaultServerFilters): strip loopback and non-public (#11286) ([ipfs/kubo#11286](https://github.com/ipfs/kubo/pull/11286)) |
| 269 | - chore: bump p2p-forge to v0.8.0 (#11285) ([ipfs/kubo#11285](https://github.com/ipfs/kubo/pull/11285)) |
| 270 | - fix: queryevent addrinfo race in kad-dht (#11288) ([ipfs/kubo#11288](https://github.com/ipfs/kubo/pull/11288)) |
| 271 | - fix(examples): avoid bitswap race, use ed25519 (#11282) ([ipfs/kubo#11282](https://github.com/ipfs/kubo/pull/11282)) |
| 272 | - docs: fix v0.41 changelog highlights |
| 273 | - fix(fuse): accurate `st_blocks` and `st_blksize` (#11280) ([ipfs/kubo#11280](https://github.com/ipfs/kubo/pull/11280)) |
| 274 | - chore: set version to v0.41.0-rc1 |
| 275 | - test(fuse): fix racy Statfs assertions |
| 276 | - fix(cli/rpc): --cid-base works in all commands (#11239) ([ipfs/kubo#11239](https://github.com/ipfs/kubo/pull/11239)) |
| 277 | - feat(fuse): Statfs (#11261) ([ipfs/kubo#11261](https://github.com/ipfs/kubo/pull/11261)) |
| 278 | - feat: add built-in `ipfs update` command (#11203) ([ipfs/kubo#11203](https://github.com/ipfs/kubo/pull/11203)) |
| 279 | - fix(filestore): respect Provide.Strategy (#11243) ([ipfs/kubo#11243](https://github.com/ipfs/kubo/pull/11243)) |
| 280 | - feat(provide): +unique and +entities strategy modifiers (#11245) ([ipfs/kubo#11245](https://github.com/ipfs/kubo/pull/11245)) |
| 281 | - fix(fuse): switch to hanwen/go-fuse (#11272) ([ipfs/kubo#11272](https://github.com/ipfs/kubo/pull/11272)) |
| 282 | - Upgrade to Boxo v0.38.0 (#11276) ([ipfs/kubo#11276](https://github.com/ipfs/kubo/pull/11276)) |
| 283 | - feat: go 1.26.2 (#11275) ([ipfs/kubo#11275](https://github.com/ipfs/kubo/pull/11275)) |
| 284 | - fix(mfs): respect Import config (#11273) ([ipfs/kubo#11273](https://github.com/ipfs/kubo/pull/11273)) |
| 285 | - fix(fuse): IPNS writes actually publish (#11271) ([ipfs/kubo#11271](https://github.com/ipfs/kubo/pull/11271)) |
| 286 | - fix(mfs): fix fsync deadlock, set attrs, disable default caching (#11255) ([ipfs/kubo#11255](https://github.com/ipfs/kubo/pull/11255)) |
| 287 | - ci: update gateway-conformance to v0.13 (#11262) ([ipfs/kubo#11262](https://github.com/ipfs/kubo/pull/11262)) |
| 288 | - fix(rpc): CARv2 import over HTTP API (#11253) ([ipfs/kubo#11253](https://github.com/ipfs/kubo/pull/11253)) |
| 289 | - chore: fix gofmt (#11256) ([ipfs/kubo#11256](https://github.com/ipfs/kubo/pull/11256)) |
| 290 | - fix: replace deprecated otelhttp.WithMetricAttributesFn (#11257) ([ipfs/kubo#11257](https://github.com/ipfs/kubo/pull/11257)) |
| 291 | - fix(rpc): validate UnixFS in `object patch` (#11248) ([ipfs/kubo#11248](https://github.com/ipfs/kubo/pull/11248)) |
| 292 | - fix(cmd): use restrictive file permissions for exported keys (#11246) ([ipfs/kubo#11246](https://github.com/ipfs/kubo/pull/11246)) |
| 293 | - chore: add go-libp2p and kad-dht bumps to v0.41 changelog |
| 294 | - feat(cmd): add 'ipfs cid inspect' command (#11241) ([ipfs/kubo#11241](https://github.com/ipfs/kubo/pull/11241)) |
| 295 | - fix(provider): purge keystore datastore after reset (#11198) ([ipfs/kubo#11198](https://github.com/ipfs/kubo/pull/11198)) |
| 296 | - fix: correct provider addresses for custom HTTP routing (#11234) ([ipfs/kubo#11234](https://github.com/ipfs/kubo/pull/11234)) |
| 297 | - fix(rpc/pin): return error if listing an invalid, but known, pin type (#11238) ([ipfs/kubo#11238](https://github.com/ipfs/kubo/pull/11238)) |
| 298 | - fix: validate --max-hamt-fanout CLI flag per UnixFS spec (#11230) ([ipfs/kubo#11230](https://github.com/ipfs/kubo/pull/11230)) |
| 299 | - test: fix flaky tests on ci (#11236) ([ipfs/kubo#11236](https://github.com/ipfs/kubo/pull/11236)) |
| 300 | - docs: use specs.ipfs.tech links for merged IPIPs (#11228) ([ipfs/kubo#11228](https://github.com/ipfs/kubo/pull/11228)) |
| 301 | - chore: add changelog placeholder for v0.42 |
| 302 | - chore: update webui to v4.12.0 (#11221) ([ipfs/kubo#11221](https://github.com/ipfs/kubo/pull/11221)) |
| 303 | - fix(windows): revert update to Go 1.26 (#11215) ([ipfs/kubo#11215](https://github.com/ipfs/kubo/pull/11215)) |
| 304 | - docs: streamline release checklist ordering and dependencies (#11193) ([ipfs/kubo#11193](https://github.com/ipfs/kubo/pull/11193)) |
| 305 | - Merge release v0.40.0 ([ipfs/kubo#11212](https://github.com/ipfs/kubo/pull/11212)) |
| 306 | - fix(metrics): disable otel exemplars to prevent rune overflow (#11211) ([ipfs/kubo#11211](https://github.com/ipfs/kubo/pull/11211)) |
| 307 | - fix: drop high-cardinality server.address from http_server metrics (#11208) ([ipfs/kubo#11208](https://github.com/ipfs/kubo/pull/11208)) |
| 308 | - test(gateway-conformance): update to v0.11 (#11207) ([ipfs/kubo#11207](https://github.com/ipfs/kubo/pull/11207)) |
| 309 | - chore: update webui to v4.11.1 (#11204) ([ipfs/kubo#11204](https://github.com/ipfs/kubo/pull/11204)) |
| 310 | - docs: add AGENTS.md with instructions for AI coding agents (#11200) ([ipfs/kubo#11200](https://github.com/ipfs/kubo/pull/11200)) |
| 311 | - fix: improve `ipfs name put` for IPNS record republishing (#11199) ([ipfs/kubo#11199](https://github.com/ipfs/kubo/pull/11199)) |
| 312 | - Upgrade to Boxo v0.37.0 (#11201) ([ipfs/kubo#11201](https://github.com/ipfs/kubo/pull/11201)) |
| 313 | - chore: prepare master for v0.41.0-dev cycle |
| 314 | - github.com/ipfs/bbloom (v0.0.4 -> v0.1.0): |
| 315 | - chore: bump version to v0.1.0 |
| 316 | - docs: explain why this fork exists and how IPFS uses it |
| 317 | - docs: add examples and improve godoc for exported symbols |
| 318 | - chore: fix LICENSE for GitHub and pkg.go.dev detection |
| 319 | - feat: allow caller-provided SipHash keys (#30) ([ipfs/bbloom#30](https://github.com/ipfs/bbloom/pull/30)) |
| 320 | - fix: make double-hash step always odd and non-zero (#29) ([ipfs/bbloom#29](https://github.com/ipfs/bbloom/pull/29)) |
| 321 | - test: false positive bloom filter test and test data generated (#15) ([ipfs/bbloom#15](https://github.com/ipfs/bbloom/pull/15)) |
| 322 | - docs: add doc.go and godoc comments for all public symbols (#28) ([ipfs/bbloom#28](https://github.com/ipfs/bbloom/pull/28)) |
| 323 | - docs: update README and add benchmarks |
| 324 | - Update collision_test.go |
| 325 | - fix: stop using math/rand.Read |
| 326 | - sync: update CI config files (#16) ([ipfs/bbloom#16](https://github.com/ipfs/bbloom/pull/16)) |
| 327 | - sync: update CI config files (#13) ([ipfs/bbloom#13](https://github.com/ipfs/bbloom/pull/13)) |
| 328 | - cleanup: fix staticcheck failures ([ipfs/bbloom#8](https://github.com/ipfs/bbloom/pull/8)) |
| 329 | - Add LICENSE (copied from upstream) |
| 330 | - github.com/ipfs/boxo (v0.37.0 -> v0.39.0): |
| 331 | - Release v0.39.0 ([ipfs/boxo#1149](https://github.com/ipfs/boxo/pull/1149)) |
| 332 | - fix: pinner shutdown race (#1146) ([ipfs/boxo#1146](https://github.com/ipfs/boxo/pull/1146)) |
| 333 | - fix(bitswap): prevent low-pending peer starvation (#1143) ([ipfs/boxo#1143](https://github.com/ipfs/boxo/pull/1143)) |
| 334 | - fix(bitswap/bsnet): close streams in background (#1144) ([ipfs/boxo#1144](https://github.com/ipfs/boxo/pull/1144)) |
| 335 | - fix(dspinner): snapshot index before emitting pins (#1140) ([ipfs/boxo#1140](https://github.com/ipfs/boxo/pull/1140)) |
| 336 | - feat(gateway): add content size limits for responses (#1138) ([ipfs/boxo#1138](https://github.com/ipfs/boxo/pull/1138)) |
| 337 | - test(dag/walker): fix flaky bloom FP assertion (#1139) ([ipfs/boxo#1139](https://github.com/ipfs/boxo/pull/1139)) |
| 338 | - Release v0.38.0 ([ipfs/boxo#1137](https://github.com/ipfs/boxo/pull/1137)) |
| 339 | - feat(ipns): Support adding custom metadata to IPNS record (#1085) ([ipfs/boxo#1085](https://github.com/ipfs/boxo/pull/1085)) |
| 340 | - feat(dag/walker): opt-in BloomTracker to avoid duplicated walks (#1124) ([ipfs/boxo#1124](https://github.com/ipfs/boxo/pull/1124)) |
| 341 | - fix(mfs): prevent flushUp from re-adding unlinked entries (#1134) ([ipfs/boxo#1134](https://github.com/ipfs/boxo/pull/1134)) |
| 342 | - fix(mfs): serialize all FileDescriptor operations (#1133) ([ipfs/boxo#1133](https://github.com/ipfs/boxo/pull/1133)) |
| 343 | - fix(mfs): prevent panic on concurrent flush and close (#1131) ([ipfs/boxo#1131](https://github.com/ipfs/boxo/pull/1131)) |
| 344 | - fix(mfs): preserve CidBuilder object in setNodeData(), Mkdir() and NewRoot() (#1125) ([ipfs/boxo#1125](https://github.com/ipfs/boxo/pull/1125)) |
| 345 | - test(gateway): cover bare CID etag match for dir listings (#1129) ([ipfs/boxo#1129](https://github.com/ipfs/boxo/pull/1129)) |
| 346 | - chore(gateway): bump gateway-conformance to v0.13 (#1130) ([ipfs/boxo#1130](https://github.com/ipfs/boxo/pull/1130)) |
| 347 | - docs: add missing godoc (#1122) ([ipfs/boxo#1122](https://github.com/ipfs/boxo/pull/1122)) |
| 348 | - fix(bitswap/httpnet): infer default port for portless HTTP multiaddrs (#1123) ([ipfs/boxo#1123](https://github.com/ipfs/boxo/pull/1123)) |
| 349 | - upgrade to go-libp2p v0.48.0 (#1120) ([ipfs/boxo#1120](https://github.com/ipfs/boxo/pull/1120)) |
| 350 | - feat(routing/http/client): add WithProviderInfoFunc for lazy address resolution (#1115) ([ipfs/boxo#1115](https://github.com/ipfs/boxo/pull/1115)) |
| 351 | - chore: remove stale boxo-migrate references from README (#1119) ([ipfs/boxo#1119](https://github.com/ipfs/boxo/pull/1119)) |
| 352 | - fix(bitswap): ignore identity CIDs instead of killing connection (#1117) ([ipfs/boxo#1117](https://github.com/ipfs/boxo/pull/1117)) |
| 353 | - chore(gateway): remove dead DoH resolver for .crypto TLD (#1118) ([ipfs/boxo#1118](https://github.com/ipfs/boxo/pull/1118)) |
| 354 | - feat: custom chunker registry (#1116) ([ipfs/boxo#1116](https://github.com/ipfs/boxo/pull/1116)) |
| 355 | - refactor: remove go-ipfs migration and deprecation code (#1113) ([ipfs/boxo#1113](https://github.com/ipfs/boxo/pull/1113)) |
| 356 | - github.com/ipfs/go-cid (v0.6.0 -> v0.6.1): |
| 357 | - v0.6.1 bump (#183) ([ipfs/go-cid#183](https://github.com/ipfs/go-cid/pull/183)) |
| 358 | - github.com/ipfs/go-ds-dynamodb (v0.2.0 -> v0.2.2): |
| 359 | - new version (#17) ([ipfs/go-ds-dynamodb#17](https://github.com/ipfs/go-ds-dynamodb/pull/17)) |
| 360 | - update go-datastore (#16) ([ipfs/go-ds-dynamodb#16](https://github.com/ipfs/go-ds-dynamodb/pull/16)) |
| 361 | - new version (#15) ([ipfs/go-ds-dynamodb#15](https://github.com/ipfs/go-ds-dynamodb/pull/15)) |
| 362 | - use go-datastore without goprocess (#14) ([ipfs/go-ds-dynamodb#14](https://github.com/ipfs/go-ds-dynamodb/pull/14)) |
| 363 | - github.com/ipfs/go-ds-pebble (v0.5.9 -> v0.5.10): |
| 364 | - new version (#84) ([ipfs/go-ds-pebble#84](https://github.com/ipfs/go-ds-pebble/pull/84)) |
| 365 | - provide function to access underlying database (#82) ([ipfs/go-ds-pebble#82](https://github.com/ipfs/go-ds-pebble/pull/82)) |
| 366 | - replace deprecated `iter.Value` with `iter.ValueAndErr` (#80) ([ipfs/go-ds-pebble#80](https://github.com/ipfs/go-ds-pebble/pull/80)) |
| 367 | - github.com/ipfs/go-ipld-legacy (v0.2.2 -> v0.3.0): |
| 368 | - new version ([ipfs/go-ipld-legacy#29](https://github.com/ipfs/go-ipld-legacy/pull/29)) |
| 369 | - Clean up README.md formatting and content |
| 370 | - modernize code ([ipfs/go-ipld-legacy#28](https://github.com/ipfs/go-ipld-legacy/pull/28)) |
| 371 | - github.com/ipfs/go-test (v0.2.3 -> v0.3.0): |
| 372 | - new version (#35) ([ipfs/go-test#35](https://github.com/ipfs/go-test/pull/35)) |
| 373 | - feat: functions to generate random AddrInfo (#34) ([ipfs/go-test#34](https://github.com/ipfs/go-test/pull/34)) |
| 374 | - github.com/ipld/go-ipld-prime (v0.22.0 -> v0.23.0): |
| 375 | failed to fetch repo |
| 376 | - github.com/ipshipyard/p2p-forge (v0.7.0 -> v0.8.0): |
| 377 | - chore: v0.8.0 with dependency updates (#86) ([ipshipyard/p2p-forge#86](https://github.com/ipshipyard/p2p-forge/pull/86)) |
| 378 | - fix: bump Dockerfile to Go 1.25 (#85) ([ipshipyard/p2p-forge#85](https://github.com/ipshipyard/p2p-forge/pull/85)) |
| 379 | - feat: add ovh2 nameserver to libp2p.direct zone (#84) ([ipshipyard/p2p-forge#84](https://github.com/ipshipyard/p2p-forge/pull/84)) |
| 380 | - github.com/libp2p/go-libp2p (v0.47.0 -> v0.48.0): |
| 381 | - Release v0.48.0 |
| 382 | - refactor(webtransport): Use keygen package for deterministic ecdsa key generation. |
| 383 | - Bump transport interop Go toolchain |
| 384 | - basichost: advertise all interface addrs for unspecified listen addrs (#3468) ([libp2p/go-libp2p#3468](https://github.com/libp2p/go-libp2p/pull/3468)) |
| 385 | - fix(mocknet): make stream deadline methods noop instead of returning error (#3471) ([libp2p/go-libp2p#3471](https://github.com/libp2p/go-libp2p/pull/3471)) |
| 386 | - webrtc: upgrade pion deps (#3469) ([libp2p/go-libp2p#3469](https://github.com/libp2p/go-libp2p/pull/3469)) |
| 387 | - refactor: apply go fix modernizers from Go 1.26 (#3463) ([libp2p/go-libp2p#3463](https://github.com/libp2p/go-libp2p/pull/3463)) |
| 388 | - quicreuse: fix incorrect skip in TestReuseListenOnSpecificInterface (#3417) ([libp2p/go-libp2p#3417](https://github.com/libp2p/go-libp2p/pull/3417)) |
| 389 | - cleanup dcutr legacy behavior and add fallback |
| 390 | - Remove assertion that assumes a certain CI network environment |
| 391 | - github.com/libp2p/go-libp2p-kad-dht (v0.38.0 -> v0.39.1): |
| 392 | - chore: release v0.39.1 (#1245) ([libp2p/go-libp2p-kad-dht#1245](https://github.com/libp2p/go-libp2p-kad-dht/pull/1245)) |
| 393 | - fix: data race on AddrInfo.Addrs in queryPeer (#1244) ([libp2p/go-libp2p-kad-dht#1244](https://github.com/libp2p/go-libp2p-kad-dht/pull/1244)) |
| 394 | - fix(provider): reduce provide log verbosity (#1243) ([libp2p/go-libp2p-kad-dht#1243](https://github.com/libp2p/go-libp2p-kad-dht/pull/1243)) |
| 395 | - tests: fix flaky TestStartProvidingSingle (#1242) ([libp2p/go-libp2p-kad-dht#1242](https://github.com/libp2p/go-libp2p-kad-dht/pull/1242)) |
| 396 | - chore: release v0.39.0 (#1240) ([libp2p/go-libp2p-kad-dht#1240](https://github.com/libp2p/go-libp2p-kad-dht/pull/1240)) |
| 397 | - feat(provider/keystore): alt datastore wipe (#1233) ([libp2p/go-libp2p-kad-dht#1233](https://github.com/libp2p/go-libp2p-kad-dht/pull/1233)) |
| 398 | - Expose provider record TTL as options (#1237) ([libp2p/go-libp2p-kad-dht#1237](https://github.com/libp2p/go-libp2p-kad-dht/pull/1237)) |
| 399 | - github.com/multiformats/go-multibase (v0.2.0 -> v0.3.0): |
| 400 | - chore: release v0.3.0 (#70) ([multiformats/go-multibase#70](https://github.com/multiformats/go-multibase/pull/70)) |
| 401 | - test: update spec submodule (#69) ([multiformats/go-multibase#69](https://github.com/multiformats/go-multibase/pull/69)) |
| 402 | - chore: bump base58 version (#67) ([multiformats/go-multibase#67](https://github.com/multiformats/go-multibase/pull/67)) |
| 403 | |
| 404 | </details> |
| 405 | |
| 406 | ### 👨👩👧👦 Contributors |
| 407 | |
| 408 | | Contributor | Commits | Lines ± | Files Changed | |
| 409 | |-------------|---------|---------|---------------| |
| 410 | | [@lidel](https://github.com/lidel) | 71 | +18331/-4390 | 358 | |
| 411 | | [@gammazero](https://github.com/gammazero) | 24 | +810/-1409 | 165 | |
| 412 | | [@guillaumemichel](https://github.com/guillaumemichel) | 4 | +1302/-105 | 15 | |
| 413 | | [@wjmelements](https://github.com/wjmelements) | 3 | +780/-160 | 26 | |
| 414 | | [@davidebeatrici](https://github.com/davidebeatrici) | 1 | +428/-211 | 7 | |
| 415 | | [@phaseloop](https://github.com/phaseloop) | 1 | +533/-7 | 6 | |
| 416 | | [@jolo18](https://github.com/jolo18) | 1 | +370/-5 | 4 | |
| 417 | | [@alanshaw](https://github.com/alanshaw) | 1 | +272/-31 | 6 | |
| 418 | | [@sukunrt](https://github.com/sukunrt) | 2 | +14/-208 | 6 | |
| 419 | | [@snissn](https://github.com/snissn) | 1 | +7/-157 | 2 | |
| 420 | | [@phillebaba](https://github.com/phillebaba) | 1 | +116/-30 | 5 | |
| 421 | | [@HarukaMa](https://github.com/HarukaMa) | 1 | +125/-9 | 4 | |
| 422 | | [@rayspock](https://github.com/rayspock) | 1 | +118/-14 | 3 | |
| 423 | | [@MarcoPolo](https://github.com/MarcoPolo) | 5 | +33/-66 | 6 | |
| 424 | | [@jpserrat](https://github.com/jpserrat) | 1 | +10/-45 | 3 | |
| 425 | | [@aschmahmann](https://github.com/aschmahmann) | 2 | +35/-2 | 4 | |
| 426 | | [@hsanjuan](https://github.com/hsanjuan) | 1 | +35/-0 | 1 | |
| 427 | | [@walldiss](https://github.com/walldiss) | 1 | +6/-12 | 1 | |
| 428 | | [@web3-bot](https://github.com/web3-bot) | 4 | +4/-4 | 4 | |
| 429 | | [@iand](https://github.com/iand) | 1 | +4/-2 | 1 | |
| 430 | | [@mr-tron](https://github.com/mr-tron) | 1 | +1/-1 | 1 | |