Skip to content

HARAJIT05/Appimage-installer

Repository files navigation

AppInstaller icon

AppInstaller

A drag-and-drop Linux application installer with a GTK4 GUI

Python GTK Platform License


Features

  • Drag & drop .AppImage, .tar.gz, or .tar.xz files 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

Screenshots

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]  │  │
│  └────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────┘

Supported file types

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

Requirements

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

Installation

1. Install system dependencies

Run the provided script — it auto-detects your package manager:

bash install.sh

Or 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

2. Install AppInstaller itself into your system

# 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/hicolor

AppInstaller will now appear in your application launcher with its icon.

3. Run directly (without installing)

python3 main.py

Project structure

appinstaller/
├── 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)

How it works

AppImage install

  1. File is copied to ~/Applications/
  2. Execute bit is set (chmod +x)
  3. --appimage-extract-desktop-integration extracts the embedded .desktop and icons into a temp dir
  4. Icons are collected from two locations inside the AppImage (in priority order):
    • squashfs-root/usr/share/icons/hicolor/<size>/apps/ — all sizes present
    • squashfs-root/*.png / *.svg / *.xpm — root-level fallback for older AppImages
  5. Every found icon is installed into ~/.local/share/icons/hicolor/<size>x<size>/apps/<name>.<ext> (SVGs go to scalable/apps/)
  6. The .desktop Exec= is patched to point to the installed binary; Icon= is set to the bare theme name (e.g. myapp) rather than an absolute path
  7. .desktop is written to ~/.local/share/applications/
  8. update-desktop-database and gtk-update-icon-cache refresh the launcher and icon caches

Update detection

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.

App registry

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.

License

MIT — see LICENSE.

About

An application to install .AppImage, .tar.gz, or .tar.xz applications in linux Distros

Topics

Resources

License

Stars

Watchers

Forks

Contributors