Minor Changes
-
#941
42ed39eThanks @Ferryx349! - feat(admin): moderation tools for pubkey, kind, and IP limits (closes #634)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.
Patch Changes
-
#968
98bd234Thanks @chappie-daemon! - chore(deps): build and test on Node 24.22.1, which patches the Brotli decoderCVE-2026-111497 is an out-of-bounds write in every Brotli decoder up to 1.2.0,
reachable by anything that decodes abrstream. Node bundles its own decoder,
so the fix is the Node release: 24.22.1 on the 24 line..nvmrcand both
Dockerfile stages move from floatingnode:24-alpineto a pinned
node:24.22.1-alpine. -
#945
062ee00Thanks @chappie-daemon! - Namespace EWMA rate-limiter keys so they cannot collide with sliding-window keysThe two strategies store different Redis types under the same key name: a sliding
window keeps a sorted set, EWMA keeps a hash. A cache volume carried over from 2.x,
or an operator switchinglimits.rateLimiter.strategy, therefore left EWMA reading a
sorted set as a hash — aWRONGTYPEerror on every connection and message until the
old key expired. EWMA now writes under anewma:prefix, which also keeps both
strategies' windows intact if the strategy is switched back. -
#965
ee65257Thanks @chappie-daemon! - fix(ci): publish legal image tags and keeplatestoff prereleasesA changesets relay release is tagged
nostream@3.7.0, and@is not legal in a
Docker tag, so thetype=ref,event=tagrule handed buildx a tag it refused: the
first live run of the Release workflow failed withinvalid tag ...: invalid reference formatand published no image for the release (#964).The tags are now computed by a shell step, so every tag is a value this
repository chose and can check: the bare version,vX.Y.Zas well beside it for
a legacy tag, andlatestonly when the release is not a prerelease. Each tag is
validated against Docker's grammar before the build, so an illegal one fails by
name at that step instead of at buildx.docs/CI-MIGRATION.md,docs/DEPLOYMENT.mdanddocs/DEPLOY-RUNBOOK.mdno
longer promisenostream@X.Y.Zas a pinnable image tag, and the runbook now
names the receiver change that subscribing toreleaseevents depends on. -
#969
8ea15fcThanks @Ferryx349! - feat(website): add the relay peering launch film and home-page section -
#967
9c736c8Thanks @chappie-daemon! - ci(release): allow the image build to be dispatched for an existing tagA published release is immutable, so when the image build fails while publishing
it, the release cannot be re-published to retry: GitHub refuses the round trip
withimmutable cannot be changed when release is immutable. That left #964's
release with no image and no way to build one.release.ymlnow acceptsworkflow_dispatchwith ataginput, and refuses a
tag that is not a relay release, since the event carries no tag of its own. With
no release flags present the prerelease is read from the version, so a dispatch
ofnostream@3.8.0-rc.1still leaveslatestwhere it is.