Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
e1361db
windows: native Windows support as a self-contained root folder
Aug 11, 2026
f9a1114
windows: drop iced-Windows switcher + prebuilt dist/ (trim the PR)
Aug 11, 2026
26d52f2
windows(daemon): fetch FFmpeg at build time instead of vendoring it
Aug 11, 2026
1bb6e35
ci(windows): ship FFmpeg DLLs + prebuilt drivers in the artifact
Aug 11, 2026
fce90b1
ci(windows): pin FFmpeg to an immutable BtbN dated tag (fix SHA misma…
Aug 11, 2026
bd1b12d
driver(mic): strip render/keyword/debug from the SYSVAD sample (captu…
Aug 11, 2026
2147ce1
driver(mic): drop ToneGenerator + WaveReader (capture is mic-pipe only)
Aug 11, 2026
bd556f8
windows: drop dev/test CLIs (windows/tools) from the product tree
Aug 11, 2026
fc5fade
windows: drop the Rust librepods-tray — the WinUI client IS the tray
Aug 11, 2026
2068ba2
winui: start hidden to the tray on autostart (--tray)
Aug 11, 2026
91db553
driver(mic): strip round 3a — dead CircuitHelper funcs + unused audio…
Aug 11, 2026
b986e21
driver(mic): strip round 3b — dead render/multicircuit declarations (…
Aug 11, 2026
1707776
docs(mic): fix prebuilt README — point to ../install.ps1 (windows/dis…
Aug 11, 2026
4ef2e32
daemon: trust Windows BT status for teardown + rebuild the mic uplink…
Aug 11, 2026
38f424f
driver(mic): refresh prebuilt with the stripped, runtime-validated .sys
Aug 11, 2026
35472ee
windows: restore + modernise the one-shot installer, wire CI releases
Aug 11, 2026
81cff80
windows(installer): track bundled devcon.exe (force past the *.exe ig…
Aug 11, 2026
b1b6c8f
winui(docs): refresh screenshots (new UI: light/dark, hearing aid, tr…
Aug 11, 2026
c2f2bb0
windows: release the AAP driver handle on shutdown; graceful single-i…
Aug 11, 2026
7b6bcd1
docs(windows/hr): identity ruled out on 3 DIDs + macOS; reframe as ho…
Aug 11, 2026
18a8b69
windows(driver): open the ATT (hearing-aid) L2CAP channel lazily, not…
Aug 12, 2026
e9ab54e
winui(settings): collapse Experimental behind an expander (hidden by …
Aug 12, 2026
f35daae
windows(daemon): re-arm mic uplink in place on stall, don't rebuild t…
Aug 12, 2026
89cc173
winui: gate all experimental cards behind one experimental toggle
Aug 12, 2026
54e84c0
windows(driver): document that bthport refuses an ATT server on the r…
Aug 12, 2026
b6570c9
windows(daemon): never collapse the audio/mic link for HR; gate the G…
Aug 12, 2026
f62b393
windows(daemon): connect only A2DP for audio, never HFP — keep stereo…
Aug 12, 2026
a9bf5bf
winui(settings): add a "Start LibrePods at Windows login" toggle
Aug 12, 2026
c7c4388
windows(daemon): self-healing virtual-mic pipe + "mic operational" no…
Aug 12, 2026
04286c1
Revert "connect only A2DP for audio" — enable both again (keep an aud…
Aug 16, 2026
bf81bcf
windows(daemon): heart-rate over service 84 (0x54), not 19 — new-firm…
Aug 16, 2026
96fc5ab
windows(daemon): pick HR service (84 vs 19) by firmware version, like…
Aug 16, 2026
34cdfc2
windows(daemon): HR set on both 19+84, decode reports on 19/20/84 (fi…
Aug 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions .github/workflows/ci-windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: Windows CI (frontend)

# Builds the native Windows frontend: the Rust daemon (librepodsd) and the WinUI 3
# app (librepods-winui, which carries its own tray). The two kernel drivers
# (AAP L2CAP + hi-res mic) are NOT built here — they need the WDK and test/EV
# signing, which is a separate, manual pipeline.

on:
push:
branches: [main, windows-native]
tags: ['windows-v*']
paths:
- 'windows/**'
- '.github/workflows/ci-windows.yml'
pull_request:
paths:
- 'windows/**'
workflow_dispatch:

jobs:
build:
runs-on: windows-latest

steps:
- uses: actions/checkout@v4

# ---- Rust: daemon (native msvc target) ---------------------------------
- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache Cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
windows/daemon/target
key: ${{ runner.os }}-cargo-${{ hashFiles('windows/**/Cargo.lock') }}

- name: Fetch FFmpeg (AAC-ELD decode libs — not vendored in git)
shell: bash
run: windows/daemon/fetch-ffmpeg.sh

- name: Build daemon (librepodsd)
working-directory: windows/daemon
run: cargo build --release

# ---- WinUI 3 app (unpackaged, self-contained) --------------------------
# WinUI resource generation runs the PRI MSBuild task
# (Microsoft.Build.Packaging.Pri.Tasks.dll), which is a .NET *Framework*
# assembly. `dotnet build` hosts MSBuild on .NET (Core) and cannot load it
# → MSB4062. Visual Studio's msbuild.exe is .NET Framework and loads it, so
# build the WinUI project with VS MSBuild. The .NET 10 SDK is still needed
# for the net10.0 target resolver.
- name: Setup .NET 10
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Setup MSBuild
uses: microsoft/setup-msbuild@v2

- name: Restore WinUI app
working-directory: windows/winui
run: msbuild LibrePods.WinUI/LibrePods.WinUI.csproj -t:Restore -p:Configuration=Release -p:Platform=x64

- name: Build WinUI app
working-directory: windows/winui
run: msbuild LibrePods.WinUI/LibrePods.WinUI.csproj -t:Build -p:Configuration=Release -p:Platform=x64 -p:RestorePackages=false

# ---- Collect + upload artifacts ----------------------------------------
- name: Collect artifacts
shell: pwsh
run: |
# Lay out dist/ exactly how windows/installer/install.ps1 expects it, so
# the zip is a ready-to-run installer bundle.
New-Item -ItemType Directory -Force dist | Out-Null
Copy-Item windows/daemon/target/release/librepodsd.exe dist/
# FFmpeg runtime DLLs the daemon loads for AAC-ELD decode (fetched, not
# vendored) — must sit next to librepodsd.exe.
Copy-Item windows/daemon/vendor/ffmpeg/bin/*.dll dist/
# Prebuilt, test-signed kernel drivers, in the installer's layout.
Copy-Item -Recurse windows/drivers/aap/prebuilt dist/driver
Copy-Item -Recurse windows/drivers/mic/prebuilt dist/driver-mic
# The one-shot installer + its bundled devcon.
Copy-Item windows/installer/install.ps1 dist/
Copy-Item -Recurse windows/installer/tools dist/tools
# Find the WinUI output dir by locating the exe (path varies with TFM/RID).
$exe = Get-ChildItem -Recurse -Filter librepods-winui.exe `
windows/winui/LibrePods.WinUI/bin | Select-Object -First 1
if (-not $exe) { throw "WinUI build output (librepods-winui.exe) not found" }
Copy-Item -Recurse $exe.Directory.FullName dist/winui

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: librepods-windows-frontend
path: dist
if-no-files-found: error

# ---- Release (only on a windows-v* tag) --------------------------------
- name: Package release zip
if: startsWith(github.ref, 'refs/tags/windows-v')
shell: pwsh
run: Compress-Archive -Path dist/* -DestinationPath "librepods-windows-${{ github.ref_name }}.zip"

- name: Create GitHub Release
if: startsWith(github.ref, 'refs/tags/windows-v')
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: LibrePods for Windows ${{ github.ref_name }}
files: librepods-windows-${{ github.ref_name }}.zip
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Loading