Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
aa1552d
style: adjust padding and layout for FluentStack components across mu…
kYaRick Apr 25, 2026
842cc38
style: update runway track visibility and opacity for improved user g…
kYaRick Apr 25, 2026
c340351
feat: implement View Transitions API for smoother navigation and enha…
kYaRick Apr 25, 2026
e08391f
feat: add Preflight.Desktop project with splash and main windows, int…
kYaRick Apr 25, 2026
09e3d51
feat: enhance WebView2 handling with improved resource requests and r…
kYaRick Apr 25, 2026
2d09c2c
fix: standardize hyphen usage in comments and descriptions across mul…
kYaRick Apr 25, 2026
c22b2ff
feat: Enhance SPA routing and loading experience
kYaRick Apr 26, 2026
509c52a
feat: enhance desktop release process with Velopack integration
kYaRick Apr 26, 2026
1531360
feat: rename portable zip for consistency and optimize Blazor asset p…
kYaRick Apr 26, 2026
5c511ec
feat: unify language flag representation and streamline splash window…
kYaRick Apr 26, 2026
0aa04d7
feat: refactor UpdateBannerWindow layout for improved button positioning
kYaRick Apr 26, 2026
4cc3572
feat: update changelog for v0.1.2-alpha release with new features and…
kYaRick Apr 26, 2026
b3ecabb
feat: enable Windows targeting for CI restore on non-Windows hosts
kYaRick Apr 26, 2026
2495c9b
fix: correct formatting of _bannerWindow.Top assignment for consistency
kYaRick Apr 26, 2026
a3ecc89
feat: update Blazor project paths for improved build and publish process
kYaRick Apr 26, 2026
bee2a82
feat: add ImportModalService to LandingPageTests for improved test co…
kYaRick Apr 26, 2026
5b3c284
update: .github/workflows/release.yml was updated
kYaRick Apr 26, 2026
4d67adc
docs: update docs/development.md
kYaRick Apr 26, 2026
1dc1e35
docs: update docs/development.md
kYaRick Apr 26, 2026
18c78d0
feat: enhance import modal behavior and add tests for improved user e…
kYaRick Apr 26, 2026
f2ad220
feat: add app showcase and autounattend.xml flow images to README
kYaRick Apr 26, 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
129 changes: 122 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
name: 🎁 Release

# Packages the PWA as a self-hostable zip and publishes a GitHub Release.
# Triggered by pushing a `v*` tag (e.g. v0.1.0) or manually from the Actions tab.
# Packages two artifact families into one GitHub Release per tag:
#
# The released zip is a portable static site: extract and serve `wwwroot/` with
# any static file server (python http.server, nginx, caddy, IIS, ...). It's
# also directly installable as a PWA on Windows / macOS / Linux / Android / iOS.
# 1. PWA archive (zip + tar.gz) - Linux runner. Extract and serve wwwroot/
# with any static file server, or install in-browser as a PWA. The
# static site itself is platform-agnostic.
#
# 2. Windows desktop bundle (Velopack alpha channel) - Windows runner.
# Portable.zip for first-time download, plus RELEASES-alpha + full.nupkg
# that the in-app UpdateManager reads to deliver auto-updates.
# Setup.exe is intentionally skipped (--noInst): we distribute the
# portable form only. See docs/releasing.md.
#
# The desktop job uses `vpk upload github --merge` so its artifacts attach
# to the same draft release that the PWA job creates - the user sees one
# release with both downloads.
#
# Triggered by pushing a `v*` tag (e.g. v0.1.0) or manually from the
# Actions tab.

on:
push:
Expand Down Expand Up @@ -120,7 +132,13 @@ jobs:
Linux, Android and iOS - no download required, no admin rights, no
Play Store. Uninstall via your browser's app menu.

## 📥 Self-host / offline archive
## 🪟 Windows desktop (portable, auto-updating)
Download the Windows portable zip below, unzip anywhere,
and run `preflight.xml.exe`. The shell will check GitHub
Releases for newer alpha builds in the background and offer
a one-click restart when an update is downloaded.

## 📥 Self-host / offline PWA archive
Download the zip below and serve `wwwroot/` with any static server:

```bash
Expand All @@ -139,4 +157,101 @@ jobs:
before serving. No rebuild required.

## ✅ Integrity
Verify downloads against `SHA256SUMS.txt`.
Verify PWA downloads against `SHA256SUMS.txt`. The desktop
zip is signed by Velopack's release manifest (RELEASES-alpha)
which the auto-updater verifies on each check.

desktop:
name: 🪟 Package Windows desktop
needs: package
runs-on: windows-latest
steps:
- name: 📥 Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: ⚙️ Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "10.0.x"

- name: 💾 Cache NuGet
uses: actions/cache@v4
with:
path: ~\.nuget\packages
key: nuget-${{ runner.os }}-${{ hashFiles('**/*.csproj', 'Directory.Packages.props', 'global.json') }}
restore-keys: nuget-${{ runner.os }}-

- name: 🏷️ Resolve version
id: ver
shell: bash
run: |
TAG="${{ github.event.inputs.tag || github.ref_name }}"
VERSION="${TAG#v}"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "::notice title=Desktop release::Packaging $TAG (version $VERSION)"

- name: 🔧 Install vpk
shell: bash
run: dotnet tool install -g vpk --version 0.0.1298

- name: 🚀 Publish desktop (self-contained win-x64)
shell: bash
run: |
dotnet publish srcs/Preflight.Desktop/Preflight.Desktop.csproj \
--configuration Release \
--runtime win-x64 \
--self-contained true \
--nologo \
--output artifacts/desktop/publish

- name: 📦 vpk pack (alpha channel, portable-only)
shell: bash
run: |
vpk pack \
--packId preflight.xml \
--packTitle "preflight.xml" \
--packAuthors "kYaRick" \
--packVersion "${{ steps.ver.outputs.version }}" \
--packDir artifacts/desktop/publish \
--mainExe preflight.xml.exe \
--channel alpha \
--runtime win-x64 \
--outputDir artifacts/desktop/releases \
--noInst

# Velopack labels the portable artifact as `<id>-<channel>-Portable.zip`
# (versionless, capital P). For consistency with the rest of the release
# asset family - lowercase, version-stamped, runtime-stamped - rename
# both the file and its reference in assets.<channel>.json before the
# upload step reads them.
- name: 📝 Rename portable zip (lowercase + version + runtime)
shell: bash
run: |
cd artifacts/desktop/releases
cap="preflight.xml-alpha-Portable.zip"
low="preflight.xml-${{ steps.ver.outputs.version }}-alpha-win-x64-portable.zip"
if [[ -f "$cap" ]]; then
mv "$cap" "$low"
perl -pi -e "s|\\Q$cap\\E|$low|g" assets.alpha.json
echo "renamed: $cap → $low"
fi

# --merge attaches our artifacts to the draft release the
# `package` job already created for this tag. --pre marks it
# as a pre-release (matches the alpha channel semantics).
- name: 🎁 Upload to GitHub Release (merge with PWA draft)
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
vpk upload github \
--outputDir artifacts/desktop/releases \
--channel alpha \
--repoUrl https://github.com/${{ github.repository }} \
--tag ${{ steps.ver.outputs.tag }} \
--token "$GITHUB_TOKEN" \
--merge \
--pre
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,13 @@ node_modules/
.aider*
.copilot/
*.ai-cache

# ─────────────────────────────────────────────────────────────
# Preflight.Desktop - build-time generated output only
# ─────────────────────────────────────────────────────────────
srcs/Preflight.Desktop/blazor-temp/
srcs/Preflight.Desktop/wwwroot/
# Portable WebView2 profile (cache, localStorage, cookies, IndexedDB).
# Created next to the executable on first run. Already inside ignored
# bin/ for dev builds, but listed here for any out-of-tree run.
**/data/WebView2/
120 changes: 120 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<!--
Authoring guide: docs/changelog.md (Keep a Changelog 1.1.0).
Wrap chore / CI / refactor entries in `internal:start` ... `internal:end`
HTML-comment markers - they show on GitHub but are stripped from the
in-app "What's new" modal.
-->

<!-- internal:start -->
# Changelog

All notable changes to **preflight.xml** are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
<!-- internal:end -->

## v0.1.2-alpha

### Added

- View Transitions API for SPA navigation - Landing → Wizard / Advanced / Docs
and wizard step changes now crossfade smoothly with no flicker. Falls back
silently to instant navigation in browsers that don't implement the spec.
- "What's new" modal - embedded CHANGELOG.md rendered inline, sharing the
same overlay chrome as the command palette and shortcuts help.
- Custom XML import modal - drag-and-drop zone, paste pad, and a "Browse"
fallback to the OS picker, all in one styled dialog instead of the
bare-browser file dialog.
- Windows desktop auto-update (Velopack, alpha channel) - the desktop
shell quietly checks GitHub Releases for newer alpha builds in the
background, downloads the delta, and offers a one-click "Restart now"
banner inside the app. No installer, no admin rights - portable zip
in, portable update out.

### Changed

- Loading bar no longer overflows on narrow phones - the SVG runway scales
uniformly to fit any viewport, with adequate edge margins.
- Trail under the loading-screen plane now draws ONLY behind the plane,
with a soft fade-in at the runway start.
- "Go to top" plane button rebuilt - solid accent gradient, larger glyph,
tactile press feedback, and a longer custom-eased scroll so the trip
back to the top reads as deliberate motion instead of an instant jump.
- Command palette + Shortcuts help modal now animate open AND close (the
old open-only animation made dismissal feel abrupt).
- Modals are now centred vertically in the viewport instead of pinned
to 15vh from the top - large modals like the changelog no longer feel
like they're falling off the page.
- Advanced XML preview modal now fades in/out with the same chrome family
as the other modals (previously it snapped open with no transition).
- Desktop update UI now uses a dedicated overlay window (WPF) instead of
an in-tree panel/popup, so the banner is no longer clipped or hidden by
WebView2 HWND airspace.
- Update checks now start after the first rendered app frame (post-splash)
instead of immediately at process startup, preventing update UI from
racing the compact splash phase.

### Fixed

- Wizard final-step action buttons no longer overlap on mobile - the
action stacks now wrap and the page bottom padding clears any floating
control.
- Ukrainian translation: "Підкрутити в Advanced" → "Доналаштувати в Advanced".
- Ukrainian "What's new" modal now actually renders the UA changelog -
MSBuild was routing CHANGELOG.uk.md to a satellite assembly because of
the .uk. infix, so the lookup always fell back to the EN file.
- Import XML modal now blurs the page header (and everything else behind
it) - the modal was rendered inside the body grid, which trapped its
backdrop-filter inside a stacking context that sat below the sticky
header.
- Desktop update banner positioning is now anchored to the main window and
continuously reflowed on move/resize, eliminating random off-window
placement.
- Desktop update banner now re-translates immediately when UI language is
changed in-app (via `preflightCulture.set` bridge to the desktop shell).

<!-- internal:start -->
### Maintenance

- Refactored ModeCard to render its content inside an `<a href>` so SPA
navigation flows through the View Transitions click interceptor instead
of programmatic Nav.NavigateTo (which bypassed it).
- Added `ChangelogService` with regex-based internal-block filter and
per-culture resource lookup.
- Embedded CHANGELOG.{en,uk}.md as compile-time resources via
`<EmbeddedResource LogicalName="..." WithCulture="false" />` in
Preflight.App.csproj. WithCulture="false" stops MSBuild from treating
the .uk. infix as a satellite-resource culture marker.
- Moved the changelog authoring guide out of the file's own header into
`docs/changelog.md` so the source file isn't 60 lines of HTML comment
before the actual content.
- Promoted the import XML modal to a top-level layout slot via
`ImportModalService` so its overlay sits above the FluentLayout
stacking context.
- Switched Preflight.Desktop's AssemblyName from `Preflight` to
`preflight.xml` so the executable, Velopack PackId and live PWA name
all match. The published exe is now `preflight.xml.exe`; Windows hides
the `.exe` in the UI so the user sees `preflight.xml`.
- Custom WPF entry point (`Program.Main`) so `VelopackApp.Build().Run()`
intercepts hook commands (`--veloapp-install` / `--veloapp-uninstall`
/ `--veloapp-updated`) before any window is constructed.
- Added `UpdateService` with `GithubSource` + `ExplicitChannel="alpha"`,
fired from `App.OnStartup` after an 8s grace period. Failures are
swallowed - desktop runs offline-first; missing updates are not an
error condition.
- New justfile recipes `desktop-publish`, `desktop-pack`,
`desktop-release` wrap the dotnet publish + `vpk pack --noInst`
(portable-only) + `vpk upload github --merge --pre` flow.
- Extended `release.yml` with a `desktop` job on `windows-latest` that
runs after the PWA package job, producing
`preflight.xml-alpha-Portable.zip` + `RELEASES-alpha` + the matching
full/delta nupkg files, and merging them into the same draft GitHub
Release the PWA job already created.
- Split the Blazor wwwroot copy in Preflight.Desktop.csproj into
`CopyBlazorToOutDir` (post-Build) + `CopyBlazorToPublishDir`
(post-Publish) so `dotnet publish --output …` ships the PWA inside
the bundle - vpk pack used to ship a desktop folder with no wwwroot.
- Added `UpdateBannerWindow` (transparent, owner-bound overlay window) for
desktop update notifications, including localization refresh and explicit
restart/dismiss callbacks wired to `UpdateService`.
<!-- internal:end -->
Loading
Loading