How I Built Automatic Updates Into a Desktop App (Without the Headache)

Demi Taylor Nimmo
Software Developer

One of the most overlooked features in desktop software is the update experience. We've all been there — an application prompts you to download an installer, run it manually, click through five screens, and restart. It's clunky, and most users just ignore it.
When I was working on a C# desktop application built with Avalonia, I wanted something better. The goal was simple: when a user opens the app, it should silently check if a newer version exists and handle everything automatically. No manual steps, no friction.
The Problem With Traditional Updates
Desktop apps don't update themselves the way websites do. A website can push changes instantly — the next time you visit, you're already on the latest version. Desktop apps are different. The software lives on the user's machine, which means getting new versions to them requires a deliberate process.
The traditional approach — sending users a download link or installer — puts all the effort on them. Most won't bother, which means users end up running outdated versions with old bugs and missing features.
The Solution: Velopack + GitLab Releases
I used two tools to solve this cleanly:
Velopack is a library that handles the entire update lifecycle for desktop apps. It checks for new versions, downloads them in the background, and applies the update when the app restarts. From the user's perspective, they just close and reopen the app — that's it.
GitLab Releases is where new versions of the app are stored. Every time a new version is published, it's uploaded to GitLab as a release. Velopack knows where to look and does the rest.
How It Works in Practice
When the application launches for the first time, Velopack quietly reaches out to GitLab in the background. It compares the version currently installed on the user's machine against the latest release available. If a newer version exists, it downloads it silently — no pop-ups, no interruptions.
The next time the user closes and reopens the app, the update is already applied. They're on the latest version without having done anything at all.
Why This Matters
For users, it means they never have to think about updates. The app just stays current.
For developers, it means bug fixes and new features actually reach people. There's nothing more frustrating than knowing you've fixed a problem, only to find out users are still experiencing it because they never updated.
It's a small detail that makes a big difference to the overall quality of the product — and in my experience, the best software is full of small details like that.
Enjoyed this post?

