tool-sync

GitHub CI Latest GitHub release MPL-2.0 license

tool-sync is a CLI tool for installing your other favourite tools from GitHub Releases.

tool-sync demo

ℹ️ DISCLAIMER: tool-sync is developed and maintained in free time by volunteers. The development may continue for decades or may stop tomorrow. You can use GitHub Sponsorship to support the development of this project.

What it really does?

tool-sync embraces the idea that configuring your personal development environment should be as easy as possible. And the life is pretty easy when all the tools are simple executables.

So why not simply download all executables you use and put them in one place??? 😱

With tool-sync, you can install all the tools you use by following three simple steps:

  1. Install tool-sync.
  2. Configure tool-sync by listing all the tools you need and specifying where to put them.
  3. Run tool sync.

That's all! 🥳

Then tool-sync does the following:

Features

tool-sync has several distinguished features that allows you to manage your personal toolbox easily:

Install

From releases (recommended)

You can install tool-sync directly from GitHub releases in a few steps:

  1. Go to the latest release.
  2. Download an asset for your OS.
  3. Unpack the tool executable to a desired location.

From crates

You can use cargo to install the latest published version of tool-sync from crates:

shell cargo install tool-sync

From sources

You can install the latest version of tool-sync from sources (requires git and cargo):

shell git clone https://github.com/chshersh/tool-sync cd tool-sync cargo build --release ./target/release/tool --version

Configure

tool-sync reads configuration from a file in TOML format. An example configuration file is shown below:

```toml

a directory to store all tools

store_directory = "~/.local/bin"

the following tools will be installed in 'store_directory'

[bat] [difftastic] [exa] [fd] [ripgrep] ```

By default tool-sync reads configuration from ~/.tool.toml but you can put the content in any place and specify the path via the --config flag.

You can also quickly copy the above configuration to the default path by running the following command (Unix-only):

shell curl https://raw.githubusercontent.com/chshersh/tool-sync/main/example-tool-sync-config.toml > ~/.tool.toml

The above example config lists some tools natively supported by tool-sync and therefore they don't require extra configuration.

To specify a tool not supported by tool-sync, add a TOML table entry and list all the required fields like in the example below:

```toml [tokei] owner = "XAMPPRocky" # GitHub username repo = "tokei" # GitHub repository exe_name = "tokei" # Executable name inside the asset

Asset name to download on linux OSes

assetname.linux = "x8664-unknown-linux-musl"

uncomment if you want to install on macOS as well

asset_name.macos = "apple-darwin"

uncomment if you want to install on Windows as well

assetname.windows = "x8664-pc-windows-msvc"

```

ℹ️ tool-sync searches asset name using the substring search. That's why you don't need to specify the full asset name in the config, only the minimal part required for identifying the asset. However, tool-sync doesn't guarantee you to find the asset you need if multiple assets from the GitHub release match the substring.

All fields in each tool section are

This means that you can override only some of the fields for known tools.

This can be helpful if e.g. you want to install a custom version of ripgrep from a forked repository. To do this, specify only the repository owner in the config:

toml [ripgrep] owner = "me"

Usage

Install all the tools specified in ~/.tool.toml:

shell tool sync

Install all the tools from config in a different location:

shell tool --config=path/to/my/config.toml sync

Run tool --help for more details.

:octocat: If you hit the limit for downloading assets or want to download assets from private repositories, create a personal access token and export it as the GITHUB_TOKEN environment variable.

Alternatives

This section contains tool-sync comparison to existing alternatives:

  1. Manual download. You can download GitHub releases manually without using any extra tools.

  2. GitHub CLI. You can download assets from releases using the GitHub CLI tool gh.

    shell gh release download --repo chshersh/tool-sync v0.0.0 --pattern='*linux*' tar -xvf tool-x86_64-unknown-linux-gnu.tar.gz ./tool --version

  3. dra. dra is the closest alternative to tool-sync. It's a CLI tool, written in Rust, that allows downloading individual releases easily.

  4. home-manager. Home Manager provides a full-features solution for managing a user environment using the Nix package manager.

For contributors

Check CONTRIBUTING.md for contributing guidelines.

Development

Build

Use cargo to build the project and run all tests:

shell cargo build cargo test

Adding a new tool

tool-sync contains a database of common tools and provides easier support for them. It's possible to add more tools (and you can suggest them!). The following list contains guidelines for including a new tool. They don't serve as gatekeeping criteria but more as points system: