From 8d331be1d5cc47fbebd2f59399cd9138f0940c85 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Wed, 8 Jul 2026 09:38:22 -0400 Subject: [PATCH] Channel grid: always query bundled default relays (fix videos on nos.lol never showing) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause of "a known video never shows on the channel": the video was a whitelisted creator's NIP-71 note that lives ONLY on nos.lol, but the channel fetch queried nostrClient.relays — the user's CAPPED NIP-65 read set — which dropped nos.lol, so we never queried the one relay that had it. Confirmed by per-relay probe: snort/damus/primal returned 0, nos.lol returned the 2 videos. loadUserVideos now unions the user's relays with DEFAULT_RELAY_URLS (nos.lol, damus, primal, snort) for the scoped channel fetch, so a creator's videos on any bundled default relay are found regardless of the read cap. Channel pages are a deliberate request for one creator, so the slightly wider fan-out is fine. Co-Authored-By: Claude Opus 4.8 --- js/channelProfile.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/js/channelProfile.js b/js/channelProfile.js index 361eeef0..9a587522 100644 --- a/js/channelProfile.js +++ b/js/channelProfile.js @@ -5611,7 +5611,14 @@ async function loadUserVideos(pubkey) { const knownRelays = Array.isArray(nostrClient.relays) ? nostrClient.relays : Array.from(nostrClient.relays || []); - const relayList = knownRelays.filter((url) => isValidRelayUrl(url)); + // ALWAYS include the bundled defaults. A creator's videos can live only on + // a default relay (e.g. a NIP-71 video that's only on nos.lol) that the + // user's capped NIP-65 read set excludes — otherwise a known, whitelisted + // video never shows on the channel because we never query the one relay + // that has it. + const relayList = [ + ...new Set([...knownRelays, ...DEFAULT_RELAY_URLS]), + ].filter((url) => isValidRelayUrl(url)); // Route one fetch through the app's PROVEN path (the same one "My Videos" // uses on refresh). It streams into the shared cache, so this grid, its