- Drag & drop
.AppImage,.tar.gz, or.tar.xzfiles directly onto the window to install them - Browse button as an alternative to drag-and-drop
- Confirmation dialog before every install — shows app name, version, and file type
- Update detection — dropping a newer version of an already-installed app triggers an update dialog instead of a duplicate install
- Installed apps list — shows icon, name, version, and install date for every app managed by AppInstaller
- Search — filter installed apps live by name, version, or file type; press Escape to clear
- Remove button — uninstalls an app, its desktop entry, and icon in one click
- Desktop integration — installed apps appear in your application launcher (GNOME, KDE, etc.) immediately, with their correct icon
- XDG icon theme support — icons are installed into
~/.local/share/icons/hicolor/at every available size; the desktop entry uses a bare theme name so DEs resolve the icon correctly - Background installs — extraction and copying run in a worker thread; the UI stays responsive with a progress spinner
Drop zone and installed apps list
┌──────────────────────────────────────────────────┐
│ AppInstaller │
├──────────────────────────────────────────────────┤
│ ┌────────────────────────────────────────────┐ │
│ │ Drop your application here │ │
│ │ .AppImage · .tar.gz · .tar.xz │ │
│ │ [ Browse for file... ] │ │
│ └────────────────────────────────────────────┘ │
│ │
│ Installed Apps [Refresh] │
│ 🔍 Search installed apps… │
│ ┌────────────────────────────────────────────┐ │
│ │ [icon] Krita v5.2 · installed … │ │
│ │ [Remove] │ │
│ └────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
| Format | Extension(s) | How it is installed |
|---|---|---|
| AppImage | .AppImage |
Copied to ~/Applications/, made executable, metadata extracted for desktop entry |
| Compressed tar | .tar.gz, .tar.xz, .tar.bz2, .tgz |
Extracted to ~/Applications/<name>/, desktop entry created/discovered |
| Dependency | Purpose |
|---|---|
| Python 3.10+ | Runtime |
| GTK 4 | GUI toolkit |
PyGObject (python3-gi) |
Python bindings for GTK4/GIO |
desktop-file-utils |
Refreshes the application launcher database |
Run the provided script — it auto-detects your package manager:
bash install.shOr install manually:
| Distro | Command |
|---|---|
| Ubuntu / Debian | sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-4.0 desktop-file-utils |
| Fedora | sudo dnf install python3-gobject gtk4 desktop-file-utils |
| Arch Linux | sudo pacman -S python-gobject gtk4 desktop-file-utils |
| openSUSE | sudo zypper install python3-gobject typelib-1_0-Gtk-4_0 desktop-file-utils |
# Copy app files
cp -r . ~/.local/lib/appinstaller
# Create CLI launcher
mkdir -p ~/.local/bin
cat > ~/.local/bin/appinstaller << EOF
#!/usr/bin/env bash
exec python3 "$HOME/.local/lib/appinstaller/main.py" "\$@"
EOF
chmod +x ~/.local/bin/appinstaller
# Install icons
for size in 16 24 32 48 64 96 128 256 512; do
dir="$HOME/.local/share/icons/hicolor/${size}x${size}/apps"
mkdir -p "$dir"
cp appicon/appinstaller-${size}.png "$dir/appinstaller.png"
done
mkdir -p ~/.local/share/icons/hicolor/scalable/apps
cp appicon/appinstaller.svg ~/.local/share/icons/hicolor/scalable/apps/
# Install desktop entry
mkdir -p ~/.local/share/applications
sed "s|Exec=.*|Exec=$HOME/.local/bin/appinstaller|" appinstaller.desktop \
> ~/.local/share/applications/appinstaller.desktop
# Refresh caches
update-desktop-database ~/.local/share/applications
gtk-update-icon-cache -f -t ~/.local/share/icons/hicolorAppInstaller will now appear in your application launcher with its icon.
python3 main.pyappinstaller/
├── main.py # Application entry point
├── ui/
│ ├── window.py # Main window: drop zone + installed apps list
│ └── dialogs.py # Confirm / update / progress / error dialogs
├── installer/
│ ├── appimage.py # AppImage install and update logic
│ └── tarball.py # tar.gz / tar.xz install logic
├── desktop_integration.py # .desktop file + icon management
├── app_registry.py # JSON registry (~/.local/share/appinstaller/)
├── appicon/
│ ├── appinstaller.svg # Source SVG icon
│ └── appinstaller-*.png # Rasterised PNG icons (16 – 512 px)
├── install.sh # Dependency installer (apt/dnf/pacman/zypper)
├── appinstaller.desktop # XDG desktop entry template
└── requirements.txt # Python package list (PyGObject)
- File is copied to
~/Applications/ - Execute bit is set (
chmod +x) --appimage-extract-desktop-integrationextracts the embedded.desktopand icons into a temp dir- Icons are collected from two locations inside the AppImage (in priority order):
squashfs-root/usr/share/icons/hicolor/<size>/apps/— all sizes presentsquashfs-root/*.png/*.svg/*.xpm— root-level fallback for older AppImages
- Every found icon is installed into
~/.local/share/icons/hicolor/<size>x<size>/apps/<name>.<ext>(SVGs go toscalable/apps/) - The
.desktopExec=is patched to point to the installed binary;Icon=is set to the bare theme name (e.g.myapp) rather than an absolute path .desktopis written to~/.local/share/applications/update-desktop-databaseandgtk-update-icon-cacherefresh the launcher and icon caches
When a file is dropped, AppInstaller reads X-AppImage-Name (or Name) from the embedded .desktop and checks the registry. If a match is found, an Update dialog appears instead of a fresh install dialog.
All managed apps are tracked in ~/.local/share/appinstaller/registry.json. Each entry stores the app name, version, executable path, .desktop path, a representative icon path (icon_path), and the full list of all installed icon paths (icon_paths). This powers the installed apps list, update detection, and complete cleanup on removal.
MIT — see LICENSE.