Shared "Our other apps" catalog and WinUI 3 page for Dynamic Solutions Canada's apps. Each Windows app bundles this as a git submodule; the page cross-promotes the publisher's Store and web apps and automatically hides the app it is running inside (matched by package family name).
App data (names, blurbs, destinations, icons) is generated by refresh.ps1 and committed
as static assets. Consuming apps fetch the public manifest when the promo page opens, then
persist the last successful manifest and icons in app-local storage. Bundled assets remain
an offline first-run fallback, so the page renders even when GitHub is unavailable.
The public generated manifest is also available at
https://raw.githubusercontent.com/RyanEwen/technicallyreal-promo/main/Assets/PromotedApps/apps.json.
git submodule add https://github.com/RyanEwen/technicallyreal-promo external/promoIn the app's .csproj:
<Import Project="external\promo\PromotedApps.projitems" Label="Shared" />Add a nav item (e.g. in NavigationView.FooterMenuItems) that navigates to
TechnicallyReal.Promo.PromotedAppsPage.
CI note: checkouts need submodules, e.g. actions/checkout with submodules: true.
- Add/remove Store product IDs in
ids.jsonand add their stableappIdand platformlinksunderappOverrides(optionally set ablurbOverridesentry to replace the auto-extracted first line of the Store description). Add web apps underexternalApps, including a destination and a repository-owned icon URL. - Run
.\refresh.ps1- it queries the Store's StoreEdgeFD endpoint and regeneratesAssets/PromotedApps/apps.jsonplus the icon files. - Review, commit, and push the diff. Existing app releases receive the update the next time their promo page opens; bump the submodule only when shared page code changes.
refresh.ps1 is the only thing that talks to the Store backend. The runtime only reads
the committed GitHub manifest and its icons, so Store endpoint changes cannot break
shipped apps.
catalog.ts exports the public manifest URL, types, and parseCatalog validation.
Each entry has a stable appId for hiding the current product across platforms,
and links containing a platform (Android, Windows, or Web), HTTPS URL,
and action label. Use HTTPS Microsoft Store listings on Android, rather than the
Windows-only ms-windows-store: scheme. Keep the original destination,
actionLabel, and packageFamilyName fields for shipped WinUI consumers.
Import the bundled JSON and icons for the first offline visit. Refresh the public
manifest when the page opens, without credentials, validate before storing it,
and retain the last successful catalog if the network or validation fails.
Cache new remote icons for offline use. Show platform labels on every app and
hide the consuming product by appId, rather than comparing display names.
The consumer's checkout and build context must include this submodule. Catalog
metadata edits go in ids.json as well as the generated manifest so a later
refresh.ps1 run preserves them.
appOrder in ids.json sets the shared display order across Store and web apps.
Every app must appear exactly once. Consumers retain that order when hiding
their own product. An optional name in appOverrides pins a publisher-approved
display name instead of the current Store listing title; stable appId values
remain unchanged when a product is renamed.