The Problem Every Linux Developer Knows
You've built a great application. It works. Your users love it. Now you need to ship it.
On Windows, you fire up Inno Setup or NSIS and produce a polished .exe installer in minutes. On macOS, you drag an .app into a .dmg. On Linux? You learn the intricacies of dpkg-deb, wrestle with RPM spec files, consider Flatpak manifests, debate Snap confinement, or simply hand users a tarball and a README that says "extract and run install.sh."
None of those options give you what Inno Setup gives Windows developers: a visual, wizard-driven tool that turns your finished application into a self-contained, branded, graphical installer — complete with license acceptance, uninstaller, .desktop integration, and localization — without requiring you to learn a single packaging spec.
That's the gap Tino Wizard fills.
What Is Tino Wizard?
Tino Wizard is an open-source (GPLv3) GUI application that generates professional Linux installers and uninstallers for your apps — whether they're GUI applications or CLI tools. It's written in Python with Tkinter, and the output is a single, self-extracting executable that guides end users through installation with a familiar wizard experience.
Think of it as Inno Setup for Linux, but designed from the ground up around Linux conventions: .desktop files, /usr/local/bin symlinks, privilege elevation via pkexec, and XDG-compliant icon paths.
Getting Started
Tino Wizard is available on GitHub:
Download, click on single file executable and install the wizard.
Then create a project, point it at your application files, configure your options through the GUI, and generate your installer. The output is a single executable that works on any Linux distribution with a display server.
How It Works — A Developer's Walkthrough
Tino Wizard is itself a wizard. When you launch it, you step through a sequence of pages that collect everything the tool needs to generate your installer.
1. Project Setup
Start by creating a new .tino project file or importing an existing one. The project file is a structured JSON document that stores your entire configuration — you can version-control it alongside your source code.
2. Application Information
Fill in the basics:
- Application Name, Version, Author, Description, Homepage URL
- License File — displayed to the user during installation for acceptance
- Pre/Post Install Information Files — shown before and after installation (release notes, getting-started guides, etc.)
- Installer & Uninstaller Icons — custom branding for the setup wizards
- Compression Algorithm — choose between gzip, bz2, or lzma (xz) with configurable compression levels (0–9)
3. Files & Folders
Add the files and directories that make up your application. Tino Wizard recursively collects folder contents, validates symlinks for safety (escaping project directories is blocked), and bundles everything into a compressed tarball.
4. Installer Options
-
App Type — GUI Application or CLI Tool (determines whether
.desktopfiles and icon symlinks are generated) -
Destination Path — where the app installs (e.g.,
/opt/myapp) -
Executable Source & Target — pick which bundled file becomes the main binary, and where its symlink lands (e.g.,
/usr/local/bin/myapp) -
Icon Source & Target — map your icon to
/usr/share/icons/myapp.png
.desktop File Configuration
For GUI applications, Tino Wizard generates and validates a .desktop file (using desktop-file-validate):
- Comment, Categories, custom key-value pairs
- Desktop Actions (e.g., "New Window", "Open Recent")
- Executable arguments
- Full XDG compliance
Scripts & Tasks
- Pre-install script — runs before extraction (environment checks, dependency setup)
- Post-install script — runs after extraction (database migrations, config generation)
- Pre-uninstall script — runs before removal (graceful shutdown, backup prompts)
- Post-uninstall script — runs after removal (cleanup)
- Additional Tasks — optional user-selectable tasks shown during installation (e.g., "Add to PATH", "Create desktop shortcut for all users")
5. Localization
Tino Wizard has built-in internationalization support. Your installer can ship with translations for multiple languages — the generated installer presents a language selection dialog at launch. Built-in locale support includes:
- 🇺🇸 English (en_US)
- 🇪🇸 Spanish (es_ES)
- 🇫🇷 French (fr_FR)
- 🇮🇳 Hindi (hi_IN)
- 🇨🇳 Chinese Simplified (zh_CN)
Per-language overrides include: application name, description, license file, pre/post install info files, and additional task labels.
6. Build & Generate
Click Generate Installer and Tino Wizard executes a 4-stage build pipeline:
Stage 1/4: Building Uninstaller...
Stage 2/4: Creating Archive...
Stage 3/4: Preparing Installer Configuration...
Stage 4/4: Building Installer...
The output is a single self-contained executable — "YourApp setup" — that you can distribute directly. No runtime dependencies for end users.
The Technical Details
- Built with: Python 3, Tkinter, Pydantic (data validation), PyInstaller (binary generation)
-
Project format:
.tinoJSON files — version-controllable, human-readable -
Installer engine: Separate
Engine.pymodule with callback-driven architecture — UI and business logic are cleanly decoupled -
Compression:
tarfilemodule with support for gzip, bz2, and lzma with configurable levels -
Elevation:
pkexec-based privilege elevation -
Desktop files: Generated and validated with
desktop-file-validate - Rollback: File-level tracking via insertion-ordered dictionary — reversed for precise cleanup
-
I18n: gettext-based with
.po/.molocale files for installer/uninstaller UI
What the End User Sees
When a user runs the generated installer, they get a complete wizard experience:
- Language Selection — if multiple translations are configured
- Welcome Page — branded with your app icon
- License Agreement — with mandatory acceptance checkbox
- Pre-Install Information — release notes, system requirements
- Additional Tasks — user-selectable options
- Ready to Install — summary with destination path
- Installation Progress — real-time progress bar with file-by-file status
- Post-Install Information — getting-started guide
- Finish — clean completion
If installation fails at any point, the installer automatically rolls back — removing extracted files, symlinks, desktop files, and the installation directory itself. The rollback is tracked at the file level for precision.
The generated uninstaller provides an equally clean GUI experience for removal, with pre/post-uninstall script support.
Privilege elevation is handled automatically via pkexec when installing to system directories like /opt or /usr/local/bin.
🔗 Links:
Have you tried Tino Wizard? Share your experience in the comments below. And if you're a contributor, check out the GitHub organization — the project is open source and welcoming contributions.
Top comments (0)