Binary distribution for omnidist
Project description
omnidist
Run your Go CLI everywhere with npx and uvx, without requiring Go on end-user machines.
omnidist turns one Go project into cross-platform npm and uv distributions with prebuilt binaries, then stages, verifies, and publishes them in a deterministic release flow.
Release flow: build -> stage -> verify -> publish so users can run your tool from JavaScript and Python ecosystems out of the box.
For project background, packaging model details, migration notes, and contributor-oriented repo layout, see CONTRIBUTING.md.
Requirements
- Go 1.25+
- Node.js + npm (for npm distribution commands)
uv(for uv distribution commands)git(whenversion.source: git-tag)NPM_PUBLISH_TOKENfor npm publish (unless--dry-run)UV_PUBLISH_TOKEN(or--token) for uv publish (unless--dry-run)
Installation
Run without installation first:
npx @omnidist/omnidist --help
uvx omnidist --help
Install globally with npm:
npm i -g @omnidist/omnidist
omnidist --help
Install with Go toolchain:
go install github.com/metalagman/omnidist/cmd/omnidist@latest
omnidist --help
Build locally from source:
go build -o ./bin/omnidist ./cmd/omnidist
./bin/omnidist --help
Or run directly:
go run ./cmd/omnidist --help
Quick Start
- Print repo-tailored onboarding/release commands:
omnidist quickstart
- Initialize config and distribution folder structure:
omnidist init
This creates:
.omnidist/omnidist.yaml.omnidist/workspace directories.omnidist/.gitignorefor generated artifacts
- Edit config and set environment variables (optional):
$EDITOR .omnidist/omnidist.yaml
omnidist loads .env automatically when present, so you can keep values like OMNIDIST_VERSION, NPM_PUBLISH_TOKEN, and UV_PUBLISH_TOKEN there.
- Build binaries for configured targets:
omnidist build
This also writes the resolved build version to .omnidist/dist/VERSION.
- Stage and verify artifacts:
omnidist stage
omnidist verify
omnidist uv stage converts the resolved version to PEP 440 and writes
.omnidist/uv/pyproject.toml with that version.
It also recreates .omnidist/uv/dist to prevent stale wheel artifacts from previous runs.
- Publish when verification passes:
omnidist publish
- Generate tag-triggered release workflow:
omnidist ci
The generated workflow publishes npm and uv artifacts and also creates a GitHub
release with the built cross-platform binaries plus checksums.txt.
Common Commands
# Build binaries for configured targets and persist build version
omnidist build
# Print a quickstart command sequence for this repo
omnidist quickstart
# Show runtime version/build metadata
omnidist version
# Stage and verify both distributions (npm -> uv)
omnidist stage
omnidist verify
# Stage dev/pre-release artifacts
omnidist stage --dev
# Publish both distributions (fail-fast, npm -> uv)
omnidist publish
# Generate GitHub Actions workflow for tagged releases
omnidist ci
# Limit orchestration to one distribution
omnidist stage --only npm
omnidist verify --only uv
# Distribution-specific publishing options
omnidist npm publish --tag next --otp <6-digit-code>
omnidist uv publish --publish-url https://test.pypi.org/legacy/ --token <pypi-token>
Environment Variables and .env
omnidist loads .env automatically at startup (via godotenv) if present.
Supported variables:
OMNIDIST_VERSION: used only whenversion.source: env; also expanded inbuild.ldflagstemplates (for example${OMNIDIST_VERSION}).VERSIONis not used.OMNIDIST_GIT_COMMIT: optional ldflags template variable for build metadata; populated automatically byomnidist buildwhen git metadata is available.OMNIDIST_BUILD_DATE: optional ldflags template variable for build metadata; populated automatically byomnidist buildas UTC RFC3339.NPM_PUBLISH_TOKEN: required for npm publish commands when not using--dry-runUV_PUBLISH_TOKEN: used by uv publish when--tokenis not provided
Example .env:
OMNIDIST_VERSION=1.2.3
NPM_PUBLISH_TOKEN=npm_xxx
UV_PUBLISH_TOKEN=pypi-xxx
Configuration
.omnidist/omnidist.yaml:
tool:
name: omnidist
main: ./cmd/omnidist
version:
source: git-tag # git-tag | file | env | fixed
file: VERSION # optional; used when source is file (default VERSION)
fixed: 1.2.3 # required when source is fixed
targets:
- os: darwin
arch: amd64
- os: darwin
arch: arm64
- os: linux
arch: amd64
- os: linux
arch: arm64
- os: windows
arch: amd64
build:
ldflags: -s -w
tags: []
cgo: false
distributions:
npm:
package: "@omnidist/omnidist"
registry: https://registry.npmjs.org
access: public # public | restricted
license: MIT # optional override for package.json license; omit to use SEE LICENSE IN <file>
include-readme: true # include project README.md in staged packages when present
uv:
package: omnidist
index-url: https://upload.pypi.org/legacy/
linux-tag: manylinux2014 # manylinux2014 | musllinux_1_2
include-readme: true # include project README.md in staged wheels when present
targets use Go values (GOOS/GOARCH). Distribution workflows map them as needed (for example windows/amd64 -> npm win32/x64).
For appkit version injection, configure build.ldflags in your project config:
build:
ldflags: -s -w -X github.com/metalagman/appkit/version.version=${OMNIDIST_VERSION} -X github.com/metalagman/appkit/version.gitCommit=${OMNIDIST_GIT_COMMIT} -X github.com/metalagman/appkit/version.buildDate=${OMNIDIST_BUILD_DATE}
With version.source: git-tag, release workflows require HEAD to be on an exact SemVer tag (vX.Y.Z or X.Y.Z).
With version.source: file, omnidist reads ./VERSION from the repository root.
With version.source: file, you can override the path via version.file (for example versions/release.txt).
With version.source: fixed, set version.fixed to an exact value in config (for example 1.2.3).
With version.source: env, set OMNIDIST_VERSION (for example in .env) before build/stage/publish.
Use global --omnidist-root <path> to set the project root for a command. Omnidist resolves it to an absolute path at startup and changes working directory to it before loading .env and config.
Command Reference
Top-level:
omnidist initomnidist buildomnidist quickstartomnidist versionomnidist ci [--force]omnidist stage [--dev] [--only npm|uv|npm,uv]omnidist verify [--only npm|uv|npm,uv]omnidist publish [--dry-run] [--only npm|uv|npm,uv]omnidist npmomnidist uv
NPM subcommands:
omnidist npm stage [--dev]omnidist npm verifyomnidist npm publish [--dry-run] [--tag <tag>] [--registry <url>] [--otp <code>]
UV subcommands:
omnidist uv stage [--dev]omnidist uv verifyomnidist uv publish [--dry-run] [--publish-url <url>] [--token <pypi-token>]
Usage Patterns
Local development loop
Use this when iterating on the CLI binary and validating artifact generation locally:
omnidist build
omnidist stage
omnidist verify
Dev pre-release artifacts
Generate prerelease versions from git describe data:
omnidist stage --dev
Unified multi-distribution orchestration
Top-level stage, verify, and publish run distributions in deterministic order:
npm first, then uv, and stop on first failure.
Select a subset with --only:
omnidist stage --only uv
omnidist verify --only npm
omnidist publish --dry-run --only npm,uv
CI bootstrap for tag releases
Generate .github/workflows/omnidist-release.yml:
omnidist ci
The generated workflow triggers on v* tag pushes and runs:
build -> stage -> verify -> publish, then publishes the built binaries and
checksums to the GitHub release.
If workflow already exists:
omnidist ci --force
npm publishing flow with custom options
omnidist npm publish --dry-run --tag next --registry https://registry.npmjs.org
Before npm commands run, omnidist writes .omnidist/.npmrc from distributions.npm.registry using:
//<registry>/:_authToken=${NPM_PUBLISH_TOKEN}.
If staged package version contains a -dev prerelease and --tag is not provided, omnidist auto-publishes with --tag dev.
If your npm account requires 2FA for publish operations:
omnidist npm publish --otp <6-digit-code>
uv publishing flow with custom index/auth
omnidist uv publish --publish-url https://upload.pypi.org/legacy/ --token <pypi-token>
omnidist uv publish uses token authentication.
Provide token via --token or UV_PUBLISH_TOKEN (required for non-dry-run).
omnidist uv verify and omnidist uv publish use the staged version from
.omnidist/uv/pyproject.toml when present.
For PyPI/TestPyPI, omnidist uv verify fails if the staged version contains local metadata (+...), since those indexes reject local versions.
TestPyPI dry-run style validation:
omnidist uv publish --dry-run --publish-url https://test.pypi.org/legacy/
Usage Examples
npm release path
git tag v1.2.0
omnidist build
omnidist npm stage
omnidist npm verify
omnidist npm publish
uv release path
git tag v1.2.0
omnidist build
omnidist uv stage
omnidist uv verify
omnidist uv publish --publish-url https://upload.pypi.org/legacy/
uv dry-run publish
omnidist uv publish --dry-run --publish-url https://test.pypi.org/legacy/
version from environment
version:
source: env
export OMNIDIST_VERSION=2.0.0
omnidist npm stage
omnidist uv stage
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file omnidist-0.1.21-py3-none-win_amd64.whl.
File metadata
- Download URL: omnidist-0.1.21-py3-none-win_amd64.whl
- Upload date:
- Size: 5.7 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
045a8c755ea2bf349d87644240c176d6e1a6c73c2bcc6619292d4913ee816fe1
|
|
| MD5 |
55a2fa68653139f12fdd1ac2f3815315
|
|
| BLAKE2b-256 |
7e416c24cba4e2f0b1e3b6be91feebe1941f4f18e4a45756daba3c39b9ef135a
|
File details
Details for the file omnidist-0.1.21-py3-none-manylinux2014_x86_64.whl.
File metadata
- Download URL: omnidist-0.1.21-py3-none-manylinux2014_x86_64.whl
- Upload date:
- Size: 5.4 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6244438a515cc23b09115137081405d666c06f61c0776f9801e8a01900c43c8
|
|
| MD5 |
9afb9074888d6a7ab8a92d7e3d109032
|
|
| BLAKE2b-256 |
0da748723bfa415db0aac1042f4039c047488e4ba56c330f556ba2a4fb6f27a8
|
File details
Details for the file omnidist-0.1.21-py3-none-manylinux2014_aarch64.whl.
File metadata
- Download URL: omnidist-0.1.21-py3-none-manylinux2014_aarch64.whl
- Upload date:
- Size: 5.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aca2a101091a7837d54ae2a4f5fdec8f5d2263ee88cffb335cf474ed2f94f8e5
|
|
| MD5 |
034fe7570447108de0e4a8e73aa443a3
|
|
| BLAKE2b-256 |
6944bdc8ed692f91a1351ccacce7a142c1ef26aad4526a39a62d2a9a271ea468
|
File details
Details for the file omnidist-0.1.21-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: omnidist-0.1.21-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 5.2 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed05fbaa3e96c2c107e0c15d9db431cfa48ae03ddd2e2a2aa3f7e10262736dca
|
|
| MD5 |
6437f2d17eaa233238ac30a9660acd93
|
|
| BLAKE2b-256 |
ce105ab73b53aa4155d304a9b76e675faa6d9e4577e9249c621f2716a5902511
|
File details
Details for the file omnidist-0.1.21-py3-none-macosx_10_13_x86_64.whl.
File metadata
- Download URL: omnidist-0.1.21-py3-none-macosx_10_13_x86_64.whl
- Upload date:
- Size: 5.5 MB
- Tags: Python 3, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83292ef77ed3a91a11ba2b518c93404944ac8f3e88c482a3e018651162dfbb92
|
|
| MD5 |
b824a4f13416cc580203a3e4b143271d
|
|
| BLAKE2b-256 |
fac90c7a6f8c43f94039a94aabccdcd3cd588ce6c7f56ed4a2c69ed642ce9c3a
|