diff --git a/app/web/src/App.svelte b/app/web/src/App.svelte
index 4d83087..61b573b 100644
--- a/app/web/src/App.svelte
+++ b/app/web/src/App.svelte
@@ -116,6 +116,9 @@
// ACL mode
let aclMode = "";
+ // Relay version
+ let relayVersion = "";
+
// Compose tab state
let composeEventJson = "";
let composePublishError = "";
@@ -859,6 +862,9 @@
// Load policy configuration
loadPolicyConfig();
+
+ // Load relay version
+ fetchRelayVersion();
}
function savePersistentState() {
@@ -2020,6 +2026,17 @@
}
}
+ async function fetchRelayVersion() {
+ try {
+ const info = await api.fetchRelayInfo();
+ if (info && info.version) {
+ relayVersion = info.version;
+ }
+ } catch (error) {
+ console.error("Error fetching relay version:", error);
+ }
+ }
+
// Export functionality
async function exportEvents(pubkeys = []) {
// Skip login check when ACL is "none" (open relay mode)
@@ -2737,6 +2754,7 @@
{isDarkTheme}
{tabs}
{selectedTab}
+ version={relayVersion}
on:selectTab={(e) => selectTab(e.detail)}
on:closeSearchTab={(e) => closeSearchTab(e.detail)}
/>
diff --git a/app/web/src/Sidebar.svelte b/app/web/src/Sidebar.svelte
index 52d89a0..2fdcbfc 100644
--- a/app/web/src/Sidebar.svelte
+++ b/app/web/src/Sidebar.svelte
@@ -2,6 +2,7 @@
export let isDarkTheme = false;
export let tabs = [];
export let selectedTab = "";
+ export let version = "";
import { createEventDispatcher } from "svelte";
const dispatch = createEventDispatcher();
@@ -41,6 +42,15 @@
{/each}
+ {#if version}
+
+
+ v{version}
+
+ {/if}
diff --git a/app/web/src/api.js b/app/web/src/api.js
index 1638c90..5281cb5 100644
--- a/app/web/src/api.js
+++ b/app/web/src/api.js
@@ -319,6 +319,28 @@ export async function fetchPolicyFollows(signer, pubkey) {
return data.follows || [];
}
+// ==================== Relay Info API ====================
+
+/**
+ * Fetch relay info document (NIP-11)
+ * @returns {Promise