From d621e6f21ab5c1d589f0a84581825ee4606e79e8 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 24 Jan 2026 22:41:56 +0000 Subject: [PATCH] feat: update embed player design with transparent background and overlay stats - Removed background colors from `embed.html` for transparency. - Added a hover-triggered overlay with "Watch on BitVid" button and stats (views, likes, dislikes). - Updated `js/ui/components/EmbedPlayerModal.js` to implement stats update methods and handle the overlay elements. - Updated `js/embed.js` to set the share URL on the overlay after video resolution. - Verified visual changes with Playwright. --- embed.html | 106 ++++++- js/embed.js | 5 + js/ui/components/EmbedPlayerModal.js | 134 +++++++- serve.log | 452 +++++++++++++++++++++++++++ verification/embed_verification.png | Bin 0 -> 11942 bytes verification/verify_embed.py | 43 +++ 6 files changed, 715 insertions(+), 25 deletions(-) create mode 100644 serve.log create mode 100644 verification/embed_verification.png create mode 100644 verification/verify_embed.py diff --git a/embed.html b/embed.html index e3408d8e..03a5d510 100644 --- a/embed.html +++ b/embed.html @@ -69,28 +69,110 @@ - +
+ + +
- +
+ + BitVid + Watch on BitVid + + +
+ + + + + + -- + + + + + + -- + + + + + + -- + +
+
+

diff --git a/js/embed.js b/js/embed.js index 89d94309..945f3170 100644 --- a/js/embed.js +++ b/js/embed.js @@ -396,6 +396,11 @@ const startEmbed = async () => { forcedSource: playback || undefined, trigger: videoEl, }); + + if (app.videoModal && typeof app.videoModal.setShareUrl === "function") { + const shareUrl = app.buildShareUrlFromEventId(video.id); + app.videoModal.setShareUrl(shareUrl); + } } catch (error) { devLogger.warn("[embed] Playback failed:", error); setStatus("Playback failed. Please try again.", "error"); diff --git a/js/ui/components/EmbedPlayerModal.js b/js/ui/components/EmbedPlayerModal.js index 291d3fc1..ace36178 100644 --- a/js/ui/components/EmbedPlayerModal.js +++ b/js/ui/components/EmbedPlayerModal.js @@ -7,10 +7,16 @@ export class EmbedPlayerModal { this.status = null; this.eventTarget = new EventTarget(); + // Overlay elements + this.watchButton = null; + this.viewCountEl = null; + this.likeCountEl = null; + this.dislikeCountEl = null; + this.toneClasses = { - default: "text-muted", - error: "text-danger", - success: "text-success", + default: "text-white/90", + error: "text-red-400", + success: "text-green-400", }; } @@ -19,6 +25,11 @@ export class EmbedPlayerModal { this.root = this.document.getElementById("embedRoot"); this.video = this.document.getElementById("embedVideo"); this.status = this.document.getElementById("embedStatus"); + + this.watchButton = this.document.getElementById("embedWatchButton"); + this.viewCountEl = this.document.getElementById("embedViewCount"); + this.likeCountEl = this.document.getElementById("embedLikeCount"); + this.dislikeCountEl = this.document.getElementById("embedDislikeCount"); } return Promise.resolve(this.root); } @@ -39,7 +50,7 @@ export class EmbedPlayerModal { } resetStats() { - // no-op for embed view + // no-op for embed view (torrent stats) } setStatus(message, tone = "default") { @@ -50,15 +61,16 @@ export class EmbedPlayerModal { const normalizedMessage = typeof message === "string" ? message.trim() : ""; this.status.textContent = normalizedMessage; - Object.values(this.toneClasses).forEach((className) => { - if (className) { - this.status.classList.remove(className); - } - }); + // Reset classes + this.status.className = "pointer-events-none absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-md bg-black/60 px-3 py-1 text-sm backdrop-blur-sm"; const toneClass = this.toneClasses[tone] || this.toneClasses.default; - if (toneClass) { - this.status.classList.add(toneClass); + this.status.classList.add(toneClass); + + if (!normalizedMessage) { + this.status.hidden = true; + } else { + this.status.hidden = false; } } @@ -67,11 +79,12 @@ export class EmbedPlayerModal { } applyLoadingPoster() { - this.setStatus("Preparing playback…", "default"); + this.setStatus("Loading…", "default"); } forceRemovePoster() { - return false; + this.setStatus("", "default"); + return true; } clearPosterCleanup() {} @@ -103,4 +116,99 @@ export class EmbedPlayerModal { dispatch(type, detail) { return this.eventTarget.dispatchEvent(new CustomEvent(type, { detail })); } + + // --- New Methods for Overlay --- + + setShareUrl(url) { + if (this.watchButton && url) { + this.watchButton.href = url; + } + } + + getViewCountElement() { + return this.viewCountEl; + } + + updateViewCountLabel(text) { + if (!this.viewCountEl) { + return; + } + const label = this.viewCountEl.querySelector("[data-view-count-text]"); + if (label) { + // App passes "123 views" or "– views". We strip "views" to keep it compact if desired, + // but the prompt asked for "view count" so maybe "1.2k views" is fine. + // Given the compact design (icon + text), just number is often cleaner, but let's stick to what app sends or simple parse. + // Actually app sends formatted string. + // Let's try to extract just the number/text if possible, or just render what is sent. + // "1.2k views" -> "1.2k" + const parts = (text || "").split(' '); + const compactText = parts[0] || "–"; + label.textContent = compactText; + } + } + + setViewCountPointer(pointerKey) { + if (this.viewCountEl && pointerKey) { + this.viewCountEl.dataset.pointerKey = pointerKey; + } + } + + formatCount(num) { + const val = Number.isFinite(num) ? num : 0; + if (val === 0) return "0"; + + // Simple compact formatter + if (typeof Intl !== "undefined" && Intl.NumberFormat) { + try { + return new Intl.NumberFormat('en-US', { + notation: "compact", + maximumFractionDigits: 1 + }).format(val); + } catch (e) { + // fallback + } + } + + if (val >= 1000000) return (val / 1000000).toFixed(1) + 'M'; + if (val >= 1000) return (val / 1000).toFixed(1) + 'k'; + return String(val); + } + + updateReactionSummary({ total, counts, userReaction } = {}) { + const likeCount = counts && typeof counts['+'] === 'number' ? counts['+'] : 0; + const dislikeCount = counts && typeof counts['-'] === 'number' ? counts['-'] : 0; + + if (this.likeCountEl) { + const label = this.likeCountEl.querySelector("[data-count]"); + if (label) label.textContent = this.formatCount(likeCount); + + // Highlight if user liked? (Read-only for now but good visual feedback if we had auth state) + if (userReaction === '+') { + this.likeCountEl.classList.add("text-primary"); + this.likeCountEl.classList.remove("text-white/80"); + } else { + this.likeCountEl.classList.remove("text-primary"); + this.likeCountEl.classList.add("text-white/80"); + } + } + + if (this.dislikeCountEl) { + const label = this.dislikeCountEl.querySelector("[data-count]"); + if (label) label.textContent = this.formatCount(dislikeCount); + + if (userReaction === '-') { + this.dislikeCountEl.classList.add("text-red-400"); + this.dislikeCountEl.classList.remove("text-white/80"); + } else { + this.dislikeCountEl.classList.remove("text-red-400"); + this.dislikeCountEl.classList.add("text-white/80"); + } + } + } + + setUserReaction(reaction) { + // We don't have the full counts here to update UI fully, + // but updateReactionSummary will be called by controller with full data. + // So we can ignore this or just toggle classes optimistically. + } } diff --git a/serve.log b/serve.log new file mode 100644 index 00000000..8c0e8577 --- /dev/null +++ b/serve.log @@ -0,0 +1,452 @@ +npm warn exec The following package was not found and will be installed: serve@14.2.5 + INFO Accepting connections at http://localhost:3000 + HTTP 1/24/2026 10:39:03 PM ::1 GET /embed.html + HTTP 1/24/2026 10:39:03 PM ::1 Returned 301 in 387 ms + HTTP 1/24/2026 10:39:03 PM ::1 GET /embed + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 15 ms + HTTP 1/24/2026 10:39:03 PM ::1 GET /css/tailwind.generated.css?v=2024.11.09 + HTTP 1/24/2026 10:39:03 PM ::1 GET /assets/svg/bitvid-logo-light-mode.svg + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 11 ms + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostrToolsBootstrap.js?v=2024.11.09 + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/embed.js?v=2024.11.09 + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 8 ms + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/utils/logger.js + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/app.js + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostrClientFacade.js + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostr/index.js + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/utils/videoPointer.js + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostrToolsBootstrap.js + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 10 ms + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 13 ms + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 22 ms + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 20 ms + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 22 ms + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 34 ms + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostr/defaultClient.js + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostrClientRegistry.js + HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/client.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip07Permissions.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip71.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/watchHistory.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 12 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/watchHistoryBindings.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/viewEvents.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/reactionEvents.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/commentEvents.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/config.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/pointer.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/hex.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostrViewEventsFacade.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/webtorrent.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/embedDiagnostics.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/accessControl.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/magnetUtils.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/playbackUtils.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/constants.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/gridHealth.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/urlHealthObserver.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/cardSourceVisibility.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/videoTags.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/hashtagNormalization.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/profileMedia.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/lists.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/userBlocks.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/relayManager.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/index.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/watchHistoryService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/r2Service.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/videoNotePayload.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/index.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/hashtagPreferencesService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/r2-quick.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/sidebarLoading.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/subscriptions.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/channelProfile.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/watchHistoryDebug.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/overlay/popoverEngine.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/videoMenuRenderers.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/moderationService.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 11 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip46Client.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostrEventSchemas.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostrPublish.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/signRequestQueue.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/viewCounter.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapSplit.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/formatters.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/reactionCounter.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/domUtils.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/staticModalAccessibility.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/loginModalController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/tagPreferenceMenuController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/reactionController.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/magnetValidators.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/videoDeduper.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/serviceWorkerFallbackMessages.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/profileBatchFetcher.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/videoTimestamps.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/designSystem.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/hashView.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/state/appState.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/state/cache.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/applicationBootstrap.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/engagementController.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/similarContentController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/urlHealthController.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/videoModalCommentController.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/torrentStatusController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/moderationActionController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/moderationDecorator.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/trustBootstrap.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/videoEventUtils.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/magnetShared.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/toolkit.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/cachePolicies.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/state/profileCache.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /vendor/crypto-helpers.bundle.min.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/syncMetadataStore.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/dmSignalEvents.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/countDiagnostics.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/maxListenerDiagnostics.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/publishHelpers.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip04WorkerClient.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/dmDecryptWorkerClient.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/dmDecryptDiagnostics.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/lruCache.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/dmDb.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/dmNostrService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/sessionActor.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/signerHelpers.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/adapters/nip07Adapter.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/adapters/nsecAdapter.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/adapters/nip46Adapter.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /config/instance-config.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/viewEventBindings.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/adminListStore.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/webtorrent.min.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/safeDecode.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/dom/cardObserver.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/magnets.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/storage.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/engine.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/stages.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/exploreScoring.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/kidsScoring.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/kidsAudienceFilterStage.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/sorters.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/sources.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/watchHistoryFeed.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/applicationContext.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/r2.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/r2-mgmt.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/r2-s3.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/s3-multipart.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/s3-client.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/storageService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/nip07.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/nip46.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/nsec.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/generate.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/views/VideoListView.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/nostrService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/designSystem/metrics.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/overlay/overlayRoot.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /vendor/floating-ui.dom.bundle.min.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip46Queue.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/VideoCard.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/moderationUiHelpers.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/moderationCopy.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapSharedState.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapNotifications.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/lnurl.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/platformAddress.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/nwcClient.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/FeedInfoPopover.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapReceiptValidator.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/platformFee.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/modalAccessibility.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/tagPreferenceMenu.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/qrcode.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/state/profileSettingsStore.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/mediaLoader.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/historyView.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/watchHistoryController.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/watchHistoryTelemetry.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/playbackService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/discussionCountService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/commentThreadService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/exploreDataService.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/nwcSettingsService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/relayHealthService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/profileIdentityController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/videoListViewController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/profileModalController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/moreMenuController.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/appChromeController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/ModalManager.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/utils.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/hashtagStripHelper.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/designSystem/dynamicStyles.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 10 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 10 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 10 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 12 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/attachments/attachmentUtils.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/directMessagesStore.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/dmNotificationManager.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapMessages.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostrWatchHistoryFacade.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nwcSettings.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/tagPillList.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/VideoModal.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/RevertModal.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/ShareNostrModal.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/EmbedVideoModal.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/EmbedPlayerModal.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/initUploadModal.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 12 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 14 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 14 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/initEditModal.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/initDeleteModal.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/EventDetailsModal.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/zapController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/index.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/s3Service.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/attachmentService.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/linkPreviewSettings.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 1 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/nip71FormManager.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/UploadModal.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/ambientBackground.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/commentsController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/reactionsController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/similarContentController.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/moderationController.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/utils/commentAvatar.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/SimilarContentCard.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/linkPreviewService.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/AppShell.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/Avatar.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/ContactRow.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/ConversationList.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/MessageThread.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/MessageBubble.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/Composer.js + HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/NotificationCenter.js + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/DayDivider.js + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/ZapReceiptList.js + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/zapHelpers.js + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/components/EditModal.js + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/components/DeleteModal.js + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/storage/s3-url.js + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 5 ms + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 6 ms + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/utils/torrentHash.js + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/DMPrivacySettings.js + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 4 ms + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 2 ms + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/ZapInterface.js + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 3 ms + HTTP 1/24/2026 10:39:05 PM ::1 GET /js/payments/zapRequests.js + HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 2 ms diff --git a/verification/embed_verification.png b/verification/embed_verification.png new file mode 100644 index 0000000000000000000000000000000000000000..bab740d8c8aa87d92d28e7dc06553490dcfba3bc GIT binary patch literal 11942 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 sc|Bz6AdpP