This is a work-in-progress draft document intended to be edited by others. It came about after a conversation between some experienced snapcrafters. It may be helpful, or it may not. Please contribute.
The goal of this document is to provide an answer to the question, “Is this thing suited to being a snap?”. Enthusiastic contributors looking to snap things may want to reference this document.
It may contain opinions, but it would be better if it were objective facts. The document may change over time as the tools and platform evolve.
Note that some things may not make sense to package in isolation but may make sense when bundled in a snap with other things, either in a leaf “application” snap, or in a “content” snap.
Absolutely yes
These are classes of applications which snap is well suited for today. There’s a ton of prior art here.
- Desktop applications - Built using GNOME, KDE, Electron
- Command-line utilities - Shell scripts, Python programs, or tools written in Go or Rust
- Examples: Bottom
- Games - Built using SDL, Unity, Defold
- Examples: Warzone2100
- Servers - both single application/components, and multi-component bundles
Qualified yes
These are also possible, but may require some work beyond actually snapping the application, or need approval for publishing.
- Backup utilities - will likely require classic confinement to work correctly
- System components - will almost certainly require additional interface development
- Examples: Cups, NetworkManager, PulseAudio
Qualified no
These might be possible, but will almost certainly require a conversation with the store review team or snapd development teams to get these over the line. Even then, the answer may well be “no”.
- Application storefronts - as these may bypass store approval / vetting process
- Examples: Flathub enabled storefront
- Exceptions: Steam, Snap-Store
- Orchestration tools - likely to require classic confinement and will almost certainly install additional software
- Exceptions: Juju
Almost certainly not
Highly likely these things will just not work well when snapped in isolation, but might make sense as part of something else - such as in the case of libraries.
- System libraries - will be inaccessible to most applications
- Examples: zlib1g
- Headers - they’ll likely be installed somewhere inaccessible by build tools
- Shells
- Examples: Bash, Zsh, fish