Two libraries, one API

PackageTargetUI
Beep.Installer.Extensions.Winformnet10.0-windowsUpdateDialog (a Form) from BeepLabel/BeepButton/BeepProgressBar.
Beep.Installer.Extensions.WPFnet9.0-windowsUpdateWindow (a Window) from the Beep WPF controls (Material3 chrome).

Both are pure presentation — all update logic stays in TheTechIdea.Beep.Updates, so the two UIs behave identically.

Use it — no DI required

// WinForms — from a "Check for updates" menu item:
await BeepUpdater.CheckAndPromptAsync(this, new UpdateSettings {
    FeedUrl        = "https://updates.example.com/stable/feed.json",
    CurrentVersion = "1.2.0",
    InstallRoot    = Application.StartupPath
}, showWhenUpToDate: true);
// WPF — 'this' is the owner Window:
await BeepUpdater.CheckAndPromptAsync(this, updateService);
// quiet check just after the main window opens (never interrupts a launch):
await BeepUpdater.CheckOnStartupAsync(mainWindow, updateService);

With DI

services.AddBeepAppUpdatesWinform();   // or AddBeepAppUpdatesWpf();
// reads update-settings.json beside the app (stamped by the installer at build time)
var updates = provider.GetRequiredService<IAppUpdateService>();
await BeepUpdater.CheckOnStartupAsync(mainForm, updates);
  • CheckAndPromptAsync — checks, and shows the dialog/window when an app or module update is available.
  • CheckOnStartupAsync — quiet variant for launch: prompts only when there's something to do, never surfaces errors or "up to date".
  • UpdateDialog.ShowFor / UpdateWindow.ShowFor — show directly for a check you already ran.

The dialog reports the available version (delta vs full), applies the app update side-by-side plus any stale modules with live progress, and offers a restart when done.