xpm - uniX Package Manager
A universal package manager for any unix-like distro including macOS. Rewritten in Rust for maximum performance and portability.
What is xpm?
XPM is a package manager for unix systems like Linux, BSD, MacOS, etc. It can be a wrapper for native package managers or a package manager itself by using its way of installing packages. For the list of packages available, see xpm-popular.
Our key values
- Easy to install, update, upgrade, remove, search (and filter)
- No questions asked, can run in a non-interactive way
- Easy to create new installers or a full repository
- Be agnostic, following unix standards and relying on very known tools
- Include many popular distros, including macOS and Android (termux)
- Prefer native pm way and falls back to xpm way
Features
- Universal: Works on Linux (Arch, Debian, Ubuntu, Fedora, openSUSE), macOS, and Android/Termux
- Fast: Built with Rust for maximum performance (~3MB static binary)
- Unified: Search and install packages from XPM repositories AND native package managers
- AUR Support: Full AUR helper support (paru, yay) on Arch Linux
- Offline-first: Local database with cached package metadata
- Script-based packages: Simple bash scripts for package installation
Supported Operating Systems & Package Managers
๐ฏ Integrated Support (Native PM with formatted search)
- Debian/Ubuntu & derivatives โ APT
- Arch Linux โ Pacman (with AUR support via Paru and Yay)
These systems get full native package manager integration with intelligent search, metadata extraction, and clean formatted output.
๐ Script-Based Support (via installers)
For other systems, XPM provides script-based installation through the xpm-popular repository:
Linux Distributions:
- Fedora โ DNF
- openSUSE โ Zypper
- Clear Linux โ swupd
- Android (Termux) โ pkg
- Alpine Linux โ via custom scripts
macOS โ Homebrew (brew) - via scripts
Installation
Faster with curl
curl -fsSL install.cat/verseles/xpmFrom Source
# Clone the repository
git clone https://github.com/verseles/xpm.git
cd xpm
# Build
cargo build --release
# Install to /usr/local/bin
sudo cp target/release/xpm /usr/local/bin/From Cargo
cargo install --git https://github.com/verseles/xpm.gitQuick Start
# Check your system
xpm check
# Add the default repository (pulls from xpm-popular)
xpm refresh
# Search for packages (searches XPM + native PM)
xpm search neovim
# Install a package
xpm install neovim
# Remove a package
xpm remove neovimCommands
| Command | Alias | Description |
|---|---|---|
search |
s |
Search for packages (XPM + native PM) |
install |
i |
Install a package |
remove |
rm |
Remove a package |
refresh |
- | Refresh package database |
upgrade |
- | Upgrade installed packages (coming soon) |
get |
- | Download a file |
file |
- | File operations (copy, move, delete, bin) |
repo |
- | Repository management |
checksum |
hash |
Compute file checksums |
shortcut |
- | Create desktop shortcuts |
log |
- | Show installed packages |
check |
- | Check system configuration |
make |
- | Create a package (coming soon) |
Search Examples
# Basic search
xpm search vim
# Multiple terms
xpm search text editor
# Limit results
xpm search rust --limit 10
# JSON output (for scripts)
xpm search go --jsonArchitecture
XPM is built as a Rust workspace with two crates:
- xpm-core: Core library with database, OS abstraction, and package management
- xpm-cli: Command-line interface
Key Components
- Native DB: Fast, embedded database using native_db (redb backend)
- Async I/O: Full async support with Tokio
- Git integration: Uses git2 for repository management
- Native PM integration: Seamless integration with apt, pacman, paru, yay
Creating Packages
Packages are bash scripts with metadata headers:
#!/bin/bash
readonly xNAME="my-package"
readonly xVERSION="1.0.0"
readonly xTITLE="My Package"
readonly xDESC="Description of my package"
readonly xURL="https://example.com"
xARCHS=(x86_64 aarch64)
xDEFAULT=(any)
install_any() {
# Installation logic
echo "Installing..."
}
remove_any() {
# Removal logic
echo "Removing..."
}
validate() {
# Validation - return 0 if installed correctly
which my-package >/dev/null
}Save as my-package/my-package.bash in your repository.
Repository Structure
my-xpm-repo/
โโโ package1/
โ โโโ package1.bash
โโโ package2/
โ โโโ package2.bash
โโโ ...
Building from Source
# Development build
cargo build
# Release build (optimized)
cargo build --release
# Run tests
cargo test
# Run with verbose output
cargo run -- --verbose check
# Pre-commit checks (format + lint + test)
make precommitContainer Testing
Test xpm on different distributions using Podman:
# Build and test on Ubuntu
make test-ubuntu
# Build and test on Arch Linux
make test-arch
# Build and test all distros
make docker-test
# Clean container images
make docker-cleanContributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Run
cargo testandcargo clippy - Submit a pull request
License
BSD-4-Clause
Credits
Built with โค๏ธ by Verseles