How to Install an AppImage on Linux and Add It to Your Menu

LinuxForDevices featured banner: a single AppImage file mounted and appearing as a menu entry

An AppImage arrives as a single file, and it runs without touching your package manager. Marking it executable and starting it takes three commands.

Everything a normal install does for you stays your job, which is why a fresh AppImage so often needs a missing system library, a mount helper, or a menu entry added by hand before it behaves like an installed application.

What an AppImage is, and what it will not do for you

An AppImage is two parts glued into one file: a small runtime that mounts what follows it, and a SquashFS image holding the application. Running that file mounts the image read-only through Filesystem in Userspace (FUSE) rather than unpacking anything into your system directories.

Nothing lands in /usr, and no package database records that the application exists.

The design buys portability, because the application carries the libraries that differ between distributions. What it does not buy is dependency resolution.

A deb or a Flatpak tells the package manager which packages to fetch. An AppImage ships its own copies and expects the base system to supply the rest, which is why one file starts cleanly and the next one asks for a library your distribution never installed.

Projects publish these files on their own download pages, and the AppImage project keeps a catalogue of the applications that do. That is a different distribution model from a repository, and the difference shows up when a library is missing.

FormatWhere the files liveDependenciesUpdates
AppImageone file wherever you put itbundled, apart from the system graphics and core librariesonly when the builder embedded update information
deb package/usr, recorded in the package databaseresolved from the repositoriesapt, when you choose to run it
Flatpaka user or system install under a shared runtimetaken from the Flatpak runtimeflatpak update or a store refresh
Snapa squashfs image managed by snapdtaken from the snap’s own baseautomatic by default

If your habits come from the repository side of Linux, the closest siblings to this workflow are installing an RPM package on Ubuntu and running a downloaded bin file. Both are exercises in getting software into place without the package manager.

What you need before the first AppImage

AppImages ask very little of a system, so the preparation is short. The architecture of the file you download and the availability of FUSE decide whether the application starts at all.

  • A 64-bit desktop distribution. Vendors publish one file per CPU family, and desktop is the target platform.
  • The asset that matches your machine, which uname -m answers in one word.
  • Write access to your home directory, where the file and its menu entry will live.
  • FUSE, which current desktop systems already have, and an extraction fallback for the systems that do not.
uname -m

The answer is x86_64 on Intel and AMD machines and aarch64 on 64-bit ARM. That single word decides which download link you take, and it is the difference between an application that starts and one the kernel refuses to execute.

Run your first AppImage

This walkthrough uses Audacity 4.0.0, released on 3 September 2026, because it is a large desktop application whose distribution package trails the upstream release. The commands are the same for any other AppImage.

Download the file and its checksums

mkdir -p ~/AppImages && cd ~/AppImages
curl -LO https://github.com/audacity/audacity/releases/download/Audacity-4.0.0/audacity-linux-4.0.0-aarch64.AppImage
curl -LO https://github.com/audacity/audacity/releases/download/Audacity-4.0.0/CHECKSUMS.txt

Swap aarch64 for x86_64 in the file name if uname -m reported x86_64. Audacity publishes the checksum table beside the downloads, which is the copy worth comparing against.

Verify the bytes before you run them

That checksum table is a three-column listing rather than the two-column format sha256sum reads, so put the expected line into a file first.

grep aarch64 CHECKSUMS.txt | awk '{print $3"  audacity-linux-4.0.0-aarch64.AppImage"}' > audacity.sha256
sha256sum -c audacity.sha256
Terminal output of sha256sum verifying the Audacity AppImage against the checksum published with the release
The checksum published with the release matches the downloaded file.

The file I checked for this walkthrough printed OK, meaning the bytes on disk match the bytes the project published. A FAILED line means the download was truncated or altered, so delete the file and fetch it again.

A checksum proves the file arrived intact, and it says nothing about who built it. The format also reserves a section for a vendor signature, and the build I tested leaves that section empty, so the published checksum is the strongest check available on this one.

Make it executable and start it

mv audacity-linux-4.0.0-aarch64.AppImage audacity.AppImage
chmod +x audacity.AppImage
./audacity.AppImage --version
Terminal output of the Audacity AppImage starting and printing version 4.0.0
The runtime mounted the bundle and the application reported its version.

The wrapper prints the system libraries it resolved before the application’s own output, so the version line is the last one. In a file manager the same file opens on a double click once the execute bit is set, and each file manager labels that checkbox differently: Allow executing file as program in Nautilus, Nemo and Caja, Is executable in Dolphin, and Execute set to Anyone in PCManFM.

Rename the file before you point a menu entry at it, because the vendor’s file names are long and the entry stores an exact path.

Put the AppImage in your application menu

Desktop integration is what makes an AppImage feel like an installed application. The bundle I extracted already carries the pieces a menu entry needs: a desktop file, icons at several sizes and an AppRun launcher.

Take the icon out of the bundle

Extraction writes a directory named squashfs-root, and a quoted path argument narrows it to the files you want.

./audacity.AppImage --appimage-extract 'share/icons/hicolor/512x512/apps/*'
cp squashfs-root/share/icons/hicolor/512x512/apps/audacity4portable.png ~/AppImages/audacity.png

The same icon ships at smaller sizes for menus that render at 16 or 32 pixels. The 512 pixel copy is the one that stays sharp when a launcher scales it up.

Write the desktop entry by hand

The desktop entry specification expects one file per application, named after the application, in the applications directory inside your home folder.

cat > ~/.local/share/applications/audacity.desktop <<'EOF'
[Desktop Entry]
Type=Application
Name=Audacity
Exec=/home/writwik/AppImages/audacity.AppImage %U
Icon=/home/writwik/AppImages/audacity.png
Terminal=false
Categories=AudioVideo;Audio;
EOF
KeyWhat it does
Type and Namerequired by the specification, and the name is what the menu shows
Execthe absolute path to the file, because desktop entries do not expand a tilde
Iconthe PNG you copied from the bundle
Categoriesthe section of the menu the entry lands in
%U in the Exec linepasses files the application can open, which is what a right-click Open With entry needs

Validate the entry and refresh the menu

cd ~/.local/share/applications
desktop-file-validate audacity.desktop && echo OK
update-desktop-database
Terminal output of desktop-file-validate confirming that the desktop entry parses
Validation is silent on a correct entry, so the echo carries the result.

The validator stays silent on a well-formed file, which is why the echo carries the result. Current desktops pick the entry up without a re-login, and older ones find it after the next session start.

AppImage Pool and Gear Lever automate this whole section. AppImage Pool is a desktop application for managing AppImages, and Gear Lever integrates a file in one click. The mechanics underneath both are the same as creating desktop shortcuts from the terminal.

Update an AppImage in place

An AppImage carries no upgrade path of its own, so whether an updater can do anything depends on a piece of metadata the person who built the file decided to include.

That metadata sits in a section of the runtime named .upd_info. When the section is empty there is nothing to read, and the build I tested for this walkthrough is one of those.

readelf -p .upd_info audacity.AppImage

The command answers with No strings found in this section, and appimageupdatetool says the same thing in its own words.

Terminal output of appimageupdatetool reporting that the AppImage carries no update information
No update information means the update is a download.

When a builder does embed update information, the section holds a zsync or a GitHub releases URL and the updater can fetch only the changed blocks instead of the whole file. Without it, the update is a fresh download.

mv ~/Downloads/audacity-linux-<new-version>-aarch64.AppImage ~/AppImages/audacity.AppImage

Verify the new file against the vendor’s checksums and keep the same name on disk, then the desktop entry you wrote earlier continues to work without an edit.

Projects that ship the same application through several channels are worth comparing on this point, and the ways to install Kdenlive show one app offered as an AppImage, a Flatpak and a Snap at the same time.

Remove an AppImage without leaving anything behind

Nothing about removing an AppImage needs care, because no package database entry exists and no dependency tree has to unwind. The package manager has nothing to clean up either.

rm ~/AppImages/audacity.AppImage ~/AppImages/audacity.png
rm ~/.local/share/applications/audacity.desktop
update-desktop-database ~/.local/share/applications
dpkg -S /home/writwik/AppImages/audacity.AppImage

The last command answers that no path was registered, which is the confirmation that nothing else needs undoing. I removed both items on the machine used for this walkthrough and the package database reported nothing to clean up.

Settings the application wrote to your home directory stay behind. They are harmless leftovers, and a re-download picks them up again.

  • The AppImage file is gone from the directory you kept it in.
  • Its desktop file is gone from the applications directory.
  • The launcher no longer lists the application after a menu refresh.

The contrast is a package removal, where uninstalling a package with apt has to consider dependencies the package manager installed on your behalf.

When an AppImage will not start

Startup failures arrive in three shapes, and no two of them have the same fix. The first pair look alike on screen and are nothing alike underneath.

The runtime says the file needs FUSE

Older AppImage runtimes load the version 2 FUSE library at run time. Distributions that moved to FUSE 3 stopped shipping that library, so the runtime gives up with this message.

dlopen(): error loading libfuse.so.2
AppImages require FUSE to run.
You might still be able to extract the contents of this AppImage
if you run it with the --appimage-extract option.

Install the FUSE 2 library under whatever name your distribution gives it. Ubuntu 24.04 and later call it libfuse2t64, Ubuntu 22.04 and Debian call it libfuse2, Arch calls it fuse2, and Fedora wants both fuse and fuse-libs.

sudo apt install libfuse2t64

Without root access, extract and run the application instead, which skips the mount.

./audacity.AppImage --appimage-extract-and-run
APPIMAGE_EXTRACT_AND_RUN=1 ./audacity.AppImage

Current builds need this less often. The runtime in the file I used mounted on a machine with only FUSE 3 installed, because recent type 2 runtimes carry their own copy of the FUSE library and look for a fusermount helper on the path instead.

The loader reports a missing shared library

A bundle carries the application’s own libraries, and the graphics stack is not part of the bundle. When one of those system libraries is absent, the loader stops the process.

Terminal error showing the loader stopping the AppImage because libOpenGL.so.0 is missing
A missing system library stops the application before it starts.

The error names the library, and dpkg -S names the package that provides it. On a Debian or Ubuntu system, the two commands below turn that message into an install.

dpkg -S libOpenGL.so.0
sudo apt install libopengl0

The build in this walkthrough printed its version line as soon as libopengl0 was installed, so I know the absent library was the whole failure and not a symptom of something larger.

The file will not run at all

These failures happen before the application starts, which makes them the fastest ones to identify from a terminal.

What you seeWhat it meansWhat to do
Exec format errorthe file is built for a different CPU familydownload the asset that matches uname -m
Permission deniedthe execute bit is missingchmod +x on the file
Nothing at all, or a window that closes at oncethe bundle started and the application inside it failedrun it from a terminal and read the last line it prints

An execute bit that never got set produces the second row of that table too. The package commands above are worth looking up if they are new to you.

When an AppImage is the wrong choice

The format optimises for shipping, and whoever builds a file decides what travels inside it. That trade puts the download on the project’s own page instead of in a repository, and it leaves maintenance with the person running the application.

Choose the opposite trade when you want somebody else to keep the software current. A deb resolves dependencies from the repositories, a Flatpak sandboxes the application and updates it centrally, and a Snap updates itself without being asked.

I check for update information before trusting an AppImage with work, and a single command tells you which side of that line a particular file sits on.

readelf -p .upd_info your.AppImage

A section containing a zsync or a GitHub releases URL means an updater can keep the file current. No strings found means you are the updater, and the project’s release page is where you watch for the next version.

If that answer is the wrong one for the job, setting up Flatpaks on Linux and how snaps work cover the two formats that maintain themselves, and managing Flatpak permissions with Flatseal is the next step once a sandbox is in play.

Frequently asked questions

Do I need sudo to run an AppImage?

No. The file runs as your user, and it writes nothing outside your home directory unless the application asks for more.

Where should I keep AppImages?

Any directory in your home folder works, and one folder of their own keeps them together. Keep the file name stable, because the desktop entry stores the exact path.

Is an AppImage portable?

The file is self-contained, and the application inside it still writes settings to your home directory. Portable mode is something the builder has to implement, not something the format gives you.

Which file do I download on a 64-bit machine?

The one that matches uname -m, which is x86_64 on Intel and AMD hardware and aarch64 on 64-bit ARM. A file built for the other architecture fails with an Exec format error.

Does an AppImage update itself?

Only when the builder embedded update information in the file. When that section is empty, the update is a fresh download that you verify and move over the old file.

Can I run an AppImage without FUSE?

Yes. The –appimage-extract-and-run option extracts the application, starts it, and cleans up when it exits, which skips the mount entirely.