Repository navigation
Releases
Releases · sn4k3/StageKit
v0.4.1
- Make
LinuxAppBundleOptions.MinimumDisplayLengthnon-nullable and omit the AppStream display-length recommendation
when its value is zero or negative - Stop generated install and uninstall script runs from printing help headers unless help is explicitly requested
- Add
PathUtilities.RedactUserPathto redact the user's home directory from a path string - Add
Concurrency.cshelper class - Omit
SingleMainWindowfrom.desktopfile metadata to prevent AppImageHub CI error: file contains key
"SingleMainWindow" in group "Desktop Entry", but keys extending the format should start with "X-" - Fix
RootCollectionFile<T,TO>.Itemsnever being persisted (read-only property ignored by the shared serializer
options), which also lostCrashReportsFilereports on restart; files now store anItemsproperty and legacy
array files still load - Fix
ApplicationKit.ApplicationArgsdefault value skipping--crash-report <id>parsing at startup - Fix
UnhandledExceptionsrelaunching with the crash-report flag when the report was not persisted, and before panic
saves completed; ignored terminating exceptions now still run panic saves andBeforeForcedExit - Fix one ignored inner exception causing a whole
AggregateExceptionto be ignored - Fix
SupportBundleExporterincludingCrashReports.jsonthrough the logs folder when crash reports are excluded - Fix
RootSettingsFile<T>races: changes made during serialization no longer get lost, stale debounce callbacks are
discarded,DeleteFilecancels pending saves,Disposewaits for an active save, and a corrupt or
unsupported-version file whose backup fails is no longer overwritten - Fix a malformed
--crash-reportconsuming the following argument on relaunch, and
ToTimeString(TimeSpan.MinValue)overflowing - Breaking:
EscapeWindowsBatchValuenow throwsArgumentExceptionfor",!, CR/LF and NUL, which cannot be
represented safely inset "NAME=value"; the previous^"escaping allowed command injection - Breaking: On Windows, the argument-list
ProcessHelper.CreateShellScriptProcessStartInfooverload rejects
arguments containing",%, CR/LF or NUL, whichcmd.exewould re-parse; raw-string arguments are passed verbatim - Fix packaging detection (
pkgutil,hdiutil, Linux package ownership) possibly deadlocking on undrained
stderr; queries are now bounded - Fix AppImage, Flatpak and Snap detection being overridden by .NET single-file detection
- Fix
HostSystem.PreventSleepon Windows being thread-affine; a dedicated thread now owns the execution state and
overlapping tokens combine correctly - Fix the Linux
OpenInTerminalfallback, Windows disk status on mounted folders (queries the requested path), macOS
LaunchNewInstancequoting of the bundle path, andPathUtilities.IsSamePathwith trailing separators - Add an opt-in
killOnCancellationparameter toProcessHelper.StartProcessAsyncthat kills the process tree and
awaits exit on cancellation or timeout - Fix Updatum generated update scripts being injectable through release tags, paths and relaunch arguments: Windows
scripts now load values from sidecar data files (parse-safe, preserving!,&,"and%), and Bash scripts
use ANSI-C quoting - Fix
UpdatumManager.InstallUpdateAsyncnot re-verifying the downloaded asset's SHA-256 before installing - Fix
InstallUpdateCompletedhandlers possibly not running before a forced update exits the process - Fix cancelling or timing out a package installer leaving the installer process running while its package was deleted
- Fix Windows
.exeupdates of a .NET single-file app being routed to the installer path - Fix a failed Windows installer being followed by relaunch and success cleanup; the script now exits non-zero and
keeps its artifacts - Fix update checks assuming GitHub release order is version order; the highest eligible version is now selected
- Fix truncated downloads being accepted when the response declared a shorter length than the release asset size
- Enforce the 4 KiB
.sha256sidecar limit while streaming instead of after buffering the whole response - Add
.tarand.tar.gzupdate archive installation;.tar.bz2and.tar.xzassets are no longer selected for
installation - Fix Flatpak and Snap relaunches dropping run arguments
v0.4.0
- Add
HostSystem.IsDarkModeandHostSystem.IsHighContrastfor detecting operating-system dark theme and accessibility
high-contrast modes across Windows (registry andSystemParametersInfoW), macOS (defaults), and Linux (gsettingsand
desktop environments) - Add
PathUtilities.DownloadsDirectoryPath,PathUtilities.GetDownloadsDirectory(), and
PathUtilities.TryGetDownloadsDirectory(...)to resolve the current user's standard Downloads directory across Windows
(nativeSHGetKnownFolderPathwithFOLDERID_Downloadsand user-shell-folder fallbacks), Linux (XDG_DOWNLOAD_DIR),
and macOS/Unix - Add
HostSystem.PreventSleep(bool keepDisplayOn = false)returning anIDisposabletoken to inhibit system sleep and
optionally keep displays active across Windows (SetThreadExecutionState), macOS (caffeinate), and Linux (systemd-inhibit) - Add
HostPowerStatus,HostSystem.IsOnBatteryPower,HostSystem.BatteryChargePercentage,HostSystem.GetPowerStatus(),
andHostSystem.TryGetPowerStatus(...)for cross-platform battery level, AC/battery power state, and charging detection - Add
HostSystem.OpenTerminal(...)andHostSystem.OpenInTerminal(...)(and asynchronous variants) to open interactive
host terminal windows and run commands across Windows (preferring Windows Terminalwt.exewithcmd.exefallback),
macOS (Terminal.appviaopenand AppleScript), and Linux (x-terminal-emulator,gnome-terminal,konsole,
xfce4-terminal,xterm) - Add
HostDiskStatus,HostSystem.GetAvailableFreeSpace(...),HostSystem.TryGetAvailableFreeSpace(...),
HostSystem.GetDiskStatus(...), andHostSystem.TryGetDiskStatus(...)to query drive capacity, free disk space,
file system format, and drive type across Windows (GetDiskFreeSpaceExWandDriveInfo) and Unix mount points - Use strongly typed
InstallerScope(PerMachineOrUser,PerUser,PerMachine) andPathRegistration(None,
Register,UserDefaultNo,UserDefaultYes) enums onWindowsInstallerOptionsinstead of raw string configuration - Add
HostSystem.OpenUrlURI overloads and generic synchronous/asynchronous andOpenhelpers for directories, files,
URLs, and raw shell-execute fallback targets - Add cross-platform unified file associations via
FileAssociationandFileAssociationsonStageKitBuild,
automatically configuring Windows Explorer context menu / Open With registration in WiX installers,
CFBundleDocumentTypesin macOSInfo.plist, andMimeTypeassociations,Execfile arguments (%F), and
AppStream mediatype metadata in Linux desktop application bundles - Add
WindowsInstallerOptionsto Fallout to configure Windows installer options (including
ContextMenuOpenWithFileAssociationsas aHashSet<FileAssociation>,SignToolPath, Authenticode signing,
InstallerScopeandPathRegistrationenums, shortcut togglesDefaultDesktopShortcutandDefaultStartMenuShortcut, and
single-file payload) alongside WiX installer context menu registration - Enforce a configurable macOS minimum runtime version in the generated installation script, defaulting to macOS 13.0
- Emit current AppStream developer metadata, including a configurable developer ID, for Linux application bundles
- Normalize AppStream summaries by removing trailing periods
- Add option to stop configured running application instances before installation
- Add
InstallerPathRegistrationmodes for optional or enforced WiX PATH registration, with user/system scope handling,
upgrade preference restoration, uninstall cleanup, and checked or unchecked user defaults - Isolate WiX intermediate outputs by installer name to prevent incremental builds from reusing another version's MSI
- Keep WiX shortcut registry state in the selected user or machine installation scope
- Stop the WiX installer from overriding a chosen installation directory with the remembered one, which silently
redirected wizard andINSTALLFOLDER=command-line choices back to the previous directory - Restore the WiX shortcut preferences on silent and basic-UI installations, which never run the wizard and so recreated
shortcuts the user had removed - Scope the WiX PATH entry and remembered directory by the installation context Windows Installer resolved (
ALLUSERS)
rather than by the wizard'sINSTALLSCOPE, so a per-user installation writes the user PATH instead of failing with an
access denied error while trying to write the system PATH - Delete the WiX installer registry key on uninstall so nothing is left behind
- Keep the WiX "Start program after install" checkbox working after a major upgrade instead of showing it inert, and
check it by default - Default silent per-user WiX installations to the user programs directory so unprivileged installs succeed without
requiring elevation or failing against Program Files - Forward
Company,Copyright,RepositoryUrl, andWindowsIconFilefrom the Windows publish pipeline to the WiX
installer build - Disable the WiX installation scope selector during maintenance or while a previous installation is detected, since
Windows Installer keeps a product in the context it was first installed in - Uninstall directly from the WiX start menu shortcut, which now carries the application icon, instead of opening
maintenance mode thatARPNOMODIFYdisables - Mark the WiX shortcut components transitive so their conditions are re-evaluated on reinstall
- Record the description, keywords (from project package tags), and copyright in the WiX package summary information
- Authenticode-sign every executable and library in the WiX payload instead of only the entry executable, through an
InstallerPayloadToSignitem that can be redefined to narrow the set - Honour a preset
InstallerPathRegistrationin the WiX installer project instead of always overwriting it - Add the StageKit demo icon to its window and taskbar entry
- Add the
PublishAotbuild parameter (--publish-aot), defaulting tofalse, to support Native AOT ahead-of-time
compilation across publishing, single-file packaging, and runtime restore operations in Fallout - Add macOS Developer ID code signing and notarization support for application bundles (
.app) and packages (.dmg,
.pkg) viaxcrun notarytoolandstapler, supporting keychain profiles (--mac-keychain-profile), Apple ID
credentials (--mac-apple-id,--mac-password,--mac-team-id), App Store Connect API keys (--mac-api-key-path,
--mac-api-key-id,--mac-api-issuer-id), signing identities (--mac-signing-identity), and programmatic options on
MacAppBundleOptions, while retaining ad-hoc code signing (codesign --sign -) as the fallback when notarization or
identity is not configured
v0.3.8
- Let users choose between per-user and per-machine WiX installation scopes
- Let installer developers enforce
perUserorperMachinethrough the WiXInstallerScopeproperty while defaulting
to user-selectable scope - Add optional SHA-256 Authenticode signing for the staged Windows executable and final MSI
- Prevent x64 installers from running under ARM64 emulation when a native ARM64 installer is available
- Allow older and same-version MSI packages to replace the installed version
- Add a uninstall software shortcut to start menu in the Wix template
- Let users choose the WiX installation directory and restore the last directory on later installs, upgrades, and
reinstalls - Record the installed MSI product code, software version, architecture, and executable path alongside the remembered
installation directory, while removing installed-product metadata during uninstall - Move the optional "Start program after install" checkbox to the completion page
v0.3.7
- Remove
<TargetFramework>net10.0</TargetFramework>from WixInstaller template - Add
UnixSystem.SetUnixPermissions(...)to set the permissions of a file or directory - Add
UnixSystem.ChangeUnixPermissions(...)to change the current permissions of a file or directory - Add
StageKitBuild.UnixFilePermissionsto apply configuredchmodmodes to validated files beneath each Unix-like
runtime's publish directory after publishing - Improve the
StageKitBuild.SoftwareNameproperty to guess from more properties
v0.3.6
- Add the
EntryApplication.CurrentProcesscached property to expose the current process - Hardens Fallout main-project detection by ignoring missing or non-boolean
FalloutMainProjectvalues - Updates host GPU reporting so
GraphicsCardNamereturns all detected adapter names - Reshapes the Linux package-manager command helper into the newer extension-property style.
v0.3.5
- Add the
GenerateWindowsWixInstallerFallout target, which scaffoldsbuilds/<SoftwareName>.WixInstallerwith the
WiX project,Package.wxs,Strings.en-us.wxl, a readme, a placeholderLicense.rtf, and generated placeholder
banner and dialog artwork at the sizes WiX expects. Upgrade codes are generated once per platform, and the target
fails instead of overwriting an existing installer project so those codes and any custom authoring survive - Replace existing same-version Windows installations when installing a rebuilt MSI instead of registering another
product. - Allow custom Windows installer welcome artwork and header logos, including the installation-options page.
- Add Windows installer checkboxes for Start menu and Desktop shortcuts (enabled by default and restored from the registry on rerun/upgrade) and starting the app after
installation (disabled by default). - Prefer RPM assets on AlmaLinux in generated installers, and retain the application-name casing for installed AppImage
and .NET single-file names - Stop Linux
speaker-testtones at the requested duration and use macOSafplayfor an audible system sound
v0.3.4
- Allow set AppImage squashfs compression in Fallout to customize or override compression
- Decouple primary directory publish from
DotNetSingleFilepackaging so that directory and portable archive publish retains all runtime assemblies and native dependencies - Add the
PublishReadyToRunbuild parameter (--publish-ready-to-run), defaulting tofalse, to make ReadyToRun compilation opt-in - Add the
PublishTrimmedbuild parameter (--publish-trimmedandTrimmedproperty alias), defaulting tofalse, to make assembly trimming opt-in across publish and restore operations - Let APT's
_aptuser read downloaded DEB files without falling back to an unsandboxed root download, and print the
command that starts applications installed through native Linux packages
v0.3.3
- Add
ShellScriptFile, aTextWriterthat builds and executes Windows batch or Unix shell scripts with optional
elevation, cancellation, captured process output, argument lists, platform-conditional writes, comments, and
environment variables.CreateTemporary(...)and the pathless constructor assign a unique temporary path and delete
it on disposal by default, while an explicit path keeps the script; content is buffered and written atomically by
Flush, byExecute, and on disposal.
WriteLines,WriteLinesAsync,WriteLinesIf,WriteLinesIfWindows/MacOS/Linux/Unix, andWriteComments
write several lines at once, takingparamsor anIEnumerable<string?> - Add raw and structured script-argument support to
ProcessHelper.CreateShellScriptProcessStartInfo, plus
StartShellScriptandStartShellScriptAsyncoverloads matching the process-start helpers - Move process lifetime metadata from
ApplicationKit.StartingTimestamp,RuntimeElapsed, andSessionIdto
EntryApplication.ProcessStartingTimestamp,ProcessUptime, andProcessSessionId; the former APIs have been
removed - Add structured process snapshots and configurable runtime reports to
RuntimeDiagnostics, including process, GC,
thread-pool, runtime-feature, culture, and time-zone details plus reusable custom report formatting - Add portable processor and multi-adapter graphics information to
HostSystem, with native or structured detection,
Windows filtering for indirect USB and software display drivers, bounded external queries, retry-after-failure
behavior, and compatibility for the originalGraphicCardNamespelling - Add cached system manufacturer and model detection plus a portable
HostSystem.SystemUptimemeasurement - Add
HostSystem.IsNetworkAvailable()for a fast, cross-platform local network-availability check and
IsInternetAvailableAsync()for an active, timeout-bound internet connectivity probe with captive-portal detection - Add cached
HostSystem.OperatingSystemNameandOperatingSystemNameWithArchdisplay values, including Mac Catalyst,
WASI, and correctly styled tvOS and watchOS names - Add immutable, platform-neutral host memory snapshots with native Windows/macOS queries, span-based Linux parsing,
readable physical-memory properties, and explicit failure detection - Show live host memory totals, availability, usage, and load in the Avalonia demo with automatic two-second refreshes
- Add
StringExtensions.InsertCharBetweenCamelCasetoStageKit.Primitivesfor splitting camelCase/PascalCase (and,
optionally, digit) transitions with a configurable separator character - Add
HostSystem.BeepandHostSystem.BeepAsynctoStageKit.Primitives. Both report success as aboolinstead of
throwing, clamp the frequency to the 37 Hz floorConsole.Beeprequires, format the Linuxsleepinterval with the
invariant culture, probe forspeaker-testbefore using it, and fall back to the macOS system alert sound - Add a host beep section to the Avalonia demo with frequency and duration editors, single and looping playback through
HostSystem.BeepAsync, and a stop button that cancels the loop - Add
LinuxRpmandDotNetSingleFiletoStageKitreleases - Fix cross-architecture RPM publishing by passing the target architecture to
rpmbuild, fail immediately when a
packaging command exits unsuccessfully, and report successful AppImage progress as regular output - Run Linux and macOS release jobs on matching native x64 or ARM64 GitHub-hosted runners
- Retry transient
hdiutil createresource-busy failures when producing macOS DMG packages - Log shell tool output at information level regardless of its output stream, skip unnecessary Arch dependency checks,
and include complete Snap store metadata; the StageKit demo Snap now stages its fontconfig runtime dependency - Set
CreateNoWindow = trueonProcessHelperby default to avoid a console window on Linux - Add
ProcessHelper.StartProcessWithShellExecuteandStartProcessWithShellExecuteAsyncoverloads for targets that
must be opened through the operating system shell
v0.3.2
- Fix macOS ZIP, PKG, and DMG auto-updates leaving the application closed. ZIP updates now replace the extracted
.app
instead of its parent directory, and relaunch uses a new Launch Services instance with startup verification and a
diagnostic log in the system temporary directory. - Fall back to
wgetin Bash build and generated installation scripts whencurlis unavailable. - Fix arch installer warnings from an unnecessary
awkregex escape and accept/helpand/?aliases. - Add Bash
--portable [PATH]extraction into an application-named directory and generate a package-aware Bash
uninstaller that probes all supported Linux and macOS formats. - Generate a Windows PowerShell uninstaller that probes an exact configured WinGet package, exact registered installer
display names, and the known per-user Portable/single-file directory andPATHentries.
v0.3.1
- Add Fallout's
GenerateInstallScripttarget, which creates GitHub Releases Bash and Windows PowerShell installers
from the selectedPackagingTypes, exposes command help and explicit downgrade/version selection, prioritizes native
installers over generic bundles, keeps Portable last, lists all published release versions or their release-note
changelogs (limited to 20 releases by default), reports clean PowerShell release-resolution errors, and falls back
when an asset or package tool is unavailable. Windows scripts can optionally try an exact WinGet package ID first and
fall back to GitHub release assets when WinGet is unavailable or installation fails. - Fix macOS PKG and DMG auto-updates leaving the application closed by deferring relaunch to a non-elevated helper that
waits for the old process to exit. Set the StageKit demo's Avalonia application name so its macOS menu uses
StageKit. - Fix macOS DMG creation being killed with exit code 137 on GitHub-hosted runners. The image is built from the
application bundle alone again, without the/Applicationsdrag-and-drop symlink, becausehdiutilfollows that
symlink while scanning the source tree and walks the whole host/Applicationsdirectory. PKG installers continue to
install their application directly in/Applications. Native packages are still created before the application ZIP. - Add opt-in
LinuxAppBundleOptions.FlatpakAllowHostCommandExecutionmanifest configuration for applications that need
theorg.freedesktop.Flatpakhost-command service. - Stage
libicu74in Snap packages by default so self-contained .NET applications have globalization support, with a
configurableLinuxAppBundleOptions.SnapStagePackageslist for other bases and runtime dependencies. - Add
ProcessHelperhost-process factories and start helpers that useflatpak-spawn --hostinside Flatpak and normal
process launching elsewhere. Updatum now installs and relaunches Flatpak updates through that bridge, using its
host-visible application cache for downloaded bundles. - Add
HostSystem.TryFindExecutablefor subprocess-free executable lookup with WindowsPATHEXTsupport and Unix
execute-permission validation. - Add synchronous and asynchronous
HostSystemhelpers to open URLs, directories, and files with their default host
applications, or reveal a file in Windows Explorer and macOS Finder (with containing-directory fallback on Linux). - Add lazy
BuildRuntime.Instancemanifest loading andBuildRuntime.TryLoad(...)toStageKit.Runtime, using
source-generated JSON metadata and the generic enum converter for trimming and Native AOT compatibility.