feat(website): pick the launcher's channel on the install page #168

Merged
HumanBean merged 2 commits from HumanBean/Longshot:feat/install-launcher-channel into main 2026-11-13 09:00:59 +00:00
Owner

Why

The install page's download buttons always take the best launcher there is, so a player who wants the release candidate or a nightly has to find the separate download page. This puts a channel picker right above the buttons.

What changed

  • website, install page: channelPicker() in website/src/repo-docs/format-install.ts adds a Stable / Release candidate / Nightly picker above the launcher's download buttons, with one line on what the chosen channel is (launcherChannels). While there is no stable launcher, Stable shows as coming soon (disabled) and Release candidate is picked; the comment above launcherChannels says what to flip once v1.0.0 is out.
  • website, script: website/src/lib/launcher-channel.ts (installLauncherChannel, run from ManualNavigation.astro like the other page scripts) moves the buttons to /download/launcher/<channel>/<os>, routes the Worker already serves. launcherHref() touches only the three launcher file links.
  • website, style: the picker's pills in website/src/styles/content.css.
  • Without scripts the picker stays hidden and the buttons keep /download/launcher/<os>, the best channel, as before. docs/getting-started.md itself is unchanged, so it reads the same on Forgejo.

Flags and settings

None.

Measurements

Nothing to measure in the game: a website change. Measured by its game-free checks.

main: 7097361f (2026-11-13)
this PR: feat/install-launcher-channel @ b9384fe4
Hardware: Linux (CachyOS), headless Chromium via agent-browser
Scene: /install/ of the built site (astro build, astro preview), 1280 × 900 and 390 × 844
Method: npm run check in website/ (2 new tests), python -I -B tests/run_all.py, the built page clicked through in a browser
How to reproduce: cd website && npm ci && npm run build && npm run check, then npx astro preview and open /install/

main @ 7097361f this PR @ b9384fe4
npm run check (website) 43 passed 45 passed
Install button links, as the page loads /download/launcher/<os> /download/launcher/rc/<os>
Button links after picking Nightly (no picker) /download/launcher/nightly/<os>
✔ the launcher download buttons get a channel picker, hidden until a script runs it
✔ a channel moves the launcher links, and only them
ℹ tests 45  ℹ pass 45  ℹ fail 0
"/download/launcher/nightly/windows /download/launcher/nightly/linux /download/launcher/nightly/windows-portable"

Testing

Tested: the built site in headless Chromium on Linux: the picker appears with Release candidate picked and the buttons on rc; picking Nightly moves all three buttons to nightly; Stable is disabled and clicking it changes nothing; at 390 px wide the pills wrap and the page doesn't scroll sideways; the label and the pills are centred on one line (measured: the same middle, 483 px, for all four) in Chromium. Firefox placed the label above the row before this fix; not yet looked at again there. npm run check passes (45). python -I -B tests/run_all.py: 467 passed, 2 failed, 69 skipped; the 2 failures are this PC missing Python modules (test_bake_portability.py needs zstandard, test_builder_log_read_only.py needs Tk), unrelated to the website.

Not tested: the deployed Worker answering /download/launcher/rc/<os> and /download/launcher/nightly/<os> for real (the routes and their tests are unchanged); the PR's website preview will show it. Not run in the game: nothing in it changes.

Needs other testers: None.

Screenshots

main @ 7097361f has no picker; this PR @ b9384fe4:

Release candidate picked as the page loads, Stable coming soon

Release candidate picked, Stable coming soon

390 px wide

390 px wide

Risk and rollback

At worst the picker misbehaves and the buttons point at the wrong channel; reverting the commit is enough. Without scripts nothing changes.

Reviewer notes

When the first stable launcher is out: drop soon from Stable and move picked: true to it in launcherChannels.

Issues

None.

Checklist

For everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description).
  • Rebased on current main.
  • python -I -B tests/run_all.py run and passing (any failure that also fails on main is named above).
  • Tested in the game, or what wasn't is named under Testing.
  • Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests).
  • Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported.
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

If applicable

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • Screenshots for a change that shows on screen.
  • A game-free test added for the fix, failing on main and passing here.

🤖 Generated with Claude Code

## Why The install page's download buttons always take the best launcher there is, so a player who wants the release candidate or a nightly has to find the separate download page. This puts a channel picker right above the buttons. ## What changed - website, install page: `channelPicker()` in `website/src/repo-docs/format-install.ts` adds a Stable / Release candidate / Nightly picker above the launcher's download buttons, with one line on what the chosen channel is (`launcherChannels`). While there is no stable launcher, Stable shows as *coming soon* (disabled) and Release candidate is picked; the comment above `launcherChannels` says what to flip once v1.0.0 is out. - website, script: `website/src/lib/launcher-channel.ts` (`installLauncherChannel`, run from `ManualNavigation.astro` like the other page scripts) moves the buttons to `/download/launcher/<channel>/<os>`, routes the Worker already serves. `launcherHref()` touches only the three launcher file links. - website, style: the picker's pills in `website/src/styles/content.css`. - Without scripts the picker stays `hidden` and the buttons keep `/download/launcher/<os>`, the best channel, as before. `docs/getting-started.md` itself is unchanged, so it reads the same on Forgejo. ## Flags and settings None. ## Measurements Nothing to measure in the game: a website change. Measured by its game-free checks. main: 7097361f (2026-11-13) this PR: feat/install-launcher-channel @ b9384fe4 Hardware: Linux (CachyOS), headless Chromium via agent-browser Scene: `/install/` of the built site (`astro build`, `astro preview`), 1280 × 900 and 390 × 844 Method: `npm run check` in `website/` (2 new tests), `python -I -B tests/run_all.py`, the built page clicked through in a browser How to reproduce: `cd website && npm ci && npm run build && npm run check`, then `npx astro preview` and open `/install/` | | main @ 7097361f | this PR @ b9384fe4 | |---|---|---| | `npm run check` (website) | 43 passed | 45 passed | | Install button links, as the page loads | `/download/launcher/<os>` | `/download/launcher/rc/<os>` | | Button links after picking Nightly | (no picker) | `/download/launcher/nightly/<os>` | ``` ✔ the launcher download buttons get a channel picker, hidden until a script runs it ✔ a channel moves the launcher links, and only them ℹ tests 45 ℹ pass 45 ℹ fail 0 "/download/launcher/nightly/windows /download/launcher/nightly/linux /download/launcher/nightly/windows-portable" ``` ## Testing **Tested:** the built site in headless Chromium on Linux: the picker appears with Release candidate picked and the buttons on `rc`; picking Nightly moves all three buttons to `nightly`; Stable is disabled and clicking it changes nothing; at 390 px wide the pills wrap and the page doesn't scroll sideways; the label and the pills are centred on one line (measured: the same middle, 483 px, for all four) in Chromium. Firefox placed the label above the row before this fix; not yet looked at again there. `npm run check` passes (45). `python -I -B tests/run_all.py`: 467 passed, 2 failed, 69 skipped; the 2 failures are this PC missing Python modules (`test_bake_portability.py` needs `zstandard`, `test_builder_log_read_only.py` needs Tk), unrelated to the website. **Not tested:** the deployed Worker answering `/download/launcher/rc/<os>` and `/download/launcher/nightly/<os>` for real (the routes and their tests are unchanged); the PR's website preview will show it. Not run in the game: nothing in it changes. **Needs other testers:** None. ## Screenshots main @ 7097361f has no picker; this PR @ b9384fe4: **Release candidate picked as the page loads, Stable coming soon** ![Release candidate picked, Stable coming soon](https://git.magicbean.dev/attachments/aa242f79-c7d5-4c78-8312-d385ac4229bc) **390 px wide** ![390 px wide](https://git.magicbean.dev/attachments/3773f80e-5405-4176-ace8-1e376ba51dc0) ## Risk and rollback At worst the picker misbehaves and the buttons point at the wrong channel; reverting the commit is enough. Without scripts nothing changes. ## Reviewer notes When the first stable launcher is out: drop `soon` from Stable and move `picked: true` to it in `launcherChannels`. ## Issues None. ## Checklist ### For everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`). - [x] Rebased on current `main`. - [x] `python -I -B tests/run_all.py` run and passing (any failure that also fails on `main` is named above). - [x] Tested in the game, or what wasn't is named under Testing. - [x] Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests). - [x] Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### If applicable - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] Screenshots for a change that shows on screen. - [x] A game-free test added for the fix, failing on `main` and passing here. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(website): pick the launcher's channel on the install page
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Successful in 5s
Third-party parts / As their notes say (pull_request) Successful in 7s
PR description / Description follows the template (pull_request_target) Successful in 5s
3603bbb194
The install page's download buttons took the best channel there is, with no way to pick another short of the
download page. A Stable / Release candidate / Nightly picker above them now moves the buttons to
/download/launcher/<channel>/<os> (lib/launcher-channel.ts), with a line on what each channel is. While there is no
stable launcher, Stable shows as coming soon and the release candidate is picked. Without scripts the picker stays
hidden and the buttons keep the best channel, as before.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
HumanBean changed title from WIP: feat(website): pick the launcher's channel on the install page to feat(website): pick the launcher's channel on the install page 2026-11-13 08:56:17 +00:00
fix(website): the channel picker's pills line up with its label
All checks were successful
PR description / Description follows the template (pull_request_target) Successful in 3s
b9384fe417
The label was a fieldset's legend, which Firefox can't place in the row, and the content's flow spacing pushed every
pill after the first down. It is a radiogroup with a label now, and the picker's items keep no margin between them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Author
Owner

Pushed b9384fe4: the channel picker's label and pills line up again. In Firefox the label (a fieldset legend) sat above the row, and the page's flow spacing pushed each pill after the first down; it's a radiogroup with a plain label now, with no margin between its items. New screenshots in the description.

Pushed b9384fe4: the channel picker's label and pills line up again. In Firefox the label (a fieldset legend) sat above the row, and the page's flow spacing pushed each pill after the first down; it's a radiogroup with a plain label now, with no margin between its items. New screenshots in the description.
HumanBean deleted branch feat/install-launcher-channel 2026-11-13 09:01:00 +00:00
Sign in to join this conversation.
No reviewers
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
MagicBeanDev/Longshot!168
No description provided.