Minor Changes
-
#999
469f1b1Thanks @Ferryx349! - feat(peering): advertise peering terms and scopes in NIP-11The relay information document now carries a
peeringsection built from the new
peeringsettings block. It advertises whether peering is offered, the feeds
available askindsscopes with an absolutesince/untilrange or a rolling
windowSeconds, terms in the existing NIP-11 fee-object shape (amount,unit,
period) where an emptytermslist means settlement-free, a peercontactor
WebSocketendpoint, andmin_pow_difficulty— the NIP-13 work a peering request
must carry,0meaning none.Disabled peering publishes only
{ "enabled": false }, so half-configured terms are
never read as an accepted peer: this is the discovery surface other relays read
before connecting, not a peer-acceptance path. Settings validation rejects invalid
scopes, terms, time ranges, endpoints and proof-of-work bounds with a clear path, and
allpeering.*fields are documented inCONFIGURATION.mdwith an example document.Closes #932.
-
#926
2819e30Thanks @Priyanshubhartistm! - feat(payments): let clients see their subscription tier
Patch Changes
-
#972
a46ae06Thanks @chappie-daemon! - fix(compose): keep dynamic container addresses off the static onesdocker-compose.ymlpinsnostream,nostream-dbandnostream-cacheto10.10.10.2–.4, but dynamic allocation drew from the bottom of the same/24. The observability stack has no dependency that orders it afternostream, sootel-collectorcould be given.2andnostreamthen failed to start withAddress already in use— most reliably after a host reboot, when the daemon starts containers in arbitrary order.Dynamic allocation is now confined to
10.10.10.128/26. The subnet and gateway are unchanged, so10.10.10.1stays the trusted proxy, and the overlay pins (.5,.252,.253) stay outside the pool. -
#1005
b185f35Thanks @chappie-daemon! - ci(deploy): retry the website deploy on a transient Cloudflare failureRun 40103130697 failed at
Deploy the preview workerwith Cloudflare API error
code: 10013after a build that had already succeeded, and the next push deployed
the same commit successfully — a transient upstream failure, not a defect in the
site or the workflow.Both website deploys now run through
.github/scripts/deploy-with-retry.sh, which
wraps the deploy step (not the build) in three attempts with a 10 s then 30 s
backoff, a per-attempt timeout, and a step-leveltimeout-minutes. It retries only
code: 10013, an HTTP 5xx, a connection reset and an expired attempt timeout; an
authentication failure, a missing environment or a wrangler validation error still
fails on the first attempt. Every retry emits a::warning::naming the attempt and
the reason, so the flake rate stays visible instead of disappearing behind a
passing job. -
#1000
dff00baThanks @chappie-daemon! - Add canonical first-party production relay setup guide at/docs/setupand replace outdated third-party guides inREADME.md. -
#1003
80b0a9eThanks @chappie-daemon! - test(redis): prove the relay keeps publishing after the cache loses its scriptsNothing is shipped in this change — it is coverage for #1002. The relay issues
EVALSHA, and Lua scripts live in the cache's memory, so a Redis restart leaves every script call answeringNOSCRIPT. The adapter's retry for that was added in #920 and had only a stubbed unit test:evalShawas mocked, which cannot catch a retry that stops working through the workers that actually call it.The new integration scenario publishes, runs
SCRIPT FLUSHagainst the same Redis, then publishes twice more.SCRIPT FLUSHis the whole of a restart as far as the relay can tell, and it is deterministic — no container to restart and no reconnect to wait for. The scenario configures a message rate limit on purpose, because both limiters return early on an empty list and a scenario without one would pass whether or not the fallback existed.