I had 27 AppImages and none of them showed up in my launcher

Published: (March 26, 2026 at 03:40 PM EDT)
3 min read
Source: Dev.to

Source: Dev.to

Problem

I use Pop!_OS with the new COSMIC desktop and have many AppImages (Obsidian, Cursor, WezTerm, Krita, FreeTube, etc.).
Every time I added a new AppImage I had to:

  1. Make it executable (chmod +x).
  2. Create a .desktop file by hand.
  3. Find the icon inside the AppImage.
  4. Choose the correct Categories= value so it appeared in the right menu.

After a while my ~/apps/ directory turned into a graveyard of version‑ed files with no indication of which version was current:

Cursor-0.47.9-x86_64.AppImage
cursor-0.45.14-build-250219jnihavxsz-x86_64.AppImage
Joplin-3.0.15.AppImage
Joplin-3.3.13.AppImage
WezTerm-nightly-Ubuntu20.04.AppImage
WezTerm-20240203-110809-5046fc22-Ubuntu20.04.AppImage

The launcher never showed any of them.


Solution – appimage‑manager

I wrote a single‑file Python tool (zero dependencies) that automates everything:

  • Scans a directory for .AppImage files and groups them by application name.
  • Picks the latest version (by version number, not file modification date).
  • Creates a clean symlink, e.g. obsidian.AppImage → Obsidian-1.9.10.AppImage.
  • Extracts the icon from the AppImage and installs it into the XDG hicolor theme.
  • Reads Categories and StartupWMClass from the embedded .desktop file.
  • Generates a proper .desktop launcher with all required metadata.

Result: press Super, type the app name, and the correct icon appears. Pin it to the dock and the icon matches.


How It Works

Filename Normalisation

AppImage filenames are inconsistent. The script uses a single regular expression that handles many patterns, for example:

Example filenameExtracted name
Obsidian-1.9.10.AppImageobsidian
cursor-0.45.14-build-250219...-x86_64.AppImagecursor
WezTerm-nightly-Ubuntu20.04.AppImagewezterm
LM+Studio-0.2.8-beta-v1.AppImagelm-studio
FreeCAD_1.0.2-conda-Linux-x86_64-py311.AppImagefreecad

The trick is to strip everything from the first version/architecture/platform token onward.

Icon Extraction

AppImages are squashfs archives that may contain a .DirIcon file in several forms:

  • A real PNG file.
  • A symlink that resolves inside the archive.
  • An icon located deep in hicolor//apps/.
  • SVG files.
  • Broken symlinks.

The script tries each strategy, selects the highest‑resolution icon, and installs it to ~/.local/share/icons/hicolor//apps/ with a bare name (e.g., Icon=appimage-obsidian). After installation, the GTK icon cache is rebuilt.

StartupWMClass

Without a correct StartupWMClass, the dock cannot match a running window to its .desktop entry. The script extracts this value from the embedded .desktop file and includes it in the generated launcher.

Optional Watch Mode

--install-watch creates a systemd user path unit that monitors the AppImage directory. Adding or removing a file automatically updates the symlink, .desktop file, and icon.


Usage

# Download the script
curl -LO https://raw.githubusercontent.com/pvojnisek/appimage-manager/main/appimage-manager.py

# Make it executable
chmod +x appimage-manager.py

# Move it to your AppImage directory (or any location you prefer)
mv appimage-manager.py ~/apps/
cd ~/apps

# Run the manager (initial sync)
./appimage-manager.py sync

Watch Mode

./appimage-manager.py --install-watch
# Now just drop AppImages into the directory; they appear in the launcher automatically.

CSV Configuration

All tracked AppImages are listed in appimages.csv. You can edit this file to change labels, categories, or ignore specific apps.

id,label,filename,categories,startup_wm_class,status
obsidian,Obsidian,Obsidian-1.9.10.AppImage,Office;X-AppImage;,obsidian,active
cursor,Cursor,Cursor-0.47.9-x86_64.AppImage,TextEditor;Development;IDE;X-AppImage;,Cursor,active
zen,Zen browser,zen-x86_64.AppImage,Network;WebBrowser;X-AppImage;,zen,active

After editing, run:

./appimage-manager.py sync

License & Source

  • ~730 lines of Python, zero external dependencies.
  • MIT licensed.
  • GitHub repository:

Feedback

I’d love to hear your thoughts, especially if the name‑extraction regex doesn’t handle your AppImage naming convention.

0 views
Back to Blog

Related posts

Read more »