Changelog

The v1 wire format is frozen, so this records what changed around it: security fixes, bridges, tooling, and the handful of local-policy changes that alter how a node behaves without altering what goes on the wire.

Two conventions specific to this project:

Unreleased

0.7.0 — 2026-08-01

0.6.0 — 2026-07-28

0.5.0 — 2026-07-27

0.4.0 — 2026-07-27

0.3.0 — 2026-07-27

Tagged V0.3.0 at 27bea16. Release plumbing only — no Rust behaviour changed, wire untouched. Both entries are the same finding recurring: a fix verified on the artefact it was written for and assumed on its neighbour.

Fixed

Cutting this release also exercised the guard added in it. V0.3.0 was tagged while Cargo.toml still said 0.2.0, and the build refused: "tag V0.3.0 is 0.3.x but Cargo.toml says 0.2.0". That is the drift S-025 was about, caught before it produced another release nobody could download — bump first, then tag.

0.2.0 — 2026-07-27

Tagged V0.2.0 at 7b2a185. Wire unchanged. Cargo.toml's major.minor is the only part of a version a human sets, and it must be bumped before the tag — the tagged build now verifies the two agree.

Security

Fixed

Changed

0.1.0 — 2026-07-27

Tagged V0.1.0 at e41c59a. First tagged release. Three numbers meet here and they version different things, so rather than let anyone infer it wrongly:

Number Versions Frozen? Lives in
SPORE v1 the wire format — envelope layout, addressing, routing, crypto yes, CI-enforced the VER byte, docs/SPEC.md, reference/vectors.json
spore 0.1.x the crate and the shipped distribution its API shape is CI-enforced Cargo.toml, tests/api_freeze.rs

Freezing the wire at v1 while the software is at 0.1 is not a contradiction. The protocol is what peers and reimplementations depend on, and it does not move. The software is early and says so: no radio bridge has been verified against real hardware — every 🧪 in Bridges — and Security findings carried open items, including that the one-shot seal had no forward secrecy (S-022, closed in 0.2.0). A 1.0 badge would have said otherwise.

How the numbers are produced from here. major.minor lives in Cargo.toml and is the only part a human touches — bumping it is a deliberate, reviewable commit. Everything else is generated: every merge to master publishes <major>.<minor>.<YYYYMMDDHHMM>+<short sha>, so a rolling build is uniquely and monotonically named and points at the exact commit it came from. No version is ever derived from a git tag again; doing that is how a build ended up called "SPORE rolling rolling+2026.07.27".

Wire unchanged throughout. One frozen Rust signature changed (Node::send); bindings/spore.h and the vectors are untouched.

Security

The remote-denial-of-service class is closed: nothing known remains that lets a peer on the medium crash a node, exhaust its memory, or use it as an amplifier.

Changed — local policy, not wire

Both alter how a node behaves on a network without changing what it emits, so a node running this interoperates with a v1 peer that is simply more permissive.

Changed — API

Added — bridges

NFC (Web NFC) — tap-to-transfer as an application/x-spore NDEF record. The NDEF codec is pure and tested; the tap needs a phone, so the bridge ships 🧪. It lives in the browser rather than the daemon because a Rust NFC bridge needs libnfc or PC/SC — a C library, which is the dependency rule that also kept TLS out.

AX.25/KISS, Tor (SOCKS5), I2P (SAM v3, dial and accept), copyparty/WebDAV, UDP multicast on any address family (which unblocked Yggdrasil, cjdns, BATMAN and Thread), Reticulum over TCP/UDP, ICMP echo, and NNCP/UUCP via a new spool bridge. Every native stream bridge now shares bridge::stream_link with automatic reconnection and exponential backoff.

Added — tooling

Documentation

docs/SECURITY_FINDINGS.md (the findings register, also published to the site), SECURITY.md, this changelog, per-bridge privacy profiles in BRIDGES.md, the stamp deployer note, and the DESIGN section explaining what "relays never verify" does and does not mean.

Fixed

1.0.0 — the frozen contract (never tagged)

Not a release; the baseline the freeze is measured against, recorded here because every entry above is defined by not having moved it. The envelope format, the five medium shapes, bindings/spore.h, reference/vectors.json and the reference decoders. It sits below 0.1.0 in this file because it predates it — the distribution was first shipped at 0.1.0, on top of an already-frozen v1 protocol.