omnidist
Omnidist builds one Go CLI and packages its prebuilt binaries for npm, PyPI-compatible indexes through uv, and RubyGems. npm packages contain no postinstall downloader; installation uses platform-specific optional dependencies already present in registry tarballs.
Install or run
Consumers only need the package manager for the channel they use:
npx -y @omnidist/omnidist@latest --help
uvx omnidist --help
gem install omnidist && omnidist --help
Maintainers can also install from Go:
go install github.com/metalagman/omnidist/cmd/omnidist@latest
Maintainer prerequisites
| Activity | Required locally or in CI |
|---|---|
| Build the Go CLI | Go 1.25+; Git when version.source: git-tag |
| npm stage/verify | Go build artifacts; npm is required at publish preflight/upload |
| uv stage/verify/publish | uv |
| gem stage/verify/publish | Ruby and RubyGems (gem) |
| Token publish | The selected backend's token environment variable |
You do not need tooling for backends absent from the selected set.
Safe quick start
Run this in an existing Go repository with one package main under cmd/*:
omnidist init
$EDITOR .omnidist/omnidist.yaml
omnidist build
omnidist stage
omnidist verify
omnidist publish --dry-run
init detects the command name and main package. If discovery is ambiguous, specify both explicitly:
omnidist init --name mytool --main ./cmd/mytool
It refuses to replace an existing config. omnidist init --force intentionally replaces that file and is destructive; review or back it up first.
The generated file uses profiles mode and stores artifacts beneath .omnidist/default/. Select which package ecosystems participate in aggregate commands and generated CI:
profiles:
default:
tool:
name: mytool
main: ./cmd/mytool
version:
source: git-tag
targets:
- os: linux
arch: amd64
build:
ldflags: -s -w
tags: []
cgo: false
distributions:
npm:
package: "@my-org/mytool"
uv:
package: mytool
The npm and uv sections select those two backends. Add or remove npm, uv, and gem sections to define the canonical aggregate set. Existing files with a non-empty enabled-distributions selector remain readable, but every selected backend must have its own section. Aggregate commands always execute in npm → uv → gem order. --only can narrow the configured set but cannot enable an unavailable backend; backend-specific commands also require an explicit section.
To offer both unscoped and scoped install names while publishing one shared platform package set, configure the unscoped package as primary, add the scoped name to aliases, and use the scoped base for platform packages:
distributions:
npm:
package: omnidist
aliases:
- "@omnidist/omnidist"
platform-package: "@omnidist/omnidist"
access: public
Users can then install either equivalent meta package:
npm install -g omnidist
npm install -g @omnidist/omnidist
Both meta packages reference platform packages such as @omnidist/omnidist-linux-x64; the binaries are not duplicated under each meta-package name. package is published first among meta packages, followed by aliases in configured order, after all unique platform packages. If aliases is omitted, Omnidist publishes only package. If platform-package is omitted or blank, it defaults to package, preserving existing package names. The configured npm identity must be allowed to publish every meta and platform name; trusted publishing must be configured for every generated package.
Release flow
omnidist build
omnidist stage
omnidist verify
omnidist publish --dry-run
omnidist publish
Aggregate publish preflights every selected backend before the first upload. This prevents locally detectable late-backend failures from causing an avoidable partial release. Registry uploads are still external and are not transactionally reversible: a network or registry failure after uploads begin can leave a partial release.
Generate backend-aware GitHub Actions after the config is final:
omnidist ci
# use --force only to intentionally replace the generated workflow
The workflow contains setup, credentials, and publish jobs only for selected backends, plus a GitHub Release job for the built binaries.
Reference
- Configuration reference — profiles, every YAML field, defaults, paths, and compatibility.
- Release runbook — credentials, first release, preflight, trusted publishing, and partial-release recovery.
- Targets and variants — Go target values and npm/wheel/gem mappings.
- Contributing — repository layout, tests, lint, and development workflow.
Commands
omnidist init [--force] [--name <name>] [--main <package>]
omnidist quickstart
omnidist build
omnidist stage [--dev] [--only npm,uv,gem]
omnidist verify [--only npm,uv,gem]
omnidist publish [--dry-run] [--only npm,uv,gem]
omnidist ci [--force] [--dry-run]
omnidist npm stage|verify|publish|trust
omnidist uv stage|verify|publish
omnidist gem stage|verify|publish
Global flags are --config, --profile, and --omnidist-root. Omnidist also loads .env; corresponding selectors are OMNIDIST_CONFIG, OMNIDIST_PROFILE, and OMNIDIST_OMNIDIST_ROOT.
Use omnidist <command> --help for backend-specific options.
Common failures
- Version resolution: an exact SemVer tag is required for
git-tag;filereadsversion.file;envreadsOMNIDIST_VERSION;fixedrequiresversion.fixed. - Missing build version: run
omnidist buildbefore stage. Profiles store it at.omnidist/<profile>/dist/VERSION; legacy config uses.omnidist/dist/VERSION. - Missing npm platform package: run
omnidist npm verifyand confirm the target matrix and equal versions. - PyPI rejects
+...: public PyPI/TestPyPI reject local version metadata; stage a publishable version. - Trusted publish fails: local preflight cannot prove remote OIDC configuration. Confirm repository metadata, workflow filename/environment,
id-token: write, and registry-side trusted publisher settings.
Metadata
Release files for omnidist 0.1.40
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| omnidist-0.1.40-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| omnidist-0.1.40-py3-none-manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| omnidist-0.1.40-py3-none-manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| omnidist-0.1.40-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| omnidist-0.1.40-py3-none-macosx_10_13_x86_64.whl | Python 3 | none | macOS 10.13+ x86-64 | Details |
Total release size: 30.9 MB
Release files / omnidist-0.1.40-py3-none-win_amd64.whl
| Download URL | omnidist-0.1.40-py3-none-win_amd64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
75e805b718f004ba7eda69ec1bf934af7e589e05d7358e01a1861ca08148a665
|
|
BLAKE2b-256 checksum How to use checksums |
5ed64cc715e46f0be2e1c46df3d617f309837bcfe7170712ac47cf0667ce8f90
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / omnidist-0.1.40-py3-none-manylinux2014_x86_64.whl
| Download URL | omnidist-0.1.40-py3-none-manylinux2014_x86_64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
75fd888c5cdefc190c800fff73a9614c19e6c0a0917a699cb90a763598bd0da9
|
|
BLAKE2b-256 checksum How to use checksums |
238d52aa6f82fcdbb0a05c363310a62810183f8af87141cd27d1ea95272300d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / omnidist-0.1.40-py3-none-manylinux2014_aarch64.whl
| Download URL | omnidist-0.1.40-py3-none-manylinux2014_aarch64.whl |
|---|---|
| Size | 5.8 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
caed801ca46f68e56d27fd30278e11811b4b4ffa9002f6610c460959514c82a2
|
|
BLAKE2b-256 checksum How to use checksums |
7ccab4fd0c37a8a8f8cdbc6a12efa74e7110c41c7aaea72699628bee04f6fdd7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / omnidist-0.1.40-py3-none-macosx_11_0_arm64.whl
| Download URL | omnidist-0.1.40-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 6.0 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7fe8dccde0f32db9ab0893c4c7da53251b95ae2f1945fca1c04e57c0cf6220dc
|
|
BLAKE2b-256 checksum How to use checksums |
cbe2ccc03d046f0deb3127da881db31e40141479c42ab1ea1338c968dbfec644
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / omnidist-0.1.40-py3-none-macosx_10_13_x86_64.whl
| Download URL | omnidist-0.1.40-py3-none-macosx_10_13_x86_64.whl |
|---|---|
| Size | 6.3 MB |
| Tags | Python 3 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
3160dc048d002420c9eb835021ff7a20acfbca82d228716b56fcdf66ce5c3a27
|
|
BLAKE2b-256 checksum How to use checksums |
c412fc9a3ef3847f7c1a55c175a5553aff43b5fbd81b446cfec9ede34fb1f82f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|