diff --git a/index.html b/index.html
index 95b3ded3..a3003653 100644
--- a/index.html
+++ b/index.html
@@ -23,6 +23,7 @@
+
diff --git a/package.json b/package.json
index 8d70fa0c..47352137 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "imwald",
- "version": "22.4.2",
+ "version": "22.5.0",
"description": "Imwald — a user-friendly Nostr client focused on relay feed browsing, publications, and relay discovery",
"private": true,
"type": "module",
diff --git a/src/components/ContentPreview/FollowPackPreview.tsx b/src/components/ContentPreview/FollowPackPreview.tsx
index 37e93575..0163e981 100644
--- a/src/components/ContentPreview/FollowPackPreview.tsx
+++ b/src/components/ContentPreview/FollowPackPreview.tsx
@@ -83,7 +83,7 @@ export default function FollowPackPreview({
return
}
if (!followList) return
- const { follow } = followList
+ const { followMany } = followList
const toFollow = packPubkeys.filter((p) => !followingSet.has(p) && !muteSetHas(mutePubkeySet, p))
if (toFollow.length === 0) {
const mutedCount = packPubkeys.filter((p) => muteSetHas(mutePubkeySet, p) && !followingSet.has(p)).length
@@ -96,9 +96,7 @@ export default function FollowPackPreview({
}
setBusy(true)
try {
- for (const pubkeyToFollow of toFollow) {
- await follow(pubkeyToFollow)
- }
+ await followMany(toFollow)
toast.success(t('Followed {{count}} users', { count: toFollow.length }))
} catch (error) {
logger.error('Failed to follow pack', { error })
diff --git a/src/components/RelayIcon/index.tsx b/src/components/RelayIcon/index.tsx
index ea54700a..ee683c46 100644
--- a/src/components/RelayIcon/index.tsx
+++ b/src/components/RelayIcon/index.tsx
@@ -8,8 +8,11 @@ import { useMemo } from 'react'
/**
* Resolve an image URL from NIP-11. Handles:
* - Absolute HTTP(S) URLs → used as-is
- * - Relative paths (e.g. "/favicon.ico") → resolved against the relay's base HTTP URL
- * - ws(s):// URLs some relays mistakenly return → ignored, fall through to favicon
+ * - Relative paths (e.g. "/logo.png") → resolved against the relay's base HTTP URL
+ * - ws(s):// URLs some relays mistakenly return → ignored
+ *
+ * We do not fetch `https://host/favicon.ico` as a fallback: many relays return HTML/404 there,
+ * which triggers Firefox Opaque Response Blocking noise and broken `
` loads.
*/
function resolveRelayImageUrl(raw: string, relayUrl: string): string | undefined {
if (!raw) return undefined
@@ -47,16 +50,7 @@ export default function RelayIcon({
return nip11Icon
}
- // Fall back to /favicon.ico at the relay's host
- try {
- const u = new URL(url)
- const scheme = u.protocol === 'wss:' ? 'https:' : 'http:'
- const favicon = `${scheme}//${u.host}/favicon.ico`
- logger.debug('[RelayIcon] using favicon fallback', { url, rawIcon, favicon })
- return favicon
- } catch {
- return undefined
- }
+ return undefined
}, [url, relayInfo])
return (
diff --git a/src/components/UserAvatar/index.tsx b/src/components/UserAvatar/index.tsx
index e1609637..0e95d574 100644
--- a/src/components/UserAvatar/index.tsx
+++ b/src/components/UserAvatar/index.tsx
@@ -216,7 +216,8 @@ export default function UserAvatar({
const [imgError, setImgError] = useState(false)
const [currentSrc, setCurrentSrc] = useState(avatarSrc)
- const isVideoAvatar = useMemo(() => isVideo(profile?.avatar?.trim() ?? ''), [profile?.avatar])
+ /** Must match `currentSrc`: deferred / fallback identicon is SVG — never pass it to `