Snap Documentation


#1

Welcome to the home of snap, snapd, and snapcraft documentation.

ⓘ Snaps are app packages for desktop, cloud and IoT that are easy to install, secure, cross-platform and dependency-free.

  • snap is both the command line interface and the application package format
  • snapd is the background service that manages and maintains your snaps
  • snapcraft is the command and the framework used to build your own snaps
  • Snap Store provides a place to upload your snaps, and for users to browse and install

Discovering snap:

Getting started Discover how snaps are used, installed, updated, removed and managed
Installing snap Step-by-step installation instructions for all major Linux distributions, from Arch to Zorin
Channels Get the latest stable releases of your favourite software, or run cutting edge versions

Advanced features:

Controlling updates Snaps update automatically, but you can also manually control when and how often
Snapshots Save, backup and restore the state of one or more installed snaps
Parallel installs Install more than one version of the same snap on your system

Building your own snaps:

Snapcraft overview Learn how to Install snapcraft and build your first snaps
Creating a snap Step-by-step guides for Python, Go, Electron, pre-built binaries and more
The snapcraft format A comprehensive look at the various values that can be defined within a snap’s build file

Most of this documentation can be collaboratively discussed and changed on the respective topic in the doc category of the Snapcraft forum. See the documentation guidelines if you’d like to contribute.

Navigation

Using

Publishing

Developing

URLs

Mapping table
Topic Path
Tab completion for snaps /tab-completion
Debuging snap startup performance issues /debuging-startup-performance
The personal-files interface /personal-files-interface
The system-files interface /system-files-interface
Snapshots /snapshots
Architectures /architectures
Build on Docker /build-on-docker
Build on LXD /build-on-lxd
C/C++ applications /c-c-applications
Channels /channels
Choosing a security model /choosing-a-security-model
Commands and aliases /commands-and-aliases
Configuration in snaps /configuration-in-snaps
Creating a snap /creating-a-snap
Creating your developer account /creating-your-developer-account
Debugging Building Snaps /debugging-building-snaps
Developing hotplug interfaces /developing-hotplug-interfaces
Documentation guidelines /documentation-guidelines
Electron apps /electron-apps
Environment variables that Snapcraft exposes /environment-variables-snapcraft-exposes
Environment variables /environment-variables
Getting ready for stable /getting-ready-for-stable
Getting started /getting-started
Go applications /go-applications
Hotplug support /hotplug-support
Install snapcraft on macOS /install-snapcraft-on-macos
Installing snap on Arch Linux /installing-snap-on-arch-linux
Installing snap on CentOS /installing-snap-on-centos
Installing snap on Debian /installing-snap-on-debian
Installing snap on Deepin /installing-snap-on-deepin
Installing snap on Elementary OS /installing-snap-on-elementary-os
Installing snap on Fedora /installing-snap-on-fedora
Installing snap on GalliumOS /installing-snap-on-galliumos
Installing snap on KDE Neon /installing-snap-on-kde-neon
Installing snap on Kubuntu /installing-snap-on-kubuntu
Installing snap on Linux Mint /installing-snap-on-linux-mint
Installing snap on Lubuntu /installing-snap-on-lubuntu
Installing snap on Manjaro Linux /installing-snap-on-manjaro-linux
Installing snap on openSUSE /installing-snap-on-opensuse
Installing snap on Parrot Security OS /installing-snap-on-parrot-security-os
Installing snap on Raspbian /installing-snap-on-raspbian
Installing snap on Solus /installing-snap-on-solus
Installing snap on Ubuntu /installing-snap-on-ubuntu
Installing snap on Xubuntu /installing-snap-on-xubuntu
Installing snap on Zorin OS /installing-snap-on-zorin-os
Installing snapd /installing-snapd
Installing the Snap Store app /installing-snap-store-app
Interface hooks /interface-hooks
Interface management /interface-management
Java applications /java-applications
Keeping snaps up to date /keeping-snaps-up-to-date
MOOS applications /moos-applications
Node apps /node-apps
Parallel Installs /parallel-installs
Process for aliases, auto-connections and tracks /process-for-aliases-auto-connections-and-tracks
Process for reviewing classic confinement snaps /reviewing-classic-confinement-snaps
Python apps /python-apps
Registering your app name /registering-your-app-name
Release notes: Snapcraft 3.0 /release-notes-snapcraft-3-0
Release notes: Snapcraft 3.1.1 /release-notes-snapcraft-3-1-1
Release notes: Snapcraft 3.1 /release-notes-snapcraft-3-1
Release notes: Snapcraft 3.2 /release-notes-snapcraft-3-2
Release notes: Snapcraft 3.3 /release-notes-snapcraft-3-3
Releasing to the Snap Store /releasing-to-the-snap-store
Releasing your app /releasing-your-app
Remote (reusable) parts /remote-reusable-parts
ROS applications /ros-applications
ROS2 applications /ros2-applications
Ruby applications /ruby-applications
Rust applications /rust-applications
Scriptlets /scriptlets
Service management /service-management
Snap confinement /snap-confinement
Snap Documentation (page deprecated) /snap-documentation
Snap epochs /snap-epochs
Snap layouts /snap-layouts
Snapcraft advanced grammar /snapcraft-advanced-grammar
Snapcraft app and service metadata /snapcraft-app-and-service-metadata
Snapcraft build, debug and publishing docs roadmap /snapcraft-docs-roadmap
Snapcraft filesets /snapcraft-filesets
Snapcraft lifecycle /snapcraft-lifecycle
Snapcraft overview /snapcraft-overview
Snapcraft parts metadata /snapcraft-parts-metadata
Snapcraft plugin API /snapcraft-plugin-api
Snapcraft plugins /snapcraft-plugins
Snapcraft release notes /snapcraft-release-notes
Snapcraft top-level metadata /snapcraft-top-level-metadata
Snapcraft.yaml reference /snapcraft-yaml-reference
Snapshots /snapshots
Supported interfaces /supported-interfaces
Supported plugins /supported-plugins
Supported snap hooks /supported-snap-hooks
System options /system-options
Tab completion for snaps /tab-completion-for-snaps
The account-control interface /account-control-interface
The accounts-service interface /accounts-service-interface
The adb-support interface /adb-support-interface
The alsa interface /alsa-interface
The ament plugin /ament-plugin
The ant plugin /ant-plugin
The autopilot-introspection interface /autopilot-introspection-interface
The autotools plugin /autotools-plugin
The avahi-control interface /avahi-control-interface
The avahi-observe interface /avahi-observe-interface
The block-devices interface /block-devices-interface
The bluetooth-control interface /bluetooth-control-interface
The bluez interface /bluez-interface
The bool-file interface /bool-file-interface
The broadcom-asic-control interface /broadcom-asic-control-interface
The browser-support interface /browser-support-interface
The calendar-service interface /calendar-service-interface
The camera interface /camera-interface
The can-bus interface /can-bus-interface
The catkin plugin /catkin-plugin
The catkin-tools plugin /catkin-tools-plugin
The classic-support interface /classic-support-interface
The cmake plugin /cmake-plugin
The content interface /content-interface
The core-support interface /core-support-interface
The cpu-control interface /cpu-control-interface
The cups-control interface /cups-control-interface
The daemon-notify interface /daemon-notify-interface
The dbus interface /dbus-interface
The dcdbas-control interface /dcdbas-control-interface
The desktop interface /desktop-interface
The desktop interfaces /desktop-interfaces
The desktop-legacy interface /desktop-legacy-interface
The device-buttons interface /device-buttons-interface
The display-control interface /display-control-interface
The docker interface /docker-interface
The docker-support interface /docker-support-interface
The docs roadmap /docs-roadmap
The dotnet plugin /dotnet-plugin
The dummy interface /dummy-interface
The dump plugin /dump-plugin
The dvb interface /dvb-interface
The firewall-control interface /firewall-control-interface
The framebuffer interface /framebuffer-interface
The fuse-support interface /fuse-support-interface
The fwupd interface /fwupd-interface
The gadget snap /gadget-snap
The go plugin /go-plugin
The gpg-keys interface /gpg-keys-interface
The gpg-public-keys interface /gpg-public-keys-interface
The gpio interface /gpio-interface
The gpio-memory-control interface /gpio-memory-control-interface
The Gradle plugin /gradle-plugin
The greengrass-support interface /greengrass-support-interface
The gsettings interface /gsettings-interface
The gulp plugin /gulp-plugin
The hardware-observe interface /hardware-observe-interface
The hardware-random-control interface /hardware-random-control-interface
The hardware-random-observe interface /hardware-random-observe-interface
The hidraw interface /hidraw-interface
The home interface /home-interface
The hostname-control interface /hostname-control-interface
The i2c interface /i2c-interface
The iio interface /iio-interface
The intel-mei interface /intel-mei-interface
The io-ports-control interface /io-ports-control-interface
The jdk plugin /jdk-plugin
The joystick interface /joystick-interface
The juju-client-observe interface /juju-client-observe-interface
The kbuild plugin /kbuild-plugin
The kernel-module-control interface /kernel-module-control-interface
The kernel-module-observe interface /kernel-module-observe-interface
The kernel plugin /kernel-plugin
The kernel snap /kernel-snap
The kubernetes-support interface /kubernetes-support-interface
The kvm interface /kvm-interface
The libvirt interface /libvirt-interface
The locale-control interface /locale-control-interface
The location-control interface /location-control-interface
The location-observe interface /location-observe-interface
The log-observe interface /log-observe-interface
The lxd interface /lxd-interface
The lxd-support interface /lxd-support-interface
The make plugin /make-plugin
The maliit interface /maliit-interface
The maven plugin /maven-plugin
The media-hub interface /media-hub-interface
The meson plugin /meson-plugin
The mir interface /mir-interface
The modem-manager interface /modem-manager-interface
The mount-observe interface /mount-observe-interface
The mpris interface /mpris-interface
The netlink-audit interface /netlink-audit-interface
The netlink-connector interface /netlink-connector-interface
The network-bind interface /network-bind-interface
The network-control interface /network-control-interface
The network interface /network-interface
The network-manager interface /network-manager-interface
The network-observe interface /network-observe-interface
The network-setup-control interface /network-setup-control-interface
The network-setup-observe interface /network-setup-observe-interface
The network-status interface /network-status-interface
The nil plugin /nil-plugin
The nodejs plugin /nodejs-plugin
The ofono interface /ofono-interface
The online-accounts-service interface /online-accounts-service-interface
The opengl interface /opengl-interface
The openvswitch interface /openvswitch-interface
The openvswitch-support interface /openvswitch-support-interface
The optical-drive interface /optical-drive-interface
The password-manager-service interface /password-manager-service-interface
The personal-files interface /personal-files-interface
The physical-memory-control interface /physical-memory-control-interface
The physical-memory-observe interface /physical-memory-observe-interface
The plainbox-provider plugin /plainbox-provider-plugin
The ppp interface /ppp-interface
The process-control interface /process-control-interface
The pulseaudio interface /pulseaudio-interface
The python plugin /python-plugin
The qmake plugin /qmake-plugin
The raw-usb interface /raw-usb-interface
The removable-media interface /removable-media-interface
The ruby plugin /ruby-plugin
The rust plugin /rust-plugin
The scons plugin /scons-plugin
The screen-inhibit-control interface /screen-inhibit-control-interface
The serial-port interface /serial-port-interface
The shutdown interface /shutdown-interface
The snap format /snap-format
The SNAPCRAFT_BUILD_ENVIRONMENT environment variable /snapcraft-build-environment-variable
The snapcraft format /snapcraft-format
The snapd-control interface /snapd-control-interface
The snapd roadmap /snapd-roadmap
The spi interface /spi-interface
The ssh-keys interface /ssh-keys-interface
The ssh-public-keys interface /ssh-public-keys-interface
The storage-framework-service interface /storage-framework-service-interface
The system-files interface /system-files-interface
The system-observe interface /system-observe-interface
The system /snap directory /system-snap-directory
The system-trace interface /system-trace-interface
The thumbnailer-service interface /thumbnailer-service-interface
The time-control interface /time-control-interface
The timeserver-control interface /timeserver-control-interface
The timezone-control interface /timezone-control-interface
The tpm interface /tpm-interface
The u2f-devices interface /u2f-devices-interface
The ubuntu-download-manager interface /ubuntu-download-manager-interface
The udisks2 interface /udisks2-interface
The uhid interface /uhid-interface
The unity7 interface /unity7-interface
The unity8-calendar interface /unity8-calendar-interface
The unity8-contacts interface /unity8-contacts-interface
The unity8 interface /unity8-interface
The upower-observe interface /upower-observe-interface
The waf plugin /waf-plugin
The wayland interface /wayland-interface
The x11 interface /x11-interface
Using external metadata /using-external-metadata
Using in-development features in `snapcraft.yaml` /using-in-development-features
Writing local plugins /writing-local-plugins
Building the snap /building-snaps
Building the snap on Docker /build-snaps-on-docker

Redirects

Mapping table
Path Location
/security-model /choosing-a-security-model

New docs.snapcraft.io publishing process
#2

Hi Robin,

Two suggestions for the format, and one comment about the data:

1. Information is boring

The output is long and boring for most people. It’s okay to have it here as it’s closely related with a table of contents, which is one of the purposes of this page, and having it here also makes it convenient to fetch at once for the dynamic systems. But we don’t need to show it all the time. We can fix that by folding it:

URLs

… content goes here …

Implemented with:

[details=URLs]
... content goes here ...
[/details]

2. Format is hard to read

It’s a lot of data and naturally repetitive. We can probably improve the situation significantly by reformatting it in a more stable way. For example:

Page URL
Creating a snap /creating-a-snap

This is not only shorted, but it’ll turn out a lot more pleasant because the two columns will align. The awkward arrow, which doesn’t align well in the font used here, is also gone.

It’s implemented with:

| Page | URL |
| --- | --- |
| https://forum.snapcraft.io/t/creating-a-snap/6799 | /creating-a-snap |

Then, a third comment on the actual data:

3. Not offering any value

This is a premature comment, but worth raising it now before the data is final. All those links seem to simply point to a URL that uses the exact same text as the title. This doesn’t seem to offer any value, and it’s a lot of trouble for no value. If that’s what we’ll do in 99% of the cases, then it’d be worth asking what the motivation is again.


#3

Thanks @niemeyer

I agree that it looks very long and boring and hard to read, and I like your suggestions 1 and 2. I’ll make it a <table> in a <details> element.

I can appreciate point 3, and it would be very nice if it was possible to make it automatically simply use the slug as the pretty URL. However, this doesn’t work practically for 2 reasons:

  1. Slugs change as soon as someone changes the title of the topic. One of the requirements here is that these URLs are crafted, rather than user-editable, and that they don’t change. So the idea here is that, even though initially these pretty URLs might closely resemble the slug (although I did strip out extra words like “the”), the slug will probably change over time but the URL will persist unless we change it deliberately.
  2. It’s very slow to try to retrieve a topic by slug alone (without ID) (you need to do a general search, then crawl through search results to check the titles/slugs manually). It’s much more efficient to have a mapping somewhere.

We could make the mapping shorted, by simply doing:

| ID | Path |
| -- | ---- |
| 6799 | /creating-a-snap |

I opted for the more verbose version:

| ID | Path |
| -- | ---- |
| https://forum.snapcraft.io/t/creating-a-snap/6799 | https://docs.snapcraft.io/creating-a-snap |

Because this then shows both sides as links, which mean that users can actually click on them to see the page, either on the forum or the documentation side.

But if you think the succinctness of the data in the table outweighs the clickability, I’m happy to entertain the shorter version.


#4

I get it. My point is a more conceptual one, to be raised upstream: if we are not doing anything other than taking Graham’s suggestion of title in 99.9% of the cases, then the whole exercise seems kind of pointless. We don’t need so many people in the loop.

Can we please use the shorter version? The second part is not really a link, but rather the suffix that generates the link. So if the link doesn’t work, it’s the underlying mechanism that is broken and not the link itself. Also, the link won’t work as soon as the file is put live either, as there will necessarily be at least a short delay between it being saved and the system acting on it. So the shorter form is both more pleasant to read, and more appropriate it seems.


#5

Can we please use the shorter version?

Okay, so which do you prefer?

ID Path
6799 /creating-a-snap

Or:

ID Path
6799 /creating-a-snap

Or:

Topic Path
Creating a snap /creating-a-snap

#6

The last one feels like a pretty good trade off between ease of writing it the first time, ease of reading, and convenience in terms of clicking on the link to see the content.