experiments in a post-browser web
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(entities): fall back to URL hostname when pageMetadata.title is empty so URL items don't stay title-less

+16 -5
+9 -3
features/entities/background.js
··· 107 107 const item = items.data.find(i => urlVariants.has(i.content)); 108 108 if (!item) return; 109 109 110 - // Update title if empty or "Loading..." 111 - if (pageMetadata.title && (!item.title || item.title === 'Loading...')) { 112 - await api.datastore.updateItemTitle(url, pageMetadata.title); 110 + // Update title if empty or "Loading...". Fall back to hostname so URL 111 + // items don't stay title-less when fetch fails / the page omits a 112 + // <title> / extraction returns nothing — those items would otherwise 113 + // render as bare URLs or empty cards in every consumer view. 114 + const fallbackTitle = pageMetadata.title || (() => { 115 + try { return new URL(url).hostname; } catch { return ''; } 116 + })(); 117 + if (fallbackTitle && (!item.title || item.title === 'Loading...')) { 118 + await api.datastore.updateItemTitle(url, fallbackTitle); 113 119 } 114 120 115 121 // Persist favicon if available
+7 -2
features/entities/home.js
··· 90 90 const item = items.data.find(i => urlVariants.has(i.content)); 91 91 if (!item) return; 92 92 93 - if (pageMetadata.title && (!item.title || item.title === 'Loading...')) { 94 - await api.datastore.updateItemTitle(url, pageMetadata.title); 93 + // Fall back to hostname when extraction yields no title — see 94 + // matching comment in features/entities/background.js. 95 + const fallbackTitle = pageMetadata.title || (() => { 96 + try { return new URL(url).hostname; } catch { return ''; } 97 + })(); 98 + if (fallbackTitle && (!item.title || item.title === 'Loading...')) { 99 + await api.datastore.updateItemTitle(url, fallbackTitle); 95 100 } 96 101 97 102 if (pageMetadata.favicon) {