{#if selectedTab === "export"} {#if isLoggedIn}

Export My Events

Download your personal events as a JSONL file.

{#if currentEffectiveRole === "admin" || currentEffectiveRole === "owner"}

Export All Events

Download the complete database as a JSONL file. This includes all events from all users.

{/if} {:else} {/if} {:else if selectedTab === "import"}
{#if isLoggedIn && (currentEffectiveRole === "admin" || currentEffectiveRole === "owner")}

Import Events

Upload a JSONL file to import events into the database.

{:else if isLoggedIn}

Import Events

❌ Admin or owner permission required for import functionality.

{:else} {/if}
{:else if selectedTab === "events"}
{#if isLoggedIn && (userRole === "write" || userRole === "admin" || userRole === "owner")}
{#if filteredEvents.length > 0} {#each filteredEvents as event}
toggleEventExpansion(event.id)} on:keydown={(e) => e.key === "Enter" && toggleEventExpansion(event.id)} role="button" tabindex="0" >
👤
{truncatePubkey(event.pubkey)}
{event.kind} {getKindName( event.kind, )}
{formatTimestamp( event.created_at, )}
{#if event.kind === 5}
🗑️ Delete Event {#if event.tags && event.tags.length > 0}
{#each event.tags.filter((tag) => tag[0] === "e") as eTag} Target: {eTag[1].slice( 0, 8, )}...{eTag[1].slice( -8, )} {/each}
{/if}
{:else}
{truncateContent( event.content, )}
{/if}
{#if event.kind !== 5 && (userRole === "admin" || userRole === "owner" || (userRole === "write" && event.pubkey && event.pubkey === userPubkey))} {/if}
{#if expandedEvents.has(event.id)}
{JSON.stringify(
                                                        event,
                                                        null,
                                                        2,
                                                    )}
{/if}
{/each} {:else if !isLoadingEvents}

No events found.

{/if} {#if isLoadingEvents}

Loading events...

{/if} {#if !hasMoreEvents && allEvents.length > 0}

No more events to load.

{/if}
{:else}

❌ Write, admin, or owner permission required to view all events.

{/if} {#if isLoggedIn && (userRole === "write" || userRole === "admin" || userRole === "owner")}
{/if}
{:else if selectedTab === "compose"}
{:else if selectedTab === "managed-acl"}
{#if aclMode !== "managed"}

⚠️ Managed ACL Mode Not Active

To use the Managed ACL interface, you need to set the ACL mode to "managed" in your relay configuration.

Current ACL mode: {aclMode || "unknown"}

Please set ORLY_ACL_MODE=managed in your environment variables and restart the relay.

{:else if isLoggedIn && userRole === "owner"} {:else}

Please log in with owner permissions to access managed ACL configuration.

{/if}
{:else if selectedTab === "sprocket"}

Sprocket Script Management

{#if isLoggedIn && userRole === "owner"}

Script Editor

Upload Script

Status: {sprocketStatus?.is_running ? "🟢 Running" : "🔴 Stopped"}
{#if sprocketStatus?.pid}
PID: {sprocketStatus.pid}
{/if}
Script: {sprocketStatus?.script_exists ? "✅ Exists" : "❌ Not found"}
{#if sprocketMessage}
{sprocketMessage}
{/if}

Script Versions

{#each sprocketVersions as version}
{version.name}
{new Date( version.modified, ).toLocaleString()} {#if version.is_current} Current {/if}
{#if !version.is_current} {/if}
{/each}
{:else if isLoggedIn}

❌ Owner permission required for sprocket management.

To enable sprocket functionality, set the ORLY_OWNERS environment variable with your npub when starting the relay.

Current user role: {userRole || "none"}

{:else} {/if}
{:else if selectedTab === "recovery"}

Event Recovery

Search and recover old versions of replaceable events

{#if (recoverySelectedKind !== null && recoverySelectedKind !== undefined && recoverySelectedKind >= 0) || (recoveryCustomKind !== "" && parseInt(recoveryCustomKind) >= 0)}
{#if isLoadingRecovery}
Loading events...
{:else if recoveryEvents.length === 0}
No events found for this kind
{:else}
{#each recoveryEvents as event} {@const isCurrent = isCurrentVersion(event)}
{#if isCurrent} Current Version{/if} {new Date( event.created_at * 1000, ).toLocaleString()}
{#if !isCurrent} {/if}
{JSON.stringify(
                                                    event,
                                                    null,
                                                    2,
                                                )}
{/each}
{#if recoveryHasMore} {/if} {/if}
{/if}
{:else if searchTabs.some((tab) => tab.id === selectedTab)} {#each searchTabs as searchTab} {#if searchTab.id === selectedTab}

🔍 Search Results: "{searchTab.query}"

handleSearchScroll(e, searchTab.id)} > {#if searchResults.get(searchTab.id)?.events?.length > 0} {#each searchResults.get(searchTab.id).events as event}
toggleEventExpansion(event.id)} on:keydown={(e) => e.key === "Enter" && toggleEventExpansion(event.id)} role="button" tabindex="0" >
👤
{truncatePubkey( event.pubkey, )}
{event.kind} {getKindName( event.kind, )}
{formatTimestamp( event.created_at, )}
{truncateContent( event.content, )}
{#if event.kind !== 5 && (userRole === "admin" || userRole === "owner" || (userRole === "write" && event.pubkey && event.pubkey === userPubkey))} {/if}
{#if expandedEvents.has(event.id)}
{JSON.stringify(
                                                            event,
                                                            null,
                                                            2,
                                                        )}
{/if}
{/each} {:else if !searchResults.get(searchTab.id)?.isLoading}

No search results found for "{searchTab.query}".

{/if} {#if searchResults.get(searchTab.id)?.isLoading}

Searching...

{/if} {#if !searchResults.get(searchTab.id)?.hasMore && searchResults.get(searchTab.id)?.events?.length > 0}

No more search results to load.

{/if}
{/if} {/each} {:else}
{#if isLoggedIn}

Welcome {userProfile?.name || userPubkey.slice(0, 8) + "..."}

{:else}

Log in to access your user dashboard

{/if}
{/if}