Releases: ipfs/kubo
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.Strategy
for MFS - Experimental support for MFS as a FUSE mount point
- Grid view in WebUI
- Enhanced DAG-Shaping Controls
Datastore
Metrics Now Opt-In- Improved performance of data onboarding
- New
Bitswap
configuration options - New
Routing
configuration 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 true
See 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.UnixFSHAMTDirectorySizeThreshold
are 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.UnixFSFileMaxLinks
Import.UnixFSDirectoryMaxLinks
Import.UnixFSHAMTDirectoryMaxFanout
Import.UnixFSHAMTDirectorySizeThreshold
Updated DAG-Shaping Import
Profiles
The release updated configuration profiles to incorporate these new Import.*
settings:
- Updated Profile:
test-cid-v1
now includes current defaults as explicitImport.UnixFSFileMaxLinks=174
,Import.UnixFSDirectoryMaxLinks=0
,Import.UnixFSHAMTDirectoryMaxFanout=256
andImport.UnixFSHAMTDirectorySizeThreshold=256KiB
- New Profile:
test-cid-v1-wide
adopts 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-libp2p
to v0.41.1- high impact fix from go-libp2p#3221 improves hole punching success rate
- updates
quic-go
to v0.50.1
See 0.34 Release Notes for full list of changes since 0.33.x
v0.34.0
This release was brought to you by the Shipyard team.
- π¦ Highlights
- AutoTLS now enabled by default for nodes with 1 hour uptime
- New WebUI features
- RPC and CLI command changes
- Bitswap improvements from Boxo
- IPNS publishing TTL change
IPFS_LOG_LEVEL
deprecated- Pebble datastore format update
- Badger datastore update
- Datastore Implementation Updates
- One Multi-error Package
- Fix hanging pinset operations during reprovides
- π¦οΈ Important dependency updates
- π Changelog
- π¨βπ©βπ§βπ¦ Contributors
π£ 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
AutoTLS now enabled by default for nodes with 1 hour uptime
Starting now, any publicly dialable Kubo node with a /tcp
listener that remains online for at least one hour will receive a TLS certificate through the AutoTLS
feature.
This occurs automatically, with no need for manual setup.
To bypass the 1-hour delay and enable AutoTLS immediately, users can explicitly opt-in by running the following commands:
$ ipfs config --json AutoTLS.Enabled true
$ ipfs config --json AutoTLS.RegistrationDelay 0
AutoTLS will remain disabled under the following conditions:
- The node already has a manually configured
/ws
(WebSocket) listener - A private network is in use with a
swarm.key
- TCP or WebSocket transports are disabled, or there is no
/tcp
listener
To troubleshoot, use GOLOG_LOG_LEVEL="error,autotls=info
.
For more details, check out the AutoTLS
configuration documentation or dive deeper with AutoTLS libp2p blog post.
New WebUI features
The WebUI, accessible at http://127.0.0.1:5001/webui/, now includes support for CAR file import and QR code sharing directly from the Files view. Additionally, the Peers screen has been updated with the latest ipfs-geoip
dataset.
RPC and CLI command changes
ipfs config
is now validating json fields (#10679).- Deprecated the
bitswap reprovide
command. Make sure to switch to modernrouting reprovide
. (#10677) - The
stats reprovide
command now shows additional stats forRouting.AcceleratedDHTClient
, indicating the last and nextreprovide
times. (#10677) ipfs files cp
now performs basic codec check and will error when source is not a valid UnixFS (onlydag-pb
andraw
codecs are allowed in MFS)
Bitswap improvements from Boxo
This release includes performance and reliability improvements and fixes for minor resource leaks. One of the performance changes greatly improves the bitswap clients ability to operate under high load, that could previously result in an out of memory condition.
IPNS publishing TTL change
Many complaints about IPNS being slow are tied to the default --ttl
in ipfs name publish
, which was set to 1 hour. To address this, weβve lowered the default IPNS Record TTL during publishing to 5 minutes, matching similar TTL defaults in DNS. This update is now part of boxo/ipfs
(GO, boxo#859) and @helia/ipns
(JS, helia#749).
Tip
IPNS TTL recommendations when even faster update propagation is desired:
- As a Publisher: Lower the
--ttl
(e.g.,ipfs name publish --ttl=1m
) to further reduce caching delays. If using DNSLink, ensure the DNS TXT record TTL matches the IPNS record TTL. - As a Gateway Operator: Override publisher TTLs for faster updates using configurations like
Ipns.MaxCacheTTL
in Kubo orRAINBOW_IPNS_MAX_CACHE_TTL
in Rainbow.
IPFS_LOG_LEVEL
deprecated
The variable has been deprecated. Please use GOLOG_LOG_LEVEL
instead for configuring logging levels.
Pebble datastore format update
If the pebble database format is not explicitly set in the config, then automatically upgrade it to the latest format version supported by the release ob pebble used by kubo. This will ensure that the database format is sufficiently up-to-date to be compatible with a major version upgrade of pebble. This is necessary before upgrading to use pebble v2.
Badger datastore update
An update was made to the badger v1 datastore that avoids use of mmap in 32-bit environments, which has been seen to cause issues on some platforms. Please be aware that this could lead to a performance regression for users of badger in a 32-bit environment. Badger users are advised to move to the flatds or pebble datastore.
Datastore Implementation Updates
The go-ds-xxx datastore implementations have been updated to support the updated go-datastore
v0.8.2 query API. This update removes the datastore implementations' dependency on goprocess
and updates the query API.
One Multi-error Package
Kubo previously depended on multiple multi-error packages, github.com/hashicorp/go-multierror
and go.uber.org/multierr
. These have nearly identical functionality so there was no need to use both. Therefore, go.uber.org/multierr
was selected as the package to depend on. Any future code needing multi-error functionality should use go.uber.org/multierr
to avoid introducing unneeded dependencies.
Fix hanging pinset operations during reprovides
The reprovide process can be quite slow. In default settings, the reprovide process will start reading CIDs that belong to the pinset. During this operation, starvation can occur for other operations that need pinset access (see #10596).
We have now switch to buffering pinset-related cids that are going to be reprovided in memory, so that we can free pinset mutexes as soon as possible so that pinset-writes and subsequent read operations can proceed. The downside is larger pinsets will need some extra memory, with an estimation of ~1GiB of RAM memory-use per 20 million items to be reprovided.
Use Reprovider.Strategy
to balance announcement prioritization, speed, and memory utilization.
π¦οΈ Important dependency updates
- update
go-libp2p
to v0.41.0 (incl. v0.40.0) - update
go-libp2p-kad-dht
to v0.30.2 (incl. v0.29.0, v0.29.1, v0.29.2, v0.30.0, v0.30.1) - update
boxo
to v0.29.1 (incl. v0.28.0 v0.29.0) - update
ipfs-webui
to v4.6.0 (incl. v4.5.0) - update
p2p-forge/client
to v0.4.0 - update
go-datastore
to v0.8.2 (incl. v0.7.0, v0.8.0)
π Changelog
Full Changelog
- github.com/ipfs/kubo:
- chore: v0.34.0
- chore: v0.34.0-rc2
- docs: mention Reprovider.Strategy config
- docs: ipns ttl change
- feat: ipfs-webui v4.6 (#10756) (ipfs/kubo#10756)
- docs(readme): update min. requirements + cleanup (#10750) (ipfs/kubo#10750)
- Upgrade to Boxo v0.29.1 (#10755) ([#10755](ht...
v0.34.0-rc2
See the draft changelog: docs/changelogs/v0.34.md
And related issue: #10685
This release is brought to you by the Shipyard team.
v0.34.0-rc1
See the draft changelog: docs/changelogs/v0.34.md
And related issue: #10685
This release is brought to you by the Shipyard team.
v0.33.2

This is a tiny patch release with a single change:
- update
go-libp2p
to v0.38.3
See 0.33 Release Notes for full list of changes since 0.32.x
π£ 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.
π Changelog
Full Changelog
- github.com/ipfs/kubo:
- chore: v0.33.2
- github.com/libp2p/go-libp2p (v0.38.2 -> v0.38.3):
- Release v0.38.3 (#3184) (libp2p/go-libp2p#3184)
π¨βπ©βπ§βπ¦ Contributors
This release was brought to you by the Shipyard team.
Contributor | Commits | Lines Β± | Files Changed |
---|---|---|---|
sukun | 1 | +122/-23 | 7 |
Marcin Rataj | 1 | +1/-1 | 1 |
v0.33.1
This is a patch release with an important boxo/bitswap
fix that we believe should reach you without waiting for 0.34 :)
See 0.33.0 for full list of changes since 0.32.1.
π¦ Highlights

Bitswap improvements from Boxo
This release includes boxo/bitswap
performance and reliability improvements and fixes for minor resource leaks. One of the performance changes greatly improves the bitswap clients ability to operate under high load, that could previously result in an out of memory condition.
Improved IPNS interop
Improved compatibility with third-party IPNS publishers by restoring support for compact binary CIDs in the Value
field of IPNS Records (IPNS Specs). As long the signature is valid, Kubo will now resolve such records (likely created by non-Kubo nodes) and convert raw CIDs into valid /ipfs/cid
content paths.
Note: This only adds support for resolving externally created recordsβKuboβs IPNS record creation remains unchanged. IPNS records with empty Value
fields default to zero-length /ipfs/bafkqaaa
to maintain backward compatibility with code expecting a valid content path.
π¦οΈ Important dependency updates
π£ Discuss
This release was brought to you by the Shipyard team.
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.
π Changelog
Full Changelog v0.33.1
- github.com/ipfs/kubo:
- chore: v0.33.1
- fix: boxo v0.27.4 (#10692) (ipfs/kubo#10692)
- docs: add webrtc-direct fixes to 0.33 release changelog (#10688) (ipfs/kubo#10688)
- fix: config help (#10686) (ipfs/kubo#10686)
- github.com/ipfs/boxo (v0.27.2 -> v0.27.4):
- Release v0.27.4 (ipfs/boxo#832)
- fix(ipns): reading records with raw []byte Value (#830) (ipfs/boxo#830)
- fix(bitswap): blockpresencemanager leak (#833) (ipfs/boxo#833)
- Always send cancels even if peer has no interest (#829) (ipfs/boxo#829)
- tidy changelog (ipfs/boxo#828)
- Update changelog (#827) (ipfs/boxo#827)
- fix(bitswap): filter interests from received messages (#822) (ipfs/boxo#822)
- Reduce unnecessary logging work (#826) (ipfs/boxo#826)
- fix: bitswap lock contention under high load (#817) (ipfs/boxo#817)
- fix: bitswap simplify cancel (#824) (ipfs/boxo#824)
- fix(bitswap): simplify SessionInterestManager (#821) (ipfs/boxo#821)
- feat: Better self-service commands for DHT providing (#815) (ipfs/boxo#815)
- bitswap/client: fewer wantlist iterations in sendCancels (#819) (ipfs/boxo#819)
- style: cleanup code by golangci-lint (#797) (ipfs/boxo#797)
- Move long messagequeue comment to doc.go (#814) (ipfs/boxo#814)
- Describe how bitswap message queue works (ipfs/boxo#813)
π¨βπ©βπ§βπ¦ Contributors
Contributor | Commits | Lines Β± | Files Changed |
---|---|---|---|
Dreamacro | 1 | +304/-376 | 119 |
Andrew Gillis | 7 | +306/-200 | 20 |
Guillaume Michel | 5 | +122/-98 | 14 |
Marcin Rataj | 2 | +113/-7 | 4 |
gammazero | 6 | +41/-11 | 6 |
Sergey Gorbunov | 1 | +14/-2 | 2 |
Daniel Norman | 1 | +9/-0 | 1 |