From 5a2c2ff573d4f48b1ea2b4bd36b08d132fcc566b Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Wed, 8 Oct 2025 15:35:58 -0400 Subject: [PATCH 01/28] no empty liquidity flag --- src/services/wizard/index.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/services/wizard/index.ts b/src/services/wizard/index.ts index 91c2ceea..1ae03a92 100644 --- a/src/services/wizard/index.ts +++ b/src/services/wizard/index.ts @@ -153,10 +153,16 @@ export class Wizard { } const automateLiquidityIndex = envFileContent.findIndex(line => line.startsWith('LIQUIDITY_PROVIDER_PUB')) - if (automateLiquidityIndex === -1) { - toMerge.push(`LIQUIDITY_PROVIDER_PUB=${pendingConfig.automateLiquidity ? defaultProviderPub : ""}`) + if (pendingConfig.automateLiquidity) { + if (automateLiquidityIndex !== -1) { + envFileContent.splice(automateLiquidityIndex, 1) + } } else { - envFileContent[automateLiquidityIndex] = `LIQUIDITY_PROVIDER_PUB=null` + if (automateLiquidityIndex === -1) { + toMerge.push(`LIQUIDITY_PROVIDER_PUB=null`) + } else { + envFileContent[automateLiquidityIndex] = `LIQUIDITY_PROVIDER_PUB=null` + } } const pushBackupsToNostrIndex = envFileContent.findIndex(line => line.startsWith('PUSH_BACKUPS_TO_NOSTR')) From 77efe1eae7b9476c57fec53efe110642c0560b78 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Wed, 8 Oct 2025 16:46:12 -0400 Subject: [PATCH 02/28] iu --- static/backup.html | 8 ++------ static/img/LightningPub.png | Bin 3369 -> 6281 bytes static/js/backup.js | 17 ++--------------- static/js/liquidity.js | 10 ---------- static/liquidity.html | 8 ++------ 5 files changed, 6 insertions(+), 37 deletions(-) diff --git a/static/backup.html b/static/backup.html index 14f87bdf..15f141da 100644 --- a/static/backup.html +++ b/static/backup.html @@ -54,7 +54,7 @@
- +
- +
+
+
Avatar:
+
+ +
+ avatar +
+
+ +
+
+
+
Administrator:
@@ -165,8 +186,11 @@ const lndText = lndStateNum === 2 ? 'ONLINE' : (lndStateNum === 1 ? 'SYNCING' : 'OFFLINE') const lndDot = lndStateNum === 2 ? 'green-dot' : (lndStateNum === 1 ? 'yellow-dot' : 'red-dot') const relayConnected = !!relayUrl + const avatar = j.avatar_url || (j.app_id ? `https://robohash.org/${encodeURIComponent(j.app_id)}.png?size=128x128&set=set3` : '') document.getElementById("show-nodey-text").innerHTML = name document.getElementById("show-nostr-text").innerHTML = relayUrl || '—' + document.getElementById("show-avatar-text").innerHTML = avatar || '—' + if (avatar) { document.getElementById("avatarImg").src = avatar } document.getElementById("adminNpub").innerText = admin document.getElementById("relayStatus").innerHTML = ` ${relayConnected ? 'Connected' : 'Disconnected'}` document.getElementById("lndStatus").innerHTML = ` ${lndText}` From 997fa43aadad107099d1a54bd88d8305fb03843b Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 13:16:48 -0400 Subject: [PATCH 14/28] wiz avatar fixes --- src/services/wizard/index.ts | 4 ++-- static/status.html | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/services/wizard/index.ts b/src/services/wizard/index.ts index ed394c2c..f6e7b8ff 100644 --- a/src/services/wizard/index.ts +++ b/src/services/wizard/index.ts @@ -71,7 +71,7 @@ export class Wizard { relay_url: relayUrl, automate_liquidity: this.settings.liquiditySettings.liquidityProviderPub !== 'null', push_backups_to_nostr: this.settings.pushBackupsToNostr, - avatar_url: (defaultApp as any)?.avatar_url || '', + avatar_url: defaultApp?.avatar_url || '', app_id: defaultApp?.app_id || '' } } catch (e) { @@ -171,7 +171,7 @@ export class Wizard { const defaultNames = ['wallet', 'wallet-test', this.settings.defaultAppName] const existingDefaultApp = appsList.find(app => defaultNames.includes(app.name)) || appsList[0] if (existingDefaultApp) { - await this.storage.applicationStorage.UpdateApplication(existingDefaultApp, { name: req.source_name, avatar_url: (req as any).avatar_url || (existingDefaultApp as any).avatar_url }) + await this.storage.applicationStorage.UpdateApplication(existingDefaultApp, { name: req.source_name, avatar_url: (req as any).avatar_url || existingDefaultApp.avatar_url }) } } catch (e) { this.log(`Error updating app info: ${(e as Error).message}`) diff --git a/static/status.html b/static/status.html index 59fe1c44..845b2788 100644 --- a/static/status.html +++ b/static/status.html @@ -81,7 +81,6 @@
avatar -
-
- If you want to use a specific Nostr relay, enter it now: - -
-
- Avatar URL (shown in wallet): - + Avatar (shown in wallet): +
+ avatar + +
-
- -
- +
+ If you want to use a specific Nostr relay, enter it now: +
+ +
+ +
+ +
+
diff --git a/static/js/wizard.js b/static/js/wizard.js index c9717150..fdc6f4ae 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -10,6 +10,7 @@ $(() => { const nodeNameInput = $("#nodeName"); const relayUrlInput = $("#relayUrl"); const avatarUrlInput = $("#avatarUrl"); + const avatarPreview = $("#avatarPreview"); const customCheckbox = $("#customCheckbox"); const automateLiquidityRadio = $("#automate"); const manualLiquidityRadio = $("#manual"); @@ -130,10 +131,15 @@ $(() => { } else { relayUrlInput.val(state.relay_url); } - const robo = state.app_id ? `https://robohash.org/${encodeURIComponent(state.app_id)}.png?size=256x256&set=set3` : '' - avatarUrlInput.attr('placeholder', robo || 'https://example.com/avatar.png') + const robo = state.app_id ? `https://robohash.org/${encodeURIComponent(state.app_id)}.png?size=128x128&set=set3` : '' if (state.avatar_url) { avatarUrlInput.val(state.avatar_url); + avatarPreview.attr('src', state.avatar_url) + } else if (robo) { + avatarPreview.attr('src', robo) + } + if (robo) { + avatarUrlInput.attr('placeholder', robo) } syncRelayState(); From c60b5103bf2b3bea1fca2fcfb0ec9d231d15d5c9 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 19:09:03 -0400 Subject: [PATCH 16/28] wiz --- src/services/wizard/index.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/services/wizard/index.ts b/src/services/wizard/index.ts index f6e7b8ff..ad1c991d 100644 --- a/src/services/wizard/index.ts +++ b/src/services/wizard/index.ts @@ -164,18 +164,20 @@ export class Wizard { if (err != null) { throw new Error(err.message) } const pendingConfig = { sourceName: req.source_name, relayUrl: req.relay_url, automateLiquidity: req.automate_liquidity, pushBackupsToNostr: req.push_backups_to_nostr } - // If already initialized, treat as idempotent update: persist name/avatar and env settings, do not block. - if (this.IsInitialized()) { - try { - const appsList = await this.storage.applicationStorage.GetApplications() - const defaultNames = ['wallet', 'wallet-test', this.settings.defaultAppName] - const existingDefaultApp = appsList.find(app => defaultNames.includes(app.name)) || appsList[0] - if (existingDefaultApp) { - await this.storage.applicationStorage.UpdateApplication(existingDefaultApp, { name: req.source_name, avatar_url: (req as any).avatar_url || existingDefaultApp.avatar_url }) - } - } catch (e) { - this.log(`Error updating app info: ${(e as Error).message}`) + // Persist app name/avatar to DB regardless (idempotent behavior) + try { + const appsList = await this.storage.applicationStorage.GetApplications() + const defaultNames = ['wallet', 'wallet-test', this.settings.defaultAppName] + const existingDefaultApp = appsList.find(app => defaultNames.includes(app.name)) || appsList[0] + if (existingDefaultApp) { + await this.storage.applicationStorage.UpdateApplication(existingDefaultApp, { name: req.source_name, avatar_url: (req as any).avatar_url || existingDefaultApp.avatar_url }) } + } catch (e) { + this.log(`Error updating app info: ${(e as Error).message}`) + } + + // If already initialized, treat as idempotent update for env and exit + if (this.IsInitialized()) { this.updateEnvFile(pendingConfig) return } From c9d531296867cf6885036e8623f616ac986de3c2 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 19:12:47 -0400 Subject: [PATCH 17/28] wiz --- static/status.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/status.html b/static/status.html index 845b2788..5ca1f4ec 100644 --- a/static/status.html +++ b/static/status.html @@ -73,7 +73,7 @@
Avatar:
+ + + + + + diff --git a/static/js/wizard.js b/static/js/wizard.js index fdc6f4ae..c52d82b7 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -20,6 +20,7 @@ $(() => { // Buttons const toLiquidityBtn = $("#liquidityBtn"); const toBackupBtn = $("#backupBtn"); + const toStatusBtn = $("#to-status"); const finishBtn = $("#next-button"); const backToNodeBtn = $("#back-to-node"); const backToLiquidityBtn = $("#back-to-liquidity"); @@ -95,12 +96,35 @@ $(() => { const j = await res.json(); throw new Error(j.reason || "Failed to start service"); } - location.href = 'connect.html'; + // Move to in-page connect step + showPage(pages.connect || $('#page-connect')); + // fetch and render connect info (re-using logic from connect.html) + (async () => { + const res = await fetch('/wizard/admin_connect_info'); + if (res.status !== 200) return; + const j = await res.json(); + if (j.connect_info && j.connect_info.enrolled_npub) { + showPage(pages.status || $('#page-status')) + return + } + const connectString = j.nprofile + ':' + j.connect_info.admin_token + const qrElement = document.getElementById('qrcode') + if (qrElement && !qrElement.firstChild) { + new QRCode(qrElement, { text: connectString, colorDark: '#000000', colorLight: '#ffffff', width: 157, height: 157 }); + } + const cs = document.getElementById('connectString'); + if (cs) cs.innerText = connectString + })(); } catch (err) { errorTextBackup.text(err.message); } }); + // Navigate from connect to status + toStatusBtn && toStatusBtn.click(() => { + showPage(pages.status || $('#page-status')) + }) + const syncRelayState = () => { relayUrlInput.prop('disabled', customCheckbox.prop('checked')); if (customCheckbox.prop('checked')) { From 312d6e3d37e08e00eb9905cb59740c61ba47a9ed Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 20:21:24 -0400 Subject: [PATCH 19/28] wiz --- static/css/connect.css | 6 ++ static/index.html | 2 +- static/js/wizard.js | 137 ++++++++++++++++++++++++++--------------- 3 files changed, 95 insertions(+), 50 deletions(-) diff --git a/static/css/connect.css b/static/css/connect.css index 0f7d19e9..bb1b5395 100644 --- a/static/css/connect.css +++ b/static/css/connect.css @@ -26,6 +26,12 @@ transition: background-color 0.3s; } +/* prevent overlap: hide connect string until revealed; click surface on box */ +.qrcode-box #connectString { display: none; } +.qrcode-box.revealed #connectString { display: block; } +.qrcode-box #qrcode { pointer-events: none; } +.qrcode-box { cursor: pointer; } + .qrcode-box-clicked::before { content: ""; position: absolute; diff --git a/static/index.html b/static/index.html index 5daf5121..bdbe8e08 100644 --- a/static/index.html +++ b/static/index.html @@ -186,7 +186,7 @@
Scan the QR or Copy-Paste the string to establish the connection.
-
+
Code contains a one-time pairing secret
Click to reveal
diff --git a/static/js/wizard.js b/static/js/wizard.js index c52d82b7..1c8de1d0 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -3,7 +3,9 @@ $(() => { const pages = { node: $('#page-node'), liquidity: $('#page-liquidity'), - backup: $('#page-backup') + backup: $('#page-backup'), + connect: $('#page-connect'), + status: $('#page-status') }; // Inputs @@ -39,6 +41,33 @@ $(() => { pageToShow.show(); }; + const populateStatus = async () => { + try { + const res = await fetch('/wizard/service_state'); + if (res.status !== 200) return; + const s = await res.json(); + const name = s.source_name || s.provider_name || ''; + const relay = s.relay_url || (s.relays && s.relays[0]) || ''; + const admin = s.admin_npub || ''; + const avatar = s.avatar_url || (s.app_id ? `https://robohash.org/${encodeURIComponent(s.app_id)}.png?size=128x128&set=set3` : ''); + + const lndState = s.lnd_state; // 0 OFFLINE, 1 SYNCING, 2 ONLINE (per enum) + const watchdogOk = !!s.watchdog_ok; + const relayConnected = !!s.relay_connected; + + $('#show-nodey-text').text(name || '—'); + $('#show-nostr-text').text(relay || '—'); + $('#adminNpub').text(admin || '—'); + if (avatar) { $('#avatarImg').attr('src', avatar); } + + const mkDot = (ok) => ok ? '' : ''; + const lndTxt = lndState === 2 ? 'Online' : (lndState === 1 ? 'Syncing' : 'Offline'); + $('#lndStatus').html(`${mkDot(lndState === 2)} ${lndTxt}`); + $('#watchdog-status').html(`${mkDot(watchdogOk)} ${watchdogOk ? 'OK' : 'Alert'}`); + $('#relayStatus').html(`${mkDot(relayConnected)} ${relayConnected ? 'Connected' : 'Disconnected'}`); + } catch { /* noop */ } + }; + // Navigation toLiquidityBtn.click(() => { const nodeName = nodeNameInput.val(); @@ -97,23 +126,41 @@ $(() => { throw new Error(j.reason || "Failed to start service"); } // Move to in-page connect step - showPage(pages.connect || $('#page-connect')); - // fetch and render connect info (re-using logic from connect.html) + showPage(pages.connect); + // fetch and prepare connect info (async () => { const res = await fetch('/wizard/admin_connect_info'); if (res.status !== 200) return; const j = await res.json(); if (j.connect_info && j.connect_info.enrolled_npub) { - showPage(pages.status || $('#page-status')) - return + showPage(pages.status); + await populateStatus(); + return; } - const connectString = j.nprofile + ':' + j.connect_info.admin_token - const qrElement = document.getElementById('qrcode') - if (qrElement && !qrElement.firstChild) { - new QRCode(qrElement, { text: connectString, colorDark: '#000000', colorLight: '#ffffff', width: 157, height: 157 }); + const connectString = j.nprofile + ':' + j.connect_info.admin_token; + const qrElement = document.getElementById('qrcode'); + const codebox = $('#codebox'); + const clickText = $('#click-text'); + const cs = $('#connectString'); + + // Reset visual state + codebox.removeClass('revealed'); + cs.text(''); + if (qrElement) { + while (qrElement.firstChild) qrElement.removeChild(qrElement.firstChild); } - const cs = document.getElementById('connectString'); - if (cs) cs.innerText = connectString + + // Reveal on click: generate QR and show string + codebox.off('click').on('click', () => { + if (!codebox.hasClass('revealed')) { + if (qrElement && !qrElement.firstChild) { + new QRCode(qrElement, { text: connectString, colorDark: '#000000', colorLight: '#ffffff', width: 157, height: 157 }); + } + cs.text(connectString); + codebox.addClass('revealed'); + clickText.text('Pairing code'); + } + }); })(); } catch (err) { errorTextBackup.text(err.message); @@ -121,8 +168,9 @@ $(() => { }); // Navigate from connect to status - toStatusBtn && toStatusBtn.click(() => { - showPage(pages.status || $('#page-status')) + toStatusBtn && toStatusBtn.click(async () => { + showPage(pages.status); + await populateStatus(); }) const syncRelayState = () => { @@ -140,45 +188,36 @@ $(() => { } }); - // Initial state load - fetch("/wizard/state").then(res => res.json()).then(data => { - if (data.admin_linked) { - location.href = 'status.html'; - } else if (data.config_sent) { - location.href = 'connect.html'; + // Initial state load (no redirects; SPA only) + fetch("/wizard/service_state").then(res => res.json()).then(state => { + nodeNameInput.val(state.source_name); + if (state.relay_url === 'wss://relay.lightning.pub') { + customCheckbox.prop('checked', true); } else { - // Pre-populate from service state - fetch("/wizard/service_state").then(res => res.json()).then(state => { - nodeNameInput.val(state.source_name); - if (state.relay_url === 'wss://relay.lightning.pub') { - customCheckbox.prop('checked', true); - } else { - relayUrlInput.val(state.relay_url); - } - const robo = state.app_id ? `https://robohash.org/${encodeURIComponent(state.app_id)}.png?size=128x128&set=set3` : '' - if (state.avatar_url) { - avatarUrlInput.val(state.avatar_url); - avatarPreview.attr('src', state.avatar_url) - } else if (robo) { - avatarPreview.attr('src', robo) - } - if (robo) { - avatarUrlInput.attr('placeholder', robo) - } - syncRelayState(); + relayUrlInput.val(state.relay_url); + } + const robo = state.app_id ? `https://robohash.org/${encodeURIComponent(state.app_id)}.png?size=128x128&set=set3` : '' + if (state.avatar_url) { + avatarUrlInput.val(state.avatar_url); + avatarPreview.attr('src', state.avatar_url) + } else if (robo) { + avatarPreview.attr('src', robo) + } + if (robo) { + avatarUrlInput.attr('placeholder', robo) + } + syncRelayState(); - if (state.automate_liquidity) { - automateLiquidityRadio.prop('checked', true); - } else { - manualLiquidityRadio.prop('checked', true); - } + if (state.automate_liquidity) { + automateLiquidityRadio.prop('checked', true); + } else { + manualLiquidityRadio.prop('checked', true); + } - if (state.push_backups_to_nostr) { - backupNostrRadio.prop('checked', true); - } else { - manualBackupRadio.prop('checked', true); - } - }); + if (state.push_backups_to_nostr) { + backupNostrRadio.prop('checked', true); + } else { + manualBackupRadio.prop('checked', true); } }); }); From cc62e72b1dbbfa1b4ecfe4bf3a2f3dddda516801 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 20:34:38 -0400 Subject: [PATCH 20/28] wiz --- static/css/connect.css | 30 +++++++++++++++++++++++++++++- static/index.html | 7 +++++-- static/js/wizard.js | 7 +++---- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/static/css/connect.css b/static/css/connect.css index bb1b5395..27ea020b 100644 --- a/static/css/connect.css +++ b/static/css/connect.css @@ -29,9 +29,37 @@ /* prevent overlap: hide connect string until revealed; click surface on box */ .qrcode-box #connectString { display: none; } .qrcode-box.revealed #connectString { display: block; } -.qrcode-box #qrcode { pointer-events: none; } .qrcode-box { cursor: pointer; } +/* QR viewport and veil overlay */ +.qrcode-viewport { + position: relative; + width: 100%; + height: 175px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} +.qrcode-viewport #qrcode { + position: absolute; + width: 157px; + height: 157px; +} +.qrcode-viewport .qr-veil { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + backdrop-filter: blur(7px); + -webkit-backdrop-filter: blur(7px); + background: rgba(0,0,0,0.25); + color: #c434e0; + font-size: 12px; +} +.qrcode-box.revealed .qr-veil { display: none; } + .qrcode-box-clicked::before { content: ""; position: absolute; diff --git a/static/index.html b/static/index.html index bdbe8e08..0d8b9a3e 100644 --- a/static/index.html +++ b/static/index.html @@ -191,13 +191,16 @@
Code contains a one-time pairing secret
Click to reveal
-
+
+
+
Click to reveal
+
- +
diff --git a/static/js/wizard.js b/static/js/wizard.js index 1c8de1d0..452e03f2 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -148,14 +148,13 @@ $(() => { cs.text(''); if (qrElement) { while (qrElement.firstChild) qrElement.removeChild(qrElement.firstChild); + // Pre-generate QR behind veil to entice reveal + new QRCode(qrElement, { text: connectString, colorDark: '#000000', colorLight: '#ffffff', width: 157, height: 157 }); } - // Reveal on click: generate QR and show string + // Reveal on click: show string and remove veil codebox.off('click').on('click', () => { if (!codebox.hasClass('revealed')) { - if (qrElement && !qrElement.firstChild) { - new QRCode(qrElement, { text: connectString, colorDark: '#000000', colorLight: '#ffffff', width: 157, height: 157 }); - } cs.text(connectString); codebox.addClass('revealed'); clickText.text('Pairing code'); From 5d75253b09ba91d0d4eead2bddeac649b8d0fc03 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 20:46:21 -0400 Subject: [PATCH 21/28] wiz --- static/css/connect.css | 11 +++++++---- static/js/wizard.js | 7 ++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/static/css/connect.css b/static/css/connect.css index 27ea020b..d66aa14c 100644 --- a/static/css/connect.css +++ b/static/css/connect.css @@ -13,9 +13,8 @@ display: block; position: relative; width: 253px; - height: 241px; - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); + min-height: 241px; + height: auto; margin-top: 10px; padding: 10px; transition: background-color 0.5s; @@ -27,7 +26,7 @@ } /* prevent overlap: hide connect string until revealed; click surface on box */ -.qrcode-box #connectString { display: none; } +.qrcode-box #connectString { display: none; margin-top: 6px; } .qrcode-box.revealed #connectString { display: block; } .qrcode-box { cursor: pointer; } @@ -40,6 +39,7 @@ align-items: center; justify-content: center; overflow: hidden; + margin-top: 6px; } .qrcode-viewport #qrcode { position: absolute; @@ -60,6 +60,9 @@ } .qrcode-box.revealed .qr-veil { display: none; } +/* hide helper text when revealed to avoid overlap */ +.qrcode-box.revealed #click-text { display: none; } + .qrcode-box-clicked::before { content: ""; position: absolute; diff --git a/static/js/wizard.js b/static/js/wizard.js index 452e03f2..7d98b372 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -152,12 +152,13 @@ $(() => { new QRCode(qrElement, { text: connectString, colorDark: '#000000', colorLight: '#ffffff', width: 157, height: 157 }); } - // Reveal on click: show string and remove veil - codebox.off('click').on('click', () => { + // Reveal on click: show string below and remove veil/heading + codebox.off('click').on('click', (e) => { + e.preventDefault(); + e.stopPropagation(); if (!codebox.hasClass('revealed')) { cs.text(connectString); codebox.addClass('revealed'); - clickText.text('Pairing code'); } }); })(); From a01e144987bde93ed49ae701aa380c4278dc7ef9 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 20:48:01 -0400 Subject: [PATCH 22/28] more neutrino peers --- scripts/install_lnd.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/install_lnd.sh b/scripts/install_lnd.sh index 81061d07..af53650c 100755 --- a/scripts/install_lnd.sh +++ b/scripts/install_lnd.sh @@ -95,7 +95,11 @@ install_lnd() { # Check for and add default settings only if the keys are missing. grep -q "^bitcoin.mainnet=" $USER_HOME/.lnd/lnd.conf || echo "bitcoin.mainnet=true" >> $USER_HOME/.lnd/lnd.conf grep -q "^bitcoin.node=" $USER_HOME/.lnd/lnd.conf || echo "bitcoin.node=neutrino" >> $USER_HOME/.lnd/lnd.conf - grep -q "^neutrino.addpeer=" $USER_HOME/.lnd/lnd.conf || echo "neutrino.addpeer=neutrino.shock.network" >> $USER_HOME/.lnd/lnd.conf + grep -q "^neutrino.addpeer=neutrino.shock.network" $USER_HOME/.lnd/lnd.conf || echo "neutrino.addpeer=neutrino.shock.network" >> $USER_HOME/.lnd/lnd.conf + grep -q "^neutrino.addpeer=asia.blixtwallet.com" $USER_HOME/.lnd/lnd.conf || echo "neutrino.addpeer=asia.blixtwallet.com" >> $USER_HOME/.lnd/lnd.conf + grep -q "^neutrino.addpeer=europe.blixtwallet.com" $USER_HOME/.lnd/lnd.conf || echo "neutrino.addpeer=europe.blixtwallet.com" >> $USER_HOME/.lnd/lnd.conf + grep -q "^neutrino.addpeer=btcd.lnolymp.us" $USER_HOME/.lnd/lnd.conf || echo "neutrino.addpeer=btcd.lnolymp.us" >> $USER_HOME/.lnd/lnd.conf + grep -q "^neutrino.addpeer=btcd-mainnet.lightning.computer" $USER_HOME/.lnd/lnd.conf || echo "neutrino.addpeer=btcd-mainnet.lightning.computer" >> $USER_HOME/.lnd/lnd.conf grep -q "^fee.url=" $USER_HOME/.lnd/lnd.conf || echo "fee.url=https://nodes.lightning.computer/fees/v1/btc-fee-estimates.json" >> $USER_HOME/.lnd/lnd.conf chmod 600 $USER_HOME/.lnd/lnd.conf From ca72dae919eb15afbc2b65a73cfc38cfa91624c4 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 20:57:55 -0400 Subject: [PATCH 23/28] wiz --- static/css/connect.css | 7 +++++++ static/js/wizard.js | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/static/css/connect.css b/static/css/connect.css index d66aa14c..e122420a 100644 --- a/static/css/connect.css +++ b/static/css/connect.css @@ -28,7 +28,14 @@ /* prevent overlap: hide connect string until revealed; click surface on box */ .qrcode-box #connectString { display: none; margin-top: 6px; } .qrcode-box.revealed #connectString { display: block; } +.qrcode-box.revealed #connectString { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} .qrcode-box { cursor: pointer; } +.qrcode-box.revealed { cursor: default; } /* QR viewport and veil overlay */ .qrcode-viewport { diff --git a/static/js/wizard.js b/static/js/wizard.js index 7d98b372..1a6ad75f 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -146,6 +146,8 @@ $(() => { // Reset visual state codebox.removeClass('revealed'); cs.text(''); + codebox.find('.qr-veil').show(); + clickText.show(); if (qrElement) { while (qrElement.firstChild) qrElement.removeChild(qrElement.firstChild); // Pre-generate QR behind veil to entice reveal @@ -159,6 +161,8 @@ $(() => { if (!codebox.hasClass('revealed')) { cs.text(connectString); codebox.addClass('revealed'); + codebox.find('.qr-veil').hide(); + clickText.hide(); } }); })(); From bb34e47e46680181f66dfc8f3bcf149714d76364 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 21:09:11 -0400 Subject: [PATCH 24/28] wiz --- scripts/install.sh | 2 +- static/css/connect.css | 3 +++ static/js/wizard.js | 6 ++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/install.sh b/scripts/install.sh index d08e88f2..171d0b1c 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -11,7 +11,7 @@ log() { echo -e "$(echo "$message" | sed 's/\\e\[[0-9;]*m//g')" >> "$TMP_LOG_FILE" } -SCRIPT_VERSION="0.2.1" +SCRIPT_VERSION="0.2.2" REPO="shocknet/Lightning.Pub" BRANCH="master" diff --git a/static/css/connect.css b/static/css/connect.css index e122420a..2e7fdcf7 100644 --- a/static/css/connect.css +++ b/static/css/connect.css @@ -33,6 +33,7 @@ -moz-user-select: text; -ms-user-select: text; user-select: text; + pointer-events: auto; } .qrcode-box { cursor: pointer; } .qrcode-box.revealed { cursor: default; } @@ -66,6 +67,8 @@ font-size: 12px; } .qrcode-box.revealed .qr-veil { display: none; } +.qrcode-viewport.revealed .qr-veil { display: none; } +.qrcode-box.revealed .qrcode-viewport { backdrop-filter: none; -webkit-backdrop-filter: none; pointer-events: none; } /* hide helper text when revealed to avoid overlap */ .qrcode-box.revealed #click-text { display: none; } diff --git a/static/js/wizard.js b/static/js/wizard.js index 1a6ad75f..fe45da22 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -156,13 +156,15 @@ $(() => { // Reveal on click: show string below and remove veil/heading codebox.off('click').on('click', (e) => { - e.preventDefault(); - e.stopPropagation(); if (!codebox.hasClass('revealed')) { + e.preventDefault(); + e.stopPropagation(); cs.text(connectString); codebox.addClass('revealed'); codebox.find('.qr-veil').hide(); clickText.hide(); + // Unbind to allow text selection and normal behavior after reveal + codebox.off('click'); } }); })(); From 0683f707cd9df9c56f22fc73c1d1d259b1e18f2d Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 21:44:59 -0400 Subject: [PATCH 25/28] wiz --- static/css/connect.css | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/static/css/connect.css b/static/css/connect.css index 2e7fdcf7..556f46e6 100644 --- a/static/css/connect.css +++ b/static/css/connect.css @@ -29,11 +29,11 @@ .qrcode-box #connectString { display: none; margin-top: 6px; } .qrcode-box.revealed #connectString { display: block; } .qrcode-box.revealed #connectString { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - pointer-events: auto; + -webkit-user-select: text !important; + -moz-user-select: text !important; + -ms-user-select: text !important; + user-select: text !important; + pointer-events: auto !important; } .qrcode-box { cursor: pointer; } .qrcode-box.revealed { cursor: default; } @@ -65,10 +65,11 @@ background: rgba(0,0,0,0.25); color: #c434e0; font-size: 12px; + pointer-events: none; /* allow clicks to pass through if needed */ } .qrcode-box.revealed .qr-veil { display: none; } .qrcode-viewport.revealed .qr-veil { display: none; } -.qrcode-box.revealed .qrcode-viewport { backdrop-filter: none; -webkit-backdrop-filter: none; pointer-events: none; } +.qrcode-box.revealed .qrcode-viewport { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; pointer-events: none; } /* hide helper text when revealed to avoid overlap */ .qrcode-box.revealed #click-text { display: none; } From 5083ef40e19fc8be52a54e3f3fce056b2212094e Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 21:51:55 -0400 Subject: [PATCH 26/28] wiz --- static/css/connect.css | 2 ++ static/js/wizard.js | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/static/css/connect.css b/static/css/connect.css index 556f46e6..09bca695 100644 --- a/static/css/connect.css +++ b/static/css/connect.css @@ -34,6 +34,8 @@ -ms-user-select: text !important; user-select: text !important; pointer-events: auto !important; + position: relative; /* Ensure z-index is respected */ + z-index: 10; /* Bring to the front */ } .qrcode-box { cursor: pointer; } .qrcode-box.revealed { cursor: default; } diff --git a/static/js/wizard.js b/static/js/wizard.js index fe45da22..b5d39187 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -161,10 +161,24 @@ $(() => { e.stopPropagation(); cs.text(connectString); codebox.addClass('revealed'); - codebox.find('.qr-veil').hide(); + + const veil = codebox.find('.qr-veil'); + veil.css({ // Force veil styles off + 'backdrop-filter': 'none', + '-webkit-backdrop-filter': 'none', + }).hide(); + clickText.hide(); + // Unbind to allow text selection and normal behavior after reveal codebox.off('click'); + + // Force text to be selectable on top + cs.css({ + 'user-select': 'text', + '-webkit-user-select': 'text', + 'pointer-events': 'auto' + }); } }); })(); @@ -195,6 +209,7 @@ $(() => { }); // Initial state load (no redirects; SPA only) + console.log('Wizard script version: REVEAL_FIX_3 activated'); fetch("/wizard/service_state").then(res => res.json()).then(state => { nodeNameInput.val(state.source_name); if (state.relay_url === 'wss://relay.lightning.pub') { From ce00af535dcd75dad647844fd1ebe8da1542a5b1 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 21:59:34 -0400 Subject: [PATCH 27/28] wiz --- static/js/wizard.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/static/js/wizard.js b/static/js/wizard.js index b5d39187..f84736cc 100644 --- a/static/js/wizard.js +++ b/static/js/wizard.js @@ -162,11 +162,8 @@ $(() => { cs.text(connectString); codebox.addClass('revealed'); - const veil = codebox.find('.qr-veil'); - veil.css({ // Force veil styles off - 'backdrop-filter': 'none', - '-webkit-backdrop-filter': 'none', - }).hide(); + // Remove the veil from the DOM entirely to kill the blur + codebox.find('.qr-veil').remove(); clickText.hide(); From e263b18bff28ae4000aec7199102cf340c8b0438 Mon Sep 17 00:00:00 2001 From: shocknet-justin Date: Thu, 9 Oct 2025 22:11:42 -0400 Subject: [PATCH 28/28] wiz --- static/css/connect.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/static/css/connect.css b/static/css/connect.css index 09bca695..16c29174 100644 --- a/static/css/connect.css +++ b/static/css/connect.css @@ -56,6 +56,9 @@ width: 157px; height: 157px; } +/* Remove global QR blur after reveal */ +.qrcode-box.revealed #qrcode { filter: none !important; } + .qrcode-viewport .qr-veil { position: absolute; inset: 0;