Repository navigation
feat: first-run setup, Bluetooth permission banner, Connect Garmin button - #2
Merged
Merged
Conversation
…tton, live device readings
Owner
Author
Review gate: PASS
MINOR findings (4)
|
…on Back, log BLE scan start errors
Owner
Author
|
Shipped 2026-10-19: #1 (ffd7a58), #2 (f4421e3) and docs #3 (c21f867) are on main, and the live Mac app runs main. What changed for riders:
Behavior changes for existing data:
Open: one MINOR from the delta review (Back within 2 s of Next on a setup device step can reset a custom name). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
/welcome): a fresh install with no profiles lands here. Steps: Bluetooth state → rider (FTP hint, kg/lb) → trainer (pick, live watts + cadence, name saved on Next) → heart rate (skippable, live bpm, Garmin pairing hint) → summary with Connect Garmin and "Start your first ride".poweredOn(also later, after permission is granted). No more 30 s timeout exit and misleading "port 4000" alert.GET /api/ble+adapterStateWS frame (replayed on connect). App-wide banner forunauthorized/poweredOffwith a System Settings link.deviceSampleWS frames (≤1/s per device).POST/GET /api/garmin/login/:riderIdruns the headed login in-process, installs Playwright Chromium first when missing, 409 on duplicate, 404 unknown rider.scripts/garmin-login.tsis a thin caller.Evidence
pnpm checkclean;vitest634/634 (new manager test:unauthorizeddoes not reject, laterpoweredOnscans once)./→/welcome; full wizard created rider (115 lb → 52.2 kg), assigned + labelled trainer and strap; livedeviceSampleframes observed (trainer cadence, strap bpm) with no session./api/ble=poweredOn; this Mac's terminal already has Bluetooth, so the denied path was checked by injecting anadapterState: unauthorizedframe (banner + settings link render).GETreturns{hasLogin:false,state:"idle"}. A full headed login was not run in the smoke (it opens a real sign-in window).