Chrome/Chromium on Linux use ~/.pki/nssdb, not only
update-ca-certificates. Auto-install now runs both paths.
- certificate_authority.js: installLinuxRootCA + certutil for
user NSS (~/.pki/nssdb) and optional /etc/pki/nssdb
- docs/CERTIFICATES.md: manual steps (libnss3-tools, certutil, verify)
- docs/README_LONGFORM.md, EXAMPLES.md, README.md: aligned Linux instructions
Remove the last layer of soft centralization: a lone `--master` on empty
storage could still implicitly genesis a separate Autopass and split the
network on the same TOPIC_SEED. Genesis is now explicit (`--master
--genesis`); secondary masters pair via invite into the same dnsPass as
joiners, with a shared network manifest, split-brain diagnostics, and
writer-aware quorum.
- Genesis vs secondary master boot paths; auto-adopt manifest on upgrade
- Masters without dnsPass accept invites; masters with pass ignore them
- NETWORK_MANIFEST_FILE, P2NS_GENESIS, MASTER_LOAD_DOMAINS, MASTER_INVITE_ONLY
- core.status networkId; admin diagnostics; docs and multi-master tests
BREAKING: operators must run one genesis per network; additional masters
use `node p2ns.js --master` (not `--genesis`) on empty storage.
Replace dual message-channel + RPC setup with a single registerPluginProtocol
path, unified sdk.channels (register/request/event/broadcast), RPC keepalive
(__p2ns.ping/pong), and core request lifecycle on RPC open. Update
global.profile and example.plugin, admin Plugin RPC stats, docs, and
test:plugin-rpc. Breaking: upgrade all peers together; no legacy adapters.
- core.status handler and coreStatusRequest; diagnoseInviteIssuesAsync
clears stale failed-invite flags when peers report canProvideInvite
- Admin invite diagnostics and Core stats UI: per-peer remote state,
text status marks, recommendations aligned with invite.deliver RPC
- Extract stats-collector; push stats/health/status via subscribe-stats
WebSocket; HTTP only on first Stats tab load
- Document core.status in PLUGIN_SDK; proxy registers onCoreStatus
Surface invite diagnostics (RPC health, per-peer state, queues,
recommendations) under Resource Usage via /api/stats core payload
and auto-refreshing renderCoreStats in the stats UI.
Replace legacy invite-channel checks with schema v2 diagnostics:
per-peer RPC/request channel health, pending invite.ack and master
queue state, and an admin UI that matches invite.deliver on
p2ns.core-request-rpc.
Align P2NS with current Autopass, Hypercore, Hyperdrive, and Protomux behavior:
add plugin DB recovery for incompatible persisted HyperDB data, stop
unconditional spec rebuilds via fingerprinting, update SDK replication paths,
and align proxy invite channels with p2ns.core-* protocols without replicating
Autopass over the p2ns topic.
Align p2ns with current Holepunch ecosystem versions: autopass 3,
hyperdb 6, hyperschema 1.21, hyperdrive 13, corestore 7.10, hyperswarm
4.17, protomux 3.11, and compact-encoding 3 (with npm overrides).
Also bump Tailwind/PostCSS, ws, node-forge, and related tooling; add
express and holesail-logger; remove unused install/npm packages.
Use cache/plugin-spec when plugin spec dirs are not writable, and
update docs and proxy install notes. Rebuild admin CSS for Tailwind 4.3.
Existing P2P storage must be wiped (--clean) after upgrading.
Add global activeClientKeys Set to track all active clients and prevent
race conditions between domain init and cache restore paths. Add EADDRINUSE
error handling in holesail.js, holesail_child.js
- Reorder shutdown sequence to close pairing operations before DNSPass
- Add proper tracking and cleanup of active Autopass.pair() operations
- Handle shared corestore conflicts between pairing ops and main DNSPass
- Ignore expected "store already closed" errors from pairing operations
- Consolidate all Autopass resource cleanup in PHASE 2.5
This fixes the "Corestore is closed" uncaught exceptions and corruption
that occurred when both pairing operations and DNSPass tried to close
the same shared corestore during shutdown.