Open-source project
GeneralLibrary/GeneralUpdate avatar
GeneralLibrary/GeneralUpdate

GeneralUpdate: a self-update component for .NET desktop apps

Unlimited Updates, Boundless Upgrades.

826 stars76 forksC#Apache-2.0

At a glance

What is it?
GeneralUpdate is an Apache-2.0 auto-upgrade component for .NET applications that deliberately avoids depending on any UI framework, so the same updater can sit inside a WPF, WinForms, WinUI, Avalonia or MAUI app. The trade-off is that the newest published artefacts are release candidates on a 10.x line, and the README does not document the API.
Who is it for?
Adopt GeneralUpdate if you ship a .NET desktop application on Windows, Linux or macOS and want the update check and download logic inside your own binary rather than delegated to a store or an installer. Do not adopt it expecting a turnkey updater with documented configuration, because the README points to the wiki and a separate samples repository rather than describing the API, and the newest published artefacts are v10.5.0 release candidates.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly C#, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

An updater that carries no UI framework of its own

GeneralUpdate is described as a cross-platform application auto-upgrade component based on .NET Standard 2.0 and released under the Apache 2.0 licence. The design decision that shapes everything else is stated in the next line: it does not rely on any UI framework, minimizing resource consumption during updates. That is unusual for a .NET component, because the .NET ecosystem has a habit of dragging WinForms or WPF into the dependency graph through a single transitive reference, and an updater that then needs those assemblies present at the moment it replaces files is an updater with a bootstrapping problem. A component that renders nothing avoids it. The consequence is that the same updater can live inside an application built on any of the UI stacks the project lists in its topics: Avalonia, console, MAUI, WinForms, WinUI and WPF. The platform badge in the README covers Linux, macOS and Windows, which is the other half of what makes the no-UI approach worth the effort.

The samples are where the integration story lives

The README does not describe the API, the configuration keys or the update file format, and it does not give an install command. What it does give is a pointer to a one-click startup example that helps you understand how to integrate automatic upgrade capabilities into your application, and a link to a separate samples repository, GeneralLibrary/GeneralUpdate-Samples, whose tree includes a UI folder. That samples repository is referenced again in the acknowledgements section, which lists the control libraries whose example code the project credits: Semi.Avalonia and Ursa.Avalonia for Avalonia, WPFDevelopers and LayUI for WPF, and AntdUI for WinForms. Reading that list tells you the shape of the intended integration better than any API description would. The updater does not draw its own window. It asks your UI to present something, which is why the sample code lives with UI component libraries in the first place. If you are evaluating this, budget time for reading the samples repository and the project wiki, since the README alone will not tell you how to wire it up.

A 10.x line still shipping release candidates

The release history tells you where the project is. The most recent published artefacts are v10.5.0-rc.2 on 2026-09-19, v10.5.0-rc.1 on 2026-06-25 and v10.5.0-beta.7 on 2026-06-21. So the current line is 10.5.0 and it has not yet reached a final tag, and it took about three months between the first of those candidates and the second before the release candidate. The repository itself is not archived and the last push was on 2026-10-18, so work is landing on the branch even though the newest tag is a release candidate. For a library whose job is to replace a running application with a new one, that release channel matters in a way it does not for an ordinary library. A user-facing application that ships a release candidate updater inherits whatever rough edges remain in the candidate. The sensible sequence is to point your build at the final 10.5.0 package once it appears, and to pin the exact version you tested.

What the repository contains beyond the source

The tree is organised like a mature community project rather than a single-author library. Alongside src/ and tests/ there is a docs/ directory, a NuGet.Config at the root, and a set of files that describe the process around the code: CODE_OF_CONDUCT.md, CONTRIBUTING.md, SECURITY.md, a LICENSE file and a PROMO.md. The presence of a separate NuGet.Config is a small signal about the build, since that file is where package sources and any credentials for private feeds are pinned, and shipping one is how a project that publishes to more than one feed keeps the restore step reproducible. The SECURITY.md file is the disclosure route, and for a component whose job is downloading and executing a binary on a user's machine, a documented way to report a vulnerability matters more than it would for a typical library. PROMO.md and the section of the README promoting the author's RoutinAI gateway show that this repository also carries commercial messaging, which is worth noting when you are scanning the project for how it is funded and maintained.

Chinese-first, mirrored on three forges

The README carries a link to a Chinese version, README_ZHCN.md, and the project distributes its code across GitHub, Gitee and GitCode with a table of the three. There is also a Discord server linked from the README and an invitation to a discussion group for companies using or evaluating the component, with the official site at justerzhu.cn. The maintainers clearly work across both languages, so it is worth considering which language the wiki documentation and the discussion group actually operate in before you rely on them. If you are integrating this into an English-speaking team's codebase, check whether the wiki you are reading is the same one your team will read later.

Where the approach stops working

The strongest argument against this component is not a bug but a category question. A self-updating application takes responsibility for something the operating system or the distribution platform can do for you: a store-managed app gets updates pushed by the platform, with no updater code in your binary, no download-and-replace logic to get right, and no question of what happens when the update half-applies. The in-app updater exists for the case where your application is distributed outside a store, downloaded from your own site, or installed on a machine where you cannot control the update channel. That is a real and common case for .NET desktop software, and for it the in-binary updater is the right shape. The other limit is that a self-updater is a security-critical component with a large surface. It fetches a file, verifies it, and runs it, and the README does not describe the signature verification or rollback behaviour, so those questions have to be answered from the wiki and the source before you ship it to users.

A component rather than a product

The framing matters when you compare this with a full installer framework. A framework such as a click-to-run or package-based distribution pipeline owns the whole update story: it decides when to update, it stages the new version, it handles the file locks of a running process, and it can roll back. GeneralUpdate deliberately does not own any of that. It is a component you call, and the workflow around it, the version check, the download, the user prompt and the restart, is assembled by you. The pitch in the README, a one-click startup example, is about the integration cost being small, not about the component owning the lifecycle. That is a reasonable scope for a library, and it is also the reason the samples repository matters so much: the integration cost is where the complexity lives, and the samples are where you would look for it.

Editorial conclusion

Adopt GeneralUpdate if you ship a .NET desktop application on Windows, Linux or macOS and want the update check and download logic inside your own binary rather than delegated to a store or an installer. Do not adopt it expecting a turnkey updater with documented configuration, because the README points to the wiki and a separate samples repository rather than describing the API, and the newest published artefacts are v10.5.0 release candidates. Before you commit, read the wiki and the GeneralUpdate-Samples repository for the one-click startup example, confirm your app targets .NET Standard 2.0 or later, and decide whether you can wait for the 10.5.0 final rather than shipping a release candidate to users.

Frequently asked questions

What is GeneralUpdate?

It is a cross-platform application auto-upgrade component for .NET, based on .NET Standard 2.0 and released under the Apache 2.0 licence. It does not rely on any UI framework, which is meant to minimize resource consumption during updates, and it works with Avalonia, WPF, WinForms, WinUI, MAUI and console applications.

Does GeneralUpdate support Linux and macOS?

The README carries a platform badge covering Linux, macOS and Windows, and the repository topics include linux alongside avalonia, maui, winforms, winui and wpf. The component itself is built on .NET Standard 2.0, which is what lets the same code run on all three.

How do I integrate GeneralUpdate into my application?

The README does not document the API or an install command. It points to a one-click startup example and to the separate GeneralLibrary/GeneralUpdate-Samples repository, whose UI folder holds example code contributed alongside control libraries such as Semi.Avalonia, Ursa.Avalonia, WPFDevelopers, LayUI and AntdUI, plus the project wiki.

Is GeneralUpdate available as a stable release?

The newest published artefacts are v10.5.0-rc.2 on 2026-09-19, v10.5.0-rc.1 on 2026-06-25 and v10.5.0-beta.7 on 2026-06-21, so the 10.5.0 line is still on release candidates. The repository is not archived and the last push was on 2026-10-18.

Official sources

  1. GeneralLibrary/GeneralUpdate on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/generallibrary-generalupdate.svg)](https://hysenlabs.com/projects/generallibrary-generalupdate)

Was this useful?