Landing hero cleanup: drop Configure link, How-it-works to bottom #229

Closed
opened 2026-09-09 12:27:04 +00:00 by crueber · 4 comments
Owner

Landing hero cleanup: drop Configure link, move How-it-works to bottom

The hero stacks too many competing elements (Browse/Push buttons, a "Configure" link that doesn't read as a link, a compliance paragraph, then a How-it-works button). Simplify, keeping the marketing page aimed at a less technical audience:

  1. Remove the "Configure" link from the hero (setup lives in the top nav; the link doesn't read as clickable).
  2. Move "How it works" to the bottom of the page (below the concepts), not the top. Hero keeps title + sub + Browse repositories / Push in 30 seconds.
  3. Remove the object-protocol-compliance paragraph from the hero (the paragraph between the old link and button positions). The compliance message still lives on /how-it-works — verify it does, don't duplicate it here.

Acceptance criteria

  • Hero: title + sub + two CTAs only; no Configure link, no compliance paragraph, no How-it-works button.
  • Page bottom carries the How-it-works CTA (button treatment from #199).
  • node --test green (pins updated); browser check both themes, zero console errors; no new deps.
# Landing hero cleanup: drop Configure link, move How-it-works to bottom The hero stacks too many competing elements (Browse/Push buttons, a "Configure" link that doesn't read as a link, a compliance paragraph, then a How-it-works button). Simplify, keeping the marketing page aimed at a less technical audience: 1. **Remove the "Configure" link** from the hero (setup lives in the top nav; the link doesn't read as clickable). 2. **Move "How it works" to the bottom of the page** (below the concepts), not the top. Hero keeps title + sub + Browse repositories / Push in 30 seconds. 3. **Remove the object-protocol-compliance paragraph from the hero** (the paragraph between the old link and button positions). The compliance message still lives on `/how-it-works` — verify it does, don't duplicate it here. ## Acceptance criteria - [ ] Hero: title + sub + two CTAs only; no Configure link, no compliance paragraph, no How-it-works button. - [ ] Page bottom carries the How-it-works CTA (button treatment from #199). - [ ] `node --test` green (pins updated); browser check both themes, zero console errors; no new deps.
Author
Owner

Fixed by #230 (#230) — hero trimmed to title + sub + two CTAs; How-it-works CTA now bottom-only; compliance paragraph verified still on /how-it-works. Web tests 439/439 green; browser check of / both themes still open.

Fixed by #230 (https://git.packden.us/crueber/walhub/pulls/230) — hero trimmed to title + sub + two CTAs; How-it-works CTA now bottom-only; compliance paragraph verified still on /how-it-works. Web tests 439/439 green; browser check of / both themes still open.
Author
Owner

Review of PR #230 (fix/issue-229, landing hero cleanup) — verified in scratch worktree at 0265974 (removed afterward; main worktree untouched, still clean apart from pre-existing untracked .opencode/).

SCOPE (matches expectation): 3 files — web/src/pages/Landing.jsx (hero deletions), web/test/unit/landing.test.js (pins rewritten), docs/go/12_web_ui.md (§2.3 + cross-link para + #229 decision entry, same change per law 12). App.jsx untouched — setup stays in top nav (App.jsx:56), verified via diff --name-only.

CHECKS (all pass):

  • Configure link gone from hero; /setup now referenced only from the quickstart auth line (Landing.jsx:117) + header nav + HowItWorks page. No orphan Configure anywhere.
  • Compliance paragraph gone from hero AND present on /how-it-works (HowItWorks.jsx:47, verbatim 'Object-protocol compliant with walgit…'). Message preserved, no duplication.
  • Hero How-it-works button gone; exactly one bottom CTA remains (Landing.jsx:125, secondary .btn in the quickstart card after #quickstart, placement asserted in test). No duplicates, no orphans (grep: single href="/how-it-works" in Landing.jsx).
  • Hero = H1 (Landing.jsx:43-45) + sub (46-50) + 2 CTAs (Browse repositories → /explore primary, Push in 30 seconds → #quickstart). LANDING_CTAS drops the Configure entry.
  • Tests meaningful: hero pin (two CTAs + absence of Configure/compliance/hero-deep-dive + /setup survives via auth line), deep-dive pin tightened to exactly-1 with placement assertion, new compliance-lives-on-deep-dive pin. Zero-API-call pin untouched.
  • No new deps: web/package.json byte-identical main vs branch.
  • Laws: 1 OK (no new imports — diff removes an A usage, adds none); 7 N/A (static page, no tasks); 8 OK (no new routes/providers, no core-package imports); 12 OK (doc updated in same commit).

VERIFY RESULTS:

  • node --test web/test/unit/*.test.js: 439/439 PASS (note: fresh worktree lacks web/node_modules so 7 markdown-related files initially failed with ERR_MODULE_NOT_FOUND 'marked' — env-only; after symlinking main's node_modules for resolution, full suite green).
  • vite build: clean, 131 modules, dist emitted.
  • Dark+light: .btn carries dark: variants (ui.css:32-35, unchanged by this PR) and the deep-dive CTA keeps secondary treatment; theme defaults dark with persisted toggle (store.js:9-15). BUT real-browser / top-to-bottom check both themes is OPEN: ms-playwright chromium + headless-shell binaries cannot load (missing system libs: libatk, libcups, libasound, libgbm, libcairo, libpango…; no system packages per review constraints) and hub CDP :9222 is down. Same open item the PR's own doc entry already records.

No fixes pushed — nothing broken found; nothing to block on.

MERGE RECOMMENDATION: ready to merge (browser check both themes remains open — needs an env with a runnable Chromium).

Review of PR #230 (fix/issue-229, landing hero cleanup) — verified in scratch worktree at 0265974 (removed afterward; main worktree untouched, still clean apart from pre-existing untracked .opencode/). SCOPE (matches expectation): 3 files — web/src/pages/Landing.jsx (hero deletions), web/test/unit/landing.test.js (pins rewritten), docs/go/12_web_ui.md (§2.3 + cross-link para + #229 decision entry, same change per law 12). App.jsx untouched — setup stays in top nav (App.jsx:56), verified via diff --name-only. CHECKS (all pass): - Configure link gone from hero; /setup now referenced only from the quickstart auth line (Landing.jsx:117) + header nav + HowItWorks page. No orphan Configure anywhere. - Compliance paragraph gone from hero AND present on /how-it-works (HowItWorks.jsx:47, verbatim 'Object-protocol compliant with walgit…'). Message preserved, no duplication. - Hero How-it-works button gone; exactly one bottom CTA remains (Landing.jsx:125, secondary .btn in the quickstart card after #quickstart, placement asserted in test). No duplicates, no orphans (grep: single href="/how-it-works" in Landing.jsx). - Hero = H1 (Landing.jsx:43-45) + sub (46-50) + 2 CTAs (Browse repositories → /explore primary, Push in 30 seconds → #quickstart). LANDING_CTAS drops the Configure entry. - Tests meaningful: hero pin (two CTAs + absence of Configure/compliance/hero-deep-dive + /setup survives via auth line), deep-dive pin tightened to exactly-1 with placement assertion, new compliance-lives-on-deep-dive pin. Zero-API-call pin untouched. - No new deps: web/package.json byte-identical main vs branch. - Laws: 1 OK (no new imports — diff removes an A usage, adds none); 7 N/A (static page, no tasks); 8 OK (no new routes/providers, no core-package imports); 12 OK (doc updated in same commit). VERIFY RESULTS: - node --test web/test/unit/*.test.js: 439/439 PASS (note: fresh worktree lacks web/node_modules so 7 markdown-related files initially failed with ERR_MODULE_NOT_FOUND 'marked' — env-only; after symlinking main's node_modules for resolution, full suite green). - vite build: clean, 131 modules, dist emitted. - Dark+light: .btn carries dark: variants (ui.css:32-35, unchanged by this PR) and the deep-dive CTA keeps secondary treatment; theme defaults dark with persisted toggle (store.js:9-15). BUT real-browser / top-to-bottom check both themes is OPEN: ms-playwright chromium + headless-shell binaries cannot load (missing system libs: libatk, libcups, libasound, libgbm, libcairo, libpango…; no system packages per review constraints) and hub CDP :9222 is down. Same open item the PR's own doc entry already records. No fixes pushed — nothing broken found; nothing to block on. MERGE RECOMMENDATION: ready to merge (browser check both themes remains open — needs an env with a runnable Chromium).
Author
Owner

Fixed by PR #230 (review clean; 439/439 node tests), merged. Closing.

Fixed by PR #230 (review clean; 439/439 node tests), merged. Closing.
Author
Owner

Browser verdict (real Chromium 145 via :9222 daemon, served main @ 127.0.0.1:8080 through walgit.localhost:8080, anonymous): ALL PASS.

  1. Hero (dark + light): PASS — SECTION.py-10 holds h1 'walhub — a git host whose only database is an object store.', sub paragraph, and exactly 2 CTA links: 'Browse repositories' (/explore, btn primary) + 'Push in 30 seconds' (#quickstart, btn secondary). No Configure link, no 'Object-protocol compliant' paragraph (absent from entire landing body), no hero How-it-works button (hero has 2

    total, links list is just the 2 CTAs).

  2. Bottom How-it-works CTA: PASS — exactly ONE a[href="/how-it-works"] page-wide ('How it works →', class 'btn px-4 py-2 inactive' = secondary, no primary), 141x38px, elementFromPoint-clickable after scrollIntoView, inside #quickstart at y=2071/2254px (page bottom, below concepts). Screenshots show it as an obvious button next to primary Browse CTA + 'New here?...' caption.
  3. Compliance on /how-it-works: PASS — body contains 'Object-protocol compliant with walgit' (not lost, not duplicated on /).
  4. Console/page errors: PASS — zero console.error / exceptionThrown / log.error across / (dark + light via real theme-toggle click) and /how-it-works.

Screenshots: /tmp/opencode/hero-dark-top.png, hero-dark-bottom.png, hero-light-top.png, hero-light-bottom.png. Targets I opened closed via Target.closeTarget; :9222 daemon left running. No code touched, no commits.

Browser verdict (real Chromium 145 via :9222 daemon, served main @ 127.0.0.1:8080 through walgit.localhost:8080, anonymous): ALL PASS. 1. Hero (dark + light): PASS — SECTION.py-10 holds h1 'walhub — a git host whose only database is an object store.', sub paragraph, and exactly 2 CTA links: 'Browse repositories' (/explore, btn primary) + 'Push in 30 seconds' (#quickstart, btn secondary). No Configure link, no 'Object-protocol compliant' paragraph (absent from entire landing body), no hero How-it-works button (hero has 2 <p> total, links list is just the 2 CTAs). 2. Bottom How-it-works CTA: PASS — exactly ONE a[href="/how-it-works"] page-wide ('How it works →', class 'btn px-4 py-2 inactive' = secondary, no primary), 141x38px, elementFromPoint-clickable after scrollIntoView, inside #quickstart at y=2071/2254px (page bottom, below concepts). Screenshots show it as an obvious button next to primary Browse CTA + 'New here?...' caption. 3. Compliance on /how-it-works: PASS — body contains 'Object-protocol compliant with walgit' (not lost, not duplicated on /). 4. Console/page errors: PASS — zero console.error / exceptionThrown / log.error across / (dark + light via real theme-toggle click) and /how-it-works. Screenshots: /tmp/opencode/hero-dark-top.png, hero-dark-bottom.png, hero-light-top.png, hero-light-bottom.png. Targets I opened closed via Target.closeTarget; :9222 daemon left running. No code touched, no commits.
crueber added this to the v1 milestone 2026-09-10 22:27:11 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
crueber/walhub#229
No description provided.