{"id":14956156,"url":"https://github.com/ipfs/distributions","last_synced_at":"2025-06-17T19:07:00.733Z","repository":{"id":35936863,"uuid":"40225364","full_name":"ipfs/distributions","owner":"ipfs","description":"Legacy dist.ipfs.tech website and artifact build tools. Currently only used for notarizing builds of Kubo and IPFS Cluster.","archived":false,"fork":false,"pushed_at":"2025-05-15T22:41:00.000Z","size":5298,"stargazers_count":48,"open_issues_count":54,"forks_count":33,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-05-15T23:27:27.621Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://dist.ipfs.tech","language":"Less","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ipfs.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":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-08-05T04:59:55.000Z","updated_at":"2025-05-15T22:41:03.000Z","dependencies_parsed_at":"2023-12-14T15:47:09.476Z","dependency_job_id":"aefce976-db25-41d6-a8b1-6d57219962c0","html_url":"https://github.com/ipfs/distributions","commit_stats":{"total_commits":644,"total_committers":42,"mean_commits":"15.333333333333334","dds":0.8198757763975155,"last_synced_commit":"d0c37e55f26d5d3f69d09798b6473b45f78fcfb9"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ipfs/distributions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs%2Fdistributions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs%2Fdistributions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs%2Fdistributions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs%2Fdistributions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ipfs","download_url":"https://codeload.github.com/ipfs/distributions/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs%2Fdistributions/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260424782,"owners_count":23007044,"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":[],"created_at":"2024-09-24T13:12:24.009Z","updated_at":"2025-06-17T19:06:55.723Z","avatar_url":"https://github.com/ipfs.png","language":"Less","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IPFS distributions\n\n[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai)\n[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](https://ipfs.tech/)\n[![](https://img.shields.io/badge/matrix%20chat-%23lobby:ipfs.io-blue.svg?style=flat-square)](https://matrix.to/#/#lobby:ipfs.io )\n\n\u003e Source for building https://dist.ipfs.tech\n\n**Table of Contents**\n\n- [IPFS distributions](#ipfs-distributions)\n  - [Install](#install)\n  - [Managing `golang` and `nodejs` versions](#managing-golang-and-nodejs-versions)\n  - [Running in Docker](#running-in-docker)\n  - [Usage](#usage)\n    - [Adding a version](#adding-a-version)\n    - [Adding a new (go) distribution](#adding-a-new-go-distribution)\n    - [Publishing](#publishing)\n  - [Background](#background)\n    - [Notes on reproducible builds](#notes-on-reproducible-builds)\n  - [Contribute](#contribute)\n    - [Want to hack on IPFS?](#want-to-hack-on-ipfs)\n  - [License](#license)\n\n## Install\n\nClone the repo and use Docker via `./dockerized \u003ccmd\u003e` wrapper.\n\nIf you don't want to run `./dockerized` build, install\nthe following dependencies via your favorite package manager:\n\n* `go`\n* `npm` (v7.13.0+ with nodejs v16.2.0+)\n* `jq`  (v1.6+)\n* `ipfs`\n* `awk`\n\n## Managing `golang` and `nodejs` versions\n\nThere is a `.tool-versions` file for the [asdf](https://asdf-vm.com/#/) version\nmanager, which the Docker build environment will also use.\n\n## Running in Docker\n\nThere is a `./dockerize` script, you can run it without arguments and be in a\nshell with the correct software installed in an Ubuntu 20.04 in a directory\nthat is mapped to the present working directory\n\nNote that we use host networking so you must run an IPFS daemon locally as the\nbuild process assumes a fairly long-lived ipfs node has the CIDs (we give them\nto the collab cluster to pin)\n\nYou can also do `./dockerized \u003cCOMAND\u003e`, for instance:\n\n```\n./dockerized make clean\n./dockerized ./dist.sh add-version go-ipfs v0.9.0\n./dockerized make publish\n```\n\nNote that you can't use bash in the command, so \n\n```\n./dockerized make clean \u0026\u0026 ./dist.sh go-ipfs add-version v0.9.0\n# Does not work\n```\nand\n\n```\n./dockerized \"make clean \u0026\u0026 ./dist.sh go-ipfs add-version v0.9.0\"\n# Does not work\n```\n\n\n## Usage\n\nAdd a new version or a new distribution with `./dist.sh` then let CI run `make publish` to update DNSLink at dist.ipfs.tech.\n\n### Adding a version\n\nRun:\n\n```sh\n\u003e ./dist.sh add-version \u003cdist\u003e \u003cversion\u003e\n```\n\nThis will add the version to `dists/\u003cdist\u003e/versions`, set it as the current version in `dists/\u003cdist\u003e/current`, and build it locally.\n\nExample:\n```sh\n\u003e ./dist.sh add-version fs-repo-99-to-100 v1.0.1\n```\n\nTo produce a signed, **official build** for use in DNSLink at `dist.ipfs.tech`:\n\n1. Run `./dist.sh add-version` locally.\n2. Commit created changes to `dists/\u003cdist\u003e` and open a PR against `ipfs/distributions`.\n3. Wait for Github Action to finish PR build. It runs `./dockerized` build, then signs macOS binaries and spits out updated root CID at the end.\n4. If everything looks good, merge PR and wait for CI running on `master` to update the DNSlink at `dist.ipfs.tech`.\n\n### Adding a new (go) distribution\n\nRun:\n\n```sh\n\u003e ./dist.sh new-go-dist \u003cdist\u003e \u003cgit-repo\u003e [sub_package]\n```\n\nAnd follow the prompts.\n\nThe optional `sub_package` argument is used to specify a module within a repo.  The script looks to see if the subpackage is tagged separately from the repo by looking for `sub_package/version` tags. Example:\n```sh\n\u003e ./dist.sh new-go-dist fs-repo-99-to-100 github.com/ipfs/fs-repo-migrations fs-repo-99-to-100\n```\n\n- If the distribution should not show up on the website (e.g. go-ipfs migrations) add a `no-site` file into the `dists/\u003crepo\u003e` folder.\n- Manually create a repo-owner file\n- Reminder that for submodules the version numbers will look like fs-repo-x-to-y/v1.0.0\n\n### Publishing\n\nTo produce a CID (`\u003cNEW_HASH\u003e`) that includes binaries for all versions defined in `./dists/`, in the root of the repository, run:\n\n```sh\n\u003e make publish\n```\n\n- This will build any new binaries defined by dist and the website to the `releases` dir, add it to ipfs and patch it into the existing DAG for the published `/ipns/dist.ipfs.tech`.\n- Versions that are already present on the website will be reused, speeding up the build.\n- Updated CID (`\u003cNEW_HASH\u003e`) will be printed at the end. That's the new hash for `dist.ipfs.tech`. We also append it to a file called `versions` in the repo root (*not* checked into git).\n\nAfter the local build is done, make a quick inspection:\n\n2. Load the dists website in your browser to make sure everything looks right: `http://localhost:8080/ipfs/\u003cNEW_HASH\u003e`.\n3. Compare `\u003cNEW_HASH\u003e` with the current `dist.ipfs.tech` to make sure nothing is amiss: `ipfs object diff /ipns/dist.ipfs.tech /ipfs/\u003cNEW_HASH\u003e`\n\nFinally,\n\n1. Commit your changes and make a PR. Specifically, the changes to `dists/\u003cdist\u003e/versions` and `dists/\u003cdist\u003e/current`.\n2. Wait for [Github Action](https://github.com/ipfs/distributions/actions/) on your PR to build **signed** binaries. `\u003cNEW_SIGNED_HASH\u003e` will be different than one from local build.\n3. Confirm that [Github Action](https://github.com/ipfs/distributions/actions/) triggered by `master` branch push updated the DNSLink for `dist.ipfs.tech`.\n\n## Background\n\nThe goal is to generate a file hierarchy that looks like this:\n\n| **File**                                                              | **Description**                                    |\n| --------------------------------------------------------------------- | -------------------------------------------------- |\n| `releases/index.html`                                                 | listing of all bundles available                   |\n| `releases/\u003cdist\u003e`                                                     | all versions of `\u003cdist\u003e`                           |\n| `releases/\u003cdist\u003e/versions`                                            | textual list of all versions of `\u003cdist\u003e`           |\n| `releases/\u003cdist\u003e/\u003cversion\u003e`                                           | dist version                                       |\n| `releases/\u003cdist\u003e/\u003cversion\u003e/\u003cdist\u003e_\u003cversion\u003e_\u003cplatform\u003e.tar.gz`        | archive for `\u003cplatform\u003e`                           |\n| `releases/\u003cdist\u003e/\u003cversion\u003e/\u003cdist\u003e_\u003cversion\u003e_\u003cplatform\u003e.tar.gz.cid`    | text file with CID of the archive                  |\n| `releases/\u003cdist\u003e/\u003cversion\u003e/\u003cdist\u003e_\u003cversion\u003e_\u003cplatform\u003e.tar.gz.sha512` | text file with SHA-512 of the archive              |\n| `releases/\u003cdist\u003e/\u003cversion\u003e/dist.json`                                 | json file describing all archives in this release. |\n| `releases/\u003cdist\u003e/\u003cversion\u003e/build-info`                                | information about the build and build machine      |\n| `releases/\u003cdist\u003e/\u003cversion\u003e/build-log-*`                               | logs from the platforms that failed to build.      |\n| `releases/\u003cdist\u003e/\u003cversion\u003e/results`                                   | list of platforms successfully built               |\n\nDefinitions:\n- `\u003cdist\u003e` is a distribution, meaning a program or library we release.\n- `\u003cversion\u003e` is the version of the `\u003cdist\u003e`.\n- `\u003cplatform\u003e` is a supported platform of `\u003cdist\u003e@\u003cversion\u003e`\n\nSo for example, if we had `\u003cdist\u003e` `go-ipfs` and `fs-repo-migrations`, we might see a hierarchy like:\n\n```\n.\n├── fs-repo-migrations\n│   ├── v1.3.0\n│   │   ├── build-info\n│   │   ├── dist.json\n│   │   ├── fs-repo-migrations_v1.3.0_darwin-386.tar.gz\n│   │   ├── fs-repo-migrations_v1.3.0_darwin-amd64.tar.gz\n│   │   ├── fs-repo-migrations_v1.3.0_freebsd-386.tar.gz\n│   │   ├── fs-repo-migrations_v1.3.0_freebsd-amd64.tar.gz\n│   │   ├── fs-repo-migrations_v1.3.0_freebsd-arm.tar.gz\n│   │   ├── fs-repo-migrations_v1.3.0_linux-386.tar.gz\n│   │   ├── fs-repo-migrations_v1.3.0_linux-amd64.tar.gz\n│   │   ├── fs-repo-migrations_v1.3.0_linux-arm.tar.gz\n│   │   ├── fs-repo-migrations_v1.3.0_windows-386.zip\n│   │   ├── fs-repo-migrations_v1.3.0_windows-amd64.zip\n│   │   └── results\n│   └── versions\n├── go-ipfs\n│   ├── v0.4.9\n│   │   ├── build-info\n│   │   ├── build-log-freebsd-386\n│   │   ├── build-log-freebsd-arm\n│   │   ├── dist.json\n│   │   ├── go-ipfs_v0.4.9_darwin-386.tar.gz\n│   │   ├── go-ipfs_v0.4.9_darwin-amd64.tar.gz\n│   │   ├── go-ipfs_v0.4.9_freebsd-amd64.tar.gz\n│   │   ├── go-ipfs_v0.4.9_linux-386.tar.gz\n│   │   ├── go-ipfs_v0.4.9_linux-amd64.tar.gz\n│   │   ├── go-ipfs_v0.4.9_linux-arm.tar.gz\n│   │   ├── go-ipfs_v0.4.9_windows-386.zip\n│   │   ├── go-ipfs_v0.4.9_windows-amd64.zip\n│   │   └── results\n│   └── versions\n└── index.html\n85 directories, 943 files\n```\n\nWe call this the **distribution index**, the listing of all distributions, their versions, and platform assets.\n\n### Notes on reproducible builds\n\nRunning `./dockerized make publish` will produce binaries using the same\nruntime as CI. The main difference between local build and official CI one is\nsigning step on platforms such as `darwin` (macOS).\n\nSignatures are attached at the end of macOS binaries, which means\n`*_darwin-*.tar.gz` produced by CI will have additional bytes when compared\nwith local build.\n\n## Contribute\n\nIssues and PRs welcome! Please [check out the issues](https://github.com/ipfs/distributions/issues).\n\n### Want to hack on IPFS?\n\n[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md)\n\n## License\n\nMIT © IPFS\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipfs%2Fdistributions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fipfs%2Fdistributions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipfs%2Fdistributions/lists"}