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
| Strategy | Who hosts | Signing | Staged rollout | Rollback | Installer included | Effort |
|---|---|---|---|---|---|---|
| App store | The store | Handled through the store’s submission process | Depends on the store; some offer flighting or percentage releases | Usually by submitting a new version; review may delay it | Yes, the store installs | Low once accepted; review on every release |
| Platform installer with built-in updates (MSIX, ClickOnce-style) | You, on a web server or file share | Required by the format; you need a certificate | Not built in; you manage separate update locations | Limited; often means publishing a higher version | Yes, the package is the installer | Medium; packaging rules to learn |
| Framework-bundled updater | You, on your own server or release storage | Code signing and sometimes a feed signature, set up by you | Rarely built in; you build it on top | Usually by republishing an older build as the latest | Usually, through the framework’s packager | Medium; tied to one framework |
| Rolling your own | You | Whatever you design and maintain | Whatever you build | Whatever you build | You build or pick one | High; a second product to maintain |
| Hosted update service | The service | Usually manifests or packages signed by the service with your keys | Usually through channels or rings | Usually by pointing a channel at an older build | Varies by service | Low 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
betachannel first, then assign the same build toproduction. 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 store | An app store |
| Ship internal apps to centrally managed Windows PCs | A platform installer format |
| Use one framework and like running your own release server | That framework’s updater |
| Have offline networks or unusual compliance rules | Rolling your own |
| Want installer, updates, channels and rollback without running servers, on Windows | A 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.