P2P Docs

Release Overview

Curated overview of releases across P2P's building blocks and helpers—Hypercore, Hyperdrive, HyperDHT, and Corestore—breaking changes, removals, and additions.

A curated record of changes across P2P's building blocks and helpers, newest first. For the raw upstream record, see each module's GitHub releases; this page is the docs-team view of what the changes mean for your application.

Looking for pear CLI or pear-* module releases instead? See Pear's release overview. For Bare's releases, see Bare's release overview.

2026-10-07 — P2P module updates

The module releases that Pear 3.6.0 bundles. An application pins its own copies in its package.json, so upgrade these dependencies directly to pick the changes up.

Hypercore — v11.37.2, v11.37.0

  • Fixed (v11.37.2): core.clear() deleted the tree nodes of still-stored blocks to the left of the cleared range (since v11.16.0), so a peer requesting one of those blocks failed with INVALID_OPERATION: Expected tree node N from storage, got (nil). For example, after clear(1) a fresh peer could not read block 0. drive.clear() goes through it. Upgrading does not restore nodes that an earlier clear() already deleted.
  • Changed (v11.37.0): manifest decoding accepts version 3, which is wire-compatible with version 2. Earlier releases throw Unknown version: 3 on such a manifest, and versions above 3 are still rejected.

Hyperdrive — v13.3.4

  • Fixed: drive.downloadDiff() finished without fetching the data blocks of entries written with dedup: true. It downloaded each entry's contiguous range, which for those entries covers only the block map. It now follows the map, as drive.download() has since v13.3.3.
  • Fixed: download.destroy() no longer waits for the blobs core to open before closing, and closing the drive during a download resolves download.done() instead of rejecting with REQUEST_CANCELLED. This covers the Download that drive.download() and drive.downloadDiff() return.

HyperDHT — v6.34.1

  • Fixed: a server that relays a connection now notices when the relay is lost, before or after pairing. It releases the unconnected stream and its hole puncher once no direct connection has taken over within the grace period and no hole punch is still running. Previously a punch parked after TRY_LATER, or a relay that died after pairing, could hold them until another close event, such as keep-alive, cleaned up.
  • Added: a relayRecoveryWait option to node.createServer(), in milliseconds and 30000 by default, that sets that grace period.

Compact-encoding — v3.5.2

  • Changed: decoding cenc.arraybuffer or a cenc.frame(enc) frame whose declared length is longer than the bytes left now throws Out of bounds. Before, arraybuffer returned a zero-padded ArrayBuffer and frame decoded whatever bytes remained.

Corestore — v7.13.0, v7.12.6

  • Added (v7.13.0): an alwaysLatestBlock constructor option, false by default, that turns on allowLatestBlock for every core the store opens. Sessions and namespaces created from the store inherit it, and an allowLatestBlock passed to store.get() takes precedence.
  • Added (v7.12.6): store.get() accepts manifestVersion, which overrides store.manifestVersion for the manifest of a new writable core. A core that already exists under that name keeps the version it was created with.

Hyperschema — v1.26.2, v1.26.0, v1.25.0

  • Changed (v1.25.0): versioned types have a framed option. A new versioned type defaults to framed: true, which length-prefixes each of its version structs unless the struct is compact, so a decoder from an earlier schema generation can skip fields that a later generation appended. A type already in your schema.json keeps its unframed layout (the next build records framed: false), and setting framed: true on it changes the bytes it writes. Keep the previous schema.json when you regenerate: without it every versioned type is framed, which differs from the layout of a spec generated with v1.24.0 or earlier.
  • Fixed (v1.26.0): a uint1–uint7 field decoded as true or false instead of its value in code generated with v1.23.0 through v1.25.0. The bytes written were correct, so regenerating the spec with v1.26.0 or later is enough, and stored data needs no migration.
  • Added (v1.26.0): a constant field option—a bool, integer, string or null literal that the decoder always returns for the field. A constant is never encoded, takes no flag bit and does not bump the schema version. It cannot be combined with required, array, record or inline.

See the Hyperschema reference for the full API, and RPC and schemas for where it fits.

blind-peering — v2.10.1, v2.10.0, v2.9.1

  • Changed (v2.9.1): sendNotification() picks a random connected blind peer among the pick closest to target (2 by default), rather than the closest connected one, to spread notification load.
  • Added (v2.10.0): a client constructor option, { name, version }, that identifies your application to blind peers. Both values are sent in the connection handshake, along with the blind-peering version.
  • Added (v2.10.1): a skipConnectionMetadata constructor option, false by default. When true, the handshake carries no metadata at all—neither client nor the blind-peering version.

blind-peer — v3.15.1

  • Changed: the Corestore that blind-peer creates when you do not pass a store is opened with alwaysLatestBlock: true (added in v7.13.0, above), so its replicator includes a request for the latest block in every upgrade request. A store you pass in is used as given. pear blind-peer start passes none, so it gets the new behaviour.

2026-09-22 — P2P module updates

The module releases that Pear 3.5.0 bundles. An application pins its own copies in its package.json, so upgrade these dependencies directly to pick the changes up.

Hypercore — v11.36.1, v11.36.0, v11.35.4

  • Added (v11.36.0): await core.setAlwaysLatestBlock(enabled).
  • Changed (v11.35.4): a session opened with a group option assigns that group to a core that has none, so a core first opened without a group can join one later. Previously the option only took effect when the core was created.

HyperDHT — v6.34.0

  • Changed: node.stats reports more counters—punches.tryLater and punches.tryLaterRelayedHandshakesAtLeastOnce for rate-limited hole-punch attempts, and a socketPool group for socket pool lifecycle. The existing punches and relaying counters are unchanged.

Hyperswarm — v4.17.1

  • Changed: a client connection that fails with CANNOT_HOLEPUNCH is now retried through relayThrough, joining HOLEPUNCH_ABORTED, HOLEPUNCH_DOUBLE_RANDOMIZED_NATS and REMOTE_NOT_HOLEPUNCHABLE. For Pear this means a relay registered with --relay is also used when the DHT reports that a hole punch cannot succeed.

Compact-encoding — v3.5.0, v3.4.0

Corestore — v7.12.5, v7.12.3

  • Changed (v7.12.5): store.get() forwards allowLatestBlock to the Hypercore it returns, so the option can be set per session through the store rather than only on a directly constructed core.
  • Fixed (v7.12.3): store.get({ group }) on a core that is already open without a group now assigns it, so the core reaches store.notifyGroup(topic). The assignment moved into Hypercore (v11.35.4, above).

Protomux — v3.12.0

  • Changed: an async channel handler (onmessage, onopen, onclose, ondrain, ondestroy) whose returned promise rejects after its channel has closed now makes the underlying stream emit a warning event carrying the error, instead of destroying the stream. A rejection while the channel is still open still destroys the stream, and a synchronous throw is unaffected. Listen for warning if you relied on the old behaviour to surface post-close errors.

Secretstream — v6.9.2

  • Added: a filterZeroByteMessages option, which drops zero-byte messages before they reach the message handler. It is on implicitly whenever keepAlive is set—so keep-alive users already had this behaviour—and can now be enabled on its own.

Hyperschema — v1.24.0, v1.23.0

  • Breaking (wire format, v1.23.0): a field with array: true and type bool is packed into a bitfield—a uint length followed by ceil(length / 8) bytes—instead of one byte per value. A spec regenerated with 1.23.0 or later cannot decode bool arrays written by a spec generated with 1.22.x or earlier, and the reverse. Check any schema with a bool array before regenerating, and migrate data already written in the old layout.
  • Changed (v1.23.0): the bitwise types uint1–uint7 used as an array now fail at build time with cannot be used as an array; they only exist inside a struct's flags byte.
  • Added (v1.24.0): fixed8, fixed16 and fixed24 types, backed by the new compact-encoding codecs.

See the Hyperschema reference for the full API, and RPC and schemas for where it fits.

blind-peering — v2.9.0, v2.8.0

  • Changed (v2.8.0): sendNotification() is rate-limited by default—10 per second, each waiting up to 10 seconds for a slot. Tune it with the new notificationRateLimit constructor option ({ capacity, interval, timeout }), or pass null to disable it.
  • Changed (v2.9.0): addAutobase() finds every view and writer core through the Autobase itself, so its additionalViews option is ignored. Register cores that are not part of the Autobase with addCore() instead.
  • Added (v2.9.0): addAutobase() accepts an Autobee.

blind-peer — v3.15.0, v3.14.0

2026-08-24 — P2P module updates

Hypercore — v11.35.2, v11.35.1, v11.35.0

  • Added (v11.35.0): core.getManifest([options]) returns the manifest, optionally in its encoded wire form via options.raw.
  • Added (v11.35.0): Hypercore.parseManifest(manifest, [key]) decodes and validates a manifest, optionally checking it hashes to a given key.
  • Changed (v11.35.0): the manifest option accepts an encoded manifest Buffer—a Buffer is read as a public key only when it is exactly 32 bytes.
  • Fixed (v11.35.1): the idle range completion scan.
  • Fixed (v11.35.2): the replicator bails out when the core is closing, instead of continuing work against a closing session.

HyperDHT — v6.33.2, v6.33.1

  • Fixed (v6.33.1): a node was pushed twice during HyperDHT initialization.
  • Fixed (v6.33.1): the clearing timeout is unreferenced, so it no longer holds the process open.
  • Fixed (v6.33.2): handshakes received while suspended are cleaned up, and clearing is reordered to match.

Compact-encoding — v3.3.2, v3.3.1

  • Added (v3.3.2): TypeScript typings.
  • Added (v3.3.1): validation on the signed integer codecs, so out-of-range values are rejected rather than silently encoded.

2026-07-30 — P2P module updates

Hypercore — v11.34.0–v11.35.1

  • Changed (v11.34.0): the tree-node proof cache is enabled, cutting repeated proof work for peers that serve many connections.
  • Added (v11.35.0): a manifest can be supplied as a raw buffer.
  • Fixed (v11.35.1): the idle range-completion scan.
  • Fixed (v11.34.1): the latest batch is always selected.

Hyperdrive — v13.3.3

  • Fixed: drive.download() and drive.has() silently stalled or fetched the wrong data for entries written with dedup: true. Those entries store blobs as a non-contiguous block map rather than a contiguous range, and the contiguous form was being used for every entry. downloadDiff() had the same bug, and this release did not fix it: v13.3.4 did (see the 2026-10-07 entry).

HyperDHT — v6.33.0

  • Fixed: relayed server connections now inherit connectionKeepAlive the way direct sockets already did, and a relay-to-direct upgrade sends an explicit handoff packet so the peer observes the direct path before the relay is torn down.
  • Fixed: a LAN shortcut no longer blocks hole-punch fallback, and relay sockets close once a direct connection is established.
  • Removed: the internal global.Pear reference, following the Pear v3 removal of the ambient Pear API.

Corestore — v7.12.0, v7.11.1

  • Changed (v7.12.0): suspend() no longer performs an implicit flush. Write-ahead-log filtering makes reopening cheap, so the flush is no longer needed on every suspend.
  • Added (v7.11.1): a treeCache option for tuning Hypercore's tree-node cache—raise maxSize on peers that serve more connections than usual.

See also

Last updated on

Was this helpful?

On this page