Releases: ipfs/kubo
v0.38.0-rc1
This release was brought to you by the Shipyard team.
- Draft release notes: docs/changelogs/v0.38.md
- Release status: #10884
v0.37.0
Note
This release was brought to you by the Shipyard team.
- Overview
- 🔦 Highlights
- 🚀 Repository migration from v16 to v17 with embedded tooling
- 🚦 Gateway concurrent request limits and retrieval timeouts
- 🔧 AutoConf: Complete control over network defaults
- 🗑️ Clear provide queue when reprovide strategy changes
- 🪵 Revamped
ipfs log levelcommand - 📌 Named pins in
ipfs addcommand - 📝 New IPNS publishing options
- 🔢 Custom sequence numbers in
ipfs name publish - ⚙️
Reprovider.Strategyis now consistently respected - ⚙️
Reprovider.Strategy=all: improved memory efficiency - 🧹 Removed unnecessary dependencies
- 🔍 Improved
ipfs cid ⚠️ Deprecatedipfs stats reprovide- 🔄 AutoRelay now uses all connected peers for relay discovery
- 📊 Anonymous telemetry for better feature prioritization
- 📦️ Important dependency updates
- 📝 Changelog
- 👨👩👧👦 Contributors
Overview
Kubo 0.37.0 introduces embedded repository migrations, gateway resource protection, complete AutoConf control, improved reprovider strategies, and anonymous telemetry for better feature prioritization. This release significantly improves memory efficiency, network configuration flexibility, and operational reliability while maintaining full backward compatibility.
🔦 Highlights
🚀 Repository migration from v16 to v17 with embedded tooling
This release migrates the Kubo repository from version 16 to version 17. Migrations are now built directly into the binary - completing in milliseconds without internet access or external downloads.
ipfs daemon --migrate performs migrations automatically. Manual migration: ipfs repo migrate --to=17 (or --to=16 --allow-downgrade for compatibility). Embedded migrations apply to v17+; older versions still require external tools.
Legacy migration deprecation: Support for legacy migrations that download binaries from the internet will be removed in a future version. Only embedded migrations for the last 3 releases will be supported. Users with very old repositories should update in stages rather than skipping multiple versions.
🚦 Gateway concurrent request limits and retrieval timeouts
New configurable limits protect gateway resources during high load:
Gateway.RetrievalTimeout(default: 30s): Maximum duration for content retrieval. Returns 504 Gateway Timeout when exceeded - applies to both initial retrieval (time to first byte) and between subsequent writes.Gateway.MaxConcurrentRequests(default: 4096): Limits concurrent HTTP requests. Returns 429 Too Many Requests when exceeded. Protects nodes from traffic spikes and resource exhaustion, especially useful behind reverse proxies without rate-limiting.
New Prometheus metrics for monitoring:
ipfs_http_gw_concurrent_requests: Current requests being processedipfs_http_gw_responses_total: HTTP responses by status codeipfs_http_gw_retrieval_timeouts_total: Timeouts by status code and truncation status
Tuning tips:
- Monitor metrics to understand gateway behavior and adjust based on observations
- Watch
ipfs_http_gw_concurrent_requestsfor saturation - Track
ipfs_http_gw_retrieval_timeouts_totalvs success rates to identify timeout patterns indicating routing or storage provider issues
🔧 AutoConf: Complete control over network defaults
Configuration fields now support ["auto"] placeholders that resolve to network defaults from AutoConf.URL. These defaults can be inspected, replaced with custom values, or disabled entirely. Previously, empty configuration fields like Routing.DelegatedRouters: [] would use hardcoded defaults - this system makes those defaults explicit through "auto" values. When upgrading to Kubo 0.37, custom configurations remain unchanged.
New --expand-auto flag shows resolved values for any config field:
ipfs config show --expand-auto # View all resolved endpoints
ipfs config Bootstrap --expand-auto # Check specific values
ipfs config Routing.DelegatedRouters --expand-auto
ipfs config DNS.Resolvers --expand-autoConfiguration can be managed via:
- Replace
"auto"with custom endpoints or set[]to disable features - Switch modes with
--profile=autoconf-on|autoconf-off - Configure via
AutoConf.Enabledand custom manifests viaAutoConf.URL
# Enable automatic configuration
ipfs config profiles apply autoconf-on
# Or manually set specific fields
ipfs config Bootstrap '["auto"]'
ipfs config --json DNS.Resolvers '{".": ["https://dns.example.com/dns-query"], "eth.": ["auto"]}'Organizations can host custom AutoConf manifests for private networks. See AutoConf documentation and format spec at https://conf.ipfs-mainnet.org/
🗑️ Clear provide queue when reprovide strategy changes
Changing Reprovider.Strategy and restarting Kubo now automatically clears the provide queue. Only content matching the new strategy will be announced.
Manual queue clearing is also available:
ipfs provide clear- clear all queued content announcements
Note
Upgrading to Kubo 0.37 will automatically clear any preexisting provide queue. The next time Reprovider.Interval hits, Reprovider.Strategy will be executed on a clean slate, ensuring consistent behavior with your current configuration.
🪵 Revamped ipfs log level command
The ipfs log level command has been completely revamped to support both getting and setting log levels with a unified interface.
New: Getting log levels
ipfs log level- Shows default level onlyipfs log level all- Shows log level for every subsystem, including default levelipfs log level foo- Shows log level for a specific subsystem only- Kubo RPC API:
POST /api/v0/log/level?arg=<subsystem>
Enhanced: Setting log levels
ipfs log level foo debug- Sets "foo" subsystem to "debug" levelipfs log level all info- Sets all subsystems to "info" level (convenient, no escaping)ipfs log level '*' info- Equivalent to above but requires shell escapingipfs log level foo default- Sets "foo" subsystem to current default level
The command now provides full visibility into your current logging configuration while maintaining full backward compatibility. Both all and * work for specifying all subsystems, with all being more convenient since it doesn't require shell escaping.
🧷 Named pins in ipfs add command
Added --pin-name flag to ipfs add for assigning names to pins.
$ ipfs add --pin-name=testname cat.jpg
added bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi cat.jpg
$ ipfs pin ls --names
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi recursive testname📝 New IPNS publishing options
Added support for controlling IPNS record publishing strategies with new command flags and configuration.
New command flags:
# Publish without network connectivity (local datastore only)
ipfs name publish --allow-offline /ipfs/QmHash
# Publish without DHT connectivity (uses local datastore and HTTP delegated publishers)
ipfs name publish --allow-delegated /ipfs/QmHashDelegated publishers configuration:
Ipns.DelegatedPublishers configures HTTP endpoints for IPNS publishing. Supports "auto" for network defaults or custom HTTP endpoints. The --allow-delegated flag enables publishing through these endpoints without requiring DHT connectivity, useful for nodes behind restrictive networks or during testing.
🔢 Custom sequence numbers in ipfs name publish
Added --sequence flag to ipfs name publish for setting custom sequence numbers in IPNS records. This enables advanced use cases like manually coordinating updates across multiple nodes. See ipfs name publish --help for details.
⚙️ Reprovider.Strategy is now consistently respected
Prior to this version, files added, blocks received etc. were "provided" to the network (announced on the DHT) regardless of the "reproviding strategy" setting. For example:
- Strategy set to "pi...
v0.37.0-rc1
This release was brought to you by the Shipyard team.
Draft release notes: docs/changelogs/v0.37.md
Release status: #10867
v0.36.0
Note
This release was brought to you by the Shipyard team.
- Overview
- 🔦 Highlights
- HTTP Retrieval Client Now Enabled by Default
- Bitswap Broadcast Reduction
- Update go-log to v2
- Kubo now uses AutoNATv2 as a client
- Overwrite option for files cp command
- Gateway now supports negative HTTP Range requests
- Option for
filestorecommand to remove bad blocks ConnMgr.SilencePeriodconfiguration setting exposed- Fix handling of EDITOR env var
- 📦️ Important dependency updates
- 📝 Changelog
- 👨👩👧👦 Contributors
Overview
🔦 Highlights
HTTP Retrieval Client Now Enabled by Default
This release promotes the HTTP Retrieval client from an experimental feature to a standard feature that is enabled by default. When possible, Kubo will retrieve blocks over plain HTTPS (HTTP/2) without any extra user configuration.
See HTTPRetrieval for more details.
Bitswap Broadcast Reduction
The Bitswap client now supports broadcast reduction logic, which is enabled by default. This feature significantly reduces the number of broadcast messages sent to peers, resulting in lower bandwidth usage during load spikes.
The overall logic works by sending to non-local peers only if those peers have previously replied that they want data blocks. To minimize impact on existing workloads, by default, broadcasts are still always sent to peers on the local network, or the ones defined in Peering.Peers.
At Shipyard, we conducted A/B testing on our internal Kubo staging gateway with organic CID requests to ipfs.io. While these results may not exactly match your specific workload, the benefits proved significant enough to make this feature default. Here are the key findings:
- Dramatic Resource Usage Reduction: Internal testing demonstrated a reduction in Bitswap broadcast messages by 80-98% and network bandwidth savings of 50-95%, with the greatest improvements occurring during high traffic and peer spikes. These efficiency gains lower operational costs of running Kubo under high load and improve the IPFS Mainnet (which is >80% Kubo-based) by reducing ambient traffic for all connected peers.
- Improved Memory Stability: Memory stays stable even during major CID request spikes that increase peer count, preventing the out-of-memory (OOM) issues found in earlier Kubo versions.
- Data Retrieval Performance Remains Strong: Our tests suggest that Kubo gateway hosts with broadcast reduction enabled achieve similar or better HTTP 200 success rates compared to version 0.35, while maintaining equivalent or higher want-have responses and unique blocks received.
For more information about our A/B tests, see kubo#10825.
To revert to the previous behavior for your own A/B testing, set Internal.Bitswap.BroadcastControl.Enable to false and monitor relevant metrics (ipfs_bitswap_bcast_skips_total, ipfs_bitswap_haves_received, ipfs_bitswap_unique_blocks_received, ipfs_bitswap_wanthaves_broadcast, HTTP 200 success rate).
For a description of the configuration items, see the documentation of Internal.Bitswap.BroadcastControl.
Update go-log to v2
go-log v2 has been out for quite a while now and it's time to deprecate v1.
- Replace all use of
go-logwithgo-log/v2 - Makes
/api/v0/log/tailuseful over HTTP - Fixes
ipfs log tail - Removes support for
ContextWithLoggableas this is not needed for tracing-like functionality
Kubo now uses AutoNATv2 as a client
This Kubo release starts utilizing AutoNATv2 client functionality. go-libp2p v0.42 supports and depends on both AutoNATv1 and v2, and Autorelay feature continues to use v1. go-libp2p v0.43+ will discontinue internal use of AutoNATv1. We will maintain support for both v1 and v2 until then, though v1 will gradually be deprecated and ultimately removed.
Smarter AutoTLS registration
This update to libp2p and AutoTLS incorporates AutoNATv2 changes. It aims to reduce false-positive scenarios where AutoTLS certificate registration occurred before a publicly dialable multiaddr was available. This should result in fewer error logs during node start, especially when IPv6 and/or IPv4 NATs with UPnP/PCP/NAT-PMP are at play.
Overwrite option for files cp command
The ipfs files cp command has a --force option to allow it to overwrite existing files. Attempting to overwrite an existing directory results in an error.
Gateway now supports negative HTTP Range requests
The latest update to boxo/gateway adds support for negative HTTP Range requests, achieving gateway-conformance@v0.8 compatibility.
This provides greater interoperability with generic HTTP-based tools. For example, WebRecorder's https://replayweb.page/ can now directly load website snapshots from Kubo-backed URLs.
Option for filestore command to remove bad blocks
The experimental filestore command has a new option, --remove-bad-blocks, to verify objects in the filestore and remove those that fail verification.
ConnMgr.SilencePeriod configuration setting exposed
This connection manager option controls how often connections are swept and potentially terminated. See the ConnMgr documentation.
Fix handling of EDITOR env var
The ipfs config edit command did not correctly handle the EDITOR environment variable when its value contains flags and arguments, i.e. EDITOR=emacs -nw. The command was treating the entire value of $EDITOR as the name of the editor command. This has been fixed to parse the value of $EDITOR into separate args, respecting shell quoting.
📦️ Important dependency updates
- update
go-libp2pto v0.42.0 - update
go-libp2p-kad-dhtto v0.33.0 - update
boxoto v0.33.0 (incl. v0.32.0) - update
gateway-conformanceto v0.8 - update
p2p-forge/clientto v0.6.0 - update
github.com/cockroachdb/pebble/v2to v2.0.6 for Go 1.25 support
📝 Changelog
Full Changelog
- github.com/ipfs/kubo:
- chore: 0.36.0
- chore: update links in markdown
- chore: 0.36.0-rc2
- feat(httpnet): gather metrics for allowlist
- chore: changelog
- test: TestEditorParsing
- fix: handling of EDITOR env var (#10855) (ipfs/kubo#10855)
- refactor: use slices.Sort where appropriate (#10858) (ipfs/kubo#10858)
- Upgrade to Boxo v0.33.0 (#10857) (ipfs/kubo#10857)
- chore: Upgrade github.com/cockroachdb/pebble/v2 to v2.0.6 for Go 1.25 support (#10850) (ipfs/kubo#10850)
- core:constructor: add a log line about http retrieval
- chore: p2p-forge v0.6.0 + go-libp2p 0.42.0 (#10840) (ipfs/kubo#10840)
- docs: fix minor typos (#10849) (ipfs/kubo#10849)
- Replace use of go-car v1 with go-car/v2 (#10845) (ipfs/kubo#10845)
- chore: v0.36.0-rc1
- chore: deduplicate 0.36 changelog
- feat(config): connmgr: expose silence period (#10827) (ipfs/kubo#10827)
- bitswap/client: configurable broadcast reduction (#10825) (ipfs/kubo#10825)
- Upgrade to Boxo v0.32.0 (#10839) (ipfs/kubo#10839)
- feat: HTTP retrieval enabled by default (#10836) (ipfs/kubo#10836)
- feat: AutoTLS with AutoNATv2 client (#10835) (ipfs/kubo#10835)
- commands: add
--forceoption tofiles cpcommand (#10823) (ipfs/kubo#10823) - docs/env variables: Document LIBP2P_SWARM_FD_LIMIT (ipfs/kubo#10828)
- test: fix "inv...
v0.36.0-rc2
This release was brought to you by the Shipyard team.
Draft release notes: docs/changelogs/v0.36.md
Release status: #10816
v0.36.0-rc1
This release was brought to you by the Shipyard team.
Draft release notes: docs/changelogs/v0.36.md
Release status: #10816
v0.35.0
Note
This release was brought to you by the Shipyard team.
- 🔦 Highlights
- Opt-in HTTP Retrieval client
- Dedicated
Reprovider.Strategyfor MFS - Experimental support for MFS as a FUSE mount point
- Grid view in WebUI
- Enhanced DAG-Shaping Controls
DatastoreMetrics Now Opt-In- Improved performance of data onboarding
- New
Bitswapconfiguration options - New
Routingconfiguration options - New Pebble database format config
- New environment variables
- 📦️ Important dependency updates
- 📝 Changelog
- 👨👩👧👦 Contributors
Overview
This release brings significant UX and performance improvements to data onboarding, provisioning, and retrieval systems.
New configuration options let you customize the shape of UnixFS DAGs generated during the data import, control the scope of DAGs announced on the Amino DHT, select which delegated routing endpoints are queried, and choose whether to enable HTTP retrieval alongside Bitswap over Libp2p.
Continue reading for more details.
🗣 Discuss
If you have comments, questions, or feedback on this release, please post here.
If you experienced any bugs with the release, please post an issue.
🔦 Highlights
Opt-in HTTP Retrieval client
This release adds experimental support for retrieving blocks directly over HTTPS (HTTP/2), complementing the existing Bitswap over Libp2p.
The opt-in client enables Kubo to use delegated routing results with /tls/http multiaddrs, connecting to HTTPS servers that support Trustless HTTP Gateway's Block Responses (?format=raw, application/vnd.ipld.raw). Fetching blocks via HTTPS (HTTP/2) simplifies infrastructure and reduces costs for storage providers by leveraging HTTP caching and CDNs.
To enable this feature for testing and feedback, set:
$ ipfs config --json HTTPRetrieval.Enabled trueSee HTTPRetrieval for more details.
Dedicated Reprovider.Strategy for MFS
The Mutable File System (MFS) in Kubo is a UnixFS filesystem managed with ipfs files commands. It supports familiar file operations like cp and mv within a folder-tree structure, automatically updating a MerkleDAG and a "root CID" that reflects the current MFS state. Files in MFS are protected from garbage collection, offering a simpler alternative to ipfs pin. This makes it a popular choice for tools like IPFS Desktop and the WebUI.
Previously, the pinned reprovider strategy required manual pin management: each dataset update meant pinning the new version and unpinning the old one. Now, new strategies—mfs and pinned+mfs—let users limit announcements to data explicitly placed in MFS. This simplifies updating datasets and announcing only the latest version to the Amino DHT.
Users relying on the pinned strategy can switch to pinned+mfs and use MFS alone to manage updates and announcements, eliminating the need for manual pinning and unpinning. We hope this makes it easier to publish just the data that matters to you.
See Reprovider.Strategy for more details.
Experimental support for MFS as a FUSE mount point
The MFS root (filesystem behind the ipfs files API) is now available as a read/write FUSE mount point at Mounts.MFS. This filesystem is mounted in the same way as Mounts.IPFS and Mounts.IPNS when running ipfs mount or ipfs daemon --mount.
Note that the operations supported by the MFS FUSE mountpoint are limited, since MFS doesn't store file attributes.
See Mounts and docs/fuse.md for more details.
Grid view in WebUI
The WebUI, accessible at http://127.0.0.1:5001/webui/, now includes support for the grid view on the Files screen:
Enhanced DAG-Shaping Controls
This release advances CIDv1 support by introducing fine-grained control over UnixFS DAG shaping during data ingestion with the ipfs add command.
Wider DAG trees (more links per node, higher fanout, larger thresholds) are beneficial for large files and directories with many files, reducing tree depth and lookup latency in high-latency networks, but they increase node size, straining memory and CPU on resource-constrained devices. Narrower trees (lower link count, lower fanout, smaller thresholds) are preferable for smaller directories, frequent updates, or low-power clients, minimizing overhead and ensuring compatibility, though they may increase traversal steps for very large datasets.
Kubo now allows users to act on these tradeoffs and customize the width of the DAG created by ipfs add command.
New DAG-Shaping ipfs add Options
Three new options allow you to override default settings for specific import operations:
--max-file-links: Sets the maximum number of child links for a single file chunk.--max-directory-links: Defines the maximum number of child entries in a "basic" (single-chunk) directory.- Note: Directories exceeding this limit or the
Import.UnixFSHAMTDirectorySizeThresholdare converted to HAMT-based (sharded across multiple blocks) structures.
- Note: Directories exceeding this limit or the
--max-hamt-fanout: Specifies the maximum number of child nodes for HAMT internal structures.
Persistent DAG-Shaping Import.* Configuration
You can set default values for these options using the following configuration settings:
Import.UnixFSFileMaxLinksImport.UnixFSDirectoryMaxLinksImport.UnixFSHAMTDirectoryMaxFanoutImport.UnixFSHAMTDirectorySizeThreshold
Updated DAG-Shaping Import Profiles
The release updated configuration profiles to incorporate these new Import.* settings:
- Updated Profile:
test-cid-v1now includes current defaults as explicitImport.UnixFSFileMaxLinks=174,Import.UnixFSDirectoryMaxLinks=0,Import.UnixFSHAMTDirectoryMaxFanout=256andImport.UnixFSHAMTDirectorySizeThreshold=256KiB - New Profile:
test-cid-v1-wideadopts experimental directory DAG-shaping defaults, increasing the maximum file DAG width from 174 to 1024, HAMT fanout from 256 to 1024, and raising the HAMT directory sharding threshold from 256KiB to 1MiB, aligning with 1MiB file chunks.- Feedback: Try it out and share your thoughts at discuss.ipfs.tech/t/should-we-profile-cids or ipfs/specs#499.
Tip
Apply one of CIDv1 test profiles with ipfs config profile apply test-cid-v1[-wide].
Datastore Metrics Now Opt-In
To reduce overhead in the default configuration, datastore metrics are no longer enabled by default when initializing a Kubo repository with ipfs init.
Metrics prefixed with <dsname>_datastore (e.g., flatfs_datastore_..., leveldb_datastore_...) are not exposed unless explicitly enabled. For a complete list of affected default metrics, refer to prometheus_metrics_added_by_measure_profile.
Convenience opt-in profiles can be enabled at initi...
v0.35.0-rc2
This RC release was brought to you by the Shipyard team.
Draft release notes: docs/changelogs/v0.35.md
Release status: #10760
v0.35.0-rc1
This RC release was brought to you by the Shipyard team.
Draft release notes: docs/changelogs/v0.35.md
Release status: #10760
v0.34.1
This patch release was brought to you by the Shipyard team.
- updates
go-libp2pto v0.41.1- high impact fix from go-libp2p#3221 improves hole punching success rate
- updates
quic-goto v0.50.1
See 0.34 Release Notes for full list of changes since 0.33.x






