diff --git a/www/js/version.json b/www/js/version.json
index ee028e2..6c405d2 100644
--- a/www/js/version.json
+++ b/www/js/version.json
@@ -1,5 +1,5 @@
{
- "VERSION": "v0.7.42",
- "VERSION_NUMBER": "0.7.42",
- "BUILD_DATE": "2026-06-26T13:44:56.791Z"
+ "VERSION": "v0.7.43",
+ "VERSION_NUMBER": "0.7.43",
+ "BUILD_DATE": "2026-06-26T13:46:35.892Z"
}
diff --git a/www/relays.html b/www/relays.html
index d7c7741..3cb1093 100644
--- a/www/relays.html
+++ b/www/relays.html
@@ -257,6 +257,10 @@
================================================================ -->
Loading relays...
+
+
▸ Discovered Relays (Outbox)
+
+
@@ -333,7 +337,7 @@
/* ================================================================
IMPORTS
================================================================ */
- import { initNDKPage, getPubkey, injectHeaderAvatar, disconnect, getRelayData, getRelayStats, reconnectRelay, publishEvent, getVersion, updateVersionDisplay, ndkFetchEvents, setRelayEventLogging } from './js/init-ndk.mjs';
+ import { initNDKPage, getPubkey, injectHeaderAvatar, disconnect, getRelayData, getRelayStats, reconnectRelay, publishEvent, getVersion, updateVersionDisplay, ndkFetchEvents, setRelayEventLogging, getDiscoveredRelays } from './js/init-ndk.mjs';
import { HamburgerMorphing } from "./hamburger_morphing/hamburger.mjs";
import { initFooterRelayStatus, updateFooterRelayStatus, initSidenavRelaySection, updateSidenavRelaySection, setRelayActivityState } from './js/relay-ui.mjs';
@@ -1331,12 +1335,88 @@ const versionInfo = await getVersion();
}
};
+ const shortNpub = (hex) => {
+ if (!hex || hex.length < 16) return hex || '-';
+ return `${hex.slice(0, 8)}…${hex.slice(-4)}`;
+ };
+
+ let discoveredRelaysExpanded = false;
+
+ const renderDiscoveredRelays = (relays) => {
+ const container = document.getElementById('divDiscoveredRelays');
+ const title = document.getElementById('divDiscoveredRelaysTitle');
+ if (!container || !title) return;
+
+ if (!discoveredRelaysExpanded) {
+ container.style.display = 'none';
+ title.textContent = `▸ Discovered Relays (Outbox)${relays.length > 0 ? ` (${relays.length})` : ''}`;
+ return;
+ }
+
+ title.textContent = `▾ Discovered Relays (Outbox) (${relays.length})`;
+ container.style.display = '';
+
+ if (relays.length === 0) {
+ container.innerHTML = '
No discovered relays. Load the feed page to populate outbox relays from your follows.
';
+ return;
+ }
+
+ let html = '
';
+ html += '';
+ html += '| Relay | ';
+ html += 'Connected | ';
+ html += 'Serving | ';
+ html += 'Sample Follows | ';
+ html += '
';
+
+ for (const relay of relays) {
+ const connected = relay.connected ? SVG_CHECKED : SVG_UNCHECKED;
+ const servingCount = Array.isArray(relay.servingPubkeys) ? relay.servingPubkeys.length : 0;
+ const sampleFollows = Array.isArray(relay.servingPubkeys)
+ ? relay.servingPubkeys.slice(0, 3).map(shortNpub).join(', ')
+ : '-';
+ const rowClass = relay.connected ? 'tblRowConnected' : '';
+
+ html += ``;
+ html += `| ${relay.url} | `;
+ html += `${connected} | `;
+ html += `${servingCount} | `;
+ html += `${sampleFollows} | `;
+ html += '
';
+ }
+
+ html += '
';
+ container.innerHTML = html;
+ };
+
+ const refreshDiscoveredRelays = async () => {
+ try {
+ const relays = await getDiscoveredRelays();
+ renderDiscoveredRelays(Array.isArray(relays) ? relays : []);
+ } catch (error) {
+ console.warn('[relays.html] Failed to fetch discovered relays:', error?.message || error);
+ renderDiscoveredRelays([]);
+ }
+ };
+
+ const initDiscoveredRelaysToggle = () => {
+ const title = document.getElementById('divDiscoveredRelaysTitle');
+ if (!title) return;
+ title.addEventListener('click', () => {
+ discoveredRelaysExpanded = !discoveredRelaysExpanded;
+ refreshDiscoveredRelays();
+ });
+ };
+
const refreshRelayData = async () => {
console.log('[relay2.html] Refreshing relay data...');
try {
const relays = await getRelayData();
await createRelayTable(relays);
+ // Refresh discovered relays (outbox) table
+ void refreshDiscoveredRelays();
+
// Keep relay debug history stable between polls; live updates are appended via ndkRelayEvent.
} catch (error) {
console.error('[relay2.html] Error getting relay data:', error);
@@ -1494,6 +1574,9 @@ const versionInfo = await getVersion();
await loadCurrentDmInboxRelayList();
+ // Initialize discovered relays (outbox) collapsible toggle
+ initDiscoveredRelaysToggle();
+
// Get initial relay data
await refreshRelayData();