Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
- Added: `app-it-static` companion plugin (`plugins/app-it-static/`) — a macOS sibling of `app-it` for **finished or buildable** apps. Builds once, then serves the built output (`dist/`/`build/`/`out/`/…) from a tiny zero-dependency static server (~15 MB) or directly via `file://` (~0 MB) — **no dev server**, instead of the 300–700 MB a dev server holds. Reuses `app-it`'s native Swift WebKit window, icon pipeline, and one-folder Dock install (the five shared templates are byte-identical and CI guards them against drift). The served output is a snapshot; `desktop:rebuild` refreshes it. Inspired by r/ClaudeAI launch feedback (see README → Community nudge) and recorded in [ADR 0006](docs/decisions/0006-static-companion-snapshot-model.md).
- Added: Windows beta scaffold (`plugins/app-it-windows/`) — a sibling plugin mirroring the macOS contract with Windows primitives (WPF + WebView2 host, PowerShell lifecycle scripts, multi-resolution `.ico`, Start Menu `.lnk`). Build + lint gated by a required `windows-latest` CI job; **untested on real hardware, looking for a maintainer.** See [docs/WINDOWS.md](docs/WINDOWS.md).
- Fixed (Windows beta): the generated launcher's **taskbar right-click menu showed `app-it-host`** instead of the app name (#9). The shell reads that label from the executable's embedded `FileDescription`, which the former build-once-then-rename flow left at the project default. `desktop-build.ps1` now publishes the WebView2 host **per app**, with identity split from the file name: `-p:AssemblyName=<slug>` gives a stable, always-valid file name (so the per-app build cache lookup is exact), while `-p:AssemblyTitle`/`-p:Product`=`<App Name>` set the embedded `FileDescription` + `ProductName` the taskbar actually reads (the `.csproj` sets neither, so there's nothing to override, and the free-form app name never has to be a valid file name). Per-app exes are cached under `assets\build\wrapper-windows\<slug>\` (mtime-aware), so the trade vs the old single shared publish is one `dotnet publish` per app on first build. Validated on real Windows 11 hardware. (Note: the Windows shell caches taskbar identity per executable, so an existing app shows the new name only after its cache turns over; a clean install shows it immediately.)
- Fixed (Windows beta): when the WebView2 runtime is missing (Windows LTSC/Server and some clean installs ship without it), the host caught the failure with a generic, developer-facing error. It now catches `WebView2RuntimeNotFoundException` specifically and offers to open Microsoft's download page (Yes/No) so an end user can fix it themselves; the catch-all handler also now names the download URL. Validated on real Windows 11 hardware.

## 0.1.0 - 2026-05-30

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ public partial class MainWindow : Window
private bool _quitting;
private bool _trayHintShown;

// Microsoft's canonical WebView2 download page (the "Evergreen Standalone"
// installer). Windows LTSC/Server and some clean installs ship without the
// runtime; this is where an end user gets it. Locale-neutral — Microsoft
// redirects to the user's region.
private const string WebView2DownloadUrl =
"https://developer.microsoft.com/microsoft-edge/webview2/";

public MainWindow(HostConfig config)
{
_config = config;
Expand Down Expand Up @@ -84,12 +91,29 @@ private async void OnLoaded(object sender, RoutedEventArgs e)

Web.CoreWebView2.Navigate(_config.Url!);
}
catch (WebView2RuntimeNotFoundException)
{
// The Evergreen runtime is genuinely absent (common on Windows
// LTSC / Server, which ship without Edge). This is the one failure
// an end user can fix themselves, so offer to open the download
// page instead of leaving them at a dead window. Caught separately
// from the generic handler below so we only point at the installer
// when that is actually the problem.
var open = MessageBox.Show(
$"{_config.Title} needs the Microsoft Edge WebView2 runtime, " +
"which isn't installed on this PC.\n\n" +
"Click Yes to open the Microsoft download page. Install the " +
"\"Evergreen Standalone\" runtime, then relaunch.",
_config.Title, MessageBoxButton.YesNo, MessageBoxImage.Warning);
if (open == MessageBoxResult.Yes) OpenInDefaultBrowser(WebView2DownloadUrl);
}
catch (Exception ex)
{
MessageBox.Show(
"WebView2 failed to start.\n\n" + ex.Message + "\n\n" +
"The WebView2 Evergreen runtime may be missing on this machine — " +
"see docs/WINDOWS.md for the maintainer checklist.",
"If the Microsoft Edge WebView2 runtime is missing, install it from\n" +
WebView2DownloadUrl + "\nthen relaunch. See docs/WINDOWS.md for the " +
"maintainer checklist.",
_config.Title, MessageBoxButton.OK, MessageBoxImage.Error);
}
}
Expand Down
Loading