Upstream is a rootless, GitHub-centric package manager designed to install and update software on Unix-like systems. It supports multiple asset types, tracks upstream releases, and automatically selects the best asset for your system architecture.
- Install packages directly from GitHub repositories.
- Auto-detect system architecture (x86_64, ARM64) and OS (Linux, macOS).
- Supports multiple asset types: appimages, binaries, archives, scripts, compressed files.
- Track, install, update, pause (pin), and resume packages.
- Configurable providers and API tokens.
- Rootless, user-level installation.
- Download the latest release for your platform
- Move the file into
~/.local/bin/ - (Optional) Rename it to
upstreamfor convenience.
(Coming soon — contribution welcome! I don't have a Mac, so I can't test MacOS. To my knowledge, it should work.)
Clone the repository and build with .NET 9.0:
git clone https://github.com/what386/upstream.git
cd upstream
dotnet build -c ReleaseOr run the CLI tool:
dotnet run -- install github:sxyazi/yazi -t archiveUpstream provides a set of commands for installing, updating, managing, and inspecting packages. For detailed information on flags and options, run:
upstream <command> --helpupstream install <provider>:<owner>/<repo> [-t <type>] [-n <name>]Installs a package from a supported provider (e.g., GitHub).
Use -t to specify an asset type. Defaults to 'auto' if not provided.
use -t to specify a custom name. Defaults to repo name if not provided.
upstream update [<package>]Checks for newer releases. Run without arguments to check all packages.
upstream upgrade [<package>]Installs updates discovered by update.
Run without arguments to update all packages.
upstream remove <package>Uninstalls a package.
upstream reinstall <package>Removes and installs the package again based on its original source.
upstream list packages
upstream list sourcesDisplays metadata about installed packages or their update sources.
upstream info <package>Shows install path, provider, asset type, last update, and other metadata.
upstream pause <package>Pins a package to its current version (skips updates).
upstream resume <package>Unpins a package and re-allows updates.
upstream config update --key <key>=<value>Updates configuration values such as API tokens.
Upstream automatically detects your OS and CPU architecture:
- Linux (x86 or ARM)
- macOS (x86 or ARM)
It selects the most appropriate release asset by matching filename patterns and extensions. If you encounter unusual filenames or any non-working installs, please open an issue.
You can set provider-specific configuration keys such as API tokens:
upstream config update --key github.apiToken=xxxUpstream uses tokens automatically when required. A GitHub token is optional but recommended to avoid rate limits.
Metadata (installed package info, tracked repos, config) is stored in:
~/.config/upstream/
Installed packages live under:
~/upstream/
├─ appimages/
├─ binaries/
├─ archives/
├─ scripts/
└─ symlinks/
Symlinks are created for convenient access to installed executables.
-
Fork the repository
-
Create a feature branch:
git checkout -b feature/awesome-feature
-
Commit your changes
-
Push the branch
-
Open a pull request