From 73fb961b9a883a9c8c87605cf8bef592b46f5273 Mon Sep 17 00:00:00 2001 From: Dorian Date: Tue, 31 Mar 2026 21:00:01 +0100 Subject: [PATCH] fix: disable boot reconciler, fix onboarding loop, UI polish Critical flow fixes: - Disable boot reconciliation that auto-created ALL containers on unbundled installs (only FileBrowser should exist on first boot) - Fix onboarding loop: RootRedirect no longer clears the neode_onboarding_complete flag on boot screen completion - Seed phrase persists when navigating back (no regeneration) UI fixes: - Boot screen: removed github and save icons from animation loop - Seed screens: viewport height scaling with 100dvh - Seed restore: removed outer card container from word input grid - Seed screens use distinct background (bg-intro-1.jpg) - Install progress simplified to "Installing" button style - Uninstall state moved to global store (persists across navigation) Co-Authored-By: Claude Opus 4.6 (1M context) --- core/archipelago/src/main.rs | 7 ++++-- neode-ui/src/components/BootScreen.vue | 2 -- neode-ui/src/stores/server.ts | 6 +++-- neode-ui/src/views/Apps.vue | 2 +- neode-ui/src/views/OnboardingSeedGenerate.vue | 17 +++++++++++-- neode-ui/src/views/OnboardingSeedRestore.vue | 4 +--- neode-ui/src/views/OnboardingSeedVerify.vue | 2 +- neode-ui/src/views/OnboardingWrapper.vue | 6 ++--- neode-ui/src/views/RootRedirect.vue | 3 ++- neode-ui/src/views/apps/AppCard.vue | 9 +++---- neode-ui/src/views/apps/useAppsActions.ts | 9 ++++--- .../views/marketplace/MarketplaceAppCard.vue | 24 +++++++------------ 12 files changed, 50 insertions(+), 41 deletions(-) diff --git a/core/archipelago/src/main.rs b/core/archipelago/src/main.rs index b1d2135f..b7e49c66 100644 --- a/core/archipelago/src/main.rs +++ b/core/archipelago/src/main.rs @@ -104,8 +104,11 @@ async fn main() -> Result<()> { // Signal to health monitor that boot recovery is done crash_recovery::mark_recovery_complete(); - // Reconcile containers against canonical specs (fixes config drift) - crash_recovery::run_boot_reconciliation().await; + // Boot reconciliation disabled — the reconciler creates ALL containers + // from specs, which is wrong on unbundled installs where only user-chosen + // apps should exist. The health monitor handles restarting existing + // containers. Run reconcile-containers.sh manually when needed. + // crash_recovery::run_boot_reconciliation().await; }); } diff --git a/neode-ui/src/components/BootScreen.vue b/neode-ui/src/components/BootScreen.vue index 9187dc92..3968eb72 100644 --- a/neode-ui/src/components/BootScreen.vue +++ b/neode-ui/src/components/BootScreen.vue @@ -79,8 +79,6 @@ const glitching = ref(false) const iconSources = [ '/assets/icon/bitcoin.svg', '/assets/icon/cloud-done.svg', - '/assets/icon/github.svg', - '/assets/icon/save.svg', ] interface LogLine { prefix: string; text: string; type: string } diff --git a/neode-ui/src/stores/server.ts b/neode-ui/src/stores/server.ts index ca046939..9b93fa83 100644 --- a/neode-ui/src/stores/server.ts +++ b/neode-ui/src/stores/server.ts @@ -9,8 +9,9 @@ import type { InstallProgress } from '../views/marketplace/marketplaceData' export const useServerStore = defineStore('server', () => { const sync = useSyncStore() - // Global install tracking — persists across navigation + // Global install/uninstall tracking — persists across navigation const installingApps = ref>(new Map()) + const uninstallingApps = ref>(new Set()) function setInstallProgress(appId: string, progress: Partial & { id: string; title: string }) { const existing = installingApps.value.get(appId) @@ -94,11 +95,12 @@ export const useServerStore = defineStore('server', () => { isShuttingDown, isOffline, - // Install tracking (global, persists across navigation) + // Install/uninstall tracking (global, persists across navigation) installingApps, setInstallProgress, clearInstallProgress, isInstalling, + uninstallingApps, // Actions installPackage, diff --git a/neode-ui/src/views/Apps.vue b/neode-ui/src/views/Apps.vue index c3a07529..060f3bac 100644 --- a/neode-ui/src/views/Apps.vue +++ b/neode-ui/src/views/Apps.vue @@ -111,7 +111,7 @@ :is-loading="!!actions.loadingActions.value[id as string]" :is-installing="serverStore.isInstalling(id as string)" :install-progress="serverStore.installingApps.get(id as string)" - :is-uninstalling="actions.uninstallingApps.value.has(id as string)" + :is-uninstalling="actions.uninstallingApps.has(id as string)" @go-to-app="goToApp" @launch="launchApp" @start="actions.startApp" diff --git a/neode-ui/src/views/OnboardingSeedGenerate.vue b/neode-ui/src/views/OnboardingSeedGenerate.vue index 8be4fdbd..28f898a4 100644 --- a/neode-ui/src/views/OnboardingSeedGenerate.vue +++ b/neode-ui/src/views/OnboardingSeedGenerate.vue @@ -1,5 +1,5 @@