AppImage follows a very simple architecture, which is explained in this section.
An AppImage consists of two parts: a runtime and a filesystem image. For the current type 2, the filesystem in use is SquashFS.
What happens when an AppImage is run is that the operating system runs the AppImage as an executable. The runtime, the executable part, tries to mount the filesystem image using FUSE. If that succeeds, the AppDir is available in a temporary mountpoint, and can be used like a read-only directory.
The runtime continues by calling the AppDir’s “entrypoint” AppRun using the operating system facilities. There are no checks performed by the runtime, the operating system is simply tasked with the execution of
<AppDir mountpoint>/AppRun. This provides a lot of flexibility, as AppRun can be an arbitrary executable, a script with a shebang, or even a simple symlink to another executable within the AppDir. The file must be executable.
The contents of an AppDir are completely user-specified, although there are tools that help with packaging. For more information, see the :ref:packaging guide <ref-packaging-guide>`.