{"id":30112397,"url":"https://github.com/basnijholt/dotbins","last_synced_at":"2026-02-01T21:01:20.880Z","repository":{"id":281515467,"uuid":"945515472","full_name":"basnijholt/dotbins","owner":"basnijholt","description":"Keep updated binaries in your dotfiles 🧰","archived":false,"fork":false,"pushed_at":"2026-01-21T09:02:43.000Z","size":639,"stargazers_count":239,"open_issues_count":16,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-01-23T09:03:38.235Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://dotbins.nijho.lt","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/basnijholt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-09T15:56:19.000Z","updated_at":"2026-01-21T09:02:46.000Z","dependencies_parsed_at":"2025-03-09T16:33:22.220Z","dependency_job_id":"369d58fd-d100-4d6f-bc52-52f154d360a1","html_url":"https://github.com/basnijholt/dotbins","commit_stats":null,"previous_names":["basnijholt/dotbins"],"tags_count":69,"template":false,"template_full_name":null,"purl":"pkg:github/basnijholt/dotbins","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basnijholt%2Fdotbins","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basnijholt%2Fdotbins/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basnijholt%2Fdotbins/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basnijholt%2Fdotbins/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/basnijholt","download_url":"https://codeload.github.com/basnijholt/dotbins/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basnijholt%2Fdotbins/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28990675,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T20:57:35.821Z","status":"ssl_error","status_checked_at":"2026-02-01T20:57:29.580Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-10T06:16:30.870Z","updated_at":"2026-02-01T21:01:20.872Z","avatar_url":"https://github.com/basnijholt.png","language":"Python","funding_links":[],"categories":["\u003ca name=\"file-handling\"\u003e\u003c/a\u003eFile and file system handling"],"sub_categories":[],"readme":"# dotbins 🧰\n\n![Build Status](https://github.com/basnijholt/dotbins/actions/workflows/pytest.yml/badge.svg)\n[![Coverage](https://img.shields.io/codecov/c/github/basnijholt/dotbins)](https://codecov.io/gh/basnijholt/dotbins)\n[![GitHub](https://img.shields.io/github/stars/basnijholt/dotbins.svg?style=social)](https://github.com/basnijholt/dotbins/stargazers)\n[![PyPI](https://img.shields.io/pypi/v/dotbins.svg)](https://pypi.python.org/pypi/dotbins)\n[![License](https://img.shields.io/github/license/basnijholt/dotbins)](https://github.com/basnijholt/dotbins/blob/main/LICENSE)\n[![Downloads](https://img.shields.io/pypi/dm/dotbins)](https://pypi.python.org/pypi/dotbins)\n![Open Issues](https://img.shields.io/github/issues-raw/basnijholt/dotbins)\n[![Docs](https://img.shields.io/badge/docs-dotbins.nijho.lt-blue)](https://dotbins.nijho.lt)\n\n\u003c!-- SECTION:intro:START --\u003e\n\u003cimg src=\"https://github.com/user-attachments/assets/cf1b44aa-ca39-4967-a4c9-52258c9d9021\" align=\"right\" style=\"width: 350px;\" /\u003e\n\n**dotbins** manages CLI tool binaries in your [dotfiles](https://github.com/basnijholt/dotfiles) repository, offering:\n\n- ✅ Cross-platform binary management (macOS, Linux, Windows)\n- ✅ No admin privileges required\n- ✅ Version-controlled CLI tools\n- ✅ Downloads from GitHub releases\n- ✅ Perfect for dotfiles synchronization\n\nNo package manager, no sudo, no problem.\n\nSee this example `.dotbins` repository: [basnijholt/.dotbins](https://github.com/basnijholt/.dotbins) completely managed with `dotbins`.\n\n\u003e [!NOTE]\n\u003e 💡 **What makes dotbins different?** Unlike similar tools, dotbins uniquely integrates tool-specific shell configurations\n\u003e (aliases, completions, etc.) directly in your dotfiles workflow, not just binary downloads, and allows a Git workflow for managing binaries.\n\u003c!-- SECTION:intro:END --\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003e\u003cu\u003e[ToC]\u003c/u\u003e\u003c/b\u003e 📚\u003c/summary\u003e\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n- [:zap: Quick Start](#zap-quick-start)\n- [:star2: Features](#star2-features)\n- [:bulb: Why I Created dotbins](#bulb-why-i-created-dotbins)\n- [:books: Usage](#books-usage)\n  - [Commands](#commands)\n  - [Update Process with `dotbins sync`](#update-process-with-dotbins-sync)\n  - [Quick Install with `dotbins get`](#quick-install-with-dotbins-get)\n  - [Initializing with `dotbins init`](#initializing-with-dotbins-init)\n- [:hammer_and_wrench: Installation](#hammer_and_wrench-installation)\n- [:gear: Configuration](#gear-configuration)\n  - [Basic Configuration](#basic-configuration)\n  - [Directory Structure](#directory-structure)\n  - [Tool Configuration](#tool-configuration)\n  - [Pattern Variables](#pattern-variables)\n  - [Platform and Architecture Mapping](#platform-and-architecture-mapping)\n  - [Asset auto-detection defaults](#asset-auto-detection-defaults)\n    - [Example: libc selection](#example-libc-selection)\n    - [Example: AppImage preference](#example-appimage-preference)\n    - [Example: Windows ABI](#example-windows-abi)\n  - [Multiple Binaries](#multiple-binaries)\n  - [Configuration Examples](#configuration-examples)\n    - [Minimal Tool Configuration](#minimal-tool-configuration)\n    - [Standard Tool](#standard-tool)\n    - [Tool with Multiple Binaries](#tool-with-multiple-binaries)\n    - [Platform-Specific Tool](#platform-specific-tool)\n    - [Version-Pinned Tool](#version-pinned-tool)\n    - [Shell-Specific Configuration](#shell-specific-configuration)\n  - [Full Configuration Example](#full-configuration-example)\n- [:bulb: Examples](#bulb-examples)\n- [:computer: Shell Integration](#computer-shell-integration)\n  - [What's in the Shell Scripts?](#whats-in-the-shell-scripts)\n  - [Shell Startup Integration](#shell-startup-integration)\n- [:books: Examples with 50+ Tools](#books-examples-with-50-tools)\n- [:wrench: Troubleshooting](#wrench-troubleshooting)\n  - [Common Issues](#common-issues)\n    - [GitHub API Rate Limits](#github-api-rate-limits)\n    - [Windows-Specific Issues](#windows-specific-issues)\n  - [Getting Help](#getting-help)\n- [:thinking: Comparison with Alternatives](#thinking-comparison-with-alternatives)\n  - [Key Alternatives](#key-alternatives)\n    - [Version Managers (e.g., `binenv`, `asdf`)](#version-managers-eg-binenv-asdf)\n    - [Binary Downloaders (e.g., `eget`)](#binary-downloaders-eg-eget)\n    - [System Package Managers (`apt`, `brew`, etc.)](#system-package-managers-apt-brew-etc)\n  - [The `dotbins` Difference](#the-dotbins-difference)\n- [:heart: Support and Contributions](#heart-support-and-contributions)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n\u003c/details\u003e\n\n\u003c!-- SECTION:quick-start:START --\u003e\n## :zap: Quick Start\n\nUsing the amazing [`uv`](https://docs.astral.sh/uv/) package manager (`uv tool install dotbins`):\n\n```bash\n# Create a sample configuration file to get started\ndotbins init\n\n# Install/update tools using a config file (to tools_dir, e.g., ~/.dotbins)\ndotbins sync\n\n# Install a single tool (defaults to ~/.local/bin) - No config needed!\ndotbins get junegunn/fzf\n\n# Install tools from a remote config (defaults to ~/.local/bin)\ndotbins get https://github.com/basnijholt/.dotbins/blob/main/dotbins.yaml\n```\n\n**See it in action:**\n\n[![asciicast](https://asciinema.org/a/709229.svg)](https://asciinema.org/a/709229)\n\u003c!-- SECTION:quick-start:END --\u003e\n\n\u003c!-- SECTION:features:START --\u003e\n## :star2: Features\n\n- 🌐 Supports multiple platforms (macOS, Linux, Windows) and architectures (amd64, arm64, etc.)\n- 📦 Downloads and organizes binaries from GitHub releases\n- 🔄 Installs and updates tools to their latest versions with a single command\n- 📌 Pin tools to specific versions with the `tag` parameter\n- 📊 Tracks installed versions and update timestamps for all tools\n- 🧩 Extracts binaries from various archive formats (zip, tar.gz)\n- 📂 Organizes tools by platform and architecture for easy access\n- 🐙 Easy integration with your dotfiles repository for version control\n- ⚙️ **Automatic PATH \u0026 Shell Code:** Configures `PATH` and applies custom shell snippets (`shell_code`).\n\u003c!-- SECTION:features:END --\u003e\n\n\u003c!-- SECTION:why:START --\u003e\n## :bulb: Why I Created dotbins\n\nI frequently works across multiple environments where I clone [my dotfiles repository](https://github.com/basnijholt/dotfiles) with all my preferred configurations.\nI faced a common frustration: some of my favorite tools (`fzf`, `bat`, `zoxide`, etc.) were not available on the new system and installing them with a package manager is too much work or even not possible.\n`dotbins` was born out of this frustration.\n\nIt allows me to:\n\n1. Track pre-compiled binaries in a [separate Git repository](https://github.com/basnijholt/.dotbins) (using Git LFS for efficient storage)\n2. Include that repository as a submodule in my dotfiles\n3. Ensure all my essential tools are _immediately_ available after cloning, regardless of system permissions\n\nNow when I clone [my dotfiles](https://github.com/basnijholt/dotfiles) on any new system, I get not just my configurations but also all the CLI tools I depend on for productivity, **ready to use with their specific aliases and shell initializations automatically configured**.\n\n**_No package manager, no sudo, no problem!_**\n\u003c!-- SECTION:why:END --\u003e\n\n---\n\n## :books: Usage\n\n\u003e [!TIP]\n\u003e Use `uvx dotbins` and create a `~/.config/dotbins/config.yaml` file to store your configuration.\n\nTo use `dotbins`, you'll need to familiarize yourself with its commands:\n\n```bash\ndotbins --help\n```\n\n\u003c!-- CODE:BASH:START --\u003e\n\u003c!-- echo '```bash' --\u003e\n\u003c!-- dotbins --help --\u003e\n\u003c!-- echo '```' --\u003e\n\u003c!-- CODE:END --\u003e\n\n\u003c!-- OUTPUT:START --\u003e\n\u003c!-- ⚠️ This content is auto-generated by `markdown-code-runner`. --\u003e\n```bash\nUsage: dotbins [-h] [-v] [--tools-dir TOOLS_DIR] [--config-file CONFIG_FILE]\n               {get,sync,init,list,status,readme,version} ...\n\ndotbins - Download, manage, and update CLI tool binaries in your dotfiles\nrepository\n\nPositional Arguments:\n  {get,sync,init,list,status,readme,version}\n                        Command to execute\n    get                 Download and install a tool directly without\n                        configuration file\n    sync                Install and update tools to their latest versions\n    init                Initialize directory structure and generate shell\n                        integration scripts\n    list                List all available tools defined in your configuration\n    status              Show installed tool versions and when they were last\n                        updated\n    readme              Generate README.md file with information about\n                        installed tools\n    version             Print dotbins version information\n\nOptions:\n  -h, --help            show this help message and exit\n  -v, --verbose         Enable verbose output with detailed logs and error\n                        messages\n  --tools-dir TOOLS_DIR\n                        Tools directory to use (overrides the value in the\n                        config file)\n  --config-file CONFIG_FILE\n                        Path to configuration file (default: looks in standard\n                        locations)\n```\n\n\u003c!-- OUTPUT:END --\u003e\n\n### Commands\n\n1. **sync** - Install and update tools to their latest versions\n2. **get** - Download and install a tool directly without using a configuration file\n3. **init** - Initialize the tools directory structure and generate a sample configuration file\n4. **list** - List available tools defined in your configuration\n5. **version** - Print version information\n6. **status** - Show detailed information about available and installed tool versions\n\n### Update Process with `dotbins sync`\n\nThe `sync` command is the core of dotbins, keeping your tools up-to-date across platforms.\nHere's what happens during `dotbins sync`:\n\n1. **Version Detection**:\n\n   - Checks each tool's current version in `manifest.json`\n   - Queries GitHub API for the latest release of each tool\n\n2. **Smart Updates**:\n\n   - Only downloads tools with newer versions available\n   - Skips up-to-date tools (unless `--force` is used)\n   - Reports which tools were updated, skipped, or failed\n\n3. **Multi-Platform Management**:\n\n   - Processes each platform/architecture combination configured\n   - Can be filtered to specific platforms: `dotbins sync -p linux`\n   - Can be limited to current system only: `dotbins sync -c`\n\n4. **File Generation**:\n   - Updates `manifest.json` with new version information\n   - Regenerates shell integration scripts with PATH and tool configurations\n   - Creates a README in the tools directory with installation status\n\n5. **Pinning to Manifest**:\n\n   - Use the `dotbins sync --pin-to-manifest` CLI flag to force `sync` to use the tags already recorded in `manifest.json`.\n   - This ignores the latest release information from GitHub and ensures that the installed versions match exactly what's in your manifest, which is useful for reproducibility or if your manifest file is version-controlled.\n\nExample update workflow:\n\n```bash\n# Update all tools for all configured platforms\ndotbins sync\n\n# Update only specific tools\ndotbins sync fzf bat\n\n# Update tools only for current platform\ndotbins sync --current\n\n# Force reinstall everything, even if up to date\ndotbins sync --force\n\n# Update tools using only the versions recorded in manifest.json\ndotbins sync --pin-to-manifest\n\n# See what is installed\ndotbins status\n```\n\nAfter updating, a summary is displayed showing what was installed, skipped, or had errors.\n\n### Quick Install with `dotbins get`\n\nThe `get` command allows you to quickly download and install tools directly from GitHub or from a remote configuration file:\n\n```bash\n# Install fzf to the default location (~/.local/bin)\ndotbins get junegunn/fzf\n\n# Install ripgrep with a custom binary name\ndotbins get BurntSushi/ripgrep --name rg\n\n# Install bat to a specific location\ndotbins get sharkdp/bat --dest ~/bin\n\n# Install multiple tools from a remote config URL/local path\ndotbins get https://example.com/my-tools.yaml --dest ~/.local/bin\n```\n\nThis is perfect for:\n\n- Quickly installing tools on a new system\n- One-off installations without needing a configuration file\n- Adding tools to PATH in standard locations like `~/.local/bin`\n- Bootstrapping with a pre-configured set of tools using a remote configuration URL or local config\n\nThe `get` command automatically detects whether you're providing a GitHub repository or a configuration URL/path.\nWhen using a URL/path, it will download all tools defined in the configuration for your current platform and architecture.\n\n### Initializing with `dotbins init`\n\nThe fastest way to get started with dotbins is to use the `init` command:\n\n```bash\ndotbins init\n```\n\nThis command:\n\n- Creates the directory structure for all configured platforms and architectures\n- Generates shell integration scripts for your system\n- If no config exists, creates a sample `dotbins.yaml` with sensible defaults\n\nThe generated sample config includes popular tools like `fzf`, `bat`, and `zoxide`, with support for multiple platforms:\n\nSample config generated by `dotbins init`:\n\n\u003c!-- CODE:BASH:START --\u003e\n\u003c!-- echo '```yaml' --\u003e\n\u003c!-- python3 -c \"import dotbins.cli; print(dotbins.cli._SAMPLE_CONFIG)\" --\u003e\n\u003c!-- echo '```' --\u003e\n\u003c!-- CODE:END --\u003e\n\n\u003c!-- OUTPUT:START --\u003e\n\u003c!-- ⚠️ This content is auto-generated by `markdown-code-runner`. --\u003e\n```yaml\n# dotbins sample configuration\n# Generated by `dotbins init`\n# See https://github.com/basnijholt/dotbins for more information\n\n# Directory where tool binaries will be stored\ntools_dir: ~/.dotbins\n\n# Target platforms and architectures for which to download binaries\n# These determine which system binaries will be downloaded and managed\nplatforms:\n  linux:\n    - amd64  # x86_64\n    - arm64  # aarch64\n  macos:\n    - arm64  # Apple Silicon\n  windows:\n    - amd64  # 64-bit Windows\n\n# Tool definitions\n# Format: tool_name: owner/repo or detailed configuration\ntools:\n  # Essential CLI tools with minimal configuration\n  bat: sharkdp/bat           # Syntax-highlighted cat replacement\n  fzf: junegunn/fzf          # Fuzzy finder for the terminal\n  zoxide: ajeetdsouza/zoxide # Smarter cd command with frecency\n\n  # Example with shell customization\n  # starship:\n  #   repo: starship/starship\n  #   shell_code: |\n  #     eval \"$(starship init bash)\"  # Change to your shell\n\n# For more configuration options, visit:\n# https://github.com/basnijholt/dotbins#gear-configuration\n\n```\n\n\u003c!-- OUTPUT:END --\u003e\n\nThis provides a good starting point that you can customize with your preferred tools and configurations.\n\n---\n\n\u003c!-- SECTION:installation:START --\u003e\n## :hammer_and_wrench: Installation\n\nWe highly recommend to use [`uv`](https://docs.astral.sh/uv/) to install/run `dotbins`:\n\n```bash\nuvx dotbins\n```\n\nor install as a global command:\n\n```bash\nuv tool install dotbins\n```\n\nOtherwise, simply use pip:\n\n```bash\npip install dotbins\n```\n\nYou'll also need to create or update your `dotbins.yaml` configuration file either in the same directory as the script or at a custom location specified with `--tools-dir`.\n\u003c!-- SECTION:installation:END --\u003e\n\n---\n\n## :gear: Configuration\n\ndotbins uses a YAML configuration file to define the tools and settings. The configuration file is searched in the following locations (in order):\n\n1. Explicitly provided path (using `--config-file` option)\n2. `./dotbins.yaml` (current directory)\n3. `~/.config/dotbins/config.yaml` (XDG config directory)\n4. `~/.config/dotbins.yaml` (XDG config directory, flat)\n5. `~/.dotbins.yaml` (home directory)\n6. `~/.dotbins/dotbins.yaml` (default dotfiles location)\n\nThe first valid configuration file found will be used. If no configuration file is found, default settings will be used.\n\n\u003e [!TIP]\n\u003e To create a starter configuration file, run `dotbins init`. This will generate a sample config with common tools in your tools directory.\n\n### Basic Configuration\n\n```yaml\n# Basic settings\ntools_dir: ~/.dotbins # (optional, ~/.dotbins by default)\n\n# Target platforms and architectures (optional, current system by default)\nplatforms:\n  linux:\n    - amd64\n    - arm64\n  macos:\n    - arm64 # Only arm64 for macOS\n\n# Tool definitions\ntools:\n  # Tool configuration entries\n```\n\n### Directory Structure\n\nWhen you run `dotbins sync`, it creates a directory structure that organizes binaries by platform and architecture, and generates shell integration scripts.\n\nHere's what gets created:\n\n```bash\n~/.dotbins/                # Root tools directory (configurable)\n├── README.md              # Auto-generated documentation\n├── dotbins.yaml           # Your configuration file (if copied)\n├── linux/                 # Platform-specific directories\n│   ├── amd64/bin/         # Architecture-specific binaries\n│   │   ├── bat\n│   │   ├── fzf\n│   │   └── ...\n│   └── arm64/bin/\n│       ├── bat\n│       ├── fzf\n│       └── ...\n├── macos/\n│   └── arm64/bin/\n│       ├── bat\n│       ├── fzf\n│       └── ...\n├── shell/                 # Shell integration scripts\n│   ├── bash.sh\n│   ├── fish.fish\n│   ├── nushell.nu\n│   ├── powershell.ps1\n│   └── zsh.sh\n└── manifest.json          # Version tracking information\n```\n\n### Tool Configuration\n\nEach tool must be configured with at least a GitHub repository.\nMany other fields are optional and can be auto-detected.\n\nThe simplest configuration is:\n\n```yaml\ntools:\n  # tool-name: owner/repo\n  zoxide: ajeetdsouza/zoxide\n  fzf: junegunn/fzf\n```\n\ndotbins will auto-detect the latest release, choose the appropriate asset for your platform, and install binaries to the specified `tools_dir` (defaults to `~/.dotbins`).\n\n\u003e [!NOTE]\n\u003e dotbins excels at auto-detecting the correct assets and binary paths for many tools.\n\u003e Always try the minimal configuration first!\n\nWhen auto-detection isn't possible or you want more control, you can provide detailed configuration:\n\n```yaml\ntool-name:\n  repo: owner/repo                 # Required: GitHub repository\n  tag: v1.2.3                      # Optional: Specific release tag to use (defaults to latest)\n  binary_name: executable-name     # Optional: Name of the resulting binary(ies) (defaults to tool-name)\n  extract_archive: true            # Optional: Whether to extract from archive (true) or direct download (false) (auto-detected if not specified)\n  path_in_archive: path/to/binary  # Optional: Path to the binary within the archive (auto-detected if not specified)\n\n  # Asset patterns - Optional with auto-detection\n  # Option 1: Platform-specific patterns\n  asset_patterns:                  # Optional: Asset patterns for each platform\n    linux: pattern-for-linux.tar.gz\n    macos: pattern-for-macos.tar.gz\n  # Option 2: Single pattern for all platforms\n  asset_patterns: pattern-for-all-platforms.tar.gz  # Global pattern for all platforms\n  # Option 3: Explicit platform patterns for different architectures\n  asset_patterns:\n    linux:\n      amd64: pattern-for-linux-amd64.tar.gz\n      arm64: pattern-for-linux-arm64.tar.gz\n    macos:\n      amd64: pattern-for-macos-amd64.tar.gz\n      arm64: pattern-for-macos-arm64.tar.gz\n```\n\nAsset patterns support variables like `{version}`, `{platform}`, and `{arch}` that are automatically replaced with the appropriate values (see Pattern Variables section for details).\n\n### Pattern Variables\n\nIn asset patterns, you can use special variables that get replaced with actual values when dotbins searches for the correct asset to download:\n\n- `{version}` - Release version (without 'v' prefix)\n- `{platform}` - Platform name (after applying platform_map)\n- `{arch}` - Architecture name (after applying arch_map)\n\nFor example, if a tool release has version `v2.4.0` and you're on `linux/amd64`:\n\n```yaml\nmytool:\n  repo: owner/mytool\n  asset_patterns: mytool-{version}-{platform}_{arch}.tar.gz\n```\n\nThis would search for an asset named: `mytool-2.4.0-linux_amd64.tar.gz`\n\nWith platform and architecture mapping:\n\n```yaml\nmytool:\n  repo: owner/mytool\n  platform_map:\n    macos: darwin # Convert \"macos\" to \"darwin\" in patterns\n  arch_map:\n    amd64: x86_64 # Convert \"amd64\" to \"x86_64\" in patterns\n  asset_patterns: mytool-{version}-{platform}_{arch}.tar.gz\n```\n\nFor macOS/amd64, this would search for: `mytool-2.4.0-darwin_x86_64.tar.gz`\n\n**Real-world example:**\n\n```yaml\nripgrep:\n  repo: BurntSushi/ripgrep\n  binary_name: rg\n  arch_map:\n    amd64: x86_64\n    arm64: aarch64\n  asset_patterns:\n    linux: ripgrep-{version}-{arch}-unknown-linux-musl.tar.gz\n    macos: ripgrep-{version}-{arch}-apple-darwin.tar.gz\n```\n\nFor Linux/amd64, this would search for: `ripgrep-14.1.1-x86_64-unknown-linux-musl.tar.gz`\nFor macOS/arm64, this would search for: `ripgrep-14.1.1-aarch64-apple-darwin.tar.gz`\n\n### Platform and Architecture Mapping\n\nIf the tool uses different naming for platforms or architectures:\n\n```yaml\ntool-name:\n  # Basic fields...\n  platform_map:                    # Optional: Platform name mapping\n    macos: darwin                  # Converts \"macos\" to \"darwin\" in patterns\n  arch_map:                        # Optional: Architecture name mapping\n    amd64: x86_64                  # Converts \"amd64\" to \"x86_64\" in patterns\n    arm64: aarch64                 # Converts \"arm64\" to \"aarch64\" in patterns\n```\n\n### Asset auto-detection defaults\n\nWhen multiple compatible assets are available for your platform and architecture, dotbins uses these settings to determine which one to select:\n\n```yaml\n# Global defaults for all tools\ndefaults:\n  prefer_appimage: true   # Prioritize AppImage format when available\n  libc: musl              # Prefer musl over glibc on Linux\n  windows_abi: msvc       # Prefer MSVC over GNU ABI on Windows\n```\n\nThese are also the built-in defaults if no custom settings are provided.\n\n**Why these defaults?**\n\n- **musl libc**: Statically linked musl binaries offer maximum portability across all Linux distributions regardless of the system's native C library. They eliminate glibc version conflicts (the notorious `GLIBC_X.YZ not found` errors), work on **both** glibc and musl-based distributions (like Alpine Linux), and generally provide a more reliable user experience.\n\n- **AppImage**: AppImage bundles all dependencies in a single, self-contained file that works across different Linux distributions without installation, making it ideal for portable applications, (such as neovim, which requires extra runtime files.)\n\n- **Windows ABI**: The MSVC ABI is the default on Windows as it's the most widely used and generally more stable. However, if you're using MinGW or prefer GNU tools, you can set this to \"gnu\".\n\n#### Example: libc selection\n\nWhen requesting Linux amd64 and both of these assets are available:\n\n- `ripgrep-13.0.0-x86_64-unknown-linux-gnu.tar.gz` (uses glibc)\n- `ripgrep-13.0.0-x86_64-unknown-linux-musl.tar.gz` (uses musl)\n\nWith `libc=\"musl\"`, dotbins selects the musl version.\nWith `libc=\"glibc\"`, dotbins selects the gnu version.\n\n#### Example: AppImage preference\n\nWhen both formats are available:\n\n- `nvim-linux-x86_64.appimage`\n- `nvim-linux-x86_64.tar.gz`\n\nWith `prefer_appimage=true`, dotbins selects the AppImage version.\n\n#### Example: Windows ABI\n\nWhen requesting Windows x86_64 and both of these assets are available:\n\n- `bat-v0.25.0-x86_64-pc-windows-gnu.zip` (uses GNU ABI)\n- `bat-v0.25.0-x86_64-pc-windows-msvc.zip` (uses MSVC ABI)\n\nWith `windows_abi=\"msvc\"`, dotbins selects the MSVC version.\nWith `windows_abi=\"gnu\"`, dotbins selects the GNU version.\n\n### Multiple Binaries\n\nFor tools that provide multiple binaries:\n\n```yaml\ntool-name:\n  # Other fields...\n  binary_name: [main-binary, additional-binary]\n  path_in_archive: [path/to/main, path/to/additional]\n```\n\n### Configuration Examples\n\n#### Minimal Tool Configuration\n\n```yaml\ndirenv:\n  repo: direnv/direnv\n```\n\nor\n\n```yaml\nripgrep:\n  repo: BurntSushi/ripgrep\n  binary_name: rg # Only specify if different from tool name\n```\n\n#### Standard Tool\n\n```yaml\natuin:\n  repo: atuinsh/atuin\n  arch_map:\n    amd64: x86_64\n    arm64: aarch64\n  asset_patterns:\n    linux: atuin-{arch}-unknown-linux-gnu.tar.gz\n    macos: atuin-{arch}-apple-darwin.tar.gz\n```\n\n#### Tool with Multiple Binaries\n\n```yaml\nuv:\n  repo: astral-sh/uv\n  binary_name: [uv, uvx]\n  path_in_archive: [uv-*/uv, uv-*/uvx]\n```\n\n#### Platform-Specific Tool\n\n```yaml\neza:\n  repo: eza-community/eza\n  arch_map:\n    amd64: x86_64\n    arm64: aarch64\n  asset_patterns:\n    linux: eza_{arch}-unknown-linux-gnu.tar.gz\n    macos: null # No macOS version available\n```\n\n#### Version-Pinned Tool\n\n```yaml\nbat:\n  repo: sharkdp/bat\n  tag: v0.23.0  # Pin to specific version instead of latest\n```\n\n#### Shell-Specific Configuration\n\nThe auto-generated shell scripts that add the binaries to your PATH will include the tool-specific shell code if provided.\n\nFor example, see the following configuration:\n\n```yaml\ntools:\n  fzf:\n    repo: junegunn/fzf\n    shell_code: |\n      source \u003c(fzf --zsh)\n\n  zoxide:\n    repo: ajeetdsouza/zoxide\n    shell_code: |\n      eval \"$(zoxide init zsh)\"\n\n  eza:\n    repo: eza-community/eza\n    shell_code: |\n      alias l=\"eza -lah --git\"\n```\n\nIf you want to make your config compatible with multiple shells (e.g., zsh, bash, fish), you can use the following syntax:\n\n- **Separate entries per shell:** Define the code for each shell individually.\n- **Comma-separated shells:** Define the same code for multiple shells by listing them separated by commas (e.g., `bash,zsh:`).\n- **Placeholder:** Use the `__DOTBINS_SHELL__` placeholder within the shell code. This placeholder will be replaced by the actual shell name (`bash`, `zsh`, etc.) when the integration scripts are generated.\n\n```yaml\nstarship:\n  repo: starship/starship\n  shell_code:\n    bash,zsh: eval \"$(starship init __DOTBINS_SHELL__)\" # Use placeholder for bash and zsh\n    fish: starship init fish | source\n```\n\n### Full Configuration Example\n\nThis is the author's configuration file (and resulting [`basnijholt/.dotbins`](https://github.com/basnijholt/.dotbins) repo):\n\n\u003cdetails\u003e\u003csummary\u003eClick to view author's full dotbins.yaml\u003c/summary\u003e\n\n\u003c!-- CODE:BASH:START --\u003e\n\u003c!-- echo '```yaml' --\u003e\n\u003c!-- cat dotbins.yaml --\u003e\n\u003c!-- echo '```' --\u003e\n\u003c!-- CODE:END --\u003e\n\n\u003c!-- OUTPUT:START --\u003e\n\u003c!-- ⚠️ This content is auto-generated by `markdown-code-runner`. --\u003e\n```yaml\ntools_dir: ~/.dotbins\n\nplatforms:\n  linux:\n    - amd64\n    - arm64\n  macos:\n    - arm64\n\ntools:\n  delta: dandavison/delta\n  duf: muesli/duf\n  dust: bootandy/dust\n  fd: sharkdp/fd\n  hyperfine: sharkdp/hyperfine\n  rg: BurntSushi/ripgrep\n  yazi: sxyazi/yazi\n\n  bat:\n    repo: sharkdp/bat\n    shell_code:\n      bash,zsh: |\n        alias bat=\"bat --paging=never\"\n        alias cat=\"bat --plain --paging=never\"\n  bun:\n    repo: oven-sh/bun\n    arch_map:\n      amd64: x64\n      arm64: aarch64\n    asset_patterns:\n      linux: bun-linux-{arch}.zip\n      macos: bun-darwin-{arch}.zip\n    shell_code:\n      bash,zsh: |\n        alias bunx=\"bun x\"\n  direnv:\n    repo: direnv/direnv\n    shell_code:\n      bash,zsh: |\n        eval \"$(direnv hook __DOTBINS_SHELL__)\"\n  eza:\n    repo: eza-community/eza\n    shell_code:\n      bash,zsh: |\n        alias l=\"eza --long --all --git --icons=auto\"\n  fzf:\n    repo: junegunn/fzf\n    shell_code:\n      zsh: |\n        source \u003c(fzf --zsh)\n      bash: |\n        eval \"$(fzf --bash)\"\n  lazygit:\n    repo: jesseduffield/lazygit\n    shell_code:\n      bash,zsh: |\n        alias lg=\"lazygit\"\n  micromamba:\n    repo: mamba-org/micromamba-releases\n    shell_code:\n      bash,zsh: |\n        alias mm=\"micromamba\"\n  starship:\n    repo: starship/starship\n    shell_code:\n      bash,zsh: |\n        eval \"$(starship init __DOTBINS_SHELL__)\"\n  zoxide:\n    repo: ajeetdsouza/zoxide\n    shell_code:\n      bash,zsh: |\n        eval \"$(zoxide init __DOTBINS_SHELL__)\"\n  atuin:\n    repo: atuinsh/atuin\n    shell_code:\n      bash,zsh: |\n        eval \"$(atuin init __DOTBINS_SHELL__ --disable-up-arrow)\"\n\n  keychain:\n    repo: danielrobbins/keychain\n    asset_patterns: keychain\n\n  uv:\n    repo: astral-sh/uv\n    binary_name: [uv, uvx]\n    path_in_archive: [uv-*/uv, uv-*/uvx]\n```\n\n\u003c!-- OUTPUT:END --\u003e\n\n\u003c/details\u003e\n\n---\n\n## :bulb: Examples\n\nList all available tools in your configuration:\n\n```bash\ndotbins list\n```\n\nInstall or update all tools for all configured platforms:\n\n```bash\ndotbins sync\n```\n\nInstall or update specific tools only:\n\n```bash\ndotbins sync fzf bat ripgrep\n```\n\nInstall or update tools for a specific platform/architecture:\n\n```bash\ndotbins sync -p macos -a arm64\n```\n\nInstall or update tools only for the current system's platform and architecture, skipping others defined in the config:\n\n```bash\ndotbins sync -c\n```\n\nForce reinstall even if tools are up to date:\n\n```bash\ndotbins sync --force\n```\n\nInstall tools from a remote configuration:\n\n```bash\ndotbins get https://raw.githubusercontent.com/username/dotbins-config/main/tools.yaml --dest ~/bin\n```\n\nShow status (installed, missing tools, last updated) for all installed tools:\n\n```bash\ndotbins status\n```\n\nShow a compact view of installed tools (one line per tool):\n\n```bash\ndotbins status --compact\n```\n\nShow tools only for the current platform/architecture:\n\n```bash\ndotbins status --current\n```\n\nFilter tools by platform or architecture:\n\n```bash\ndotbins status --platform macos\ndotbins status --architecture arm64\n```\n\n---\n\n\u003c!-- SECTION:shell-integration:START --\u003e\n## :computer: Shell Integration\n\ndotbins creates shell scripts that add binaries to your `PATH` and apply your custom tool configurations.\n\nAfter running `dotbins sync` or `dotbins init`, shell integration scripts are created in `~/.dotbins/shell/` for various shells (Bash, Zsh, Fish, Nushell, and PowerShell)\n\n### What's in the Shell Scripts?\n\nThe generated shell scripts do two main things:\n\n1. **Add binaries to PATH** - Makes tool binaries available for your platform/architecture\n2. **Apply your tool-specific shell_code** - Sets up aliases, completions, and initializations\n\nFor example, with this configuration:\n\n```yaml\nfzf:\n  repo: junegunn/fzf\n  shell_code: |\n    source \u003c(fzf --zsh)\n\nbat:\n  repo: sharkdp/bat\n  shell_code: |\n    alias bat=\"bat --paging=never\"\n    alias cat=\"bat --plain --paging=never\"\n```\n\nThe generated `zsh.sh` will include:\n\n```bash\n#!/usr/bin/env zsh\n# dotbins - Add platform-specific binaries to PATH\n_os=$(uname -s | tr '[:upper:]' '[:lower:]')\n[[ \"$_os\" == \"darwin\" ]] \u0026\u0026 _os=\"macos\"\n\n_arch=$(uname -m)\n[[ \"$_arch\" == \"x86_64\" ]] \u0026\u0026 _arch=\"amd64\"\n[[ \"$_arch\" == \"aarch64\" || \"$_arch\" == \"arm64\" ]] \u0026\u0026 _arch=\"arm64\"\n\nexport PATH=\"$HOME/.dotbins/$_os/$_arch/bin:$PATH\"\n\n# Tool-specific configurations\n# Configuration for fzf\nif command -v fzf \u003e/dev/null 2\u003e\u00261; then\n    source \u003c(fzf --zsh)\nfi\n\n# Configuration for bat\nif command -v bat \u003e/dev/null 2\u003e\u00261; then\n    alias bat=\"bat --paging=never\"\n    alias cat=\"bat --plain --paging=never\"\nfi\n```\n\n### Shell Startup Integration\n\nAdd this line to your shell's startup file to integrate dotbins:\n\n```bash\n# For Zsh (~/.zshrc)\nsource \"$HOME/.dotbins/shell/zsh.sh\"\n\n# For Bash (~/.bashrc)\nsource \"$HOME/.dotbins/shell/bash.sh\"\n\n# For Fish (~/.config/fish/config.fish)\nsource \"$HOME/.dotbins/shell/fish.fish\"\n\n# For Nushell\nsource ~/.dotbins/shell/nushell.nu\n```\n\u003c!-- SECTION:shell-integration:END --\u003e\n\n---\n\n## :books: Examples with 50+ Tools\n\nSee the [examples/examples.yaml](examples/examples.yaml) file for a list of \u003e50 tools that require no configuration.\n\n\u003c!-- CODE:BASH:START --\u003e\n\u003c!-- echo '```yaml' --\u003e\n\u003c!-- cat examples/examples.yaml --\u003e\n\u003c!-- echo '```' --\u003e\n\u003c!-- CODE:END --\u003e\n\n\u003c!-- OUTPUT:START --\u003e\n\u003c!-- ⚠️ This content is auto-generated by `markdown-code-runner`. --\u003e\n```yaml\ntools_dir: ~/.dotbins-examples\n\n# List of tools that require no configuration\n\ntools:\n  atuin: atuinsh/atuin            # Shell history and recording tool\n  bandwhich: imsnif/bandwhich     # Terminal bandwidth utilization tool\n  bat: sharkdp/bat                # Cat clone with syntax highlighting and Git integration\n  btm: ClementTsang/bottom        # Graphical system monitor\n  # Bitwarden CLI - demonstrates tag_pattern for filtering releases by tag\n  bw:\n    repo: bitwarden/clients\n    tag_pattern: \"^cli-\"  # Filter releases to only CLI (not web/desktop/browser)\n    asset_patterns:\n      linux:\n        amd64: bw-linux-.*\\.zip\n      macos:\n        arm64: bw-macos-arm64-.*\\.zip\n        amd64: bw-macos-.*\\.zip\n      windows:\n        amd64: bw-windows-.*\\.zip\n  btop: aristocratos/btop         # Resource monitor and process viewer\n  caddy: caddyserver/caddy        # Web server with automatic HTTPS\n  choose: theryangeary/choose     # Cut alternative with a simpler syntax\n  croc: schollz/croc              # File transfer tool with end-to-end encryption\n  ctop: bcicen/ctop               # Container metrics and monitoring\n  curlie: rs/curlie               # Curl wrapper with httpie-like syntax\n  delta: dandavison/delta         # Syntax-highlighting pager for git and diff output\n  difft: Wilfred/difftastic       # Structural diff tool that understands syntax\n  direnv: direnv/direnv           # Environment switcher for the shell\n  dog: ogham/dog                  # Command-line DNS client like dig\n  duf: muesli/duf                 # Disk usage analyzer with pretty output\n  dust: bootandy/dust             # More intuitive version of du (disk usage)\n  eget: zyedidia/eget             # Go single file downloader (similar to Dotbins)\n  eza: eza-community/eza          # Modern replacement for ls\n  fd: sharkdp/fd                  # Simple, fast alternative to find\n  fzf: junegunn/fzf               # Command-line fuzzy finder\n  git-lfs: git-lfs/git-lfs        # Git extension for versioning large files\n  glow: charmbracelet/glow        # Markdown renderer for the terminal\n  gping: orf/gping                # Ping with a graph\n  grex: pemistahl/grex            # Command-line tool for generating regular expressions from user-provided examples\n  gron: tomnomnom/gron            # Make JSON greppable\n  hexyl: sharkdp/hexyl            # Command-line hex viewer\n  hx: helix-editor/helix          # Modern text editor\n  hyperfine: sharkdp/hyperfine    # Command-line benchmarking tool\n  jc: kellyjonbrazil/jc           # JSON CLI output converter\n  jless: PaulJuliusMartinez/jless # Command-line JSON viewer\n  jq: jqlang/jq                   # Lightweight JSON processor\n  just: casey/just                # Command runner alternative to make\n  k9s: derailed/k9s               # Kubernetes CLI to manage clusters\n  lazygit: jesseduffield/lazygit  # Simple terminal UI for git commands\n  lnav: tstack/lnav               # Log file navigator\n  lsd: lsd-rs/lsd                 # Next-gen ls command with icons and colors\n  mcfly: cantino/mcfly            # Fly through your shell history\n  micro: zyedidia/micro           # Modern and intuitive terminal-based text editor\n  micromamba: mamba-org/micromamba-releases # Conda-like distribution\n  navi: denisidoro/navi           # Interactive cheatsheet tool for the CLI\n  neovim: neovim/neovim           # Modern text editor\n  nu: nushell/nushell             # Modern shell for the GitHub era\n  pastel: sharkdp/pastel          # A command-line tool to generate, convert and manipulate colors\n  procs: dalance/procs            # Modern replacement for ps\n  rg: BurntSushi/ripgrep          # Fast grep alternative\n  rip: MilesCranmer/rip2          # A safe and ergonomic alternative to rm\n  sd: chmln/sd                    # Find \u0026 replace CLI\n  sk: skim-rs/skim                # Fuzzy finder for the terminal in Rust (similar to fzf)\n  starship: starship/starship     # Minimal, fast, customizable prompt for any shell\n  tldr: tealdeer-rs/tealdeer      # Fast tldr client in Rust\n  topgrade: topgrade-rs/topgrade  # Upgrade all your tools at once\n  tre: dduan/tre                  # Tree command with git awareness\n  xh: ducaale/xh                  # Friendly and fast tool for sending HTTP requests\n  xplr: sayanarijit/xplr          # Hackable, minimal, fast TUI file explorer\n  yazi: sxyazi/yazi               # Terminal file manager with image preview\n  yq: mikefarah/yq                # YAML/XML/TOML processor similar to jq\n  zellij: zellij-org/zellij       # Terminal multiplexer\n  zoxide: ajeetdsouza/zoxide      # Smarter cd command with learning\n  keychain: funtoo/keychain       # ssh-agent manager\n\nplatforms:\n  linux:\n    - amd64\n    - arm64\n  macos:\n    - arm64\n```\n\n\u003c!-- OUTPUT:END --\u003e\n\n---\n\n\u003c!-- SECTION:troubleshooting:START --\u003e\n## :wrench: Troubleshooting\n\n### Common Issues\n\n#### GitHub API Rate Limits\n\n**Issue**: `Failed to fetch latest release: rate limit exceeded`\n**Solution**:\n\n- Create a GitHub token with `public_repo` scope\n- Use the token with: `dotbins sync --github-token YOUR_TOKEN`\n- Or set the environment variable: `GITHUB_TOKEN=YOUR_TOKEN dotbins sync`\n- **Tip:** Use `GITHUB_TOKEN=$(gh auth token) dotbins sync` to use your existing GitHub CLI token\n\n#### Windows-Specific Issues\n\n**Issue**: PowerShell execution policy preventing script execution\n**Solution**:\n\n- Run PowerShell as administrator\n- Execute: `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser`\n\n### Getting Help\n\n- Enable verbose logging with `-v` flag: `dotbins sync -v`\n- Check all installed tool versions with: `dotbins status`\n- Join GitHub Discussions for help: https://github.com/basnijholt/dotbins/discussions\n\u003c!-- SECTION:troubleshooting:END --\u003e\n\n---\n\n\u003c!-- SECTION:comparison:START --\u003e\n## :thinking: Comparison with Alternatives\n\n`dotbins` fills a specific niche in the binary management ecosystem. Here's how it compares to key alternatives:\n\n| Tool          | Version Management                 | Shell Integration             | Dotfiles Integration           | Primary Use Case           |\n| ------------- | ---------------------------------- | ----------------------------- | ------------------------------ | -------------------------- |\n| **dotbins**   | Latest only                        | **Built-in via `shell_code`** | **First-class with Git (LFS)** | Complete dotfiles solution |\n| **binenv**    | Multiple versions with constraints | Separate completion scripts   | Not focused on                 | Development environments   |\n| **eget**      | Latest or specific only            | None                          | Not focused on                 | Quick one-off installs     |\n| **asdf/aqua** | Multiple plugins \u0026 versions        | Plugin-specific               | Not focused on                 | Development environments   |\n| **apt/brew**  | System packages                    | None                          | Not possible                   | System-wide management     |\n\n---\n\n### Key Alternatives\n\n#### Version Managers (e.g., `binenv`, `asdf`)\n\n- **Pros:** Advanced version management (constraints like `\u003e=1.2.3`), multiple versions side-by-side\n- **Cons vs. `dotbins`:**\n  - Focus on version management rather than dotfiles integration\n  - **Separate configuration needed for shell integration** (aliases, completions)\n  - Often use shims or more complex architecture\n- **When to choose:** For development environments where you need multiple versions of tools\n\n#### Binary Downloaders (e.g., `eget`)\n\n- **Pros:** Lightweight, fast for one-off downloads\n- **Cons vs. `dotbins`:**\n  - No configuration for multiple tools\n  - **No shell integration** for aliases or environment setup\n  - No version tracking between sessions\n- **When to choose:** For quick installation of individual tools without configuration needs\n\n#### System Package Managers (`apt`, `brew`, etc.)\n\n- **Pros:** System-wide installation, dependency management\n- **Cons vs. `dotbins`:**\n  - Require admin privileges\n  - Not portable across systems\n  - Cannot be version-controlled in dotfiles\n- **When to choose:** For system-wide software needed by multiple users\n\n### The `dotbins` Difference\n\n`dotbins` uniquely combines:\n\n1. **Binary management** - Downloading from GitHub Releases\n2. **Shell configuration** - Defining aliases and shell setup in the same file:\n   ```yaml\n   bat:\n     repo: sharkdp/bat\n     shell_code: |\n       alias cat=\"bat --plain --paging=never\"\n   ```\n3. **Dotfiles integration** - Designed to be version-controlled as a Git repository\n4. **Cross-platform portability** - Works the same across Linux, macOS, Windows\n\nThis makes it perfect for users who want to manage their complete shell environment in a version-controlled dotfiles repository that can be easily deployed on any system.\n\u003c!-- SECTION:comparison:END --\u003e\n\n---\n\n\u003c!-- SECTION:license:START --\u003e\n## :heart: Support and Contributions\n\nWe 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.\n\nHappy tooling! 🧰🛠️🎉\n\u003c!-- SECTION:license:END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasnijholt%2Fdotbins","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbasnijholt%2Fdotbins","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasnijholt%2Fdotbins/lists"}