I had 27 AppImages and none of them showed up in my launcher
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:
- Make it executable (
chmod +x). - Create a
.desktopfile by hand. - Find the icon inside the AppImage.
- 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.AppImageThe 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
.AppImagefiles 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
CategoriesandStartupWMClassfrom the embedded.desktopfile. - Generates a proper
.desktoplauncher 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 filename | Extracted name |
|---|---|
Obsidian-1.9.10.AppImage | obsidian |
cursor-0.45.14-build-250219...-x86_64.AppImage | cursor |
WezTerm-nightly-Ubuntu20.04.AppImage | wezterm |
LM+Studio-0.2.8-beta-v1.AppImage | lm-studio |
FreeCAD_1.0.2-conda-Linux-x86_64-py311.AppImage | freecad |
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 syncWatch 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,activeAfter editing, run:
./appimage-manager.py syncLicense & 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.