{"id":13560948,"url":"https://github.com/anchore/binny","last_synced_at":"2026-02-10T17:11:18.058Z","repository":{"id":196709462,"uuid":"686108987","full_name":"anchore/binny","owner":"anchore","description":"Manage a directory of binaries without a package manager","archived":false,"fork":false,"pushed_at":"2025-04-08T18:09:31.000Z","size":414,"stargazers_count":28,"open_issues_count":12,"forks_count":1,"subscribers_count":11,"default_branch":"main","last_synced_at":"2025-04-08T19:25:55.758Z","etag":null,"topics":["binary","github-release","go-installer","hacktoberfest","package-manager"],"latest_commit_sha":null,"homepage":"","language":"Go","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/anchore.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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}},"created_at":"2023-09-01T19:09:11.000Z","updated_at":"2025-04-08T18:09:35.000Z","dependencies_parsed_at":"2023-09-27T03:25:02.332Z","dependency_job_id":"c733753d-50ba-4fd7-a12e-e194ed16588d","html_url":"https://github.com/anchore/binny","commit_stats":null,"previous_names":["anchore/binny"],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchore%2Fbinny","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchore%2Fbinny/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchore%2Fbinny/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchore%2Fbinny/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anchore","download_url":"https://codeload.github.com/anchore/binny/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250460235,"owners_count":21434229,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["binary","github-release","go-installer","hacktoberfest","package-manager"],"created_at":"2024-08-01T13:00:51.090Z","updated_at":"2026-02-10T17:11:18.052Z","avatar_url":"https://github.com/anchore.png","language":"Go","readme":"# binny\n\nManage a directory of binaries without a package manager.\n\n\n![binny-demo](https://github.com/anchore/binny/assets/590471/cdfda64f-0ead-4604-8565-34a397a031b2)\n\n\n## Installation\n\n```bash\ncurl -sSfL https://get.anchore.io/binny | sudo sh -s -- -b /usr/local/bin\n```\n\n... or, you can specify a release version and destination directory for the installation:\n\n```bash\ncurl -sSfL https://get.anchore.io/binny | sudo sh -s -- -b \u003cDESTINATION_DIR\u003e \u003cRELEASE_VERSION\u003e\n```\n\n## Usage\n\nKeep a configuration in your repo with the binaries you want to manage. For example:\n\n```yaml\n# .binny.yaml\ntools:\n    - name: gh\n      version:\n        want: v2.33.0\n        constraint: \u003c v3\n      method: github-release\n      with:\n        repo: cli/cli\n    \n    - name: quill\n      version:\n        want: v0.4.1\n        constraint: \u003c v0.5\n      method: github-release\n      with:\n        repo: anchore/quill\n    \n    - name: chronicle\n      version:\n        want: v0.7.0\n      method: github-release\n      with:\n        repo: anchore/chronicle\n```\n\nThen you can run:\n  - `binny install [name...]` to install all tools in the configuration (or the given tool names)\n  - `binny check` to verify all configured tools are installed, return exit code 1 if any are missing or inconsistent\n  - `binny update [name...]` to update any pinned versions in the configuration with the latest available versions (and within any given constraints)\n  - `binny list` to list all tools in the configuration and the installed store\n\nYou can add tools to the configuration one of two ways:\n    - manually, by adding a new entry to the configuration file (see the [Configuration](#configuration) section below)\n    - with the `binny add \u003cmethod\u003e` commands, which will handle the configuration for you\n\n\n## Configuration\n\nThe configuration file is a YAML file with a list of tools to manage. Each tool has a name, a version, and \na method for installing it. You can optionally specify a specific method for checking the latest version of \nthe tool, however, this is not necessary as all install methods have a default version resolver.\n\n\n### Tool Configuration\n\nEach tool has the following configuration options:\n\n```yaml\nname: chronicle\nversion:\n  want: v0.7.0\n  constraint: \u003c= v0.9.0\n  method: github-release\n  with:\n    # arbitrary key-value pairs for the version resolver method\nmethod: go-install\nwith:\n  # arbitrary key-value pairs for the install method\n```\n\n| Option         | Description                                                                                                                                               |\n|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `name`         | The name of the tool to install. This is used to determine the installation directory and the name of the binary.                                         |\n| `version.want` | The version of the tool to install. This can be a specific version, or a version range.                                                                   |\n| `version.constraint` | A constraint on the version of the tool to install. This is used to determine the latest version of the tool to update to.                          |\n| `version.method` | The method to use to determine the latest version of the tool. See the [Version Resolver Methods](#version-resolver-methods) section for more details.  |\n| `version.with` | The configuration options for the version method. See the [Version Resolver Methods](#version-resolver-methods) section for more details.                                       |\n| `method`       | The method to use to install the tool. See the [Install Methods](#install-methods) section for more details.                                                           |\n| `with`        | The configuration options for the install method. See the [Install Methods](#install-methods) section for more details.                                                 |\n\n\n### Install Methods\n\nInstall methods specify where the tool binary should be pulled or built from.\n\n\n#### `github-release`\n\nThe `github-release` install method uses the GitHub Releases API to download the latest release of a tool. It requires the following configuration options:\n\n| Option | Description                                                                                     |\n|--------|-------------------------------------------------------------------------------------------------|\n| `repo` | The GitHub repository to reference releases from. This should be in the format `\u003cowner\u003e/\u003crepo\u003e` |\n| `assets` (optional) | Regex pattern(s) to filter release assets. Can be a single string or array of strings for priority matching |\n\nWhen multiple assets match the OS/architecture, the `assets` field allows you to specify which one to select:\n\n```yaml\n# single regex pattern\n- name: hugo\n  method: github-release\n  with:\n    repo: gohugoio/hugo\n    assets: \"^hugo_extended_[0-9]\"  # match hugo_extended but not hugo_extended_withdeploy\n\n# multiple patterns (first match wins)\n- name: tool\n  method: github-release\n  with:\n    repo: owner/tool\n    assets:\n      - \"^tool_premium_[0-9]\"   # try premium version first\n      - \"^tool_[0-9]\"           # fall back to standard version\n```\n\nThe default version resolver for this method is `github-release`.\n\n\n#### `go-install`\n\nThe `go-install` install method uses `go install` to install a tool. It requires the following configuration options:\n\n| Option                  | Description                                                                          |\n|-------------------------|--------------------------------------------------------------------------------------|\n| `module`                | The FQDN to the Go module (e.g. `github.com/anchore/syft`)                           |\n| `entrypoint` (optional) | The path within the repo to the main package for the tool (e.g. `cmd/syft`)          |\n| `ldflags` (optional)    | A list of ldflags to pass to `go install` (e.g. `-X main.version={{ .Version }}`)    |\n| `args` (optional)       | A list of args/flags to pass to `go install` (e.g. `-tags containers_image_openpgp`) |\n| `env` (optional)        | A list key=value environment variables to use when running `go install`              |\n\nThe `module` option allows for a special entry:\n- `.` or `path/to/module/on/disk`\n\nThe `ldflags` allow for templating with the following variables:\n\n| Variable | Description                                                                                         |\n|--------|-------------------------------------------------------------------------------------------------------|\n| `{{ .Version }}` | The resolved version of the tool (which may differe from that of the `version.want` value)  |\n\nIn addition to these variables, [sprig functions](http://masterminds.github.io/sprig/) are allowed; for example:\n```yaml\nldflags:\n- -X main.buildDate={{ now | date \"2006-01-02T15:04:05Z07:00\" }}\n```\n\nFor more information about sprig functions, see the [sprig documentation](http://masterminds.github.io/sprig/).\n\nThe default version resolver for this method is `go-proxy`.\n\n\n#### `hosted-shell`\n\nThe `hosted-shell` install method uses a hosted shell script to install a tool. It requires the following configuration options:\n\n| Option | Description                                                                                                |\n|--------|------------------------------------------------------------------------------------------------------------|\n| `url` | The URL to the hosted shell script (e.g. `https://raw.githubusercontent.com/anchore/syft/main/install.sh`)  |\n| `args` (optional) | Arguments to pass to the shell script (as a single string)                                      |\n\nIf the URL refers to either `github.com` or `raw.githubusercontent.com` then the default version resolver is `github-release`. \nOtherwise, the version resolver must be specified manually.\n\n\n\n### Version Resolver Methods\n\nThe version method specifies how to determine the latest version for a tool.\n\n#### `git`\n\nThe `git` version method will use a git repo on disk as a source for resolving versions via tags. It requires the following configuration options:\n\n| Option | Description                            |\n|--------|----------------------------------------|\n| `path` | The path to the git repository on disk |\n\nThe `version.want` option allows a special entry:\n- `current`: use the current commit checked out in the repo\n\n**note**: this method is still under development. Currently it is most useful for tools that are being used where that are developed:\n\n```yaml\n  - name: binny\n    version:\n      # since the module is . then \"current\" means whatever is checked out\n      want: current\n    method: go-install\n    with:\n      # aka: github.com/anchore/binny, without going through github / goproxy (stay local)\n      module: .\n      entrypoint: cmd/binny\n      ldflags:\n        - -X main.version={{ .Version }}\n        - -X main.gitCommit={{ .Version }}\n        - -X main.gitDescription={{ .Version }}\n        # note: sprig functions are available: http://masterminds.github.io/sprig/\n        - -X main.buildDate={{ now | date \"2006-01-02T15:04:05Z07:00\" }}\n```\n\n#### `github-release`\n\nThe `github-release` version method uses the GitHub Releases API to determine the latest release of a tool. It requires the following configuration options:\n\n| Option   | Description                                                                                     |\n|----------|-------------------------------------------------------------------------------------------------|\n| `binary` | Binary to select if there are multiple within the release archive (defaults to the tool name)   |\n| `repo`   | The GitHub repository to reference releases from. This should be in the format `\u003cowner\u003e/\u003crepo\u003e` |\n\nThe `version.want` option allows a special entry:\n- `latest`: don't pin to a version, use the latest available\n\nNote: this approach will might require a GitHub API token to be set in the `GITHUB_TOKEN` environment variable if there\nis a version constraint used.\n\n#### `go-proxy`\n\nThe `go-proxy` version method reaches out to `proxy.golang.org` to determine the latest version of a Go module. It requires the following configuration options:\n\n| Option | Description                                                                                                                              |\n|--------|------------------------------------------------------------------------------------------------------------------------------------------|\n| `module` | The FQDN to the Go module (e.g. `github.com/anchore/syft`)                                                                             |\n| `allow-unresolved-version` | If the latest version cannot be found by the proxy allow for \"latest\" as a valid value (which `go install` supports) | \n\nThe `version.want` option allows a special entry:\n- `latest`: don't pin to a version, use the latest available\n","funding_links":[],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanchore%2Fbinny","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanchore%2Fbinny","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanchore%2Fbinny/lists"}