https://github.com/seuros/upkg
Unified package management CLI. One command surface across apt, dnf, pacman, zypper, opkg, pkg, and a native macOS engine — without inventing a new catalog.
https://github.com/seuros/upkg
apt cli cross-platform devops dnf freebsd homebrew linux macos package-manager pacman sysadmin termux
Last synced: 28 days ago
JSON representation
Unified package management CLI. One command surface across apt, dnf, pacman, zypper, opkg, pkg, and a native macOS engine — without inventing a new catalog.
- Host: GitHub
- URL: https://github.com/seuros/upkg
- Owner: seuros
- License: bsd-2-clause
- Created: 2026-04-27T08:50:34.000Z (about 2 months ago)
- Default Branch: master
- Last Pushed: 2026-05-21T01:09:34.000Z (about 1 month ago)
- Last Synced: 2026-05-21T07:48:39.123Z (about 1 month ago)
- Topics: apt, cli, cross-platform, devops, dnf, freebsd, homebrew, linux, macos, package-manager, pacman, sysadmin, termux
- Language: Rust
- Size: 467 KB
- Stars: 8
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# upkg
Ever tried to document how to install your own program?
You end up writing 47 pages just to say "install the dev headers for libfoo" — because on Debian it's `libfoo-dev`, on Fedora it's `libfoo-devel`, on Arch it's `libfoo`, on Alpine it's `libfoo-dev` (different one), on FreeBSD it's `foo`, and on macOS it's *"fook yu"* — because the dev didn't pay $199 to sign the package.
**upkg lets you speak civilized. It speaks the dialect of 87 other package managers for you.**
```bash
upkg install git curl ripgrep
```
That's it. Same command on Debian, Fedora, Arch, openSUSE, OpenWrt, Termux, FreeBSD, and macOS.
## What it actually does
- One command surface: `upkg install`, `upkg uninstall`, `upkg upgrade`.
- Routes to the native package manager underneath.
- Keeps the names people already know — no new catalog, no parallel universe.
- Stays out of your way for anything advanced. Use `apt`, `dnf`, `pacman`, `pkg` directly when you need to.
## What it is not
- Not a new global package ecosystem.
- Not a replacement for native tooling when you need flags, repos, or version pinning.
- Not a daemon, not a sync service, not a wrapper that "knows better."
## Backends
| Platform | Backend |
|---|---|
| Debian/Ubuntu | `apt` |
| Fedora/RHEL | `dnf` / `yum` |
| Arch | `pacman` |
| openSUSE | `zypper` |
| OpenWrt | `opkg` |
| Android (Termux) | `pkg` (fallback `apt`) |
| FreeBSD | `pkg` |
| macOS | built-in engine (Homebrew-compatible names + prefixes) |
## macOS
No runtime switch, no shelling out to `brew`. The engine is built in and keeps the prefixes people expect:
- Apple Silicon: `/opt/homebrew`
- Intel: `/usr/local`
Same formula and cask names. Different engine.
Apps are detected automatically when a name exists as a cask but not as a
formula. Use `--app` when you want to force cask resolution:
```bash
upkg install ghostty
upkg install --app ghostty
upkg uninstall --app ghostty
```
App installs are written in the Homebrew-compatible cask layout, so `brew
info --cask ` can detect them. Supported cask artifacts currently include
apps, manpages, and bash/fish/zsh completions.
## Usage
```bash
upkg install git curl
upkg install ghostty
upkg install --app ghostty
upkg install --dry-run ripgrep
upkg uninstall htop
upkg uninstall --app ghostty
upkg upgrade
upkg list
upkg --self-upgrade
upkg help
```
## Build
```bash
cargo build -p upkg
just qq
```