UpSparkle 1.0.6

dotnet add package UpSparkle --version 1.0.6
                    
NuGet\Install-Package UpSparkle -Version 1.0.6
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="UpSparkle" Version="1.0.6" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="UpSparkle" Version="1.0.6" />
                    
Directory.Packages.props
<PackageReference Include="UpSparkle" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add UpSparkle --version 1.0.6
                    
#r "nuget: UpSparkle, 1.0.6"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package UpSparkle@1.0.6
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=UpSparkle&version=1.0.6
                    
Install as a Cake Addin
#tool nuget:?package=UpSparkle&version=1.0.6
                    
Install as a Cake Tool

UpSparkle

Thin .NET wrapper around WinSparkle (Windows) and Sparkle (macOS). One NuGet package, two platforms.

NuGet NuGet Buy me a coffee

About

UpSparkle gives .NET desktop apps a cross-platform auto-update UI without any platform-specific plumbing code. It ships a single netstandard2.0 NuGet package that automatically picks the right native binary at runtime.

Quickstart

1. Install the NuGet package

dotnet add package UpSparkle

Or via Package Manager Console in Visual Studio:

Install-Package UpSparkle

2. Configure your project

Initialize reads your app's metadata from the executing assembly, so you need to set those values in your project first.

Windows — SDK-style project (.csproj)

Add company, product, and version to your <PropertyGroup>, then declare the UpSparkle-specific metadata in an <ItemGroup>:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <Company>Wayne Enterprise</Company>
    <Product>BatComputer App</Product>
    <Version>1.0.0</Version>
  </PropertyGroup>

  <ItemGroup>
    
    <AssemblyMetadata Include="SUFeedURL" Value="https://example.com/appcast.xml" />
    
    <AssemblyMetadata Include="SUPublicEDKey" Value="<your-base64-eddsa-public-key>" />
  </ItemGroup>
</Project>

These map to AssemblyCompanyAttribute, AssemblyProductAttribute, AssemblyInformationalVersionAttribute, and AssemblyMetadataAttribute respectively — all of which Initialize reads at runtime.

Windows — classic .NET Framework project (AssemblyInfo.cs)

For non-SDK-style projects (e.g. .NET Framework 4.6.2 targeting net462 without <Project Sdk="...">), the <ItemGroup>/<AssemblyMetadata> shorthand is not available. Add the attributes directly to your Properties\AssemblyInfo.cs instead:

using System.Reflection;

// Standard assembly identity attributes
[assembly: AssemblyCompany("Wayne Enterprise")]
[assembly: AssemblyProduct("BatComputer App")]
[assembly: AssemblyInformationalVersion("1.0.0")]

// UpSparkle-specific metadata
[assembly: AssemblyMetadata("SUFeedURL", "https://example.com/appcast.xml")]
[assembly: AssemblyMetadata("SUPublicEDKey", "<your-base64-eddsa-public-key>")]

AssemblyMetadata is in System.Reflection and is available in .NET Framework 4.5+.

macOS — Info.plist

On macOS, Sparkle reads its configuration directly from the app bundle's Info.plist. At minimum you need:


<key>SUFeedURL</key>
<string>https://example.com/appcast.xml</string>


<key>SUPublicEDKey</key>
<string><your-base64-eddsa-public-key></string>

Commonly used optional keys:


<key>SUEnableAutomaticChecks</key>
<true/>


<key>SUScheduledCheckInterval</key>
<integer>86400</integer>


<key>SUAutomaticallyUpdate</key>
<false/>


<key>SUShowReleaseNotes</key>
<true/>

For the full list of supported keys see the Sparkle customization docs.

To generate your EdDSA key pair, use the generate_keys tool that ships with Sparkle. See the EdDSA signatures guide for step-by-step instructions.

3. Initialize the updater

Create one UpSparkleUpdater instance per application (typically at startup) and call Initialize. The simplest form reads everything from the executing assembly:

using UpSparkle;

var updater = new UpSparkleUpdater();

// Reads SUFeedURL and SUPublicEDKey from AssemblyMetadata,
// and company/product/version from standard assembly attributes.
updater.Initialize(System.Reflection.Assembly.GetExecutingAssembly());

You can also pass the appcast URL and/or public key directly — they take precedence over the assembly metadata:

updater.Initialize(
    assemblyInfo:   System.Reflection.Assembly.GetExecutingAssembly(),
    appcastUrl:     "https://example.com/appcast.xml",
    edDSAPublicKey: "<your-base64-eddsa-public-key>");

After a successful call, the following properties are available:

Property Description
IsInitialized true once Initialize has succeeded
AppcastUrl The resolved appcast feed URL
EdDSAPublicKey The resolved EdDSA public key
CompanyName Resolved from AssemblyCompanyAttribute
AppName Resolved from AssemblyProductAttribute
AppVersion Resolved from AssemblyInformationalVersionAttribute (build metadata suffix stripped)

4. Check for updates

Call CheckUpdateWithUI() to open the native update dialog — wire this to a menu item, toolbar button, or call it automatically on startup:

updater.CheckUpdateWithUI();

CheckUpdateWithUI throws InvalidOperationException if called before Initialize.

5. Clean up on exit

Dispose the updater when the application closes to release native resources:

updater.Dispose();

After disposal, IsInitialized is reset to false.

Full Examples

WPF

using System.Windows;
using UpSparkle;

public partial class MainWindow : Window
{
    private readonly UpSparkleUpdater _updater = new UpSparkleUpdater();

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _updater.Initialize(System.Reflection.Assembly.GetExecutingAssembly());
    }

    private void CheckForUpdates_Click(object sender, RoutedEventArgs e)
    {
        _updater.CheckUpdateWithUI();
    }

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        _updater.Dispose();
    }
}

WinForms

using System.Windows.Forms;
using UpSparkle;

public partial class Form1 : Form
{
    private readonly UpSparkleUpdater _updater = new UpSparkleUpdater();

    private void Form1_Load(object sender, EventArgs e)
    {
        _updater.Initialize(System.Reflection.Assembly.GetExecutingAssembly());
    }

    private void btnCheckUpdate_Click(object sender, EventArgs e)
    {
        _updater.CheckUpdateWithUI();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        _updater.Dispose();
    }
}

Avalonia (MVVM)

using System.Reflection;
using UpSparkle;

public partial class MainWindowViewModel : ViewModelBase
{
    private readonly UpSparkleUpdater _updater = new UpSparkleUpdater();

    public void Init()
    {
        _updater.Initialize(Assembly.GetExecutingAssembly());

        // Properties are populated after Initialize
        Console.WriteLine(_updater.CompanyName);
        Console.WriteLine(_updater.AppName);
        Console.WriteLine(_updater.AppVersion);
    }

    public void CheckForUpdates()
    {
        _updater.CheckUpdateWithUI();
    }
}

MAUI

using System.Reflection;
using UpSparkle;

public partial class MainPage : ContentPage
{
    private readonly UpSparkleUpdater _updater = new UpSparkleUpdater();

    public MainPage()
    {
        InitializeComponent();

        this.Loaded += (_, _) =>
            _updater.Initialize(Assembly.GetExecutingAssembly());

        this.Disappearing += (_, _) =>
            _updater.Dispose();
    }

    private void OnCheckUpdatesClicked(object sender, EventArgs e)
    {
        _updater.CheckUpdateWithUI();
    }
}

API Reference

UpSparkleUpdater

public class UpSparkleUpdater : IDisposable
Constructor
new UpSparkleUpdater()

Creates a new updater instance. The native backend is not started until Initialize is called.

Methods
void Initialize(Assembly assemblyInfo, string appcastUrl = null, string edDSAPublicKey = null)

Starts the native Sparkle / WinSparkle framework. Reads company name, app name, and version from the assembly's standard attributes. appcastUrl and edDSAPublicKey are resolved from parameters first, then from AssemblyMetadata entries with keys "SUFeedURL" and "SUPublicEDKey" respectively.

Throws ArgumentNullException if assemblyInfo is null. Throws ArgumentException if a required value cannot be resolved.

void CheckUpdateWithUI()

Opens the native update UI. Throws InvalidOperationException if called before Initialize.

void Dispose()

Shuts down the native updater and releases native resources. Resets IsInitialized to false.

Properties
bool IsInitialized { get; }
string AppcastUrl { get; }
string EdDSAPublicKey { get; }
string CompanyName { get; }
string AppName { get; }
string AppVersion { get; }

All properties return null before Initialize is called.

Constants
const string AppcastUrlMetadataKey = "SUFeedURL";
const string EdDSAPublicKeyMetadataKey = "SUPublicEDKey";

Keys used to look up AssemblyMetadata values from the assembly. Match the corresponding Info.plist keys on macOS.

Supported Platforms

Platform Minimum version
Windows (x86 / x64 / Arm64) .NET Framework 4.6.2, or .NET 6+
macOS (Apple Silicon / Intel) .NET 6+
Mac Catalyst (Apple Silicon / Intel) .NET 6+

Tested project types:

Windows — WinForms, WPF, WinUI, Avalonia UI, MAUI (WinUI)

macOS — .NET macOS, MAUI (Mac Catalyst), Avalonia UI, Uno Platform

Appcast & Signing

UpSparkle requires an appcast XML feed hosted at a public URL. Every update package must be signed with an EdDSA key pair.

Generate your keys with the generate_keys tool that ships with Sparkle, then follow the EdDSA signatures guide to sign your releases.

Development

Before starting development, fetch the native dependencies by running the script for your platform.

macOS / Linux

./getlibs.sh

Windows (PowerShell)

.\Get-Libraries.ps1

Both scripts download and extract binaries based on .gitbinmodules into the libs directory. To use a different version of Sparkle or WinSparkle, edit .gitbinmodules and re-run the script.

Credits

License

MIT License

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.6 55 7/30/2026

UpSparkle 1.0.6.0 - 2026-07-30

Added

- UpSparkleUpdater: single public class with a unified API for Windows and macOS.
- Initialize(Assembly, appcastUrl, edDSAPublicKey): reads company, app name, and version
 from standard assembly attributes. Falls back to AssemblyMetadata entries with keys
 SUFeedURL and SUPublicEDKey when appcastUrl/edDSAPublicKey are not passed directly.
- InitializeAsync: async counterpart of Initialize.
- CheckUpdateWithUI / CheckUpdateWithUIAsync: opens the native update dialog.
- Dispose: shuts down the native updater and releases native resources.
- Properties populated after Initialize: IsInitialized, AppcastUrl, EdDSAPublicKey,
 CompanyName, AppName, AppVersion.
- Constants AppcastUrlMetadataKey (SUFeedURL) and EdDSAPublicKeyMetadataKey (SUPublicEDKey).
- Windows backend wrapping WinSparkle 0.9.3, with automatic x86/x64/Arm64 detection.
- macOS / Mac Catalyst backend wrapping Sparkle 2.9.4 via libMacSparkle 1.0.9.
- netstandard2.0 target, compatible with .NET Framework 4.6.2+ and .NET 6+.
- Native binaries for win-x86, win-x64, win-arm64, and osx bundled using the standard
 NuGet runtimes/ layout — no manual DLL copying needed.

Changed

- Refined Sparkle framework extraction and macOS app bundle integration.
- Improved NuGet build metadata and runtime asset packaging for Sparkle/WinSparkle.
- Merged the old UpSparkle.Mac and UpSparkle.Windows projects into a single library with
 runtime platform dispatch.
- Switched native loading from static DllImport to dynamic LoadLibrary/dlopen to support
 the NuGet runtimes/ layout.