Skip to main content

Keep updated binaries in your dotfiles

Project description

dotbins 🧰

Build Coverage GitHub PyPI License Downloads Open Issues

Introducing dotbins - a utility for managing CLI tool binaries in your dotfiles repository. It downloads and organizes binaries for popular tools across multiple platforms (macOS, Linux) and architectures (amd64, arm64), helping you maintain a consistent set of CLI utilities across all your environments.

Whether you work across multiple machines or just want a version-controlled setup for your essential command-line tools, dotbins makes it easy to keep everything synchronized and updated. 🚀

[ToC] 📚

:star2: Features

  • 🌐 Supports multiple platforms (macOS, Linux) and architectures (amd64, arm64)
  • 📦 Downloads and organizes binaries from GitHub releases
  • 🔄 Updates tools to their latest versions with a single command
  • 🧩 Extracts binaries from various archive formats (zip, tar.gz)
  • 📂 Organizes tools by platform and architecture for easy access
  • 🔍 Includes a tool to analyze GitHub releases to help configure new tools
  • 🐙 Easy integration with your dotfiles repository for version control

:books: Usage

To use dotbins, you'll need to familiarize yourself with its commands:

dotbins --help
usage: dotbins [-h] [-v] [--tools-dir TOOLS_DIR] [--config-file CONFIG_FILE]
               {list,update,init,analyze,version} ...

dotbins - Manage CLI tool binaries in your dotfiles repository

positional arguments:
  {list,update,init,analyze,version}
                        Command to execute
    list                List available tools
    update              Update tools
    init                Initialize directory structure
    analyze             Analyze GitHub releases for a tool
    version             Print version information

options:
  -h, --help            show this help message and exit
  -v, --verbose         Enable verbose output (default: False)
  --tools-dir TOOLS_DIR
                        Tools directory (default: None)
  --config-file CONFIG_FILE
                        Path to configuration file (default: None)

Commands

  1. init - Initialize the tools directory structure
  2. list - List available tools defined in your configuration
  3. update - Download or update tools
  4. analyze - Analyze GitHub releases to help configure new tools

:hammer_and_wrench: Installation

To install dotbins, simply use pip:

pip install dotbins

You'll also need to create or update your tools.yaml configuration file either in the same directory as the script or at a custom location specified with --tools-dir.

:gear: Configuration

dotbins uses a YAML configuration file (tools.yaml) to define the tools and settings.

Basic Configuration

# Basic settings
dotfiles_dir: ~/.dotfiles
tools_dir: ~/.dotfiles/tools

# Target platforms and architectures
platforms:
  - linux
  - macos
architectures:
  - amd64
  - arm64

# Tool definitions
tools:
  # Tool configuration entries

Tool Configuration

Each tool must be configured with these fields:

tool-name:
  repo: owner/repo                 # Required: GitHub repository
  extract_binary: true             # Whether to extract from archive (true) or direct download (false)
  binary_name: executable-name     # Name of the resulting binary(ies)
  binary_path: path/to/binary      # Path to the binary within the archive
  # Option 1: Platform-specific patterns
  asset_patterns:                  # Required: Asset patterns for each platform
    linux: pattern-for-linux.tar.gz
    macos: pattern-for-macos.tar.gz
  # Option 2: Single pattern for all platforms
  asset_patterns: pattern-for-all-platforms.tar.gz  # Global pattern for all platforms

Platform and Architecture Mapping

If the tool uses different naming for platforms or architectures:

tool-name:
  # Basic fields...
  platform_map:                    # Optional: Platform name mapping
    macos: darwin                  # Converts "macos" to "darwin" in patterns
  arch_map:                        # Optional: Architecture name mapping
    amd64: x86_64                  # Converts "amd64" to "x86_64" in patterns
    arm64: aarch64                 # Converts "arm64" to "aarch64" in patterns

Pattern Variables

In asset patterns, you can use these variables:

  • {version} - Release version (without 'v' prefix)
  • {platform} - Platform name (after applying platform_map)
  • {arch} - Architecture name (after applying arch_map)

Multiple Binaries

For tools that provide multiple binaries:

tool-name:
  # Other fields...
  binary_name: [main-binary, additional-binary]
  binary_path: [path/to/main, path/to/additional]

Configuration Examples

Standard Tool

ripgrep:
  repo: BurntSushi/ripgrep
  extract_binary: true
  binary_name: rg
  binary_path: rg
  asset_patterns:
    linux: ripgrep-{version}-x86_64-unknown-linux-musl.tar.gz
    macos: ripgrep-{version}-x86_64-apple-darwin.tar.gz
  arch_map:
    amd64: x86_64
    arm64: aarch64

Tool with Multiple Binaries

uv:
  repo: astral-sh/uv
  extract_binary: true
  binary_name: [uv, uvx]
  binary_path: [uv-*/uv, uv-*/uvx]
  asset_patterns:
    linux: uv-{arch}-unknown-linux-gnu.tar.gz
    macos: uv-{arch}-apple-darwin.tar.gz
  arch_map:
    amd64: x86_64
    arm64: aarch64

Platform-Specific Tool

linux-only-tool:
  repo: owner/linux-tool
  extract_binary: true
  binary_name: linux-tool
  binary_path: bin/linux-tool
  asset_patterns:
    linux: linux-tool-{version}-{arch}.tar.gz
    macos: null  # No macOS version available

Full Configuration Example

# Configuration
dotfiles_dir: ~/.dotfiles
tools_dir: ~/.dotfiles/tools

# Target platforms and architectures
platforms:
  - linux
  - macos
architectures:
  - amd64
  - arm64

# Tool definitions
tools:
  fzf:
    repo: junegunn/fzf
    extract_binary: true
    binary_name: fzf
    binary_path: fzf
    asset_patterns: fzf-{version}-{platform}_{arch}.tar.gz
    platform_map:
      macos: darwin

  bat:
    repo: sharkdp/bat
    extract_binary: true
    binary_name: bat
    binary_path: bat-v{version}-{arch}-*/bat
    arch_map:
      amd64: x86_64
      arm64: aarch64
    asset_patterns:
      linux: bat-v{version}-{arch}-unknown-linux-gnu.tar.gz
      macos: bat-v{version}-{arch}-apple-darwin.tar.gz

  eza:
    repo: eza-community/eza
    extract_binary: true
    binary_name: eza
    binary_path: eza
    arch_map:
      amd64: x86_64
      arm64: aarch64
    asset_patterns:
      linux: eza_{arch}-unknown-linux-gnu.tar.gz
      macos: null  # No macOS binaries available as of now

  zoxide:
    repo: ajeetdsouza/zoxide
    extract_binary: true
    binary_name: zoxide
    binary_path: zoxide
    arch_map:
      amd64: x86_64
      arm64: aarch64
    asset_patterns:
      linux: zoxide-{version}-{arch}-unknown-linux-musl.tar.gz
      macos: zoxide-{version}-{arch}-apple-darwin.tar.gz

  delta:
    repo: dandavison/delta
    extract_binary: true
    binary_name: delta
    binary_path: delta-{version}-{arch}-*/delta
    arch_map:
      amd64: x86_64
      arm64: aarch64
    asset_patterns:
      linux: delta-{version}-{arch}-unknown-linux-gnu.tar.gz
      macos: delta-{version}-{arch}-apple-darwin.tar.gz

  uv:
    repo: astral-sh/uv
    extract_binary: true
    binary_name: [uv, uvx]
    binary_path: [uv-*/uv, uv-*/uvx]
    arch_map:
      amd64: x86_64
      arm64: aarch64
    asset_patterns:
      linux: uv-{arch}-unknown-linux-gnu.tar.gz
      macos: uv-{arch}-apple-darwin.tar.gz

:bulb: Examples

List available tools:

dotbins list

Update all tools for all platforms:

dotbins update

Update specific tools only:

dotbins update fzf bat

Update tools for a specific platform/architecture:

dotbins update -p macos -a arm64

Analyze a GitHub repository to help configure a new tool:

dotbins analyze owner/repo

:computer: Shell Integration

Add this to your shell configuration file (e.g., .bashrc, .zshrc) to use the platform-specific binaries:

# 🛠️ dotbins initialized tools directory structure

# Add this to your shell configuration file (e.g., .bashrc, .zshrc):

# dotbins - Add platform-specific binaries to PATH
_os=$(uname -s | tr '[:upper:]' '[:lower:]')
[[ "$_os" == "darwin" ]] && _os="macos"

_arch=$(uname -m)
[[ "$_arch" == "x86_64" ]] && _arch="amd64"
[[ "$_arch" == "aarch64" || "$_arch" == "arm64" ]] && _arch="arm64"

export PATH="$HOME/.dotfiles/tools/$_os/$_arch/bin:$PATH"

:mag: Finding Tool Patterns

To add a new tool, you can use the analyze command to examine GitHub release assets:

dotbins analyze sharkdp/bat

This will suggest a configuration for the tool based on its release assets.

:heart: Support and Contributions

We appreciate your feedback and contributions! If you encounter any issues or have suggestions for improvements, please file an issue on the GitHub repository. We also welcome pull requests for bug fixes or new features.

Happy tooling! 🧰🛠️🎉

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dotbins-0.1.0.tar.gz (32.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dotbins-0.1.0-py3-none-any.whl (22.2 kB view details)

Uploaded Python 3

File details

Details for the file dotbins-0.1.0.tar.gz.

File metadata

  • Download URL: dotbins-0.1.0.tar.gz
  • Upload date:
  • Size: 32.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for dotbins-0.1.0.tar.gz
Algorithm Hash digest
SHA256 1635b98acea7f90fabeffbdbf9538b3b9148b1522a7d2987f9015d915f1452dd
MD5 f4f26af4165ae47e7bf051da9e2c0182
BLAKE2b-256 a5fe8b4f255a76a917222b1b7358def4e63ecfaab5450b60791586ddd8fc228e

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotbins-0.1.0.tar.gz:

Publisher: release.yml on basnijholt/dotbins

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dotbins-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: dotbins-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for dotbins-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e542701f36d810071cb2f0564b30b635290d424cbe4170960365b671e613921e
MD5 f10db0ed3743e4a10bcdc0923ea18728
BLAKE2b-256 ac298cfb958201223e1523a563bf0e70434ce0234cd69327a20944ed5577efb7

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotbins-0.1.0-py3-none-any.whl:

Publisher: release.yml on basnijholt/dotbins

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page