Store submission pre-checklist¶
Beacon itself remains unpackaged and self-contained (RFC §10, WindowsPackageType=None) — a store submission only adds an MSIX package that wraps the whole publish output, with an in-package Identity for the store to recognize; the app's runtime shape does not change. This page records three things: how the MSIX is produced, what fields the privacy-policy page needs, and what store assets to prepare.
Status (2026-10-12)¶
| Item | Status |
|---|---|
| SignPath free signing | Parameters wired for real (2026-10-12): api-token and organization-id go through repository secrets (SIGNPATH_API_TOKEN / SIGNPATH_ORGANIZATION_ID, nothing hard-coded), with project-slug: beacon and signing-policy-slug: beacon; artifact-configuration-slug is an optional parameter — omitting it uses the project's default Artifact Configuration (fill it in later if needed, once a Portable Executable + deep signing configuration has been created in the console). One user-side step remains (not done by an agent): in the SignPath console, add the user who owns the API token to the Submitters list of the "beacon" signing policy — once done, the next v* tag onward signs automatically; until then a version-tag build goes red at the signing step (fail closed; an unsigned official release is never shipped silently). Policy in the README "Code signing policy" section |
| MSIX packaging | Verified on a Windows runner with byte-level package checks (2026-10-12, two green dry runs, manifest version replacement observed to happen): MakeAppx in place, the manifest accepted, a package of about 66 MB produced. The packaging logic shares .github/workflows/scripts/msix-pack.ps1 with the daily-build version-tag channel |
| Store app reservation | Not started. Identity Name / Publisher in the appxmanifest can only be fixed after reserving the app name in Partner Center |
| Privacy policy page | Ready: https://cuihairu.github.io/beacon/privacy-policy/ (docs/privacy-policy.md, published by the docs workflow; the field mapping is in section 1) |
| Store assets | Icon prepared; screenshots / description / category / rating questionnaire not prepared (see section 2) |
1. Required fields of the privacy policy page¶
Store rule: an app that accesses personal data or has network capability must provide a publicly accessible privacy-policy URL. Beacon has network access (the GitHub API + AI-platform usage endpoints) and stores API tokens locally, so this is mandatory.
The page must state at least these fields (left column = the field, right column = Beacon's actual answer, copyable):
| Field | Beacon's actual answer |
|---|---|
| What data is collected | API tokens (GitHub PAT, AI-platform keys); user configuration (connections, refresh intervals, theme, widget layout); local machine readings (CPU / memory / disk / network speed / IP) |
| Where the data lives | All local: tokens go into the DPAPI secret store; configuration goes to %AppData%\Beacon\config.json (only a credentialRef is stored, never a plaintext token); logs go to %AppData%\Beacon\logs |
| How data leaves the machine | Sent only to the API endpoints the user configured (GitHub API, AI-platform console/usage endpoints); sent to no third party, no telemetry reporting |
| What the data is used for | Local display of state and local execution of actions only; tokens are used only to authenticate queries against the corresponding platforms |
| Retention and deletion | Removed with the install directory; uninstall through the system "Add or Remove Programs"; no cloud copy |
| Contact | To fill in (email or GitHub profile) |
Landing requirements:
- [x] The public URL is ready:
https://cuihairu.github.io/beacon/privacy-policy/(docs/privacy-policy.md, published by the docs workflow — submit exactly this) - [ ] Before submission the URL must already be reachable (the store crawls it)
- [ ] It must not be a
localhost/ intranet address / a page that requires login
2. Store asset checklist¶
| Item | Requirement | Beacon status |
|---|---|---|
| App icon | 310x310 PNG; the manifest Logo (small store-listing icon) uses 50x50 |
Ready: packaging/msix/Square310x310Logo.png, StoreLogo.png (rasterized from docs/img/logo.svg; the same batch also produced 44/71/150/310x150 for in-package tiles) |
| Screenshots | At least 1, 4+ recommended; PNG or JPG; common size 1920x1080 (1366x768 / 2560x1440 also accepted); per-file size limit per the submission page | Not prepared. Bases can be picked from existing evidence screenshots in docs/img/evidence/, but those are mostly dark-theme close-ups; light-theme, multi-screen, and settings shots are still needed |
| App description | Up to 10000 characters; cover positioning / features / supported scenarios, keywords allowed | Not prepared. Can be adapted from the README install section + the positioning section of docs/mission.md |
| Category | Primary + secondary category, chosen from the store's list (Developer tools / Productivity are candidates) | Not decided |
| Age rating questionnaire | The IARC questionnaire answered item by item: violence, horror or fear, crude language, tobacco/alcohol, sexual content or nudity, user interaction, in-app purchases | Unanswered. Beacon has no content-risk items; the expected result is "Everyone" |
| Support URL | Required (GitHub issues works) | Not decided |
Exact size limits, allowed category values, and questionnaire wording follow the Partner Center page at submission time — the numbers in this table are the common conventions; check against the page once before submitting.
3. MSIX packaging: blockers and alternatives¶
The packaging chain (.github/workflows/daily-build.yml, v* tag channel only):
publish/ (self-contained output) + packaging/msix/appxmanifest.xml (version replaced per tag)
→ staging directory with AppxManifest.xml + all publish files
→ makeappx pack /d <staging> /p <asset>.msix
→ into SHA256SUMS + gh release upload
- Version alignment:
Version="0.0.0.0"in the manifest is a placeholder, replaced by the workflow with the four-segment form of thev*tag (v0.1.3→0.1.3.0); the exe's ownVersiongets the same tag version injected at the publish step, so the two are always equal. - The unsigned MSIX is deliberate: the store signs it at submission (Microsoft's signature); locally it is not signed. Sideload testing needs your own development certificate (
makeappx pack /o+ a self-signed certificate) — that is a local pre-submission verification step, not done in CI. - Placeholders that must be replaced before submission:
Identity Name="Beacon.CuiHairu"→ the app name reserved in Partner Center;Publisher="CN=cuihairu"→ the submission certificate subject (consistent withPublisherDisplayName). - Windows runner field test (2026-10-12, two green dry runs: 38230149697 + 38233094172):
- MakeAppx is present on the runner:
C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86\makeappx.exe - The hand-written manifest was accepted by MakeAppx (namespaces /
uap:VisualElements/uap:DefaultTile/rescap:runFullTrustall valid); packing completes in about 10 s - Package-level byte verification (artifact downloaded and unpacked locally): the zip container is valid, about 66 MB / 502 entries;
AppxManifest.xml+ 6 Logos are all at the package root with byte counts matching the repository files one by one;Beacon.App.exeandAssets\entered the package from publish - The version-replacement path was observed live (run 38233094172, the dry-run harness deliberately passed 9.9.9.9 ≠ the placeholder): the in-package Identity actually became
Version="9.9.9.9"and the placeholder0.0.0.0disappeared — the "version aligned to thev*tag" mechanism is proven to really happen, not an empty replacement - The only blocker at the time was "no way to dry-run": the MSIX step runs only in the
v*tag channel, and version tags are given manually by the author (a repository red line: no tags); dry-running with an existing tag would upload another commit's assets onto an already-published release, violating delivery integrity. The solution was to extract the shared script.github/workflows/scripts/msix-pack.ps1plus a dry-run harness.github/workflows/msix-dry-run.ymlthat only builds the package and never touches the release or tags.
If the packaging chain breaks in the future, alternatives (in recommended order):
- Sparse package (
WindowsPackageType=Sparse) — the WinUI 3-supported mode of "has package identity but still runs unpackaged": addWindowsPackageType=Sparse+PackageCertificateKeyFileto the csproj and the appxmanifest is generated by MSBuild automatically (no hand-writing). Cost: local development and the portable form would have to switch mode along with it. - App Installer distribution (
.appinstaller) — an enterprise / personal distribution channel that bypasses the store. - Zip + setup.exe only — the store is not a distribution requirement: the portable zip + Inno Setup installer already cover personal distribution; MSIX exists purely for listing.