We explained what Flatpak, Snap, and AppImage are in the article How Do They Stack? published over 2 years ago and while the technologies have improved a lot since that time, I’m evaluating them from the perspective of a software developer.
Sandboxing / Confinement
You can run AppImage without sandboxing as well as use it with different sandboxes e.g. AppArmor and Firejail.
Snap can run without sandboxing but you cannot use it with different sandboxes as it is tightly coupled to AppArmor.
Flatpak can neither run without sandboxing nor can it be used with different sandboxes other than Bubblewrap.
Installation / Execution
One can run an AppImage after setting the executable without root access, without decompressing it, and on an offline system.
Snap needs to be installed by snapd, cannot run without root access until after it is installed nor can its downloadable file be placed next to
.dmg which users can install on offline systems, but it can run from an uncompressed source.
Flatpak needs to be installed by a Flatpak client-side tool, cannot run without root access until after installation, cannot run from an uncompressed source. Also,
.flatpakref files require Internet and
.flatpak bundles require a run-time to be installed.
AppImage can store and run applications from non-standard locations such as CD-ROM and network shares. Flatpak can do the same after some configuration, while Snap currently can’t.
In this section, AppImage takes the cake because its applications are more flexible.
Application Distribution & Updates
The central repository for Flatpak and Snap is FlatHub, and Snap Store respectively. Users can download AppImages from AppImageHub which is a cataloguing platform for software available as AppImage bundles.
Unlike AppImage and FlatPak, however, the Snap Store is the only dominant app store with one repo per device. Whether that is a good or bad thing is for you to decide.
Apps packaged using all 3 methods can have multiple versions running in parallel and can be easily copied to another machine. However, they have their unique implementations.
All 3 support binary delta updates but only AppImage apps can be self-updating as Snap apps need snapd to be installed and Flatpak apps need Flatpak to be installed.
AppImages and Snap remain compressed at all times (Flatpak is compressed only on the server-side) and are typically smaller in size than Flatpak apps. AppImage is also independent of any distro maker and aims to unify Linux platform ecosystems.
Snap is owned by Canonical and places its base snap over the underlying distro, while Flatpak is a Red Hat initiative that places a Yocto distro over the underlying distro. Also, unlike with Snap where developers need to pay to Canonical, AppImage and Flatpak are free to use.
From where I stand, AppImages are the ideal packaging method to use because it is the most convenient for both developers and end users. However, it is possible for them to coexist especially when there are cases developers will prefer to use one of the other. Tell us what you think in the comments section below.
My research for this article was greatly influenced by Similar projects and the Reddit threads here and here. Feel free to check them out for more insight.