stew icon

stew

An independent package manager for compiled binaries.

build status go report card Coverage Status pkg.go.dev reference Mentioned in Awesome Go

# Features * Install binaries from GitHub releases or directly from URLs. * Easily distribute binaries across teams and private repositories. * Get the latest releases ahead of other package managers. * Rapidly browse, install, and experiment with different projects. * [Configure](https://github.com/marwanhawari/stew/blob/main/config.md) where to install binaries. * No need for `sudo`. * Just a single binary with 0 dependencies. * Portable [`Stewfile`](https://github.com/marwanhawari/stew/blob/main/examples/Stewfile) with optional pinned versioning. * Headless batch installs from a [`Stewfile.lock.json`](https://github.com/marwanhawari/stew/blob/main/examples/Stewfile.lock.json) file. ![demo](https://github.com/marwanhawari/stew/raw/main/assets/demo.gif) # Installation Stew supports macOS, Linux, and Windows. ### Install using a package manager
macOS ```sh brew install marwanhawari/tap/stew ```
Arch ```sh git clone https://aur.archlinux.org/stew.git cd stew makepkg -sric ```
### Download a compiled binary Compiled binaries can be downloaded from the [releases page](https://github.com/marwanhawari/stew/releases). ### Install using Go
Install the latest released version ```sh go install github.com/marwanhawari/stew@latest ```
Install the latest unreleased source ```sh git clone https://github.com/marwanhawari/stew cd stew go install . ```
# Usage ### Install ```sh # Install from GitHub releases stew install junegunn/fzf # Install the latest release stew install junegunn/fzf@0.27.1 # Install a specific, tagged version # Install directly from a URL stew install https://github.com/cli/cli/releases/download/v2.4.0/gh_2.4.0_macOS_amd64.tar.gz # Install from an Stewfile stew install Stewfile # Install headlessly from a Stewfile.lock.json stew install Stewfile.lock.json # Install mutliple binaries per repo/asset stew install astral-sh/uv # Install uv the first time stew install astral-sh/uv # Install uvx the second time ``` ### Search ```sh # Search for a GitHub repo and browse its contents with a terminal UI stew search ripgrep stew search fzf user:junegunn language:go # Use GitHub search syntax ``` ### Browse ```sh # Browse a specific GitHub repo's releases and assets with a terminal UI stew browse sharkdp/hyperfine ``` ### Upgrade ```sh # Upgrade a binary to its latest version. Not for binaries installed from a URL. stew upgrade rg # Upgrade using the name of the binary directly stew upgrade --all # Upgrade all binaries ``` ### Uninstall ```sh # Uninstall a binary stew uninstall rg # Uninstall using the name of the binary directly stew uninstall --all # Uninstall all binaries ``` ### Rename ```sh # Rename an installed binary using an interactive UI stew rename rg # Rename using the name of the binary directly ``` ### List ```sh # List installed binaries stew list # Print to console stew list > Stewfile # Create an Stewfile without pinned tags stew list --tags > Stewfile # Pin tags ``` ### Config ```sh # Configure the stew file paths using an interactive UI stew config # Automatically updates the stew.config.json ``` # Configuration `stew` can be configured with a `stew.config.json` file. The location of this file will also depend on your OS: |Linux/macOS | Windows | | ------------ | ---------- | | `$XDG_CONFIG_HOME/stew` or `~/.config/stew` | `~/AppData/Local/stew/Config` | You can configure 2 aspects of `stew`: 1. The `stewPath`: this is where `stew` data is stored. 2. The `stewBinPath`: this is where `stew` installs binaries 3. `excludeFromUpgradeAll`: this is the list of binaries that you don't want to be upgraded during `stew upgrade --all`, perhaps because they have their own built in upgrade feature or because you want to pin a specific version. The default locations for the `stewPath` and `stewBinPath` are: | | Linux/macOS | Windows | | ------------ | ------------ | ---------- | | `stewPath` | `$XDG_DATA_HOME/stew` or `~/.local/share/stew` | `~/AppData/Local/stew` | | `stewBinPath` | `~/.local/bin` | `~/AppData/Local/stew/bin` | There are multiple ways to configure these: * When you first run `stew`, it will look for a `stew.config.json` file. If it cannot find one, then you will be prompted to set the configuration values. * After `stew` is installed, you can use the `stew config` command to set the configuration values. * At any time, you can manually create or edit the `stew.config.json` file. It should have values for `stewPath`, `stewBinPath`, and `excludeFromUpgradeAll`. Make sure that the installation path is in your `PATH` environment variable. Otherwise, you won't be able to use any of the binaries installed by `stew`. # FAQ ### Why couldn't `stew` automatically find any binaries for X repo? The repo probably uses an unconventional naming scheme for their binaries. You can always manually select the release asset. ### Will `stew` work with private GitHub repositories? Yes, `stew` will automatically detect if you have a `GITHUB_TOKEN` environment variable and allow you to access binaries from your private repositories. ### I'm hitting the GitHub API rate limit with a large `Stewfile.lock.json`. How can I avoid this? Unauthenticated GitHub API requests are limited to 60 requests per hour. However, authenticated requests can make up to 5,000 requests per hour. To avoid hitting the limit, set a `GITHUB_TOKEN` environment variable. `Stew` will automatically detect it and use it for authenticated GitHub API requests.