Skip to content

Latest commit

 

History

History
244 lines (186 loc) · 8.4 KB

File metadata and controls

244 lines (186 loc) · 8.4 KB

Latest Release Downloads SLSA: Level 3 License
Tests & Scans Security Scans CodeQL
Test Coverage (%) Test Condition Coverage (%) Duplicated Lines (%) SonarQube Code Issues SonarQube Security Hotspots

ToolFetch

ToolFetch is a CLI for fetching and installing external tools from release URLs (e.g. GitHub releases) using a YAML configuration file.

It is designed for:

  • setting up new developer machines quickly and consistently
  • reproducible tool installations

Installation demo using toolfetch.yaml:

Demo

Installation

  1. Download the latest release for your OS/architecture from Releases
  2. Move the toolfetch binary to a directory in your $PATH (e.g., system-wide: /usr/local/bin or user-specific: $HOME/.local/bin)

Verify Releases

See VERIFICATION.md for details.

Usage

Given the following configuration file named toolfetch.yaml:

destination: "/opt"
tools:
  - id: "toolfetch"
    url: "https://github.com/jdheim/toolfetch/releases/download/v0.0.3/toolfetch-0.0.3-linux-amd64.tar.gz"

When you invoke the command: toolfetch --config "toolfetch.yaml", the latest version of the tool will be installed like this:

/opt
|-- toolfetch

You can use optional placeholder: ${version} in url which will be replaced with version value at runtime:

destination: "/opt"
tools:
  - id: "toolfetch"
    version: "0.0.3"
    url: "https://github.com/jdheim/toolfetch/releases/download/v${version}/toolfetch-${version}-linux-amd64.tar.gz"
  - id: "intellij-idea"
    version: "2026.1.1"
    url: "https://download.jetbrains.com/idea/idea-${version}.tar.gz"

When you invoke the command again, tools will be installed like this:

/opt
|-- intellij-idea
|-- toolfetch

You can optionally define a destination key for a specific tool to install it somewhere else:

destination: "/opt"
tools:
  - id: "toolfetch"
    version: "0.0.3"
    url: "https://github.com/jdheim/toolfetch/releases/download/v${version}/toolfetch-${version}-linux-amd64.tar.gz"
    destination: "best-tools" # or absolute path: "/opt/best-tools"
  - id: "intellij-idea"
    version: "2026.1.1"
    url: "https://download.jetbrains.com/idea/idea-${version}.tar.gz"

Now, when you invoke the same command, tools will be installed like this:

/opt
|-- intellij-idea
|-- best-tools
    |-- toolfetch

You can optionally define a checksums key for a specific tool to verify the downloaded archive before it is extracted:

destination: "/opt"
tools:
  - id: "toolfetch"
    version: "0.0.3"
    url: "https://github.com/jdheim/toolfetch/releases/download/v${version}/toolfetch-${version}-linux-amd64.tar.gz"
    checksums:
      sha256: "5c0a98ae80e06eea619ae878d84748154405903b42fc12c1cd02ddf98440eb77"
  - id: "intellij-idea"
    version: "2026.1.1"
    url: "https://download.jetbrains.com/idea/idea-${version}.tar.gz"
    checksums:
      sha256: "7a58d386f2a2e5a8cd7e4591657b4fe599aeac22d960c7accf5f927846507bfb"

Environment Variables

Environment variables can be used in toolfetch.yaml using either $VAR or ${VAR} syntax.

Currently supported in:

  • destination
  • tools[].destination

Example:

destination: "$HOME/tools"
tools:
  - id: "toolfetch"
    version: "0.0.3"
    url: "https://github.com/jdheim/toolfetch/releases/download/v${version}/toolfetch-${version}-linux-amd64.tar.gz"
    destination: "${PWD}/best-tools"

Archive and Compression Formats

Currently, the following Archive Formats are supported:

  • tar
  • zip
  • jar

Warning

7z support is planned

and Compression Formats:

  • brotli
  • bzip2
  • deflate
  • gzip
  • lz4
  • lzma
  • pack200 (for jars)
  • snappy (excluding iwa)
  • xz
  • z
  • zstandard
  • concatenated streams for bzip2, gzip, xz and lz4

Checksum Verification Formats

Currently, the following Checksum Verification Formats are supported:

  • sha256
  • sha384
  • sha512

Custom Certificate Authorities

Warning

TrustStore configuration support in toolfetch.yaml is planned

If your organization uses custom Certificate Authorities, you may need to configure a Java TrustStore.

Pass JVM options directly to toolfetch:

  • -Djavax.net.ssl.trustStore=path/to/truststore
  • -Djavax.net.ssl.trustStorePassword=changeit

Otherwise, you may encounter an exception like:

(certificate_unknown) PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

💖 Support

Hey there! If you enjoy my work and would like to support me, consider buying me a coffee! 🙂 Your contributions help me keep creating, and I truly appreciate every bit of support you offer.

Buy me a Coffee

Also, please consider giving this project a ⭐ on GitHub. This kind of support helps promote the project and lets others know that it's worth checking out.

Thank you for being amazing!

©️ License

Copyright 2026 JDHeim.com

This project is licensed under the Apache License, Version 2.0. See the LICENSE file for full license terms.