Skip to content

Commit 9fecd9f

Browse files
Joeri Van Doorenclaude
andcommitted
v1.0.10 — Microsoft Store AppX target (x64 + arm64)
Adds an AppX build target alongside the existing NSIS installers for Windows, wired with the Store identity registered in Partner Center under RFGuru.SVXLink-HotSpot: identityName: RFGuru.SVXLink-HotSpot publisher: CN=FBF35633-D0C5-410A-883E-75B3C38AB746 publisherDisplayName: RF Guru applicationId: HotSpot displayName: SVXLink HotSpot Outputs land in dist/ as HotSpot-x64.appx + HotSpot-arm64.appx, uploaded to the draft release alongside the NSIS .exe files. Submit them to the Store via Partner Center → SVXLink-HotSpot → New submission → upload each .appx. Signing: electron-builder's appx target requires the package to be signed for makeappx/signtool to succeed, but Microsoft re-signs during Store certification. So we generate a throwaway self-signed cert in CI whose Subject matches the Publisher CN — just enough to make signtool.exe happy. Sideload users who install the .appx directly will have to trust the publisher cert on first launch; Store users see no prompt because the Store-signed copy chains to Microsoft. BLE: the AppX manifest declares `runFullTrust` (electron-builder's Desktop-Bridge template default), so the packaged app retains full Win32 trust including Web Bluetooth. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6a1d834 commit 9fecd9f

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

.github/workflows/release.yml

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ jobs:
6060
- name: Windows
6161
os: windows-latest
6262
script: build:win
63-
artifacts: dist/*.exe
63+
artifacts: |
64+
dist/*.exe
65+
dist/*.appx
6466
6567
- name: Linux
6668
os: ubuntu-latest
@@ -203,6 +205,43 @@ jobs:
203205
if: matrix.os != 'macos-latest'
204206
run: npm run ${{ matrix.script }} -- --publish never
205207

208+
# Microsoft Store / sideload AppX for Windows. Generates a self-signed
209+
# cert whose Subject matches the Publisher CN declared in the manifest
210+
# (Partner Center → SVXLink-HotSpot identity). The cert is throwaway:
211+
# Microsoft re-signs the package during Store certification, so it only
212+
# needs to make signtool.exe happy here. Sideload users who install the
213+
# .appx directly will have to trust the publisher cert at install time.
214+
- name: Generate AppX signing cert (Windows only)
215+
if: matrix.os == 'windows-latest'
216+
shell: pwsh
217+
run: |
218+
$cert = New-SelfSignedCertificate `
219+
-Type Custom `
220+
-Subject "CN=FBF35633-D0C5-410A-883E-75B3C38AB746" `
221+
-KeyUsage DigitalSignature `
222+
-FriendlyName "HotSpot Store Build Cert" `
223+
-CertStoreLocation "Cert:\CurrentUser\My" `
224+
-TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
225+
$pfxPath = Join-Path $env:RUNNER_TEMP "store-cert.pfx"
226+
$pwd = ConvertTo-SecureString -String "store-cert-temp" -Force -AsPlainText
227+
$cert | Export-PfxCertificate -FilePath $pfxPath -Password $pwd | Out-Null
228+
Write-Host "Exported PFX to $pfxPath"
229+
"APPX_CERT_PATH=$pfxPath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
230+
"APPX_CERT_PASSWORD=store-cert-temp" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
231+
232+
- name: Build Windows AppX (x64 + arm64, signed)
233+
if: matrix.os == 'windows-latest'
234+
shell: pwsh
235+
run: |
236+
# WIN_CSC_* are Windows-only signing inputs read by electron-builder.
237+
# We re-export inside the shell rather than reading the APPX_CERT_*
238+
# vars via a step-level env block: the validator can't statically
239+
# confirm a var set by a previous step exists, and we want a clean
240+
# actions-lint pass.
241+
$env:WIN_CSC_LINK = $env:APPX_CERT_PATH
242+
$env:WIN_CSC_KEY_PASSWORD = $env:APPX_CERT_PASSWORD
243+
npm run build:win:appx -- --publish never
244+
206245
- name: Upload artifacts to draft release
207246
uses: softprops/action-gh-release@v2
208247
with:

RELEASE_NOTES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ A minimal desktop companion for the Analog HotSpot SVXLink box.
2323
| Windows | `.exe` (NSIS installer, x64) |
2424
| Linux | `.AppImage` (x64 + arm64) |
2525

26+
## What's new in 1.0.10
27+
28+
- **Microsoft Store packages.** Each release now ships `HotSpot-x64.appx` and `HotSpot-arm64.appx` alongside the NSIS installers. These match the **RFGuru.SVXLink-HotSpot** identity registered in Partner Center and are ready to upload to the Microsoft Store submission flow.
29+
- AppX manifest declares `runFullTrust` (via electron-builder's Desktop-Bridge template), so the packaged app retains full Web Bluetooth access just like the NSIS installer.
30+
- Signed in CI with a self-signed cert whose CN matches the registered Publisher (`CN=FBF35633-D0C5-410A-883E-75B3C38AB746`). The Store re-signs during certification, so this signature only exists to satisfy `signtool.exe` during the build.
31+
2632
## What's new in 1.0.9
2733

2834
A targeted hardening pass after a 10-lens adversarial audit. Most items are invisible if everything was already working — the value is in the failure modes that no longer happen.

package.json

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
{
22
"name": "hotspot-app",
33
"productName": "HotSpot",
4-
"version": "1.0.9",
4+
"version": "1.0.10",
55
"description": "HotSpot — Desktop App for Mac, Windows and Linux (BLE feed viewer)",
66
"main": "main.js",
77
"scripts": {
88
"start": "electron .",
99
"build:mac": "electron-builder --mac",
1010
"build:linux": "electron-builder --linux",
11-
"build:win": "electron-builder --win"
11+
"build:win": "electron-builder --win nsis --x64 --arm64",
12+
"build:win:appx": "electron-builder --win appx --x64 --arm64"
1213
},
1314
"build": {
1415
"appId": "com.gururf.hotspot-app",
@@ -53,11 +54,30 @@
5354
"x64",
5455
"arm64"
5556
]
57+
},
58+
{
59+
"target": "appx",
60+
"arch": [
61+
"x64",
62+
"arm64"
63+
]
5664
}
5765
],
5866
"artifactName": "${productName}-Setup-${arch}.${ext}",
5967
"icon": "build/icon.png"
6068
},
69+
"appx": {
70+
"identityName": "RFGuru.SVXLink-HotSpot",
71+
"publisher": "CN=FBF35633-D0C5-410A-883E-75B3C38AB746",
72+
"publisherDisplayName": "RF Guru",
73+
"applicationId": "HotSpot",
74+
"displayName": "SVXLink HotSpot",
75+
"backgroundColor": "#0b1220",
76+
"languages": [
77+
"en-US"
78+
],
79+
"artifactName": "${productName}-${arch}.${ext}"
80+
},
6181
"linux": {
6282
"target": [
6383
{

0 commit comments

Comments
 (0)