windows: build the drivers in CI, heart-rate docs, and the HR graph in the app - #10
Merged
Merged
Conversation
…and what was ruled out heart-rate.md said there was no working heart rate on Windows and blamed a host-privilege gate. Rewrite it around what was actually found: the AAP channel's 672-byte inbound MTU kept the AirPods from publishing the ~920-byte HEARTRATE descriptors; requesting 1691 (ConfigIn on bthport) fixes it. Document what the daemon sends (84 → reported on 20, 19 NAKs on iOS 27 firmware) and decodes (BPM byte 1, confidence byte 2 gated at 0x80, tails), keep the ruled-out list, and note that 0x0E is the activity classifier. Update the README and docs index. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on and app The pipeline only built the daemon and the WinUI app and bundled the committed prebuilt driver packages, so a driver source change (the AAP channel's 1691-byte MTU that heart rate needs) never reached the install folder or the nightly. Build the AAP (LibrePodsAAP.vcxproj) and hi-res mic (AudioCodec.sln) drivers on the runner with the WDK installed via winget, regenerate their catalogs with Inf2Cat, and overwrite windows/drivers/*/prebuilt so make-dist.ps1 bundles the fresh builds. The WDK's own post-build Inf2Cat is disabled for the AAP project (it runs before the .sys sits next to the .inf); the catalog is made afterwards. Pinned to windows-2022: windows-latest's VS2026 lacks WDK integration for the WindowsKernelModeDriver10.0 toolset. PRs touching the workflow now run it too. WDK-via-winget approach and the windows-2022 pin come from the Gab4545/librepods fork, which built the mic driver this way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t may not work Add the recent-readings graph from upstream PR librepods-org#702's HeartRateMiniGraph to the heart-rate card: the last 24 readings, scaled around their centre with a 20 bpm minimum span, a faint bar per reading, the line, and a dot on the newest; three guide lines while there's no data. The daemon only pushes a snapshot when the BPM changes, so the card samples the latest value once a second to follow the stream's 1 Hz cadence. The InfoBar is now informational ("works on AirPods Pro 3, the first reading takes a few seconds") in en-US/pt-PT/es-ES/fr-FR, with a caption for the graph, and DevicePage's comment no longer claims heart rate can't work on Windows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every validated reading is stored in %LOCALAPPDATA%\LibrePods\heart-rate.sqlite3 (its own file, WAL): - sessions(id, device, started_at, ended_at): opened by the first reading, closed when HR is switched off, the buds disconnect or the user disconnects; another pair of buds starts its own session. - samples(id, session_id, ts, bpm, confidence): Unix ms, BPM and the sensor's confidence byte (the decoder now returns it alongside the BPM). Writes go through a channel to one writer thread so the AAP receive loop never waits on the disk; if the file can't be opened, tracking is disabled with a log line and heart rate itself keeps working. rusqlite with `bundled` compiles SQLite in, so nothing has to be installed. Verified: 1 Hz rows (72-81 bpm, confidence 236-239) in a live session. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rtifact and release asset The install folder already carries both drivers built in the run; also upload them on their own (librepods-windows-drivers artifact) and attach LibrePods-Windows-drivers.zip to the nightly and versioned releases, so the drivers can be installed or updated separately. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
arctumn
added a commit
that referenced
this pull request
Sep 29, 2026
windows: land the HR card v2 + READMEs that #10 missed, and ship one release zip
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.
Summary
This finishes what #9 started, which was merged before these landed on the branch. It adds:
windows/docs/heart-rate.mdis rewritten around the MTU cause, the stream, and what was ruled out. The README lines are updated too.Changes
ci-windows.yml:windows-2022, becausewindows-latest's VS2026 lacks WDK integration forWindowsKernelModeDriver10.0.LibrePodsAAP.vcxproj(/p:EnableInf2cat=false) andAudioCodec.sln.windows/drivers/*/prebuilt, somake-dist.ps1bundles the fresh builds.HeartRateCard:HeartRateMiniGraph).heart-rate.md,windows/README.md,windows/docs/README.md.Added since opening
librepods-windows-driversartifact and attached asLibrePods-Windows-drivers.zipto the nightly and versioned releases (1fe6932).b599677): the daemon stores every reading in%LOCALAPPDATA%\LibrePods\heart-rate.sqlite3(sessions+sampleswith confidence), usingrusqlitewith SQLite bundled.88daa92):Microsoft.Data.Sqlite);b682565): heart-rate section, release assets, CI-built drivers, where the data lives.Test
🤖 Generated with Claude Code