Upstream
Upstream is a rootless package manager for installing software directly from upstream release sources.
It fetches binaries, archives, AppImages, and other release artifacts from GitHub, GitLab, Gitea, direct URLs, and download pages. When nobody published a usable binary, it can build the project from source.
What it does
- Installs software without root
- Finds the right release asset for your OS and architecture
- Installs from GitHub, GitLab, Gitea, URLs, and scraped download pages
- Upgrades, reinstalls, removes, and rolls back packages
- Builds Rust, .NET, Go, Zig, and CMake projects from source
- Tracks stable, preview, and nightly release channels
- Creates desktop entries for graphical applications
- Verifies downloads with checksums and signatures when available
- Imports and exports package lists, profiles, configuration, and trusted keys
- Keeps shell hooks, cached documentation, and diagnostics in one place
Installation
There are a couple of ways to install Upstream.
Binary installers
Linux
|
macOS
|
Windows
iwr -useb https://raw.githubusercontent.com/what386/upstream-rs/main/scripts/install/install.ps1 | iex
Windows also requires the latest supported Microsoft Visual C++ v14 Redistributable. Install the package matching your architecture from Microsoft before running the installer.
Linux is the primary supported platform. Windows and macOS support are experimental. Windows is currently more supported and tested than macOS (which is to say not at all) MacOS is also missing some features, including desktop-entry creation.
Cargo
Cargo installs work normally, but they cannot update themselves with upstream upgrade.
Manual installation
Download a release from the latest GitHub release, then make the binary executable (on Unix systems):
Examples
Initialize shell integration:
Install something:
Preview the install first:
Find software interactively:
Choose a release asset interactively:
Upgrade everything, or check without changing anything:
List, inspect, remove, and diagnose:
Common workflows
Install a release
Packages are identified by their provider and repository slug. Upstream discovers executable aliases from the installed artifact, so a project does not need to use the same name for its repository and its binary.
Build from source
Supported build profiles are rust, dotnet, go, zig, and cmake.
Build workspaces are cached under .upstream/cache/build/ when the project
build system allows rebuilds to reuse its output.
Manage packages
Import and export
Exports contain reinstallable references and metadata. They do not contain installed files or cache contents.
API tokens
Provider tokens are optional. They help avoid anonymous rate limits, but are required for private repositories.
For GitHub, create a token under Settings > Developer settings > Personal
access tokens. Tokens are stored separately in auth.toml and are not
included in configuration or profile exports.
Documentation
Developer documentation is in docs/:
FAQ
Why not just use my distribution's package manager?
You should use it when it has the package and version you want. Upstream is for the gaps: small projects, portable binaries, newer versions, private repositories, or projects that are expected to be built from source.
Why Rust?
Because it's πππ BLAZINGLY FAST πππ and πΎπΎπΎ MEMORY SAFE πΎπΎπΎ and πππ ZERO-COST ABSTRACTIONS πππ and β‘β‘β‘ FEARLESSLY CONCURRENT β‘β‘β‘ an
License
MIT OR Apache-2.0