Skip to main content

Guided Installer โ€” Completion Report

Final report for the guided installer and compatibility wizard feature (merged 2026-07-11).

Summaryโ€‹

ADL now leads with a personalized "Get Started" path: a local-first wizard at /get-started that assesses device compatibility across 15 dimensions (each with its own status and evidence confidence), recommends a distribution / desktop / display method / audio path / browser / accessories with human-readable reasons, and generates an app-by-app, command-by-command installation guide gated behind an explicit five-part risk acknowledgment. The knowledge base, compatibility platform, and all existing routes are unchanged; the feature is purely additive.

Homepage changesโ€‹

  • "Get Started โ†’" is the dominant CTA (large primary button, above the fold on mobile and desktop, aria-label "Get Started with your personalized Linux installation guide"), with the microcopy "Answer a few questions, check your device, and receive a tailored installation path."
  • The required purpose statement sits under the retained title ("A Full Linux Desktop on Your Android Device") and tagline ("The Open Knowledge Base for Desktop Linux on Android").
  • New "Three steps to your Linux desktop" section (Check your device โ†’ Choose your setup โ†’ Follow the guide) with a repeated CTA, plus a final CTA section. "Browse the Knowledge Base" is the visually subordinate secondary action; former hero links moved into the navbar/footer.
  • Navbar gained "Get Started" (first item); the footer's Get Started column gained "Guided installer".

New routesโ€‹

  • /get-started โ€” wizard, review, assessment, acknowledgment, guide (client-rendered; <noscript> fallback links to manual paths).
  • /docs/get-started/start-here, /docs/get-started/methodology, /docs/get-started/disclaimer
  • /docs/learn/concepts/linux-on-android-explained
  • /docs/learn/hardware/external-displays
  • /docs/troubleshooting/symptom-index
  • /docs/downloads/scripts
  • Static: /downloads/scripts/*.sh, SHA256SUMS, manifest.json; data mirrors at /data/{device-catalog,wizard-issues,sources}.json.

Wizard architectureโ€‹

Local-first React (no backend, no account, GitHub Pages compatible). Eight questionnaire sections + review; conditional questions; "I don't know" everywhere; versioned localStorage save/resume; JSON export/import; device report paste-import with review-before-apply; full reset. Pure TypeScript engine (src/lib/compatibility/) and guide generator (src/lib/guide/) with zero React dependencies; usernames and display numbers pass allowlist sanitizers before reaching command templates. Versioned: questionnaire schema, device-report schema, rules, saved state, plan exports, disclaimer.

Compatibility methodologyโ€‹

15 dimensions ร— 7 status levels ร— 6 evidence-confidence levels; documented RAM/storage/architecture heuristic bands (labeled as ADL planning heuristics); hard blockers separated from preferences; unknown devices get specification-based results, never rejection; missing wired video out is never treated as "incompatible with Linux". Full write-up: methodology.

Device-data coverageโ€‹

17 variant-aware records researched against official sources (accessed 2026-07-11): Samsung S22+/S23/S24/Z Fold5/Tab S9/A54/A14/J5-2015, Pixel 6/8/9, Motorola Edge+ 2023/ThinkPhone/Edge 40, OnePlus 11/12, Xiaomi 14. DisplayPort Alt Mode recorded as true/false/unknown strictly by source quality (OnePlus/Xiaomi honestly unknown). 18 structured issue records; 25-entry source registry with access dates and reliability ratings.

New KB pagesโ€‹

Listed under "New routes". Existing canonical pages were extended instead of duplicated: browsers.md (Ubuntu Snap-stub browsers, Mozilla apt repository, removal of the previous --no-sandbox guidance in favor of non-root usage), audio.md (added the auth-ip-acl=127.0.0.1 localhost restriction to every PulseAudio command and the Android 16 known issue), and the Galaxy S22+ device page (field report with per-symptom confirmed/uncertain analysis).

Scripts createdโ€‹

11 scripts in static/downloads/scripts/ (device-report, preflight, install-base, install-distro, create-user, install-desktop, configure-audio, create-launcher, doctor, backup, remove-installation) โ€” strict mode, environment detection with refusal to run in the wrong environment, argument allowlists, --help/--version (+ --dry-run where meaningful), typed confirmations before deletions, no Android security changes, no personal data. All pass ShellCheck (-S style); SHA-256 checksums + manifest generated by scripts/generate-script-checksums.mjs and verified in CI.

Research sources usedโ€‹

Primary: termux-app / termux-x11 / proot-distro READMEs and releases, agnostic-apollo's Android-Docs (phantom processes), Samsung DeX and Auto Blocker support pages + official spec sheets, Google Pixel display-support page + Android Developers blog, Motorola Smart Connect chart + Lenovo PSREF, packages.mozilla.org repo metadata, Debian/Ubuntu package pages, GNOME/KDE project blogs, Chromium sandbox docs. Registry with dates: data/sources.json. Key recency findings encoded: proot-distro v5's OCI switch (May 2026), Termux:X11's Android 8 minimum, GNOME's systemd/X11 status, Plasma 6.8 X11 removal timeline, Pixel 8+ DisplayPort enablement, and the Android 16 audio issue.

Tests run and resultsโ€‹

  • npm test (vitest): 34/34 pass, including all 18 required fixtures.
  • npm run typecheck: pass.
  • npm run build (onBrokenLinks: "throw"): pass โ€” all links valid.
  • npm run validate:data: 17 devices, 18 issues, 25 sources โ€” 0 errors.
  • node scripts/generate-script-checksums.mjs --check: pass.
  • ShellCheck (-S style) on all 11 scripts: clean.
  • markdownlint on changed docs: 0 errors.
  • Browser e2e (Playwright, production build): 29/29 checks โ€” homepage CTA dominance/above-fold at 1440px and 390px, full S22+ path (assessment content, Auto Blocker surfacing, five-checkbox gating with nothing pre-checked, guide environment labels, audio forwarding, no --no-sandbox commands, progress + reload resume), unknown-device path (spec-based labeling, no rejection), CLI-only path on mobile.

Accessibility checksโ€‹

Keyboard-first controls (fieldset/legend groups, labeled inputs, focus moved to each step's heading), role=alert validation with instructions, aria progressbar, visible focus outlines, no color-only status (badges carry text), reduced-motion support, print styles, 44px-class touch targets, mobile-first layout verified at 390px. Automated axe-style audit was not run in this environment โ€” listed under limitations.

Known limitationsโ€‹

  • Physical-device validation is pending for everything except the S22+ field report; all other device rows are labeled inferred from specifications.
  • The Arch Linux route is labeled advanced/experimental: under proot-distro v5 (OCI images) ARM64 image availability for archlinux needs confirmation; the installer script warns accordingly.
  • Local Desktop is positioned in the methods list but has no dedicated guide yet (honestly labeled; not presented as documented).
  • Wireless-display and VNC flows are documented but not maintainer-tested.
  • The wizard's e2e coverage is a repeatable local Playwright script (kept in the session workspace), not a committed CI e2e suite โ€” CI runs the unit/data/shell gates.
  • Tag pushes were rejected by the hosting environment's git proxy; tags exist locally (see rollback record).

Items requiring physical-device validationโ€‹

Audio on Android 16; Termux:X11 flags per device; DeX vs mirrored Termux:X11 behavior on One UI 7/8; OnePlus 12 / Xiaomi 14 USB-C video output; Pixel 8/9 Termux:X11-on-external-display behavior; LXQt/Plasma session quality on 4 GB devices.

Git recordโ€‹

See the rollback record โ€” checkpoint dd9f7ff, feature branch feature/guided-linux-installer (kept), feature commit a0f9c6d, merge commit 7c003cc (--no-ff), tags pre-guided-installer-20260711-0258 and guided-installer-v1-20260711. Rollback: git revert -m 1 7c003cc. No force-pushes; no history rewritten.