Snap documentation

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:

Managing 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
Glossary /docs/glossary
The login-session-observe interface /docs/login-session-interface
The raw-volume interface /docs/raw-volume-interface
Parts environment variables /docs/parts-environment-variables
Release notes: Snapcraft 3.9 /docs/release-notes-snapcraft-3-9
Remote build /docs/remote-build
Build options /docs/build-options
Updating gadget boot assets /docs/gadget-boot-assets
The kde-neon extension /docs/kde-neon-extension
Qt5 and KDE Frameworks Applications /docs/qt5-kde-applications
Adding OpenGL/GPU support to a snap /docs/gpu-support
Desktop files for menu integration /docs/desktop-menu-icon-support
Desktop applications /docs/desktop-applications
GTK3 applications /docs/gtk3-applications
Snapcraft Extensions /docs/snapcraft-extensions
The gnome-3-28 extension /docs/gnome-3-28-extension
The audio-playback interface /docs/audio-playback-interface
The audio-record interface /docs/audio-record-interface
Building a snap RPM for Red Hat Enterprise Linux (RHEL) 8 /docs/building-snap-rpms-on-rhel
System usernames /docs/system-usernames
Release notes: Snapcraft 3.8 /docs/release-notes-snapcraft-3-8
The gpio-control interface /docs/gpio-control-interface
The appstream-metadata interface /docs/appstream-metadata-interface
The packagekit-control interface /docs/packagekit-control-interface
Ubuntu Core boot modes /docs/ubuntu-core-boot-modes
Installing snap on Red Hat Enterprise Linux (RHEL) /docs/installing-snap-on-red-hat
Permission requests /docs/permission-requests
Services and daemons /docs/services-and-daemons
Snap Store metrics /docs/snap-store-metrics
Using the Snap Store /docs/using-the-snap-store
The conda plugin /docs/the-conda-plugin
The crystal plugin /docs/the-crystal-plugin
The colcon plugin /docs/the-colcon-plugin
Debugging building snaps /docs/debugging-building-snaps
Release management /docs/release-management
Deprecation notices /docs/deprecation-notices
Deprecation notice: 1 /docs/deprecation-notice-1
Deprecation notice: 2 /docs/deprecation-notice-2
Deprecation notice: 3 /docs/deprecation-notice-3
Deprecation notice: 4 /docs/deprecation-notice-4
Deprecation notice: 5 /docs/deprecation-notice-5
Deprecation notice: 6 /docs/deprecation-notice-6
Deprecation notice: 7 /docs/deprecation-notice-7
Deprecation notice: 8 /docs/deprecation-notice-8
Deprecation notice: 9 /docs/deprecation-notice-9
Deprecation notice: 10 /docs/deprecation-notice-10
Deprecation notice: 10 /docs/deprecation-notices/dn10
Parts lifecycle /docs/parts-lifecycle
Release notes: Snapcraft 3.7 /docs/release-notes-snapcraft-3-7
Release notes: Snapcraft 3.6 /docs/release-notes-snapcraft-3-6
https://forum.snapcraft.io/t/release-notes-snapcraft-3-5/11651 /docs/release-notes-snapcraft-3-5
https://forum.snapcraft.io/t/release-notes-snapcraft-3-4/11650 /docs/release-notes-snapcraft-3-4
https://forum.snapcraft.io/t/troubleshoot-snap-building/11938 /docs/troubleshoot-snap-building
https://forum.snapcraft.io/t/defining-a-command/12060 /docs/defining-a-command
https://forum.snapcraft.io/t/iterating-over-a-build/12143 /docs/iterating-over-a-build
https://forum.snapcraft.io/t/build-and-staging-dependencies/11451 /docs/build-and-staging-dependencies
https://forum.snapcraft.io/t/adding-parts/11473 /docs/adding-parts
https://forum.snapcraft.io/t/base-snaps/11198 /docs/base-snaps
https://forum.snapcraft.io/t/adding-global-metadata/11486 /docs/adding-global-metadata
https://forum.snapcraft.io/t/snapcraft-checklist/10926 /docs/snapcraft-checklist
https://forum.snapcraft.io/t/tab-completion-for-snaps/2261 /docs/tab-completion
https://forum.snapcraft.io/t/debuging-snap-startup-performance-issues/9337 /docs/debuging-startup-performance
https://forum.snapcraft.io/t/the-personal-files-interface/9357 /docs/personal-files-interface
https://forum.snapcraft.io/t/the-system-files-interface/9358 /docs/system-files-interface
https://forum.snapcraft.io/t/snapshots/9468 /docs/snapshots
https://forum.snapcraft.io/t/architectures/4972 /docs/architectures
https://forum.snapcraft.io/t/build-on-docker/4158 /docs/build-on-docker
https://forum.snapcraft.io/t/build-on-lxd/4157 /docs/build-on-lxd
https://forum.snapcraft.io/t/c-c-applications/7817 /docs/c-c-applications
https://forum.snapcraft.io/t/channels/551 /docs/channels
https://forum.snapcraft.io/t/choosing-a-security-model/6847 /docs/choosing-a-security-model
https://forum.snapcraft.io/t/commands-and-aliases/3950 /docs/commands-and-aliases
https://forum.snapcraft.io/t/configuration-in-snaps/510 /docs/configuration-in-snaps
https://forum.snapcraft.io/t/creating-a-snap/6799 /docs/creating-a-snap
https://forum.snapcraft.io/t/creating-your-developer-account/6760 /docs/creating-your-developer-account
Debugging building snaps /docs/debugging-building-snaps
https://forum.snapcraft.io/t/developing-hotplug-interfaces/10759 /docs/developing-hotplug-interfaces
https://forum.snapcraft.io/t/documentation-guidelines/3798 /docs/documentation-guidelines
https://forum.snapcraft.io/t/electron-apps/6748 /docs/electron-apps
https://forum.snapcraft.io/t/environment-variables/7983 /docs/environment-variables
https://forum.snapcraft.io/t/getting-ready-for-stable/4305 /docs/getting-ready-for-stable
https://forum.snapcraft.io/t/getting-started/3876 /docs/getting-started
https://forum.snapcraft.io/t/go-applications/7818 /docs/go-applications
https://forum.snapcraft.io/t/hotplug-support/10750 /docs/hotplug-support
https://forum.snapcraft.io/t/install-snapcraft-on-macos/9607 /docs/install-snapcraft-on-macos
https://forum.snapcraft.io/t/installing-snap-on-arch-linux/6758 /docs/installing-snap-on-arch-linux
https://forum.snapcraft.io/t/installing-snap-on-centos/10020 /docs/installing-snap-on-centos
https://forum.snapcraft.io/t/installing-snap-on-debian/6742 /docs/installing-snap-on-debian
https://forum.snapcraft.io/t/installing-snap-on-deepin/6791 /docs/installing-snap-on-deepin
https://forum.snapcraft.io/t/installing-snap-on-elementary-os/6768 /docs/installing-snap-on-elementary-os
https://forum.snapcraft.io/t/installing-snap-on-fedora/6755 /docs/installing-snap-on-fedora
https://forum.snapcraft.io/t/installing-snap-on-galliumos/6801 /docs/installing-snap-on-galliumos
https://forum.snapcraft.io/t/installing-snap-on-kde-neon/6792 /docs/installing-snap-on-kde-neon
https://forum.snapcraft.io/t/installing-snap-on-kubuntu/9967 /docs/installing-snap-on-kubuntu
https://forum.snapcraft.io/t/installing-snap-on-linux-mint/6765 /docs/installing-snap-on-linux-mint
https://forum.snapcraft.io/t/installing-snap-on-lubuntu/9965 /docs/installing-snap-on-lubuntu
https://forum.snapcraft.io/t/installing-snap-on-manjaro-linux/6807 /docs/installing-snap-on-manjaro-linux
https://forum.snapcraft.io/t/installing-snap-on-opensuse/8375 /docs/installing-snap-on-opensuse
https://forum.snapcraft.io/t/installing-snap-on-parrot-security-os/6810 /docs/installing-snap-on-parrot-security-os
https://forum.snapcraft.io/t/installing-snap-on-raspbian/6754 /docs/installing-snap-on-raspbian
https://forum.snapcraft.io/t/installing-snap-on-solus/6803 /docs/installing-snap-on-solus
https://forum.snapcraft.io/t/installing-snap-on-ubuntu/6740 /docs/installing-snap-on-ubuntu
https://forum.snapcraft.io/t/installing-snap-on-xubuntu/9963 /docs/installing-snap-on-xubuntu
https://forum.snapcraft.io/t/installing-snap-on-zorin-os/6804 /docs/installing-snap-on-zorin-os
https://forum.snapcraft.io/t/installing-snapd/6735 /docs/installing-snapd
https://forum.snapcraft.io/t/installing-the-snap-store-app/10077 /docs/installing-snap-store-app
https://forum.snapcraft.io/t/interface-hooks/8214 /docs/interface-hooks
https://forum.snapcraft.io/t/interface-management/6154 /docs/interface-management
https://forum.snapcraft.io/t/java-applications/7819 /docs/java-applications
https://forum.snapcraft.io/t/keeping-snaps-up-to-date/7022 /docs/keeping-snaps-up-to-date
https://forum.snapcraft.io/t/moos-applications/7820 /docs/moos-applications
https://forum.snapcraft.io/t/node-apps/6747 /docs/node-apps
https://forum.snapcraft.io/t/parallel-installs/7679 /docs/parallel-installs
https://forum.snapcraft.io/t/process-for-aliases-auto-connections-and-tracks/455 /docs/process-for-aliases-auto-connections-and-tracks
https://forum.snapcraft.io/t/process-for-reviewing-classic-confinement-snaps/1460 /docs/reviewing-classic-confinement-snaps
https://forum.snapcraft.io/t/python-apps/6741 /docs/python-apps
https://forum.snapcraft.io/t/registering-your-app-name/6793 /docs/registering-your-app-name
https://forum.snapcraft.io/t/release-notes-snapcraft-3-0/10704 /docs/release-notes-snapcraft-3-0
https://forum.snapcraft.io/t/release-notes-snapcraft-3-1-1/10722 /docs/release-notes-snapcraft-3-1-1
https://forum.snapcraft.io/t/release-notes-snapcraft-3-1/10719 /docs/release-notes-snapcraft-3-1
https://forum.snapcraft.io/t/release-notes-snapcraft-3-2/10723 /docs/release-notes-snapcraft-3-2
https://forum.snapcraft.io/t/release-notes-snapcraft-3-3/10725 /docs/release-notes-snapcraft-3-3
https://forum.snapcraft.io/t/releasing-to-the-snap-store/6848 /docs/releasing-to-the-snap-store
https://forum.snapcraft.io/t/releasing-your-app/6795 /docs/releasing-your-app
https://forum.snapcraft.io/t/remote-reusable-parts/4233 /docs/remote-reusable-parts
https://forum.snapcraft.io/t/ros-applications/7822 /docs/ros-applications
https://forum.snapcraft.io/t/ros2-applications/7823 /docs/ros2-applications
https://forum.snapcraft.io/t/ruby-applications/7824 /docs/ruby-applications
https://forum.snapcraft.io/t/rust-applications/7826 /docs/rust-applications
https://forum.snapcraft.io/t/scriptlets/4892 /docs/scriptlets
https://forum.snapcraft.io/t/service-management/3965 /docs/service-management
https://forum.snapcraft.io/t/snap-confinement/6233 /docs/snap-confinement
https://forum.snapcraft.io/t/snap-documentation/3781 /docs/snap-documentation
https://forum.snapcraft.io/t/snap-epochs/10316 /docs/snap-epochs
https://forum.snapcraft.io/t/snap-layouts/7207 /docs/snap-layouts
https://forum.snapcraft.io/t/snapcraft-advanced-grammar/8349 /docs/snapcraft-advanced-grammar
https://forum.snapcraft.io/t/snapcraft-app-and-service-metadata/8335 /docs/snapcraft-app-and-service-metadata
https://forum.snapcraft.io/t/snapcraft-build-debug-and-publishing-docs-roadmap/10273 /docs/snapcraft-docs-roadmap
https://forum.snapcraft.io/t/snapcraft-filesets/8973 /docs/snapcraft-filesets
https://forum.snapcraft.io/t/snapcraft-lifecycle/5123 /docs/snapcraft-lifecycle
https://forum.snapcraft.io/t/snapcraft-overview/8940 /docs/snapcraft-overview
https://forum.snapcraft.io/t/snapcraft-parts-metadata/8336 /docs/snapcraft-parts-metadata
https://forum.snapcraft.io/t/snapcraft-plugin-api/5124 /docs/snapcraft-plugin-api
https://forum.snapcraft.io/t/snapcraft-plugins/4284 /docs/snapcraft-plugins
https://forum.snapcraft.io/t/snapcraft-release-notes/10721 /docs/snapcraft-release-notes
https://forum.snapcraft.io/t/snapcraft-top-level-metadata/8334 /docs/snapcraft-top-level-metadata
https://forum.snapcraft.io/t/snapcraft-yaml-reference/4276 /docs/snapcraft-yaml-reference
https://forum.snapcraft.io/t/snapshots/9468 /docs/snapshots
https://forum.snapcraft.io/t/supported-interfaces/7744 /docs/supported-interfaces
https://forum.snapcraft.io/t/supported-plugins/8080 /docs/supported-plugins
https://forum.snapcraft.io/t/supported-snap-hooks/3795 /docs/supported-snap-hooks
https://forum.snapcraft.io/t/system-options/87 /docs/system-options
https://forum.snapcraft.io/t/tab-completion-for-snaps/2261 /docs/tab-completion-for-snaps
https://forum.snapcraft.io/t/the-account-control-interface/7746 /docs/account-control-interface
https://forum.snapcraft.io/t/the-accounts-service-interface/7802 /docs/accounts-service-interface
https://forum.snapcraft.io/t/the-adb-support-interface/9720 /docs/adb-support-interface
https://forum.snapcraft.io/t/the-alsa-interface/7766 /docs/alsa-interface
https://forum.snapcraft.io/t/the-ament-plugin/8643 /docs/ament-plugin
https://forum.snapcraft.io/t/the-ant-plugin/8507 /docs/ant-plugin
https://forum.snapcraft.io/t/the-autopilot-introspection-interface/7768 /docs/autopilot-introspection-interface
https://forum.snapcraft.io/t/the-autotools-plugin/8616 /docs/autotools-plugin
https://forum.snapcraft.io/t/the-avahi-control-interface/7769 /docs/avahi-control-interface
https://forum.snapcraft.io/t/the-avahi-observe-interface/7770 /docs/avahi-observe-interface
https://forum.snapcraft.io/t/the-block-devices-interface/9721 /docs/block-devices-interface
https://forum.snapcraft.io/t/the-bluetooth-control-interface/7771 /docs/bluetooth-control-interface
https://forum.snapcraft.io/t/the-bluez-interface/7772 /docs/bluez-interface
https://forum.snapcraft.io/t/the-bool-file-interface/7803 /docs/bool-file-interface
https://forum.snapcraft.io/t/the-broadcom-asic-control-interface/7773 /docs/broadcom-asic-control-interface
https://forum.snapcraft.io/t/the-browser-support-interface/7775 /docs/browser-support-interface
https://forum.snapcraft.io/t/the-calendar-service-interface/7804 /docs/calendar-service-interface
https://forum.snapcraft.io/t/the-camera-interface/7776 /docs/camera-interface
https://forum.snapcraft.io/t/the-can-bus-interface/7805 /docs/can-bus-interface
https://forum.snapcraft.io/t/the-catkin-plugin/8644 /docs/catkin-plugin
https://forum.snapcraft.io/t/the-catkin-tools-plugin/8645 /docs/catkin-tools-plugin
https://forum.snapcraft.io/t/the-classic-support-interface/7777 /docs/classic-support-interface
https://forum.snapcraft.io/t/the-cmake-plugin/8621 /docs/cmake-plugin
https://forum.snapcraft.io/t/the-content-interface/1074 /docs/content-interface
https://forum.snapcraft.io/t/the-core-support-interface/7778 /docs/core-support-interface
https://forum.snapcraft.io/t/the-cpu-control-interface/7780 /docs/cpu-control-interface
https://forum.snapcraft.io/t/the-cups-control-interface/7779 /docs/cups-control-interface
https://forum.snapcraft.io/t/the-daemon-notify-interface/7809 /docs/daemon-notify-interface
https://forum.snapcraft.io/t/the-dbus-interface/2038 /docs/dbus-interface
https://forum.snapcraft.io/t/the-dcdbas-control-interface/7781 /docs/dcdbas-control-interface
https://forum.snapcraft.io/t/the-desktop-interface/7783 /docs/desktop-interface
https://forum.snapcraft.io/t/the-desktop-interfaces/2042 /docs/desktop-interfaces
https://forum.snapcraft.io/t/the-desktop-legacy-interface/7782 /docs/desktop-legacy-interface
https://forum.snapcraft.io/t/the-device-buttons-interface/8598 /docs/device-buttons-interface
https://forum.snapcraft.io/t/the-display-control-interface/9723 /docs/display-control-interface
https://forum.snapcraft.io/t/the-docker-interface/7787 /docs/docker-interface
https://forum.snapcraft.io/t/the-docker-support-interface/7810 /docs/docker-support-interface
https://forum.snapcraft.io/t/the-docs-roadmap/8763 /docs/docs-roadmap
https://forum.snapcraft.io/t/the-dotnet-plugin/8584 /docs/dotnet-plugin
https://forum.snapcraft.io/t/the-dummy-interface/7811 /docs/dummy-interface
https://forum.snapcraft.io/t/the-dump-plugin/8007 /docs/dump-plugin
https://forum.snapcraft.io/t/the-dvb-interface/7812 /docs/dvb-interface
https://forum.snapcraft.io/t/the-firewall-control-interface/7813 /docs/firewall-control-interface
https://forum.snapcraft.io/t/the-framebuffer-interface/7814 /docs/framebuffer-interface
https://forum.snapcraft.io/t/the-fuse-support-interface/7816 /docs/fuse-support-interface
https://forum.snapcraft.io/t/the-fwupd-interface/7825 /docs/fwupd-interface
https://forum.snapcraft.io/t/the-gadget-snap/696 /docs/gadget-snap
https://forum.snapcraft.io/t/the-go-plugin/8505 /docs/go-plugin
https://forum.snapcraft.io/t/the-gpg-keys-interface/7827 /docs/gpg-keys-interface
https://forum.snapcraft.io/t/the-gpg-public-keys-interface/7828 /docs/gpg-public-keys-interface
https://forum.snapcraft.io/t/the-gpio-interface/7829 /docs/gpio-interface
https://forum.snapcraft.io/t/the-gpio-memory-control-interface/7830 /docs/gpio-memory-control-interface
https://forum.snapcraft.io/t/the-gradle-plugin/5390 /docs/gradle-plugin
https://forum.snapcraft.io/t/the-greengrass-support-interface/7831 /docs/greengrass-support-interface
https://forum.snapcraft.io/t/the-gsettings-interface/7832 /docs/gsettings-interface
https://forum.snapcraft.io/t/the-gulp-plugin/8511 /docs/gulp-plugin
https://forum.snapcraft.io/t/the-hardware-observe-interface/7833 /docs/hardware-observe-interface
https://forum.snapcraft.io/t/the-hardware-random-control-interface/7835 /docs/hardware-random-control-interface
https://forum.snapcraft.io/t/the-hardware-random-observe-interface/7836 /docs/hardware-random-observe-interface
https://forum.snapcraft.io/t/the-hidraw-interface/7837 /docs/hidraw-interface
https://forum.snapcraft.io/t/the-home-interface/7838 /docs/home-interface
https://forum.snapcraft.io/t/the-hostname-control-interface/7841 /docs/hostname-control-interface
https://forum.snapcraft.io/t/the-i2c-interface/7842 /docs/i2c-interface
https://forum.snapcraft.io/t/the-iio-interface/7846 /docs/iio-interface
https://forum.snapcraft.io/t/the-intel-mei-interface/10203 /docs/intel-mei-interface
https://forum.snapcraft.io/t/the-io-ports-control-interface/7848 /docs/io-ports-control-interface
https://forum.snapcraft.io/t/the-jdk-plugin/8508 /docs/jdk-plugin
https://forum.snapcraft.io/t/the-joystick-interface/7849 /docs/joystick-interface
https://forum.snapcraft.io/t/the-juju-client-observe-interface/7850 /docs/juju-client-observe-interface
https://forum.snapcraft.io/t/the-kbuild-plugin/8633 /docs/kbuild-plugin
https://forum.snapcraft.io/t/the-kernel-module-control-interface/7853 /docs/kernel-module-control-interface
https://forum.snapcraft.io/t/the-kernel-module-observe-interface/9719 /docs/kernel-module-observe-interface
https://forum.snapcraft.io/t/the-kernel-plugin/8642 /docs/kernel-plugin
https://forum.snapcraft.io/t/the-kernel-snap/697 /docs/kernel-snap
https://forum.snapcraft.io/t/the-kubernetes-support-interface/7855 /docs/kubernetes-support-interface
https://forum.snapcraft.io/t/the-kvm-interface/7856 /docs/kvm-interface
https://forum.snapcraft.io/t/the-libvirt-interface/7858 /docs/libvirt-interface
https://forum.snapcraft.io/t/the-locale-control-interface/7859 /docs/locale-control-interface
https://forum.snapcraft.io/t/the-location-control-interface/7860 /docs/location-control-interface
https://forum.snapcraft.io/t/the-location-observe-interface/7861 /docs/location-observe-interface
https://forum.snapcraft.io/t/the-log-observe-interface/7862 /docs/log-observe-interface
https://forum.snapcraft.io/t/the-lxd-interface/7863 /docs/lxd-interface
https://forum.snapcraft.io/t/the-lxd-support-interface/7864 /docs/lxd-support-interface
https://forum.snapcraft.io/t/the-make-plugin/8622 /docs/make-plugin
https://forum.snapcraft.io/t/the-maliit-interface/7872 /docs/maliit-interface
https://forum.snapcraft.io/t/the-maven-plugin/4282 /docs/maven-plugin
https://forum.snapcraft.io/t/the-media-hub-interface/7873 /docs/media-hub-interface
https://forum.snapcraft.io/t/the-meson-plugin/8623 /docs/meson-plugin
https://forum.snapcraft.io/t/the-mir-interface/7874 /docs/mir-interface
https://forum.snapcraft.io/t/the-modem-manager-interface/7875 /docs/modem-manager-interface
https://forum.snapcraft.io/t/the-mount-observe-interface/7876 /docs/mount-observe-interface
https://forum.snapcraft.io/t/the-mpris-interface/7877 /docs/mpris-interface
https://forum.snapcraft.io/t/the-netlink-audit-interface/7878 /docs/netlink-audit-interface
https://forum.snapcraft.io/t/the-netlink-connector-interface/7879 /docs/netlink-connector-interface
https://forum.snapcraft.io/t/the-network-bind-interface/7881 /docs/network-bind-interface
https://forum.snapcraft.io/t/the-network-control-interface/7882 /docs/network-control-interface
https://forum.snapcraft.io/t/the-network-interface/7880 /docs/network-interface
https://forum.snapcraft.io/t/the-network-manager-interface/7883 /docs/network-manager-interface
https://forum.snapcraft.io/t/the-network-observe-interface/7884 /docs/network-observe-interface
https://forum.snapcraft.io/t/the-network-setup-control-interface/7885 /docs/network-setup-control-interface
https://forum.snapcraft.io/t/the-network-setup-observe-interface/7888 /docs/network-setup-observe-interface
https://forum.snapcraft.io/t/the-network-status-interface/7890 /docs/network-status-interface
https://forum.snapcraft.io/t/the-nil-plugin/8646 /docs/nil-plugin
https://forum.snapcraft.io/t/the-nodejs-plugin/8514 /docs/nodejs-plugin
https://forum.snapcraft.io/t/the-ofono-interface/7891 /docs/ofono-interface
https://forum.snapcraft.io/t/the-online-accounts-service-interface/7893 /docs/online-accounts-service-interface
https://forum.snapcraft.io/t/the-opengl-interface/7894 /docs/opengl-interface
https://forum.snapcraft.io/t/the-openvswitch-interface/7896 /docs/openvswitch-interface
https://forum.snapcraft.io/t/the-openvswitch-support-interface/7897 /docs/openvswitch-support-interface
https://forum.snapcraft.io/t/the-optical-drive-interface/7898 /docs/optical-drive-interface
https://forum.snapcraft.io/t/the-password-manager-service-interface/7899 /docs/password-manager-service-interface
https://forum.snapcraft.io/t/the-personal-files-interface/9357 /docs/personal-files-interface
https://forum.snapcraft.io/t/the-physical-memory-control-interface/7900 /docs/physical-memory-control-interface
https://forum.snapcraft.io/t/the-physical-memory-observe-interface/7901 /docs/physical-memory-observe-interface
https://forum.snapcraft.io/t/the-plainbox-provider-plugin/8647 /docs/plainbox-provider-plugin
https://forum.snapcraft.io/t/the-ppp-interface/7902 /docs/ppp-interface
https://forum.snapcraft.io/t/the-process-control-interface/7903 /docs/process-control-interface
https://forum.snapcraft.io/t/the-pulseaudio-interface/7906 /docs/pulseaudio-interface
https://forum.snapcraft.io/t/the-python-plugin/8529 /docs/python-plugin
https://forum.snapcraft.io/t/the-qmake-plugin/8628 /docs/qmake-plugin
https://forum.snapcraft.io/t/the-raw-usb-interface/7908 /docs/raw-usb-interface
https://forum.snapcraft.io/t/the-removable-media-interface/7910 /docs/removable-media-interface
https://forum.snapcraft.io/t/the-ruby-plugin/8587 /docs/ruby-plugin
https://forum.snapcraft.io/t/the-rust-plugin/8588 /docs/rust-plugin
https://forum.snapcraft.io/t/the-scons-plugin/8629 /docs/scons-plugin
https://forum.snapcraft.io/t/the-screen-inhibit-control-interface/7911 /docs/screen-inhibit-control-interface
https://forum.snapcraft.io/t/the-serial-port-interface/7913 /docs/serial-port-interface
https://forum.snapcraft.io/t/the-shutdown-interface/7914 /docs/shutdown-interface
https://forum.snapcraft.io/t/the-snap-format/698 /docs/snap-format
https://forum.snapcraft.io/t/the-snapcraft-format/8337 /docs/snapcraft-format
https://forum.snapcraft.io/t/the-snapd-control-interface/7915 /docs/snapd-control-interface
https://forum.snapcraft.io/t/the-snapd-roadmap/1973 /docs/snapd-roadmap
https://forum.snapcraft.io/t/the-spi-interface/7916 /docs/spi-interface
https://forum.snapcraft.io/t/the-ssh-keys-interface/7917 /docs/ssh-keys-interface
https://forum.snapcraft.io/t/the-ssh-public-keys-interface/7918 /docs/ssh-public-keys-interface
https://forum.snapcraft.io/t/the-storage-framework-service-interface/7919 /docs/storage-framework-service-interface
https://forum.snapcraft.io/t/the-system-files-interface/9358 /docs/system-files-interface
https://forum.snapcraft.io/t/the-system-observe-interface/7921 /docs/system-observe-interface
https://forum.snapcraft.io/t/the-system-snap-directory/2817 /docs/system-snap-directory
https://forum.snapcraft.io/t/the-system-trace-interface/7922 /docs/system-trace-interface
https://forum.snapcraft.io/t/the-thumbnailer-service-interface/7923 /docs/thumbnailer-service-interface
https://forum.snapcraft.io/t/the-time-control-interface/7924 /docs/time-control-interface
https://forum.snapcraft.io/t/the-timeserver-control-interface/7925 /docs/timeserver-control-interface
https://forum.snapcraft.io/t/the-timezone-control-interface/7926 /docs/timezone-control-interface
https://forum.snapcraft.io/t/the-tpm-interface/7927 /docs/tpm-interface
https://forum.snapcraft.io/t/the-u2f-devices-interface/9722 /docs/u2f-devices-interface
https://forum.snapcraft.io/t/the-ubuntu-download-manager-interface/7928 /docs/ubuntu-download-manager-interface
https://forum.snapcraft.io/t/the-udisks2-interface/7930 /docs/udisks2-interface
https://forum.snapcraft.io/t/the-uhid-interface/7931 /docs/uhid-interface
https://forum.snapcraft.io/t/the-unity7-interface/7786 /docs/unity7-interface
https://forum.snapcraft.io/t/the-unity8-calendar-interface/7933 /docs/unity8-calendar-interface
https://forum.snapcraft.io/t/the-unity8-contacts-interface/7934 /docs/unity8-contacts-interface
https://forum.snapcraft.io/t/the-unity8-interface/7932 /docs/unity8-interface
https://forum.snapcraft.io/t/the-upower-observe-interface/7935 /docs/upower-observe-interface
https://forum.snapcraft.io/t/the-waf-plugin/8630 /docs/waf-plugin
https://forum.snapcraft.io/t/the-wayland-interface/7784 /docs/wayland-interface
https://forum.snapcraft.io/t/the-x11-interface/7785 /docs/x11-interface
https://forum.snapcraft.io/t/using-external-metadata/4642 /docs/using-external-metadata
https://forum.snapcraft.io/t/using-in-development-features-in-snapcraft-yaml/5766 /docs/using-in-development-features
https://forum.snapcraft.io/t/writing-local-plugins/5125 /docs/writing-local-plugins
https://forum.snapcraft.io/t/building-the-snap/6800 /docs/building-snaps
https://forum.snapcraft.io/t/building-the-snap-on-docker/6757 /docs/build-snaps-on-docker

Redirects

Mapping table
Path Location
/docs/security-model /docs/choosing-a-security-model
/docs/build-snaps-on-docker /docs/build-on-docker

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.

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.

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.

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

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.

2 Likes

All the content of Building the snap on Docker has been merged into Build on Docker a while ago.

The first page however, still shows up in google searches:

image

So I removed the content of the first page and added a notice redirecting to the correct one. Is it possible to remove the page entirely and create a redirect pointing /docs/build-snaps-on-docker to /docs/build-on-docker?

That’s a good point, thanks - and thanks for the edits. I’ll add the redirect now.

1 Like

I’ve been gathering and updating documentation for creating snaps of desktop applications. This is tricky to get right and very specific to which toolkit you use.

Given the many questions on this forum about desktop toolkits, it’s clear that many people are struggling with this, so we should give it a clear place in the docs, but I’m not sure where.

The easiest route might be to just add Desktop app support to the navigation, but it doesn’t really fit in there. I added a link to this document in the checklist page, but I don’t think that is visible enough.

Creating a snap has the “common languages and platforms” table. I was thinking of adding another table or column called “Desktop toolkits” which contains “Electron” (moved from “languages”), “Qt”, “GTK”, “Java Swing”, “wxWidgets” and “other”. This could be expanded in the future with other toolkits and things like OpenGL (which is more complex than simply adding an interface) and ffmpeg.

However, many of these topics don’t really fit into the style of a complete walkthrough. I can update them a bit to look more similar, but I’m not sure if it makes sense to turn pages like Qt5 and GTK into complete walkthroughs since these are meant to be used together with one of the languages. For example, an application might use Python + GTK3 or Go + Qt5 etc.

@degville, what do you think?

Thanks for working on this, and for highlighting desktop toolkit documentation. You’ve raised a really important point, and one we’ve spent considerable time discussing internally. It’s definitely something we want to get right.

Part of the delay in writing a good set of docs for this has been waiting for desktop extensions to mature enough to handle the hard dependency parts - these extensions should transform the process, and they’re close being ready.

Another part has been that we wanted to make sure there was a wider doc support structure for snap building before tackling desktop integration. This is what we’ve been working on with the Snapcraft build, debug and publishing docs roadmap, and it’s almost complete too.

I think we can do this in both of the ways you suggest. A walkthrough is really useful, and helps give a wider context to how snaps are built, even when they don’t fit your exact use-case. It’s also great for Google, etc. Adding a new table to Creating a snap to link to these makes good sense to me.

But as you also mention, a walkthrough doesn’t fit into our current (published) docs style. I think to integrate both, we need to make sure the core details for what’s discussed in any walkthrough are included in the more formal doc structure. I think walkthroughs should be a little like CI testing in code - they bring together the various elements of what’s already documented into a fully working example, but they shouldn’t be adding new ‘functionality’ themselves.

Adding to the wider docs is something I (or anyone, really!) can do if you feel like we’re not explaining something clearly, or if you feel a topic has become vague or outgrown its original intent. And it’s easier to do when that content already exists, whatever form it takes.

TLDR:

  • thanks!
  • I think walkthrough-style docs for desktop toolkit integration is a good idea
  • desktop toolkit integration is currently changing, but still worth documenting
  • a new table on Creating a snap is a good place for them
  • I/we need to make sure whatever we cover in a walkthrough is easily discoverable and more formally documented in the normal doc structure. This may be easier to do after a walkthrough has been written.

I’ll also have a discussion with the Snapcraft/Advocacy teams on how best we can handle desktop toolkit integration.

I have some stuff I need your help with. I’m not completely done cleaning up these pages, but having them online would make my job a bit easier.

Please give the following pages a canonical url.

Feel free to change the path etc.

Topic Path
Adding OpenGL/GPU support to a snap /docs/gpu-support
Desktop files for menu integration /docs/desktop-menu-icon-support
Desktop applications /docs/desktop-applications
GTK3 applications /docs/gtk3-applications
Snapcraft Extensions /docs/snapcraft-extensions
The gnome-3-28 extension /docs/gnome-3-28-extension
The audio-playback interface /docs/audio-playback-interface
The audio-record interface /docs/audio-record-interface

Pages to turn into a wiki

I made them or I want to edit them.

Pages to add to the sidebar

I propose to add this to the sidebar. I’ll also link to the specific tutorials (GTK3, qt5, …) from the “creating a snap” page.

Pages to redirect

redirect https://snapcraft.io/docs/snapcraft-lifecycle to https://snapcraft.io/docs/parts-lifecycle

1 Like

I’ll make all the necessary fixes you’ve requested - thank you for all this!