From 6e356412b87191efb2beeeabcc377704a41b23eb Mon Sep 17 00:00:00 2001 From: Dorian Date: Sat, 28 Mar 2026 23:41:40 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20batch=20beta=20fixes=20=E2=80=94=2013=20?= =?UTF-8?q?issues=20from=202026-03-28=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Frontend (neode-ui): - Login double-enter: change @keyup.enter to @keydown.enter (#10) - Login loop on LAN: post-login session verify before navigation (#12) - Splash flash: reorder isReady/showSplash, add black fallback div (#7) - Skip button text: remove "skip this step" from onboarding (#8) - Password UI: import existing ChangePasswordSection in Settings (#11) - Arrow key focus trap: add tab-order fallback when spatial nav fails (#13) ISO/Boot (image-recipe): - Step counter: TOTAL_STEPS=7 → 8 to match actual step count - GRUB theme: add desktop-image-scale-method stretch, widen menu - Boot noise: add loglevel=0, rd.systemd.show_status=false to kernel - USB removal: copy reboot script to tmpfs, exec from there - Tor setup: rewrite python3 JSON generation as bash heredoc - Doctor/reconcile: copy scripts into rootfs, fix missing file errors - zstd: add to rootfs packages for initramfs compression Docs: - BETA-ISSUES-20260328.md: full issue tracker - INSTALL-SCREENS-DESIGN.md: editable TUI mockups 522 tests pass, vue-tsc clean. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/BETA-ISSUES-20260328.md | 96 +++++++++++++++ docs/INSTALL-SCREENS-DESIGN.md | 117 +++++++++++++++++++ image-recipe/branding/grub-theme/theme.txt | 13 ++- image-recipe/build-auto-installer-iso.sh | 113 +++++++++++------- neode-ui/src/App.vue | 8 +- neode-ui/src/composables/useControllerNav.ts | 18 ++- neode-ui/src/views/Login.vue | 14 ++- neode-ui/src/views/OnboardingBackup.vue | 2 +- neode-ui/src/views/OnboardingVerify.vue | 4 +- neode-ui/src/views/Settings.vue | 2 + 10 files changed, 330 insertions(+), 57 deletions(-) create mode 100644 docs/BETA-ISSUES-20260328.md create mode 100644 docs/INSTALL-SCREENS-DESIGN.md diff --git a/docs/BETA-ISSUES-20260328.md b/docs/BETA-ISSUES-20260328.md new file mode 100644 index 00000000..10708242 --- /dev/null +++ b/docs/BETA-ISSUES-20260328.md @@ -0,0 +1,96 @@ +# Beta Test Issues — 2026-03-28 (ISO build 2137) + +Hardware: Dell OptiPlex 3020M, i5, 8GB RAM, 465G HDD, UEFI+Legacy + +## ISO / Boot (image-recipe) + +### 1. UEFI autodetect broken +- **Severity**: High +- **Detail**: Only autodetects/boots in Legacy BIOS mode. UEFI boot does not autodetect the install disk. +- **Where**: `build-auto-installer-iso.sh` GRUB config, EFI boot chain +- **Status**: TODO + +### 2. Installation TUI screens need redesign +- **Severity**: Medium +- **Detail**: Current installer output is plain/ugly. Needs polished design. +- **Action**: User will provide .md mockup for each screen, then we implement. +- **Where**: `build-auto-installer-iso.sh` auto-install.sh embedded script +- **Status**: AWAITING DESIGN + +### 3. No TUI animations +- **Severity**: Low +- **Detail**: Would like Claude-style spinner/progress animations during install. May not be possible with bash. +- **Where**: auto-install.sh +- **Status**: TODO (investigate) + +### 4. USB read errors on boot +- **Severity**: Medium (cosmetic but bad first impression) +- **Detail**: Read errors scroll on screen during USB boot before installer loads. Scares new users. +- **Where**: Kernel/initramfs boot, possibly `quiet` not suppressing early messages +- **Status**: TODO + +### 5. GRUB background tiling + text cutoff +- **Severity**: Medium +- **Detail**: Boot menu background image tiles instead of scaling. Menu text ("Install Archipelago", "Failsafe mode") is cut off. +- **Where**: `branding/grub-theme/`, `boot/grub/grub.cfg`, theme.txt resolution settings +- **Status**: TODO + +### 6. USB removal drops to command line +- **Severity**: Medium +- **Detail**: After install completes, removing USB drops to shell before user presses Enter to reboot. Confuses non-technical users. +- **Where**: auto-install.sh — end of install, before `read -s` / `reboot` +- **Status**: TODO + +## Frontend / UI (neode-ui) + +### 7. Broken splash screen flashes before onboarding +- **Severity**: High +- **Detail**: Black screen with "online/offline" top-right, broken archipelago image top-left, "use arrow keys" text. Flashes briefly before onboarding loads. +- **Where**: Likely `RootRedirect.vue` or `SplashScreen.vue` — routing/transition timing +- **Status**: TODO (reported before, persists) + +### 8. Skip buttons still visible in onboarding +- **Severity**: Medium +- **Detail**: Onboarding flow still shows skip buttons. Should be removed for clean UX. +- **Where**: `src/views/onboarding/` components +- **Status**: TODO + +### 9. App install UX outdated +- **Severity**: High +- **Detail**: Missing the yellow "Installing..." button that persists across navigation. Apps don't show as "installing" in My Apps view during install. +- **Where**: `src/views/marketplace/`, `src/views/myapps/`, app install store +- **Status**: TODO + +### 10. Login requires double Enter +- **Severity**: Medium +- **Detail**: Password field on login page requires pressing Enter twice to submit. +- **Where**: `src/views/LoginView.vue` — form submission handler +- **Status**: TODO (reported before, persists) + +### 11. No password setting UI +- **Severity**: High +- **Detail**: No way for user to set/change their password from the web UI. Currently hardcoded `password123`. +- **Where**: Settings view, backend auth API +- **Status**: TODO + +### 12. Browser login loops (non-kiosk) +- **Severity**: High +- **Detail**: Logging in from a browser (not kiosk) on the same network redirects back to login in a loop. Kiosk mode works fine. +- **Where**: Auth/session handling — possibly cookie `SameSite` or redirect logic in `RootRedirect.vue` +- **Status**: TODO + +### 13. Can't exit input fields with arrow keys +- **Severity**: Medium +- **Detail**: When focused on a text input, up/down arrow keys don't move focus to adjacent UI elements. Stuck in the field. +- **Where**: `useControllerNav.ts` — input field focus trap logic +- **Status**: TODO (reported before, persists) + +--- + +## Summary + +| Category | Critical | High | Medium | Low | +|----------|----------|------|--------|-----| +| ISO/Boot | 0 | 1 | 4 | 1 | +| Frontend | 0 | 4 | 3 | 0 | +| **Total** | **0** | **5** | **7** | **1** | diff --git a/docs/INSTALL-SCREENS-DESIGN.md b/docs/INSTALL-SCREENS-DESIGN.md new file mode 100644 index 00000000..03af5b66 --- /dev/null +++ b/docs/INSTALL-SCREENS-DESIGN.md @@ -0,0 +1,117 @@ +# Archipelago Installer — Screen Designs + +Edit these screens to match your vision. I'll implement exactly what you specify. +Each screen is what the user sees at that moment on the console (80 columns wide). + +Constraints: bash TUI only (no ncurses). ANSI colors available: +- `\033[1;37m` = bold white, `\033[1;33m` = bold yellow/orange +- `\033[32m` = green, `\033[31m` = red, `\033[37m` = dim gray +- `\033[0m` = reset. Box-drawing chars: ━ ─ │ ╭ ╮ ╰ ╯ ╔ ╗ ╚ ╝ █ ▓ ░ ▌▐ +- Spinners possible: ⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ or ◐◓◑◒ or |/-\ + +--- + +## Screen 1: Welcome / Press Enter + +``` + (clear screen, centered) + + a r c h i p e l a g o + ━━━━━━━━━━━━━━━━━━━━━ + automatic installer + + Press Enter to install | Ctrl+C for shell +``` + +--- + +## Screen 2: Detecting Disk + +``` + a r c h i p e l a g o + ━━━━━━━━━━━━━━━━━━━━━ + + [1/7] Checking tools .............. ✓ + [2/7] Detecting disks + + Found: /dev/sda (465.8G) — TOSHIBA MQ01ACF0 + + ────────────────────────────────────────── + + ⚠ All data on /dev/sda will be erased. + + Press Enter to install | Ctrl+C to cancel +``` + +--- + +## Screen 3: Installing (progress) + +``` + a r c h i p e l a g o + ━━━━━━━━━━━━━━━━━━━━━ + + [1/7] Checking tools .............. ✓ + [2/7] Detecting disks ............. ✓ + [3/7] Creating partitions ......... ✓ + [4/7] Formatting .................. ✓ + [5/7] Installing system ........... ✓ + [6/7] Encrypting data partition ◐ + AES-256-XTS (AES-NI detected) + + ────────────────────────────────────────── +``` + +--- + +## Screen 4: Bootloader + +``` + a r c h i p e l a g o + ━━━━━━━━━━━━━━━━━━━━━ + + [1/7] Checking tools .............. ✓ + [2/7] Detecting disks ............. ✓ + [3/7] Creating partitions ......... ✓ + [4/7] Formatting .................. ✓ + [5/7] Installing system ........... ✓ + [6/7] Encrypting data ............. ✓ + [7/7] Installing bootloader ....... ✓ + + ────────────────────────────────────────── +``` + +--- + +## Screen 5: Complete + +``` + a r c h i p e l a g o + ━━━━━━━━━━━━━━━━━━━━━ + Installation Complete + + After reboot, open the Web UI from any device: + + http://192.168.1.198 + + SSH: ssh archipelago@192.168.1.198 + Password: archipelago + Web Login: password123 + + ────────────────────────────────────────── + + >>> REMOVE THE USB DRIVE NOW <<< + + Press Enter to reboot +``` + +--- + +## Notes for Dorian + +- Edit any screen above to match what you want to see +- Add/remove steps, change wording, change layout +- Specify colors per line if you want (e.g. "this line in yellow") +- I can add a spinner animation on the active step +- Box-drawing, progress bars, anything bash can render is fair game +- Once you're happy with the designs I'll implement them exactly diff --git a/image-recipe/branding/grub-theme/theme.txt b/image-recipe/branding/grub-theme/theme.txt index c2fc1c8d..67374784 100644 --- a/image-recipe/branding/grub-theme/theme.txt +++ b/image-recipe/branding/grub-theme/theme.txt @@ -5,17 +5,18 @@ title-text: "" desktop-color: "#0a0a0a" desktop-image: "background.png" +desktop-image-scale-method: "stretch" + boot_menu { - left = 25% + left = 15% top = 40% - width = 50% - height = 30% + width = 70% + height = 35% item_color = "#aaaaaa" selected_item_color = "#f7931a" - item_height = 36 - item_spacing = 8 - item_padding = 16 + item_height = 40 + item_spacing = 10 + item_padding = 20 scrollbar = false } diff --git a/image-recipe/build-auto-installer-iso.sh b/image-recipe/build-auto-installer-iso.sh index 7ceb6571..535b60ab 100755 --- a/image-recipe/build-auto-installer-iso.sh +++ b/image-recipe/build-auto-installer-iso.sh @@ -280,6 +280,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ xfonts-base \ plymouth \ plymouth-themes \ + zstd \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* @@ -339,6 +340,13 @@ COPY archipelago-doctor.timer /etc/systemd/system/archipelago-doctor.timer COPY archipelago-reconcile.service /etc/systemd/system/archipelago-reconcile.service COPY archipelago-reconcile.timer /etc/systemd/system/archipelago-reconcile.timer +# Copy container doctor + reconcile scripts (referenced by the services above) +RUN mkdir -p /home/archipelago/archy/scripts +COPY container-doctor.sh /home/archipelago/archy/scripts/container-doctor.sh +COPY reconcile-containers.sh /home/archipelago/archy/scripts/reconcile-containers.sh +RUN chmod +x /home/archipelago/archy/scripts/*.sh && \ + chown -R archipelago:archipelago /home/archipelago/archy + # Enable services RUN systemctl enable NetworkManager || true && \ systemctl enable ssh || true && \ @@ -409,12 +417,18 @@ NGINXCONF echo " Using archipelago-update.service + timer from configs/" fi - # Copy container doctor and reconciliation timers + # Copy container doctor and reconciliation timers + scripts if [ -f "$SCRIPT_DIR/configs/archipelago-doctor.service" ]; then cp "$SCRIPT_DIR/configs/archipelago-doctor.service" "$WORK_DIR/archipelago-doctor.service" cp "$SCRIPT_DIR/configs/archipelago-doctor.timer" "$WORK_DIR/archipelago-doctor.timer" cp "$SCRIPT_DIR/configs/archipelago-reconcile.service" "$WORK_DIR/archipelago-reconcile.service" cp "$SCRIPT_DIR/configs/archipelago-reconcile.timer" "$WORK_DIR/archipelago-reconcile.timer" + # Copy the actual scripts the services reference + for s in container-doctor.sh reconcile-containers.sh; do + if [ -f "$SCRIPT_DIR/../scripts/$s" ]; then + cp "$SCRIPT_DIR/../scripts/$s" "$WORK_DIR/$s" + fi + done echo " Using container doctor + reconcile timers from configs/" fi @@ -1106,21 +1120,20 @@ LOG="/var/log/archipelago-tor.log" mkdir -p "$ARCHY_TOR_DIR" # Write services.json for the backend to read -python3 -c ' -import json -services = [ - {"name": "archipelago", "local_port": 80, "enabled": True}, - {"name": "bitcoin", "local_port": 8333, "enabled": True}, - {"name": "electrumx", "local_port": 50001, "enabled": True}, - {"name": "lnd", "local_port": 9735, "enabled": True}, - {"name": "btcpay", "local_port": 23000, "enabled": True}, - {"name": "mempool", "local_port": 4080, "enabled": True}, - {"name": "fedimint", "local_port": 8175, "enabled": True} -] -with open("'"$ARCHY_TOR_DIR"'/services.json", "w") as f: - json.dump({"services": services}, f, indent=2) -print("services.json created") -' +cat > "\$ARCHY_TOR_DIR/services.json" <