|
1 | 1 | # nostream |
2 | 2 |
|
| 3 | +## 3.8.0 |
| 4 | + |
| 5 | +### Minor Changes |
| 6 | + |
| 7 | +- [#941](https://github.com/cameri/nostream/pull/941) [`42ed39e`](https://github.com/cameri/nostream/commit/42ed39edf61ef6e8091e2fa32cad8e76823bb67d) Thanks [@Ferryx349](https://github.com/Ferryx349)! - feat(admin): moderation tools for pubkey, kind, and IP limits (closes [#634](https://github.com/cameri/nostream/issues/634)) |
| 8 | + |
| 9 | + Adds admin API and console view to read and update event pubkey/kind lists, rate-limit bypass lists, quick ban/unban actions, and activity stats for top publishers, client IPs, and rate-limit hits. |
| 10 | + |
| 11 | +### Patch Changes |
| 12 | + |
| 13 | +- [#968](https://github.com/cameri/nostream/pull/968) [`98bd234`](https://github.com/cameri/nostream/commit/98bd2340af5bfd79deaa83bcd3a145550e269343) Thanks [@chappie-daemon](https://github.com/chappie-daemon)! - chore(deps): build and test on Node 24.22.1, which patches the Brotli decoder |
| 14 | + |
| 15 | + CVE-2026-111497 is an out-of-bounds write in every Brotli decoder up to 1.2.0, |
| 16 | + reachable by anything that decodes a `br` stream. Node bundles its own decoder, |
| 17 | + so the fix is the Node release: 24.22.1 on the 24 line. `.nvmrc` and both |
| 18 | + Dockerfile stages move from floating `node:24-alpine` to a pinned |
| 19 | + `node:24.22.1-alpine`. |
| 20 | + |
| 21 | +- [#945](https://github.com/cameri/nostream/pull/945) [`062ee00`](https://github.com/cameri/nostream/commit/062ee007d150b7c4d0daff5032be3ad71de7773e) Thanks [@chappie-daemon](https://github.com/chappie-daemon)! - Namespace EWMA rate-limiter keys so they cannot collide with sliding-window keys |
| 22 | + |
| 23 | + The two strategies store different Redis types under the same key name: a sliding |
| 24 | + window keeps a sorted set, EWMA keeps a hash. A cache volume carried over from 2.x, |
| 25 | + or an operator switching `limits.rateLimiter.strategy`, therefore left EWMA reading a |
| 26 | + sorted set as a hash — a `WRONGTYPE` error on every connection and message until the |
| 27 | + old key expired. EWMA now writes under an `ewma:` prefix, which also keeps both |
| 28 | + strategies' windows intact if the strategy is switched back. |
| 29 | + |
| 30 | +- [#965](https://github.com/cameri/nostream/pull/965) [`ee65257`](https://github.com/cameri/nostream/commit/ee652577236a2a2da6499f3a58f98e0ed3e581c4) Thanks [@chappie-daemon](https://github.com/chappie-daemon)! - fix(ci): publish legal image tags and keep `latest` off prereleases |
| 31 | + |
| 32 | + A changesets relay release is tagged `nostream@3.7.0`, and `@` is not legal in a |
| 33 | + Docker tag, so the `type=ref,event=tag` rule handed buildx a tag it refused: the |
| 34 | + first live run of the Release workflow failed with `invalid tag ...: invalid |
| 35 | +reference format` and published no image for the release ([#964](https://github.com/cameri/nostream/issues/964)). |
| 36 | + |
| 37 | + The tags are now computed by a shell step, so every tag is a value this |
| 38 | + repository chose and can check: the bare version, `vX.Y.Z` as well beside it for |
| 39 | + a legacy tag, and `latest` only when the release is not a prerelease. Each tag is |
| 40 | + validated against Docker's grammar before the build, so an illegal one fails by |
| 41 | + name at that step instead of at buildx. |
| 42 | + |
| 43 | + `docs/CI-MIGRATION.md`, `docs/DEPLOYMENT.md` and `docs/DEPLOY-RUNBOOK.md` no |
| 44 | + longer promise `nostream@X.Y.Z` as a pinnable image tag, and the runbook now |
| 45 | + names the receiver change that subscribing to `release` events depends on. |
| 46 | + |
| 47 | +- [#967](https://github.com/cameri/nostream/pull/967) [`9c736c8`](https://github.com/cameri/nostream/commit/9c736c83d7ea116cd9492c619c7a2f7a156c20ba) Thanks [@chappie-daemon](https://github.com/chappie-daemon)! - ci(release): allow the image build to be dispatched for an existing tag |
| 48 | + |
| 49 | + A published release is immutable, so when the image build fails while publishing |
| 50 | + it, the release cannot be re-published to retry: GitHub refuses the round trip |
| 51 | + with `immutable cannot be changed when release is immutable`. That left [#964](https://github.com/cameri/nostream/issues/964)'s |
| 52 | + release with no image and no way to build one. |
| 53 | + |
| 54 | + `release.yml` now accepts `workflow_dispatch` with a `tag` input, and refuses a |
| 55 | + tag that is not a relay release, since the event carries no tag of its own. With |
| 56 | + no release flags present the prerelease is read from the version, so a dispatch |
| 57 | + of `nostream@3.8.0-rc.1` still leaves `latest` where it is. |
| 58 | + |
3 | 59 | ## 3.7.0 |
4 | 60 |
|
5 | 61 | ### Minor Changes |
|
0 commit comments