macOS and Linux
Download and run the install script:~/.local/bin. Override the version or install directory with WXCTL_VERSION and WXCTL_INSTALL_DIR:
~/.local/bin is not on your PATH, add it:
Windows
Run the install script in PowerShell:%LOCALAPPDATA%\wxctl\bin, and removes the “Mark of the Web” so Windows does not block it. Override the version or install directory with WXCTL_VERSION and WXCTL_INSTALL_DIR:
PATH, the script prints a command to add it for the current user. Open a new terminal afterward. Under WSL, follow the macOS and Linux steps.
npm
Install globally with npm as an alternative to the install script. It works the same on macOS, Linux, and Windows, and skips the macOS Gatekeeper and Windows SmartScreen prompts:npm install downloads a prebuilt binary for your platform (there is no Node.js runtime dependency and no compile step) and puts wxctl on your PATH. Binaries delivered through npm carry no macOS Gatekeeper quarantine or Windows “Mark of the Web”, so this avoids the “unidentified developer” and SmartScreen prompts you can hit with a hand-downloaded binary.
npm delivers binaries for glibc Linux, macOS, and Windows. Alpine and other musl-based Linux are not supported over npm: npm install -g wxctl fails with a clear “no musl build” message. Use the install script or build from source on musl.
Run a one-off command without a global install:
npx wxctl downloads the prebuilt binary for your platform, a one-time step. For repeated use, install it globally with npm install -g wxctl.
Upgrade with npm update -g wxctl, not wxctl update (see Upgrade).
Download a binary
Every release includes a per-platform archive and aSHA256SUMS file. Download the archive for your platform, verify it, extract it, and move wxctl onto your PATH.
| Platform | Archive |
|---|---|
| macOS, Apple Silicon (arm64) | wxctl-<version>-aarch64-apple-darwin.tar.gz |
| macOS, Intel (x86_64) | wxctl-<version>-x86_64-apple-darwin.tar.gz |
| Linux, x86_64 | wxctl-<version>-x86_64-unknown-linux-gnu.tar.gz |
| Linux, arm64 | wxctl-<version>-aarch64-unknown-linux-gnu.tar.gz |
| Windows, x86_64 | wxctl-<version>-x86_64-pc-windows-msvc.zip |
| Windows, arm64 | wxctl-<version>-aarch64-pc-windows-msvc.zip |
wxctl binary (wxctl.exe on Windows), LICENSE, and README.md. A hand-downloaded macOS binary is quarantined by Gatekeeper; clear it with xattr -d com.apple.quarantine ./wxctl, or install with npm to skip the prompt entirely.
Build from source
Requires Rust 1.88 or newer.Configure a profile
wxctl init scaffolds a commented ~/.wxctl/profiles.yaml with a service block for every service (or just the ones a config uses), written with 0600 permissions. It does no prompting: you fill in the credentials afterward.
auth_type, and for every credential field both a commented ${env:...} line and a PASTE_YOUR_<FIELD>_HERE placeholder. Fill each placeholder with a real value or uncomment the ${env:...} line, then run wxctl profile validate.
Authentication types
wxctl init scaffolds each service’s auth_type into ~/.wxctl/profiles.yaml. See Profiles & credentials for the supported auth types (apikey, zenapikey, cp4d, hmac, and more) and the fields each one needs.
Active profile
Commands that talk to remote services (plan, apply, destroy, test) use the active profile. It is resolved in this order:
- The
-p, --profile <name>flag - The
WXCTL_PROFILEenvironment variable ~/.wxctl/active_profiledefault
Upgrade
If you installed with npm, upgrade with npm.wxctl update detects an npm install and points you here rather than replacing a binary inside node_modules:
wxctl --version. See Releases for what changed.
Uninstall
Remove the binary and wxctl’s local data. If you installed with npm, remove it withnpm uninstall -g wxctl instead of deleting the binary by hand:
~/.wxctl/ holds profiles.yaml (your profiles), active_profile, and the runs/ history. Deleting it removes all stored credentials.
Next steps
Quickstart
Declare resources and run your first plan.

