NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #2385 by repository stars
Last release 14 days ago
24 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Rarely documented
notes for 10 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
10 years old
716 releases · first in 2016
Nothing published for this version
Nothing published for this version
Note This release was brought to you by the Shipyard team.
Note
This release was brought to you by the Shipyard team.
v0.42.0 (#1277) inadvertently turned every provider record write and GC delete into an individual (fsynced) datastore operation, causing excessive disk I/O on busy nodes (ipfs/kubo#11432). Provider writes and GC deletes are now batched (256 records per batch), restoring the pre-v0.42.0 fsync rate. No protocol or record-layout change.
The WithAddLocalRecord callback now receives the sweeping provider's lifecycle context instead of context.Background() (a regression from #1282), so local provider record writes are properly cancelled when the provider shuts down.
Full Changelog: v0.42.1...v0.42.2
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Note This release was brought to you by the Shipyard team.
Note
This release was brought to you by the Shipyard team.
Full Changelog: v0.42.0...v0.42.1
Nothing published for this version
Nothing published for this version
Note This release was brought to you by the Shipyard team.
Note
This release was brought to you by the Shipyard team.
context.Context (#1282)The lifecycle context was removed from all constructors. The DHT now runs until Close() is called; cancelling a context no longer tears it down.
| Before | After |
|---|---|
dht.New(ctx, h, opts...) |
dht.New(h, opts...) |
dht.NewDHT(ctx, h, dstore) |
dht.NewDHT(h, dstore) |
dht.NewDHTClient(ctx, h, dstore) |
dht.NewDHTClient(h, dstore) |
dual.New(ctx, h, opts...) |
dual.New(h, opts...) |
records.NewProviderManager(ctx, ...) |
records.NewProviderManager(...) |
rtrefresh.NewRtRefreshManager(ctx, ...) |
rtrefresh.NewRtRefreshManager(...) |
Migration: drop the context argument. If you relied on cancelling the constructor context to shut the DHT down, call Close() instead. Close() blocks until all long-lived components have stopped. Note that in-flight RPC handlers are owned by the libp2p host, so close the host before closing any datastore handed to the DHT.
ProviderStore option removed (#1277 by @guillaumemichel)Custom ProviderStore implementations can no longer be injected; the DHT always runs the built-in provider manager. The dht.ProviderStore(...) option is replaced by datastore-level configuration:
// Before: inject a custom provider store
d, err := dht.New(ctx, h, dht.ProviderStore(customStore))
// After: configure the built-in provider manager
d, err := dht.New(h,
dht.ProviderDatastore(dstore), // dedicated datastore for provider records
dht.ProviderManagerOpts( // tune the built-in manager
records.ProvideValidity(48*time.Hour),
records.Cache(myLRU),
),
)New options: ValueDatastore and ProviderDatastore give value and provider records their own physical datastores (both default to the datastore set with Datastore). The dht.ProviderStore() getter on IpfsDHT remains available.
Value records used to be stored at the datastore root as /<base32(key)>; they are now namespaced by record type: /<namespace>/<base32(key)> (e.g. /pk/..., /ipns/...). This keeps a shared datastore collision-free and enables per-namespace garbage collection.
Migration: there is no automatic key migration. On upgrade, value records persisted by earlier versions are simply not found under the new layout — nodes will re-store them as the network republishes (records expire after MaxRecordAge, 48h by default, anyway). If you persist the DHT datastore and want to reclaim space, you can delete leftover root-level base32 keys. Provider records are unaffected (already namespaced under /providers/).
Full Changelog: v0.41.0...v0.42.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Note This release was brought to you by the Shipyard team.
Note
This release was brought to you by the Shipyard team.
TestBootStrapWhenRTIsEmpty by @guillaumemichel in #1264Full Changelog: v0.40.0...v0.41.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Note This release was brought to you by the Shipyard team.
Note
This release was brought to you by the Shipyard team.
SweepingProvider.Stats() now takes a context.Context and returns (stats.Stats, error). Callers must pass a ctx with a deadline — the key count is fetched through the keystore worker and can stall behind a slow datastore op. (#1251 by @guillaumemichel)ADD_PROVIDER sends so a single slow peer can't stall a reprovide cycle. (#1252 by @guillaumemichel)batchReprovide now holds cycleStatsLk for the full defer, fixing a stats race. (#1255 by @guillaumemichel)ResettableKeystore reset is faster and no longer blocks the worker. (#1256 by @guillaumemichel)Full Changelog: v0.39.2...v0.40.0
Nothing published for this version
Nothing published for this version
Note This release was brought to you by the Shipyard team.
Note
This release was brought to you by the Shipyard team.
Full Changelog: v0.39.1...v0.39.2
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Note This release was brought to you by the Shipyard team.
Note
This release was brought to you by the Shipyard team.
Full Changelog: v0.39.0...v0.39.1
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Note This release was brought to you by the Shipyard team.
Note
This release was brought to you by the Shipyard team.
keystore.NewResettableKeystore() now takes keystore.ResettableKeystoreOption instead of keystore.Option. Wrap existing options with KeystoreOption() to migrate.Full Changelog: v0.38.0...v0.39.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
fix(provider): close datastore results by @guillaumemichel in #1226
Full Changelog: v0.37.1...v0.38.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
fix(routing): add per-peer timeouts for PutValue and Provide by @lidel in #1222
Full Changelog: v0.37.0...v0.37.1
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →