kubo/docs/changelogs/v0.40.md
Marcin Rataj 541bd657a6 feat(dns): add DNS.OverrideSystem config to apply resolvers globally
adds DNS.OverrideSystem flag (enabled by default) that extends
DNS.Resolvers to affect all DNS lookups in the daemon process,
not just DNSLink and Multiaddr resolution.

this ensures AutoTLS ACME DNS-01 challenge verification, HTTP retrieval,
and third-party library code all respect DNS.Resolvers config.

implementation creates a net.Resolver bridge that intercepts DNS wire
protocol queries, parses them with miekg/dns, calls madns.Resolver,
and returns properly formatted DNS responses.

note: this is an exploration of daemon-wide DNS configuration without
refactoring boxo/gateway. a cleaner future approach may create native
net.Resolver from config first, then convert to madns only for go-libp2p.
2026-01-12 21:26:29 +01:00

5.9 KiB
Raw Blame History

Kubo changelog v0.40

This release was brought to you by the Shipyard team.

v0.40.0

Overview

🔦 Highlights

Routing V1 HTTP API now exposed by default

The Routing V1 HTTP API 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 is included. Can be disabled via Gateway.ExposeRoutingAPI.

Track total size when adding pins

Adds total size progress tracking of pinned nodes during ipfs pin add --progress. The output now shows the total size of the pinned dag.

Example output:

Fetched/Processed 336 nodes (83 MB)

🚇 Improved ipfs p2p tunnels with foreground mode

P2P tunnels can now run like SSH port forwarding: start a tunnel, use it, and it cleans up automatically when you're done.

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:

$ ipfs p2p listen /x/ssh /ip4/127.0.0.1/tcp/22 --foreground
Listening on /x/ssh, forwarding to /ip4/127.0.0.1/tcp/22, waiting for interrupt...
^C
Received interrupt, removing listener for /x/ssh

Without --foreground, commands return immediately and tunnels persist until explicitly closed (existing behavior).

See docs/p2p-tunnels.md for usage examples.

Improved ipfs dag stat output

The ipfs dag stat command has been improved for better terminal UX:

  • Progress output now uses a single line with carriage return, avoiding terminal flooding
  • Progress is auto-detected: shown only in interactive terminals by default
  • Human-readable sizes are now displayed alongside raw byte counts

Example progress (interactive terminal):

Fetched/Processed 84 blocks, 2097152 bytes (2.1 MB)

Example summary output:

Summary
Total Size: 2097152 (2.1 MB)
Unique Blocks: 42
Shared Size: 1048576 (1.0 MB)
Ratio: 1.500000

Use --progress=true to force progress even when piped, or --progress=false to disable it.

Skip bad keys when listing

Change the ipfs key list behavior to log an error and continue listing keys when a key cannot be read from the keystore or decoded.

Accelerated DHT Client and Provide Sweep now work together

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.

DNS.OverrideSystem config flag

A new DNS.OverrideSystem config flag (enabled by default) extends DNS.Resolvers to apply globally to all DNS lookups in the daemon process. This goes beyond DNSLink and Multiaddr resolution, affecting AutoTLS ACME DNS-01 challenge verification, HTTP client requests (including HTTP retrieval), and any third-party library code.

Note

This is an exploration of how DNS configuration can be applied daemon-wide without refactoring boxo/gateway. A future improvement may create a native net.Resolver from config first, and convert it to Multiaddr DNS resolver only when passing to go-libp2p, which would be a cleaner architecture.

Set to false to revert to previous behavior where DNS.Resolvers only affected DNSLink and Multiaddr resolution.

📦 Dependency updates

  • update go-libp2p to v0.46.0
    • Reduced WebRTC log noise by using debug level for pion errors (go-libp2p#3426).
    • Fixed mDNS discovery on Windows and macOS by filtering addresses to reduce packet size (go-libp2p#3434).
  • update quic-go to v0.57.1 (incl. v0.56.0 + v0.57.0)
  • update p2p-forge to v0.7.0
  • update go-ds-pebble to v0.5.8
    • updates github.com/cockroachdb/pebble to v2.1.3 to enable Go 1.26 support

📝 Changelog

👨‍👩‍👧‍👦 Contributors