diff --git a/core/Cargo.lock b/core/Cargo.lock index 1da20db5..0ddd2491 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "archipelago" -version = "1.7.33-alpha" +version = "1.7.34-alpha" dependencies = [ "anyhow", "archipelago-container", diff --git a/core/archipelago/Cargo.toml b/core/archipelago/Cargo.toml index 28e858db..0ddd5b2a 100644 --- a/core/archipelago/Cargo.toml +++ b/core/archipelago/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "archipelago" -version = "1.7.33-alpha" +version = "1.7.34-alpha" edition = "2021" description = "Archipelago Bitcoin Node OS - Native backend" authors = ["Archipelago Team"] diff --git a/neode-ui/src/composables/useOnboarding.ts b/neode-ui/src/composables/useOnboarding.ts index 4c70acd3..c9573979 100644 --- a/neode-ui/src/composables/useOnboarding.ts +++ b/neode-ui/src/composables/useOnboarding.ts @@ -24,7 +24,18 @@ export async function isOnboardingComplete(): Promise { // as already-onboarded and skip the wizard entirely). Only fall // back to localStorage if the backend is unreachable. const result = await callWithRetry(() => rpcClient.isOnboardingComplete(), 2) - if (result !== null) return result + if (result !== null) { + // Re-seed the localStorage cache so non-async consumers + // (OnboardingWrapper's useVideoBackground computed, etc.) see the + // right answer after the user clears site data on an already- + // onboarded node. + if (result) { + try { localStorage.setItem('neode_onboarding_complete', '1') } catch {} + } else { + try { localStorage.removeItem('neode_onboarding_complete') } catch {} + } + return result + } return localStorage.getItem('neode_onboarding_complete') === '1' } diff --git a/neode-ui/src/views/Dashboard.vue b/neode-ui/src/views/Dashboard.vue index 571d80cb..c30be20b 100644 --- a/neode-ui/src/views/Dashboard.vue +++ b/neode-ui/src/views/Dashboard.vue @@ -285,17 +285,15 @@ onMounted(() => { loginTransition.setPendingWelcomeTyping(false) }, 4000) } else if (loginTransition.justLoggedIn) { - // Regular re-login — quick interface draw, no triple glitch flashes. - // Just the zoom-in for a short beat, then welcome typing fires fast. + // Regular re-login — no zoom, no glitch. Just land on the + // dashboard and kick off the welcome typing quickly. playDashboardLoadOomph() - showZoomIn.value = true loginTransition.setPendingWelcomeTyping(true) loginTransition.setJustLoggedIn(false) - scheduledTimeout(() => { showZoomIn.value = false }, 1200) scheduledTimeout(() => { loginTransition.setStartWelcomeTyping(true) loginTransition.setPendingWelcomeTyping(false) - }, 600) + }, 300) } window.addEventListener('keydown', handleKioskShortcuts) diff --git a/neode-ui/src/views/OnboardingWrapper.vue b/neode-ui/src/views/OnboardingWrapper.vue index 0b9f3da1..358d1546 100644 --- a/neode-ui/src/views/OnboardingWrapper.vue +++ b/neode-ui/src/views/OnboardingWrapper.vue @@ -122,7 +122,32 @@ const routeBackgrounds: Record = { '/login': 'bg-intro.jpg' // Video loops from splash (same as intro) } -const loginBackground = 'bg-intro-1.jpg' +// Rotate the login background so the lock screen doesn't look +// identical on every logout. Cycles through bg-intro-1..6 using a +// counter persisted to localStorage so subsequent visits advance. +const LOGIN_BACKGROUNDS = [ + 'bg-intro-1.jpg', + 'bg-intro-2.jpg', + 'bg-intro-3.jpg', + 'bg-intro-4.jpg', + 'bg-intro-5.jpg', + 'bg-intro-6.jpg', +] +function pickNextLoginBackground(): string { + try { + const raw = localStorage.getItem('neode_login_bg_idx') + const prev = raw !== null ? parseInt(raw, 10) : -1 + const next = (Number.isFinite(prev) ? prev + 1 : 0) % LOGIN_BACKGROUNDS.length + localStorage.setItem('neode_login_bg_idx', String(next)) + return LOGIN_BACKGROUNDS[next]! + } catch { + return LOGIN_BACKGROUNDS[Math.floor(Math.random() * LOGIN_BACKGROUNDS.length)]! + } +} +const loginBackground = ref(pickNextLoginBackground()) +watch(() => route.path, (p) => { + if (p === '/login') loginBackground.value = pickNextLoginBackground() +}) // Restore video time from splash screen for seamless transition function restoreVideoTime() { diff --git a/releases/manifest.json b/releases/manifest.json index 9f29e1b8..ec072a97 100644 --- a/releases/manifest.json +++ b/releases/manifest.json @@ -1,29 +1,27 @@ { - "version": "1.7.33-alpha", + "version": "1.7.34-alpha", "release_date": "2026-04-22", "changelog": [ - "Onboarding fix: a fresh node would skip the full onboarding wizard and dump you straight at 'set password' if your browser had ever onboarded another node. The check now asks the actual node first instead of trusting browser memory.", - "Lock screen fix: logging out used to replay the full intro video every single time. Now once you've onboarded, logging out drops you on the static lock-screen background — login is instant, no movie.", - "Update fix: a brief network hiccup during an OTA update no longer triggers the full mock 'boot screen' animation on already-onboarded nodes. The page just shows a quiet spinner and reconnects when the backend is back. Boot screen is reserved for genuine fresh boots.", - "Login animation: the glitchy zoom-and-flash reveal now only plays the very first time you reach the dashboard after onboarding. Every subsequent login gets a quick interface draw — fast, no glitches.", - "PWA cache bumped so old browsers/devices reliably pick up new UI versions instead of serving stale cached assets after an update." + "Clearing browser data on an already-onboarded node no longer sends you back through the onboarding wizard. The page now asks the node on every visit and re-caches the answer locally, so clearing site data is harmless.", + "Login screen background now rotates each time you land on it — cycles through the six intro images so the lock screen doesn't look identical on every logout.", + "Removed the zoom-in effect from subsequent logins. Only the first-ever login (right after onboarding) plays the full zoom + glitch reveal; every re-login now just lands on the dashboard with the welcome typing, no animation." ], "components": [ { "name": "archipelago", - "current_version": "1.7.32-alpha", - "new_version": "1.7.33-alpha", - "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.33-alpha/archipelago", - "sha256": "c75a226658cb8af7ecb4eff937cbc221bb2b1c93bf1dadd61c99b2f550376c8b", - "size_bytes": 40793648 + "current_version": "1.7.33-alpha", + "new_version": "1.7.34-alpha", + "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.34-alpha/archipelago", + "sha256": "ba0c6cb531f48a8d350775ab61972291c5c92a298551a7c0543d42e1fe3b18e1", + "size_bytes": 40791976 }, { - "name": "archipelago-frontend-1.7.33-alpha.tar.gz", - "current_version": "1.7.32-alpha", - "new_version": "1.7.33-alpha", - "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.33-alpha/archipelago-frontend-1.7.33-alpha.tar.gz", - "sha256": "d6fd4648046d4ea05d33ef56180afda80e118f6d655ba7d339a2135a0a28e838", - "size_bytes": 77011007 + "name": "archipelago-frontend-1.7.34-alpha.tar.gz", + "current_version": "1.7.33-alpha", + "new_version": "1.7.34-alpha", + "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.34-alpha/archipelago-frontend-1.7.34-alpha.tar.gz", + "sha256": "8700c1ce6534567f008670a810682333966481e0c2e5d36164013219fb2ed3d9", + "size_bytes": 77007484 } ] } diff --git a/releases/v1.7.34-alpha/archipelago b/releases/v1.7.34-alpha/archipelago new file mode 100755 index 00000000..4b16f285 Binary files /dev/null and b/releases/v1.7.34-alpha/archipelago differ diff --git a/releases/v1.7.34-alpha/archipelago-frontend-1.7.34-alpha.tar.gz b/releases/v1.7.34-alpha/archipelago-frontend-1.7.34-alpha.tar.gz new file mode 100644 index 00000000..806b7e06 Binary files /dev/null and b/releases/v1.7.34-alpha/archipelago-frontend-1.7.34-alpha.tar.gz differ