{t('{{count}} RSS entries for this URL', { count: rssItems.length })}
) : null}
- {isHttpArticleUrl(canonicalUrl) ? (
-
- ) : null}
-
-
+ {!rssColumnReadOnly ? : null}
)
}
diff --git a/src/i18n/locales/ar.ts b/src/i18n/locales/ar.ts
index 2e613570..8d7b095d 100644
--- a/src/i18n/locales/ar.ts
+++ b/src/i18n/locales/ar.ts
@@ -1519,13 +1519,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/de.ts b/src/i18n/locales/de.ts
index 90e178b4..633d4cc8 100644
--- a/src/i18n/locales/de.ts
+++ b/src/i18n/locales/de.ts
@@ -1558,13 +1558,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Nur Links aus Nostr-Relays (Entdeckung) oder von dir hinzugefügte URLs. Einträge, die nur aus abonnierten RSS-Feeds stammen, erscheinen hier nicht — dafür RSS oder Beides.',
+ 'Artikel-URLs ohne Einträge aus abonnierten Feeds — von Nostr-Relays oder von dir hinzugefügt. Sobald ein Feed Einträge liefert, erscheint die Karte unter RSS.',
+ 'RSS feed column title': 'RSS & verknüpfte Artikel',
+ 'RSS feed column subtitle':
+ 'Feed-Einträge und Artikelkarten mit mindestens einem Eintrag aus deinen abonnierten RSS-Feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'Noch keine reinen Artikel-URLs',
+ 'Respond to this RSS entry': 'Auf diesen RSS-Eintrag reagieren',
+ 'RSS read-only thread hint':
+ 'Nostr-Antworten, Zaps und Markierungen sind hier ausgeblendet. Damit fügst du den Artikel der URL-Liste hinzu und reagierst dort.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts
index 4d1d1131..ef5806a6 100644
--- a/src/i18n/locales/en.ts
+++ b/src/i18n/locales/en.ts
@@ -1532,13 +1532,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/es.ts b/src/i18n/locales/es.ts
index be8196e8..ed40991f 100644
--- a/src/i18n/locales/es.ts
+++ b/src/i18n/locales/es.ts
@@ -1527,13 +1527,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/fa.ts b/src/i18n/locales/fa.ts
index 68473718..f6160ed6 100644
--- a/src/i18n/locales/fa.ts
+++ b/src/i18n/locales/fa.ts
@@ -1523,13 +1523,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/fr.ts b/src/i18n/locales/fr.ts
index 277f5148..fcf2c4b2 100644
--- a/src/i18n/locales/fr.ts
+++ b/src/i18n/locales/fr.ts
@@ -1532,13 +1532,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/hi.ts b/src/i18n/locales/hi.ts
index f4bf5735..a5bf988f 100644
--- a/src/i18n/locales/hi.ts
+++ b/src/i18n/locales/hi.ts
@@ -1525,13 +1525,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/it.ts b/src/i18n/locales/it.ts
index 259bb349..17aad7a0 100644
--- a/src/i18n/locales/it.ts
+++ b/src/i18n/locales/it.ts
@@ -1528,13 +1528,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/ja.ts b/src/i18n/locales/ja.ts
index bb32910d..80b6b49a 100644
--- a/src/i18n/locales/ja.ts
+++ b/src/i18n/locales/ja.ts
@@ -1523,13 +1523,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/ko.ts b/src/i18n/locales/ko.ts
index 47426d64..a536d70b 100644
--- a/src/i18n/locales/ko.ts
+++ b/src/i18n/locales/ko.ts
@@ -1521,13 +1521,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/pl.ts b/src/i18n/locales/pl.ts
index cd0d5809..4188d66a 100644
--- a/src/i18n/locales/pl.ts
+++ b/src/i18n/locales/pl.ts
@@ -1526,13 +1526,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/pt-BR.ts b/src/i18n/locales/pt-BR.ts
index d6e92290..faf5dff2 100644
--- a/src/i18n/locales/pt-BR.ts
+++ b/src/i18n/locales/pt-BR.ts
@@ -1525,13 +1525,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/pt-PT.ts b/src/i18n/locales/pt-PT.ts
index c9b49bb8..20fd691b 100644
--- a/src/i18n/locales/pt-PT.ts
+++ b/src/i18n/locales/pt-PT.ts
@@ -1527,13 +1527,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/ru.ts b/src/i18n/locales/ru.ts
index 48248720..64f0665b 100644
--- a/src/i18n/locales/ru.ts
+++ b/src/i18n/locales/ru.ts
@@ -1528,13 +1528,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/th.ts b/src/i18n/locales/th.ts
index f7f35906..986a82d0 100644
--- a/src/i18n/locales/th.ts
+++ b/src/i18n/locales/th.ts
@@ -1518,13 +1518,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/i18n/locales/zh.ts b/src/i18n/locales/zh.ts
index bab2913a..5ed54150 100644
--- a/src/i18n/locales/zh.ts
+++ b/src/i18n/locales/zh.ts
@@ -1513,13 +1513,19 @@ export default {
'Article URLs subtitle':
'One card per link: URLs from Nostr relays (you and people you follow) plus any RSS hit. No RSS row yet → web preview card.',
'Article URLs Nostr manual subtitle':
- 'Only links from Nostr relay discovery or URLs you added. Items that exist only because they appeared in subscribed RSS feeds are not listed here — use RSS or Both.',
+ 'Article URLs with no subscribed-feed items yet — from Nostr relay discovery or links you added. Anything that already has feed items appears under RSS.',
+ 'RSS feed column title': 'RSS & linked articles',
+ 'RSS feed column subtitle':
+ 'Feed entries and article cards that include at least one item from your subscribed RSS feeds.',
'RSS timeline': 'RSS timeline',
'RSS timeline subtitle':
'Every item from your subscribed feeds, newest first — classic RSS reader.',
URLs: 'URLs',
RSS: 'RSS',
- Both: 'Both',
+ 'No URL-only items yet': 'No URL-only items yet',
+ 'Respond to this RSS entry': 'Respond to this RSS entry',
+ 'RSS read-only thread hint':
+ 'Nostr replies, zaps, and highlights are hidden here. Use this to add the article to your URL feed and respond there.',
'RSS feed item label': 'RSS',
'Web URL item label': 'Web URL',
'URL thread activity': 'URL thread activity',
diff --git a/src/lib/rss-web-feed.ts b/src/lib/rss-web-feed.ts
index f2486b68..2136c7a8 100644
--- a/src/lib/rss-web-feed.ts
+++ b/src/lib/rss-web-feed.ts
@@ -17,6 +17,7 @@ import { isImage, isLocalNetworkUrl, isMedia, isVideo, normalizeUrl } from '@/li
import { queryService } from '@/services/client.service'
import indexedDb from '@/services/indexed-db.service'
import type { RssFeedItem } from '@/services/rss-feed.service'
+import { isWebOnlyFauxRssItem } from '@/services/rss-feed.service'
import { kinds, type Event, type Filter } from 'nostr-tools'
/** IndexedDB: `'1'` (default) = hide clawstr.com (strip preview links + drop URL/RSS rows for that host). */
@@ -25,25 +26,32 @@ export const RSS_WEB_SUPPRESS_CLAWSTR_SETTING = 'rssWebSuppressClawstrLinks'
/** IndexedDB: `'1'` (default) = keep local/media/feed XML links as plain RSS rows, not URL cards. */
export const RSS_WEB_HIDE_UNIFIED_CLUTTER_SETTING = 'rssWebHideUnifiedClutter'
-/** IndexedDB: feed view — article URL cards, flat RSS timeline, or both interleaved. */
+/** IndexedDB: feed view — URLs (no feed items) vs RSS (feed-backed rows). */
export const RSS_WEB_FEED_SCOPE_SETTING = 'rssWebFeedScope'
/** IndexedDB: JSON array of `{ url, addedAt }` for URLs added from “Add URL” (no RSS row yet). */
export const RSS_WEB_MANUAL_URLS_SETTING = 'rssWebManualUrls'
/**
- * `urls` = article URL cards that come from manual URLs or Nostr discovery only (not RSS-grouped links).
- * `rss` = classic chronological RSS list only. `both` = all URL cards (RSS-enriched + Nostr/manual) plus RSS-only rows.
+ * `urls` = article URL cards with no real subscribed-feed items (Nostr/manual / web preview only).
+ * `rss` = feed items, non-HTTP entries, and URL cards that include at least one real RSS item.
*/
-export type RssWebFeedScope = 'urls' | 'rss' | 'both'
+export type RssWebFeedScope = 'urls' | 'rss'
-/** Normalize stored scope (legacy `webOnly` / `rssOnly` / `webAndRss` included). */
+/** True if the row includes at least one item from a subscribed RSS feed (not the synthetic web-only row). */
+export function rssWebRowHasRealFeedItems(
+ items: Pick[]
+): boolean {
+ return items.some((i) => !isWebOnlyFauxRssItem(i))
+}
+
+/** Normalize stored scope (legacy `both` / `webAndRss` → `rss`). */
export function parseRssWebFeedScope(raw: string | null | undefined): RssWebFeedScope {
- if (raw === 'urls' || raw === 'rss' || raw === 'both') return raw
+ if (raw === 'urls' || raw === 'rss') return raw
+ if (raw === 'both' || raw === 'webAndRss' || raw === 'all') return 'rss'
if (raw === 'webOnly') return 'urls'
if (raw === 'rssOnly') return 'rss'
- if (raw === 'webAndRss' || raw === 'all') return 'both'
- return 'both'
+ return 'urls'
}
export type ManualRssWebUrlEntry = { url: string; addedAt: number }
@@ -129,6 +137,51 @@ export async function mergeDiscoveredRssWebUrls(discovered: ManualRssWebUrlEntry
/** Dispatched after publishing a kind 17 web URL reaction so RSS+Web can refetch. */
export const WEB_EXTERNAL_REACTION_PUBLISHED_EVENT = 'jumble:webExternalReactionPublished'
+/** IndexedDB: JSON array of canonical article URLs promoted from RSS read-only into the URL feed (Nostr thread). */
+export const RSS_WEB_PROMOTED_THREAD_URLS_SETTING = 'rssWebPromotedThreadUrls'
+
+const MAX_PROMOTED_THREAD_URLS = 300
+
+export async function loadPromotedRssThreadUrls(): Promise {
+ const raw = await indexedDb.getSetting(RSS_WEB_PROMOTED_THREAD_URLS_SETTING)
+ if (!raw) return []
+ try {
+ const parsed = JSON.parse(raw) as unknown
+ if (!Array.isArray(parsed)) return []
+ const out: string[] = []
+ for (const x of parsed) {
+ if (typeof x !== 'string') continue
+ const c = canonicalizeRssArticleUrl(x.trim())
+ if (isHttpArticleUrl(c)) out.push(c)
+ }
+ return [...new Set(out)].slice(0, MAX_PROMOTED_THREAD_URLS)
+ } catch {
+ return []
+ }
+}
+
+export async function addPromotedRssThreadUrl(rawUrl: string): Promise {
+ const canonical = canonicalizeRssArticleUrl(rawUrl.trim())
+ if (!isHttpArticleUrl(canonical)) return canonical
+ const existing = await loadPromotedRssThreadUrls()
+ const filtered = existing.filter((u) => u !== canonical)
+ const next = [canonical, ...filtered].slice(0, MAX_PROMOTED_THREAD_URLS)
+ await indexedDb.setSetting(RSS_WEB_PROMOTED_THREAD_URLS_SETTING, JSON.stringify(next))
+ return canonical
+}
+
+/**
+ * Adds the URL to the manual web list, marks it for the URL feed with full Nostr thread UI,
+ * and dispatches {@link WEB_EXTERNAL_REACTION_PUBLISHED_EVENT}.
+ */
+export async function promoteRssArticleForNostrThread(rawUrl: string): Promise {
+ const canonical = await addManualRssWebUrl(rawUrl)
+ if (!isHttpArticleUrl(canonical)) return canonical
+ await addPromotedRssThreadUrl(canonical)
+ window.dispatchEvent(new CustomEvent(WEB_EXTERNAL_REACTION_PUBLISHED_EVENT))
+ return canonical
+}
+
export type RssUrlGroup = {
canonicalUrl: string
items: RssFeedItem[]
@@ -301,11 +354,6 @@ export type ArticleUrlFeedWebRow = {
canonicalUrl: string
rssItems: RssFeedItem[]
latestPub: number
- /**
- * True when this URL came from the manual list or Nostr relay discovery. False when the row exists only
- * because RSS items were grouped by link (RSS-only article cards).
- */
- fromNostrOrManual: boolean
}
export function buildArticleUrlFeedRows(
@@ -316,16 +364,12 @@ export function buildArticleUrlFeedRows(
): { webRows: ArticleUrlFeedWebRow[]; nonHttpItems: RssFeedItem[] } {
const { groups, nonHttpItems } = partitionRssItemsForWebFeed(filteredItems, options)
const excludeClutter = options?.excludeClutterLinks !== false
- const webByUrl = new Map<
- string,
- { rssItems: RssFeedItem[]; latestPub: number; fromNostrOrManual: boolean }
- >()
+ const webByUrl = new Map()
for (const g of groups) {
webByUrl.set(g.canonicalUrl, {
rssItems: g.items,
- latestPub: g.latestPub,
- fromNostrOrManual: false
+ latestPub: g.latestPub
})
}
@@ -334,11 +378,10 @@ export function buildArticleUrlFeedRows(
if (cur) {
webByUrl.set(url, {
...cur,
- latestPub: Math.max(cur.latestPub, ts),
- fromNostrOrManual: true
+ latestPub: Math.max(cur.latestPub, ts)
})
} else {
- webByUrl.set(url, { rssItems: [], latestPub: ts, fromNostrOrManual: true })
+ webByUrl.set(url, { rssItems: [], latestPub: ts })
}
}
@@ -358,8 +401,7 @@ export function buildArticleUrlFeedRows(
kind: 'web' as const,
canonicalUrl,
rssItems: v.rssItems,
- latestPub: v.latestPub,
- fromNostrOrManual: v.fromNostrOrManual
+ latestPub: v.latestPub
})
)
webRows.sort((a, b) => b.latestPub - a.latestPub)
diff --git a/src/pages/secondary/RssArticlePage/index.tsx b/src/pages/secondary/RssArticlePage/index.tsx
index 6d8d71c5..c93e6749 100644
--- a/src/pages/secondary/RssArticlePage/index.tsx
+++ b/src/pages/secondary/RssArticlePage/index.tsx
@@ -2,6 +2,7 @@ import NoteInteractions from '@/components/NoteInteractions'
import NoteStats from '@/components/NoteStats'
import RssFeedItem from '@/components/RssFeedItem'
import { RefreshButton } from '@/components/RefreshButton'
+import { Button } from '@/components/ui/button'
import { Label } from '@/components/ui/label'
import {
Select,
@@ -17,7 +18,7 @@ import {
createWebOnlyRssFeedItem,
isWebOnlyFauxRssItem
} from '@/services/rss-feed.service'
-import { isHttpArticleUrl } from '@/lib/rss-web-feed'
+import { isHttpArticleUrl, promoteRssArticleForNostrThread } from '@/lib/rss-web-feed'
import SecondaryPageLayout from '@/layouts/SecondaryPageLayout'
import { usePrimaryNoteView } from '@/contexts/primary-note-view-context'
import { useNostr } from '@/providers/NostrProvider'
@@ -45,6 +46,16 @@ const RssArticlePage = forwardRef(
ref
) => {
const { t } = useTranslation()
+ const [rssFeedReadOnly, setRssFeedReadOnly] = useState(() => {
+ try {
+ return new URLSearchParams(window.location.search).get('rssFeedReadOnly') === '1'
+ } catch {
+ return false
+ }
+ })
+ const [threadUnlocked, setThreadUnlocked] = useState(false)
+ const [promotingThread, setPromotingThread] = useState(false)
+ const showNostrThread = !rssFeedReadOnly || threadUnlocked
const { rssFeedListEvent } = useNostr()
const { registerPrimaryPanelRefresh } = usePrimaryNoteView()
const [contentKey, setContentKey] = useState(0)
@@ -60,6 +71,31 @@ const RssArticlePage = forwardRef(
}
}, [articleKey])
+ useEffect(() => {
+ setThreadUnlocked(false)
+ try {
+ setRssFeedReadOnly(
+ new URLSearchParams(window.location.search).get('rssFeedReadOnly') === '1'
+ )
+ } catch {
+ setRssFeedReadOnly(false)
+ }
+ }, [articleKey])
+
+ useEffect(() => {
+ const sync = () => {
+ try {
+ setRssFeedReadOnly(
+ new URLSearchParams(window.location.search).get('rssFeedReadOnly') === '1'
+ )
+ } catch {
+ setRssFeedReadOnly(false)
+ }
+ }
+ window.addEventListener('popstate', sync)
+ return () => window.removeEventListener('popstate', sync)
+ }, [])
+
const subscribedFeedUrls = useMemo(() => {
if (!rssFeedListEvent?.tags?.length) return new Set()
const s = new Set()
@@ -174,6 +210,17 @@ const RssArticlePage = forwardRef(
}
}, [articleUrl])
+ const onPromoteForNostrThread = useCallback(async () => {
+ if (!articleUrl || !isHttpArticleUrl(articleUrl)) return
+ setPromotingThread(true)
+ try {
+ await promoteRssArticleForNostrThread(articleUrl)
+ setThreadUnlocked(true)
+ } finally {
+ setPromotingThread(false)
+ }
+ }, [articleUrl])
+
useEffect(() => {
if (!hideTitlebar) {
registerPrimaryPanelRefresh(null)
@@ -230,21 +277,35 @@ const RssArticlePage = forwardRef(
{t('Opened by URL — not from your RSS list. Nostr thread is still tied to this link.')}