# Knit Spool v0.1.0 — knit-spool 0.1.0 - Product: Knit Spool (https://whatsnew.fyi/product/knit-spool) - Vendor: Knit Spool - Date: 2026-08-18 - Version: v0.1.0 - Original notes: https://github.com/getknit/knit-spool/releases/tag/v0.1.0 - Permalink: https://whatsnew.fyi/product/knit-spool/releases/v0.1.0 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — Record layer with CBOR hello/sub/digest/list/pull/blob/push/event/ok/err messages pinned to spec vectors with forward-compatible tolerance of unknown records and fields - **added** — Handshake with version negotiation, advertised limits, and bearer-token private spools - **added** — Fan-out live event delivery to every other subscriber of a scope with q-correlated replies and idempotent duplicate pushes - **added** — Retention with oldest-by-arrival eviction, count-bounded tombstones, and per-scope digests with unsolicited re-anchors - **added** — Attachments family (ahave/ahas/aget/achunk/aput) with chunk presence bitmaps, first-write-wins conflict detection, and per-scope byte quota - **added** — Abuse control including stateless PoW on SUB and shed-scope PUSH-recreate, per-connection and per-IP rate limits, and global storage watermark shedding - **added** — Persistence using SQLite with WAL and self-healing boot recompute or in-memory storage - **added** — Operational endpoints including GET /healthz, GET /metrics (Prometheus text), graceful shutdown, and periodic status logging - **added** — knit_spool_egress_bytes_total metric for fan-out egress tracking - **added** — Conformance suite CLI that validates any live spool over WebSocket with destructive and token-file options - **added** — Container image with JRE-only runtime stage, health check, and volume support - **added** — Reverse-proxy configurations for Caddy and nginx that keep bearer tokens out of access logs - **added** — Self-contained TLS compose stack for certificate issuance and renewal - **added** — Minimal overlay deployment for 1 GB boxes with resource caps and metered link optimization - **added** — GitHub Actions CI pipeline running check, koverVerify, and conformance suite on pull requests - **added** — GitLab CI pipeline with kaniko image build, Trivy scans, and tag-only release job - **added** — Release workflow publishing multi-arch images to GHCR and Docker Hub with signed build provenance - **added** — Coverage reporting via Kover with merged and per-module reports and ratcheting line/branch floors - **changed** — Hot-path hex encoding, digest computation, and store queries optimized to reduce per-record overhead - **fixed** — WebSocket close path no longer surfaces ping-timeout IOException as an error - **fixed** — Conformance runner reports non-assertion failures diagnosably and tallies transport faults separately from spec violations - **fixed** — Container build no longer races Kotlin compile daemon lock file under kaniko and mkdir tolerates volume path creation First implementation of the **v1** spool protocol, and the first tagged release. Pre-1.0: every interface below is subject to change, and only the wire protocol's own compatibility rules — which are versioned separately, above — are stable. ###### Added - **Record layer** — CBOR `hello`/`sub`/`digest`/`list`/`pull`/`blob`/`push`/`event`/`ok`/`err`, pinned byte-for-byte to the spec's §13 vectors by `SpecVectorTest`, with forward-compatible tolerance of unknown records and fields. - **Handshake** — version negotiation, advertised limits, and bearer-token private spools (`wss://host/spool/v1?k=…`). - **Fan-out** — live `event` delivery to every other subscriber of a scope, `q`-correlated replies, and idempotent duplicate pushes. - **Retention** — oldest-by-arrival eviction, count-bounded tombstones, and per-scope digests with unsolicited re-anchors after eviction or expiry. - **Attachments** (§6.5/§7.3) — `ahave`/`ahas`/`aget`/`achunk`/`aput`, chunk presence bitmaps, first-write-wins with `conflict` on mismatch, truncated (never refused) over-long `aget`, and a per-scope byte quota. `SPOOL_MAX_ATTACH_BYTES=0` removes the whole family from `hello`. - **Abuse control** — stateless PoW on SUB and on the shed-scope PUSH-recreate path, with the per-`(scope, day)` cache; per-connection and per-IP rate limits (`rate` + `retryMs`, escalating to close 4003); and a global storage watermark that sheds the least-active scope. - **Persistence** — SQLite (WAL, self-healing boot recompute) or in-memory behind one store contract, plus a periodic sweeper. - **Ops** — `GET /healthz`, `GET /metrics` (Prometheus text, token-gated on private spools), graceful shutdown, and a periodic one-line status log under its own `app.getknit.spool.Status` logger — gauges absolute, everything else a delta since the previous line (`SPOOL_STATUS_MS`, 5 min; `0` disables). - **`knit_spool_egress_bytes_total`** — fan-out means one push leaves as (subscribers − 1) copies, and on a metered link the transfer allowance binds long before CPU or memory does. - **Conformance suite** (`:conformance`) — a CLI that validates *any* live spool over WebSocket, TAP on stdout and a MUST tally on stderr. Depends only on `:protocol`, never on `:daemon`, so it tests the wire contract rather than this repo's internals. `--destructive` enables the quota and rate-limit checks; `--token-file` keeps a bearer token out of argv, where `ps` and shell history can read it. - **Deployment** — a container image (JRE-only runtime stage, uid 65532, `/data` volume, `/healthz` HEALTHCHECK); Caddy and nginx reverse-proxy configurations, both keeping the `?k=` token out of access logs; a self-contained TLS compose stack that issues and renews certificates; and a *tiny* overlay for 1 GB boxes that side-loads or pulls the image instead of building it, caps every container, bounds the log driver, and re-sizes the limits for a metered link. - **CI** — two pipelines over the same gating checks. GitHub Actions ([`.github/workflows/ci.yml`](.github/workflows/ci.yml)) runs `check` with merged coverage, `koverVerify`, and the conformance suite against the freshly built daemon on every pull request, and publishes the coverage badge on a default-branch push. The maintainer's internal GitLab pipeline ([`.gitlab-ci.yml`](.gitlab-ci.yml)) runs the same two test jobs and adds what needs a registry credential: a kaniko image build, advisory Trivy filesystem/image and markdownlint scans, and a tag-only release job. - **Releases** — a `v*` tag runs [`.github/workflows/release.yml`](.github/workflows/release.yml), which is the default source of release images. It re-runs `check` and the conformance suite against the tagged tree, then publishes a multi-arch (`linux/amd64`, `linux/arm64`) image to GHCR and Docker Hub with a signed build provenance attestation, and opens a draft GitHub Release carrying the dis _[Truncated at 4000 characters — full notes: https://github.com/getknit/knit-spool/releases/tag/v0.1.0]_