Skip to content

Installation

poly ships one binary. Every channel below installs that same prebuilt executable: none of them compiles anything, and none needs a Rust, Node or Python toolchain at run time.

Terminal window
curl -fsSL https://raw.githubusercontent.com/Goldziher/poly/main/install.sh | sh

Both detect the platform, download the matching release archive, and verify it against the release’s sha256sums.txt. Set POLY_VERSION to pin an exact release:

Terminal window
POLY_VERSION=0.23.1 curl -fsSL https://raw.githubusercontent.com/Goldziher/poly/main/install.sh | sh
.github/workflows/ci.yaml
- uses: Goldziher/poly@v0
with:
version: v0.23.1 # omit for the latest release
- run: poly lint .
- run: poly fmt --check .

The action forwards to the same install.sh and caches the installed binary by version and platform. Its full input/output reference lives in ACTION_USAGE.md.

Terminal window
brew install Goldziher/tap/poly
Terminal window
scoop bucket add goldziher https://github.com/Goldziher/scoop-bucket
scoop install poly
Terminal window
npm install --global @goldziher/polylint
# or, per project:
npm install --save-dev @goldziher/polylint

The package pulls exactly one prebuilt binary through optionalDependencies, matched to your platform by npm’s own os, cpu and libc fields. There is no postinstall script and nothing is downloaded at install time, so installs work offline and behind a proxy, and the binary is covered by the registry’s integrity hashes like any other package content.

Platform Platform package
macOS (Apple silicon) @goldziher/polylint-darwin-arm64
macOS (Intel) @goldziher/polylint-darwin-x64
Linux arm64 (glibc) @goldziher/polylint-linux-arm64-gnu
Linux x64 (glibc) @goldziher/polylint-linux-x64-gnu
Linux x64 (musl/Alpine) @goldziher/polylint-linux-x64-musl
Windows x64 @goldziher/polylint-win32-x64

Installing with optional dependencies disabled (--omit=optional) is the one way to end up with the wrapper and no binary. poly then says so and tells you how to fix it, rather than failing with a stack trace.

Terminal window
pip install polylint
# or:
uv tool install polylint

Each release publishes platform-specific wheels, each carrying one binary as package data plus the poly and polylint console scripts. Again: nothing downloaded at install time, no build step.

A py3-none-any wheel is published alongside the platform wheels. pip ranks platform wheels above it, so a supported platform never resolves to it; an unsupported one gets a poly command that explains which platforms are published, instead of pip’s bare “could not find a version that satisfies the requirement”.

Terminal window
cargo binstall --git https://github.com/Goldziher/poly poly-cli

This resolves the same GitHub release archives — it does not build from source.

poly ships its own Claude/Codex plugin, registering poly mcp as a stdio server plus 5 skills and 2 slash commands (/poly-check, /poly-fix):

/plugin marketplace add Goldziher/poly
/plugin install poly@poly

For Codex, add the Goldziher/poly marketplace through your client’s plugin manager; the manifest is at .codex-plugin/plugin.json.

See Agents and MCP for the tool surface.

Any MCP-capable client can run poly directly:

mcp.json
{
"mcpServers": {
"poly": { "command": "poly", "args": ["mcp"] }
}
}
  1. Confirm which binary you got, and that nothing else shadows it:

    Terminal window
    poly doctor

    It prints the resolved path of the running executable with its version and build identifier, every poly on PATH in order, the config files in effect, and the cache directory — then exits non-zero on a real defect.

  2. Check the version string carries a release build identifier:

    Terminal window
    $ poly --version
    0.23.1 (release build v0.23.1, release)

    A development build reads 0.23.1 (dev build v0.23.1-8-g18aa5e8, debug) instead, so an unreleased build carrying local changes can never be quoted as a release.