The best Windows installer you've never heard of: Clowd.Squirrel
Tags: installer, windows
Published: 2022-01-24 03:09:12

The [Clowd.Squirrel installer framework](https://github.com/clowd/Clowd.Squirrel) makes your app install and update as smoothly as Chrome:

- No UAC prompt when installing or updating. Installs to `%localappdata%`
- No tedious wizards. Just installs and launches the app.
- Download and install the new version side-by-side while still running the app. Updating is as fast as re-launching the app.
- Supports delta update packages to minimize download time.
- Automatic install of required VC redistributable or .NET frameworks.
- Easy integration and package building.

This is a modern offshoot of the [original Squirrel](https://github.com/Squirrel/Squirrel.Windows), which is [focusing on .NET Framework only](https://github.com/clowd/Clowd.Squirrel/issues/8) and is no longer in active development. Clowd.Squirrel was forked to add support for .NET 5/6. It also has a bunch of other handy features like a progress bar on the install splash screen.

## Non-C# apps

The .NET support is very good, and it [also has the capability to work with other apps](https://github.com/clowd/Clowd.Squirrel/blob/develop/docs/using/custom-squirrel-events-non-cs.md).

However, the fork hasn't yet made its way back to Electron - it's not yet in [Electron Forge](https://www.electronforge.io/config/makers/squirrel.windows) or [electron-builder](https://www.electron.build/configuration/squirrel-windows.html). Hopefully we'll see the Clowd.Squirrel fork show up there.

## My implementation

I'm now using this with [VidCoder](https://vidcoder.net/) Beta and it's worked well. I appreciate being able to write install/uninstall actions in C# as part of the main app rather than in some weird language like Delphi (for Inno Setup).

I ended up writing a small console `.exe` to perform steps that need UAC-elevation like adding some registry keys to react to DVD/Blu-ray drive insert events. So right now, install/uninstall still have a UAC prompt but the updates don't.

I decided to have two update modes:

1. **Silent**. The next time you launch it has the new version. This is the default because I'm convinced that most users care about getting an update way less than the developers typically do.
2. **Prompt to restart/apply update on launch**. This one will let you know there's a new version when you start up. Some people just really want to get the latest version.

## Native splash screens for .NET apps

As part of the installs/updates the main program might be started several times with different special arguments to perform bookkeeping or fire custom logic. Normally this is invisible, but I had a native splashscreen image registered for my WPF app. The splash screen was popping up multiple times as Squirrel did its work. I had to switch to using a managed window to show the splash screen. It now shows up a bit later during app startup, but I think the tradeoff is worth it for the easy updates.

Though getting rid of the native splash screen had a side benefit as well: I could retire all the logic that was double-displaying messageboxes on launch. For some reason when you have a native splash screen the first message box gets auto-dismissed, so I had to fire them twice for one to get through.