Auto-updates

Desktop app update strategies compared

By the Omnihorn team · · 7 min read

There are five common desktop app update strategies: distribute through an app store, use a platform installer format with built-in updates, use your framework’s bundled updater, build your own update system, or use a hosted update service. They differ in who hosts the files, how signing works, whether you can stage and roll back releases, and your effort.

What are the main ways to update a desktop app?

Five strategies cover almost every desktop app. An app store hosts and updates the app for you under the store’s rules. Platform installer formats, such as MSIX or ClickOnce-style deployments, update through Windows itself. Framework updaters ship with your app framework. Some teams build their own. Hosted update services run the server side and often the client.

Each one solves the same problem, getting a new version onto PCs that already have the old one, with different trade-offs. The questions below are the ones that usually decide it: who hosts the files, who signs what, whether you can release to a few users first, whether you can go back, whether an installer is included, and how much work it is.

Desktop app update strategies side by side

StrategyWho hostsSigningStaged rolloutRollbackInstaller includedEffort
App storeThe storeHandled through the store’s submission processDepends on the store; some offer flighting or percentage releasesUsually by submitting a new version; review may delay itYes, the store installsLow once accepted; review on every release
Platform installer with built-in updates (MSIX, ClickOnce-style)You, on a web server or file shareRequired by the format; you need a certificateNot built in; you manage separate update locationsLimited; often means publishing a higher versionYes, the package is the installerMedium; packaging rules to learn
Framework-bundled updaterYou, on your own server or release storageCode signing and sometimes a feed signature, set up by youRarely built in; you build it on topUsually by republishing an older build as the latestUsually, through the framework’s packagerMedium; tied to one framework
Rolling your ownYouWhatever you design and maintainWhatever you buildWhatever you buildYou build or pick oneHigh; a second product to maintain
Hosted update serviceThe serviceUsually manifests or packages signed by the service with your keysUsually through channels or ringsUsually by pointing a channel at an older buildVaries by serviceLow to medium

The cells are general. Individual products within each category differ, so check the specifics of whatever you pick against the questions in this table.

When does an app store make sense?

An app store is the least work for updates once your app is accepted. The store hosts the files, installs the app and updates it. In exchange you follow its packaging and content rules, go through review on each release, and share the customer relationship with the store.

It fits consumer apps that benefit from store discovery and can live with review delays. It fits poorly when you need to ship a fix within the hour, when your app needs capabilities the store restricts, or when your customers install software through their own IT tools.

What about MSIX and ClickOnce-style installers?

Platform installer formats let Windows handle installation and, with the right configuration, check a location you host for newer versions. Install and removal are clean because the platform tracks the files. The cost is the packaging model: the package must be signed, some apps need changes to run packaged, and the update policy options are fixed by the format.

These formats suit line-of-business apps in organisations that already manage Windows centrally. Rollback and staged releases are usually something you assemble yourself, for example with separate update locations for testers and everyone else.

Are framework-bundled updaters enough?

Many desktop frameworks include an updater module or a recommended one. It handles the client side: checking a feed, downloading and replacing the app. You still host the release files, sign them, decide how testers get builds early, and decide what "go back" means.

If your team uses one framework and is comfortable running a small piece of release infrastructure, this is a common and reasonable choice. It gets harder when you have several apps on different stacks, or when the person who set up the release server leaves.

Should you build your own update system?

Building your own gives full control and full responsibility. A safe updater needs a version check, a signed manifest, hash-verified downloads of changed files, an atomic apply with rollback, check intervals, rate limits, and a way to point testers and everyone else at different builds. The steps are in how to auto-update a desktop app.

Teams that do this well usually have unusual requirements: offline networks, custom delta formats or strict data residency. For everyone else the risk is spending months on infrastructure that customers never see, and then maintaining it.

What does a hosted update service do?

A hosted update service runs the server side of updates for you: storage, the version check, signing and the release controls. Depending on the service, it also provides the client or the installer. You upload builds and decide which users get which build; the service delivers them.

The trade-off is dependence on a vendor and its platform support. Check which operating systems it covers, how signing keys are held, how you go back to an older build, and what happens to installed copies if you leave.

Where Omnihorn fits

Omnihorn is a hosted update service that also builds the Windows installer. You upload the folder your build produces, from the dashboard or from CI. Omnihorn signs each build’s manifest with your app’s own key, and builds a setup.exe that installs the app and keeps it updated. Channels such as beta and production point at builds, which is how you stage a release and how you roll one back.

  • Hosting: Omnihorn stores the builds and answers the update checks.
  • Signing: every manifest is signed with an Ed25519 key that belongs to the app; installers are not code-signed by default, so SmartScreen warns until a certificate is configured. See Security.
  • Staged rollout: release to a beta channel first, then assign the same build to production. See Channels and rollouts and beta channels.
  • Rollback: point the channel at an older build; see rolling back a release.
  • Installer: built from Installer Studio with one button; see Installer Studio.
  • Effort: no updater code in your app and no release server to run. There is a free plan; see pricing.

Which update strategy should you choose?

Pick the strategy that matches who installs your app and how much release infrastructure you want to own. The table below is a starting point, not a rule.

If you…Consider
Sell to consumers who browse a storeAn app store
Ship internal apps to centrally managed Windows PCsA platform installer format
Use one framework and like running your own release serverThat framework’s updater
Have offline networks or unusual compliance rulesRolling your own
Want installer, updates, channels and rollback without running servers, on WindowsA hosted service such as Omnihorn
›What is the easiest way to add auto-updates to a desktop app?

Usually a store (if your app fits its rules) or a hosted update service, because both run the server side for you. Rolling your own is the most work.

›Can I switch update strategies later?

Yes, but installed copies only know the updater they shipped with. Plan one release that installs the new mechanism, then retire the old one once most users have moved.

›How do I release to a few users first?

Use separate channels or rings: testers install from a beta channel, everyone else from production, and you promote a build from one to the other once it has proved itself.

›Does Omnihorn support macOS or Linux?

Not yet. Windows is the only supported platform today.