A Linux app installer that works across distros. One CLI, one GUI — apt, dnf, pacman, zypper, all the same way.
The problem: you go to download an app on Linux and get six choices, none of which you recognize. Or you copy-paste a curl pipe from a README and hope for the best. OpenInstall is a thin wrapper around your system's native package manager. It figures out what distro you're on, downloads the right package, verifies the signature, then hands it to apt or pacman or whatever you've got.
No new package format. No containers. Just a better first impression.
curl -sSf https://raw.githubusercontent.com/bejiihiu/openinstall/main/scripts/install.sh | shThat's it. The script detects your architecture (x86_64 / aarch64), downloads the right binary, and registers the desktop entry + URI handlers automatically. After install, openinstall:// links in your browser will open directly in OpenInstall.
Other install methods
openinstall://openinstall?m=https://raw.githubusercontent.com/bejiihiu/openinstall/main/openinstall.json
cargo build --release -p installer-cli --features gui
cp target/release/installer ~/.local/bin/
installer gui --register-desktop # register in app menu + URI handlersinstaller self-updateinstaller detect # show your distro, arch, package manager
installer install https://example.com/app.json # install an app from a manifest
installer gui # open the graphical installer| Distro | Package manager | Slot key |
|---|---|---|
| Arch Linux / Manjaro / EndeavourOS | pacman | arch |
| Ubuntu / Debian / Mint / Pop!_OS | apt | ubuntu |
| Fedora / RHEL / CentOS | dnf | fedora |
| openSUSE | zypper | opensuse |
| Anything with PackageKit | pkcon | fallback |
| Anything else | — | fallback (AppImage) |
installer publish \
--name "Cursor" \
--publisher "Anysphere" \
--version "1.5.0" \
--description "AI Code Editor" \
--ubuntu ./cursor-amd64.deb \
--arch ./cursor-x86_64.pkg.tar.zst \
--output ./cursor.jsoninstaller install https://example.com/cursor.jsonOr via a browser link:
openinstall://cursor?m=https://example.com/cursor.json
Full CLI reference
installer detect print distro/arch/package manager
installer validate <manifest> check manifest is correct
installer select <manifest> show which package matches your system
installer show <manifest> print everything about an app
installer verify <manifest> download + check sha256 + signature
installer install <manifest> download, verify, install
installer remove <manifest> uninstall
installer update <manifest> same as install
installer reinstall <manifest> force reinstall
installer rollback <manifest> go back to previous cache version
installer history <manifest> installation history
installer cache clear nuke the cache
installer cache info show cache size
installer publish --name ... (see above) generate a manifest
installer serve <manifest> [addr] serve /app/latest on HTTP
installer gui [manifest] launch graphical installer (Linux only)
installer gui --register-desktop add to application menu + URI handlers
installer self-update download and replace itself
# URI subcommands
installer uri <scheme://app> parse URI and print details
installer uri <scheme://app?m=manifest_url> parse and install from manifest URL
installer uri desktop-entry <name> <path> [scheme] generate a .desktop file
installer uri register <name> <path> [scheme] register URI handler in the system
# Direct URI (same as `installer uri ...` but as top-level command)
installer openinstall://cursor?m=https://example.com/manifest.json
installer signature verify <sig> <file> check ed25519 signature
{
"name": "Cursor",
"publisher": "Anysphere",
"version": "1.5.0",
"description": "AI Code Editor",
"homepage": "https://cursor.sh",
"license": "MIT",
"packages": {
"arch": "https://example.com/cursor.pkg.tar.zst",
"ubuntu": "https://example.com/cursor.deb",
"fedora": "https://example.com/cursor.rpm",
"opensuse": "https://example.com/cursor.rpm",
"fallback": "https://example.com/cursor.AppImage"
},
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"signature": "ed25519:<public_key_hex>:<signature_hex>"
}See docs/manifest.md for details.
Three crates, one dependency chain:
installer-core → types, adapters, verification, installer runtime
installer-cli → CLI (20+ commands) + optional GUI (`--features gui`)
installer-bootstrapper → tiny entry point for download + launch
The core detects the environment by reading /etc/os-release and checking which binaries (pacman, apt-get, dnf, zypper, pkcon) exist on the PATH. It then picks a matching package from the manifest, downloads it, verifies the sha256 and ed25519 signature, and runs the native package manager under the hood.
Every package manager has its own adapter. Adding one is about 20 lines.
- All downloads go through TLS (
reqwest+rustls) - Network requests have timeouts: 15s for manifests, 30s connect + 120s total for packages
- SHA256 is checked before the package touches the package manager
- Ed25519 signatures are verified with
ring
- Linux (x86_64 or aarch64)
- A package manager from the table above (or PackageKit)
- curl (for the install script)
- GTK4 + libadwaita (only for
installer gui— optional)
cargo build --release
# or specific crates
cargo build -p installer-cli --features gui # with GUI (Linux only)Tests:
cargo test -p installer-core
cargo test -p installer-cliThe GUI requires GTK4 and libadwaita development headers (libgtk-4-dev and libadwaita-1-dev on Debian/Ubuntu, gtk4 and libadwaita on Arch).
It's not a new package manager. It's not a container runtime. It's not an app store. It's a frontend that reads a JSON file, downloads stuff, checks signatures, and calls your system's package manager. Nothing more.
We'd love your help. Here's how to get started:
- Easy entry — look for
good first issuelabels. Adding a new package manager adapter is ~20 lines. - Read the guide — see CONTRIBUTING.md for setup, code style, and PR process.
- Report bugs — use the bug report template.
- Request features — use the feature request template.
Even small PRs help — fix a typo, improve an error message, add a test. Every contribution counts.
- Cross-distro CLI installer (apt, pacman, dnf, zypper, pkcon)
- Manifest format with SHA256 + ed25519 signatures
- GTK4 + libadwaita GUI
- URI handler (
openinstall://links) - Self-update mechanism
- Snap adapter
- Nix adapter
- Flatpak adapter (as install source)
- Batch install (multiple manifests)
- Offline install support
- Shell completion (bash, zsh, fish)
- Man page
See open issues for what's being worked on. Pick something from the roadmap and claim it — open an issue so others know it's taken.
If you run a Telegram channel, a Discord server, or just know people who'd find this useful — tell them about OpenInstall.
If the project helped you — drop a ⭐ on GitHub. Helps other people find it.
Also read: HONESTY.md — why this project exists.
