A universal installer builder for Linux. Turn ANY standalone executable into a fully-integrated desktop application—complete with graphical setup and desktop icons—using just a single configuration file.
- 🚀 Zero-Config Build: Just edit one
packdrop.yamlfile. - 📦 True Offline Setup: Automatically bundles
.debdependencies (likelibxcb) for clean Ubuntu targets. - ⚡ Sidecar Architecture: Skips slow recompression of massive
.tar.gzfiles. - 🛠️ Auto-Fetches Qt IFW: No need to manually install the Qt Installer Framework or any other dependencies like Qt.
PackDrop is completely agnostic to your tech stack. As long as you have a standalone Linux directory or executable, PackDrop can wrap it. You can build your core application using your favorite packaging tools:
- Python:
Nuitka,PyInstaller,cx_Freeze - C++ / Qt:
linuxdeployqt,AppImageTool - Node.js / Electron:
pkg,electron-builder - Go / Rust / C: Native compiled binaries
Just pack your final build folder into a .tar.gz archive, and PackDrop will turn it into a professional GUI installer.
-
Clone this template — Use "Use this template" on GitHub to create your own repository.
-
Edit
packdrop.yaml— Set your application name, version, and file paths:app_name: "My Cool App" app_version: "1.0.0" compressed_file: "./my_app.tar.gz" executable_file: "my_app"
-
Place your files — Put your compressed application archive and
logo.pngin the project root. -
Build the installer:
./build_installer.sh
That's it! The script automatically fetches required dependencies and outputs your ready-to-ship installer in the
release/directory. -
Distribute — Everything you need is in the
release/directory. Ship it to your users. -
End users install with:
sudo ./setup.sh
| Key | Description | Example |
|---|---|---|
app_name |
Display name (used everywhere) | "My Cool App" |
app_version |
Semantic version | "1.0.0" |
app_publisher |
Developer / publisher name | "MyTeam" |
app_description |
Short description | "A useful application" |
compressed_file |
Path to your app archive (.tar.gz) |
"./my_app.tar.gz" |
executable_file |
Main executable name inside the archive | "my_app" |
app_categories |
Desktop menu categories (semicolon-separated) | "Utility;" |
dependencies |
Comma-separated system packages to bundle | "libxcb-cursor0,libgl1" |
qtifw |
Qt IFW version or custom install path | "4.8.1" or "/opt/QtIFW" |
required_space_mb |
Minimum disk space in MB | 100 |
The qtifw field accepts either:
- A version number (e.g.
"4.8.1") — the build script will check~/Qt/QtIFW-4.8.1/and if not found, offer to download and install it automatically for your architecture (x64/arm64). - An absolute path (e.g.
"/opt/QtIFW-4.8.1") — used directly without any auto-detection.
Default: "4.8.1" (tested and recommended).
System packages required by Qt IFW and your application. During build, these are automatically downloaded via apt-get download and bundled into release/offline_dependencies/. The installer installs them on the target system.
Default packages ensure Qt IFW runs on a minimal Ubuntu system. Add any extra packages your application needs.
The build_installer.sh script reads your config and produces a complete distribution in release/:
release/
├── setup.sh — User-facing entry point (sudo ./setup.sh)
├── Installer_GUI.run — Qt IFW graphical installer
├── <app_name>.tar.gz — Your application archive (renamed)
├── logo.png — Application icon
├── uninstall.sh — Clean uninstaller
└── offline_dependencies/ — Auto-downloaded .deb packages
├── ⚙️ packdrop.yaml — Configuration (edit this)
├── 🔨 build_installer.sh — Build script (run this)
├── 🖼️ logo.png — App icon (replace this)
├── 📁 ifw_config/ — Installer templates (auto-processed)
│ ├── 📜 setup.sh — Setup template
│ ├── 🧹 uninstall.sh — Uninstall template
│ ├── 📂 config/ — Qt IFW config templates
│ └── 📦 packages/ — Qt IFW package templates
├── 📥 offline_dependencies/ — Optional extra .deb packages
└── 🚀 release/ — Build output (distribute this)
See LICENSE for details.
