SquashMate is a Linux desktop app (PyQt5) that makes AppImage and .deb installation easier, with built-in logging, desktop integration, and safe uninstall flows.
It was built to remove repetitive package-management friction for tools that are commonly shipped as AppImages or .deb files.
- Install or update AppImages into
~/Applications/<AppName>/ - Install
.debfiles with privilege escalation (pkexec) and dependency fix-up - Generate desktop entries for AppImages automatically
- Launch AppImages from inside SquashMate
- Uninstall AppImages and
.debpackages with double confirmation - Capture detailed logs for installs, uninstalls, and launch failures
SquashMate currently focuses on:
- AppImage lifecycle: install, update, list, launch, uninstall
.deblifecycle: install, list installed packages, uninstall- Desktop UX: launcher integration and persistent logs
It does not currently manage Flatpak, Snap, RPM, or repository browsing.
- Python 3
- PyQt5
- Linux desktop tooling (
dpkg,apt-get,pkexec,update-desktop-database)
- Linux (tested on Ubuntu/Debian-style systems)
- Python 3.8+ recommended
python3-pyqt5
pkexec(usually provided bypolicykit-1)
Install requirements:
sudo apt update
sudo apt install -y python3-pyqt5 policykit-1git clone <repository-url>
cd SquashMate
chmod +x launch.sh squashmate.py
./launch.shInstall a desktop launcher entry and wrapper:
chmod +x install_squashmate.sh
./install_squashmate.shThis script:
- Ensures
python3-pyqt5is present - Creates
~/.local/share/applications/SquashMate.desktop - Installs
~/.local/bin/squashmate_launcher.py - Updates desktop database (if available)
Uninstall integration:
chmod +x uninstall_squashmate.sh
./uninstall_squashmate.sh- Open the Install AppImage tab
- Select an
.AppImagefile - Click Install/Update Application
What SquashMate does:
- Extracts using
--appimage-extract - Installs to
~/Applications/<AppName>/ - Creates desktop entry in
~/.local/share/applications/ - Sets execute permissions
- Installs/updates launcher wrapper in
~/.local/bin/
- Open the Install .deb tab
- Select a
.debfile - Click Install .deb Package
- Approve authentication prompt when requested
Install flow:
- Validates package with
dpkg --info - Installs via
dpkg -i - Runs
apt-get install -f -yfor dependency resolution - Verifies installed state via
dpkg -l
In Manage Installed:
📦items are AppImages (launch + uninstall supported)📋items are installed.debpackages (uninstall supported)- Uninstall requires a second typed confirmation to reduce accidental removals
SquashMate keeps logs under:
- Main log:
~/.local/share/squashmate/squashmate.log - App launch logs:
~/.local/share/squashmate/apps/<AppName>.log .debinstall/uninstall log:~/.local/share/squashmate/deb_packages.log- Desktop wrapper:
~/.local/bin/squashmate_launcher.py
Desktop launches are marked as Desktop Launch in per-app logs.
.deblisting shows installed packages from the system package database, which can be large on some systems..deboperations rely on host tools (dpkg,apt-get,pkexec) and desktop authentication configuration.- Fallback terminal-based
.debinstall path assumes a GNOME terminal environment.
squashmate.py- main GUI and install/uninstall logicsquashmate_launcher.py- AppImage launch wrapper used by desktop entriesinstall_squashmate.sh- desktop integration installeruninstall_squashmate.sh- desktop integration removerlaunch.sh- convenience runnertest_launcher.py- launcher wrapper smoke testVERSION- single source of truth for the app version
The app version lives in a single file: VERSION at the project root. To ship a new release:
- Edit
VERSION(e.g.1.0.0→1.1.0). - Build release artifacts:
./build_release.sh
- Commit and tag the release.
That value is automatically picked up by:
- The window header version pill (
v1.0.0). QApplication.setApplicationVersion(...)(used by Qt for--versionand dialogs).install_squashmate.sh, which prints the version during install.
No code edits are required to bump versions.
./build_release.sh creates:
dist/squashmate_<version>_all.debdist/squashmate-<version>-linux.tar.gz(portable bundle; kept indist/only)dist/latest.json(manifest: version,.debfilename, download path, SHA256)
It copies the website-ready downloads to:
/home/alex/Desktop/Projects/squashMate-website/public/downloads
Website public/downloads contains only the .deb and latest.json (any previous *.tar.gz there is removed on each build) so your primary CTA can stay “Download for Linux” as a single Debian package.
You can override that destination with environment variables:
WEBSITE_DIR=/path/to/site ./build_release.sh
# or
WEBSITE_DOWNLOADS_DIR=/path/to/site/public/downloads ./build_release.sh- Fixed
.debinstall success detection so both installation steps must succeed before reporting success. - Improved AppImage extraction reliability by always restoring original working directory and cleaning temporary extraction data on failure.
- Hardened manual command examples for paths containing spaces by shell-quoting
.debpaths. - Refreshed this README for website/use-case clarity and accurate current behavior.
If you are building a project website, this README now supports:
- Clear product value proposition
- Accurate feature and scope breakdown
- Operational flow suitable for docs pages
- Explicit limitations and environment assumptions
You can reuse sections directly for:
- Landing page (
Highlights,Current Scope) - Docs (
Quick Start,Usage,Logging,Known Limitations) - Changelog (
Improvements Applied)
- Filter/search in installed
.debpackage list - Track only SquashMate-managed
.debinstalls as an optional mode - Add exportable diagnostic bundle for support issues
- Add optional dark theme and accessibility tuning
- Add release packaging (
.deb/AppImage) for SquashMate itself
MIT (recommended). Add a LICENSE file if not already included.