Publishing & Releasing CURD
When you build CURD and want to distribute it to the world, the process involves two main steps: GitHub Releases (the source of truth) and Package Manager Registries (the distribution channels).
Here is the exact workflow for taking the output of make dist and publishing it globally.
1. GitHub Releases (The Source of Truth)
All native package managers (Homebrew, Winget, Scoop, AUR) do not host the binary themselves. They read a manifest file that points to a download URL on GitHub Releases.
Therefore, your first step is always uploading the binaries to GitHub.
- Run the Build: Execute
make dist(typically done in a Linux/macOS GitHub Actions CI runner to avoid local cross-compilation linker issues). - Create a Tag:
git tag v0.7.1-beta && git push --tags - Upload to Release: Go to your GitHub repository -> Releases -> “Draft a new release”.
- Attach Artifacts: Upload all the
.tar.gz,.zip,.deb, and.rpmfiles from thedist/cli/directory.
2. Pushing to Language Registries (PyPI & NPM)
Language registries actually host the built artifacts, so you upload directly to them.
PyPI (curd-python)
The make dist-python command generates Python wheels (.whl files) inside dist/python/.
To publish them to PyPI:
# Install twine
pipx install twine
# Upload all wheels
twine upload dist/python/*.whl(Once uploaded, users can instantly run uvx --from curd-python curd)
NPM (curd-node)
The make dist-node command generates a .tgz tarball and native .node bindings.
To publish to NPM:
cd curd-node
npm publish --access public3. Submitting to Native Package Managers
Once your GitHub Release is live with the attached binaries, you can update the package managers using the manifests generated in dist/package-managers/.
Homebrew (macOS / Linux)
- Copy the
dist/package-managers/homebrew/curd.rbfile. - Commit it to your custom tap repository (e.g.,
github.com/aerospeedsta/homebrew-curd). - If you want it in the official
homebrew-core, you must open a Pull Request toHomebrew/homebrew-corewith this formula.
Arch Linux AUR (curd-bin & curd-git)
Arch Linux users use the AUR.
curd-bin: Uses the pre-compiled binary from GitHub. Themake dist-archcommand generates a.SRCINFOandPKGBUILD. You clone the AUR ssh repossh://aur@aur.archlinux.org/curd-bin.git, copy the generated files in, runmakepkg --printsrcinfo > .SRCINFO, andgit push.curd-git: This compiles from source on the user’s machine. You manage this in a separate AUR repocurd-git.gitwith a PKGBUILD that runscargo build.
Winget (Windows)
The Windows Package Manager uses YAML manifests.
- Take the manifest generated in
dist/package-managers/winget/. - Open a Pull Request to the official Microsoft registry:
github.com/microsoft/winget-pkgs. - Use their provided
wingetcreateCLI tool to automatically submit the PR.
Debian/Ubuntu (APT) & Fedora (DNF)
For these platforms, you generally host your own apt/yum repository (using a tool like reprepro or Cloudsmith), or simply tell users to download the .deb and .rpm files directly from your GitHub Releases page, as we documented in the Setup guide.
Conda-Forge
To get CURD into the conda-forge channel:
- Ensure your source code is tagged and released on GitHub.
- Fork the staged-recipes repository.
- Create a new recipe
recipes/curd/meta.yamlthat points to the GitHub source tarball (v0.7.1-beta.tar.gz) and usesrustas a build dependency. - Open a Pull Request. Once merged, Conda-Forge’s CI will automatically build and distribute the binaries to Anaconda users (
conda install -c conda-forge curd).
Automating with CI/CD
To make this instantaneous, this entire process is typically automated via GitHub Actions. A standard workflow:
- Triggers on a
v*tag push. - Uses a matrix matrix to build
x86_64andaarch64on Mac, Windows, and Linux runners. - Uses
softprops/action-gh-releaseto upload all binaries to the GitHub Release. - Uses
pypa/gh-action-pypi-publishto push the wheels to PyPI. - Uses a custom script to bump the Homebrew Tap repo hash.