Install Commercial from https://packages.wolfxl.com/simple/ with the username and secret shown on your checkout success page or evaluation confirmation page. Save the secret when it is shown; it is not emailed. Use /recover to replace credentials for an existing purchase. Install WolfXL and defusedxml from that index, and other packages from PyPI. Install Wolf Runtime through npm from https://packages.wolfxl.com/wolf/npm/ with the same username and secret when your evaluation or Order covers Wolf Runtime. Follow the recipes below to keep the secret out of commands, URLs, shell history, and logs.
pip on a workstation
Store the credential once in a netrc file. pip reads it for packages.wolfxl.com, so the secret never appears in a command.
Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.
~/.netrc on macOS or Linux (then run chmod 600 ~/.netrc), or %USERPROFILE%\_netrc on Windows
machine packages.wolfxl.com
login <username>
password <secret>
Install
python -m pip install "wolfxl>=2.1" --index-url https://packages.wolfxl.com/simple/
pip in CI with environment variables
Expose the username and secret to the job as masked secrets. The script writes a private netrc file for this shell only and deletes it on exit.
Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.
Install step
# WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD come from your secret store.
NETRC="$(mktemp)"
export NETRC
trap 'rm -f "$NETRC"' EXIT
printf 'machine packages.wolfxl.com\nlogin %s\npassword %s\n' "$WOLFXL_INDEX_USERNAME" "$WOLFXL_INDEX_PASSWORD" > "$NETRC"
PIP_INDEX_URL=https://packages.wolfxl.com/simple/ python -m pip install --no-input "wolfxl>=2.1"
Do not run this step with shell tracing (set -x), which would print the expanded printf arguments.
uv project with a named index
Pin wolfxl to a named index. uv fetches only wolfxl from packages.wolfxl.com and everything else from PyPI.
Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.
pyproject.toml
[project]
name = "my-app"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = ["wolfxl>=2.1"]
[[tool.uv.index]]
name = "wolfxl"
url = "https://packages.wolfxl.com/simple/"
explicit = true
[tool.uv.sources]
wolfxl = { index = "wolfxl" }
Install
# UV_INDEX_WOLFXL_USERNAME and UV_INDEX_WOLFXL_PASSWORD come from your secret store.
# On a workstation, uv also reads the same ~/.netrc entry that pip uses.
uv sync
Without a project
uv pip install "wolfxl>=2.1" --index wolfxl=https://packages.wolfxl.com/simple/
uv.lock records the index URL and file hashes, never the credential.
GitHub Actions
Add WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD as repository secrets. GitHub masks them in logs.
Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.
.github/workflows/test.yml (pip)
name: test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install WolfXL Commercial
env:
WOLFXL_INDEX_USERNAME: ${{ secrets.WOLFXL_INDEX_USERNAME }}
WOLFXL_INDEX_PASSWORD: ${{ secrets.WOLFXL_INDEX_PASSWORD }}
run: |
# WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD come from your secret store.
NETRC="$(mktemp)"
export NETRC
trap 'rm -f "$NETRC"' EXIT
printf 'machine packages.wolfxl.com\nlogin %s\npassword %s\n' "$WOLFXL_INDEX_USERNAME" "$WOLFXL_INDEX_PASSWORD" > "$NETRC"
PIP_INDEX_URL=https://packages.wolfxl.com/simple/ python -m pip install --no-input "wolfxl>=2.1"
uv variant of the install step
- uses: astral-sh/setup-uv@v6
- name: Install dependencies
env:
UV_INDEX_WOLFXL_USERNAME: ${{ secrets.WOLFXL_INDEX_USERNAME }}
UV_INDEX_WOLFXL_PASSWORD: ${{ secrets.WOLFXL_INDEX_PASSWORD }}
run: uv sync
Docker with a BuildKit secret
Mount the netrc file only for the install step. It is never written to an image layer or the build history.
Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.12-slim
RUN --mount=type=secret,id=wolfxl_netrc,target=/root/.netrc \
python -m pip install --no-cache-dir "wolfxl>=2.1" --index-url https://packages.wolfxl.com/simple/
Build
# wolfxl.netrc holds the three netrc lines. In CI, write it the same way as the pip recipe.
docker build --secret id=wolfxl_netrc,src=wolfxl.netrc -t my-app .
The mount target assumes the step runs as root. For another user, mount the secret at that user's home directory.
Hosted agent sandboxes
Add WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD as secrets or environment variables in the sandbox's environment settings, then run the CI install script from the environment's setup script. Keep the credential out of prompts, chat messages, and committed files.
Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.
Setup script
# WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD come from your secret store.
NETRC="$(mktemp)"
export NETRC
trap 'rm -f "$NETRC"' EXIT
printf 'machine packages.wolfxl.com\nlogin %s\npassword %s\n' "$WOLFXL_INDEX_USERNAME" "$WOLFXL_INDEX_PASSWORD" > "$NETRC"
PIP_INDEX_URL=https://packages.wolfxl.com/simple/ python -m pip install --no-input "wolfxl>=2.1"
If the sandbox limits outbound network access, allow packages.wolfxl.com alongside PyPI. Sandboxes that can reach only PyPI can still run Community.
Wolf Runtime with npx
Wolf Runtime ships as the @wolfsdk/wolf npm package for Node.js 18 or later. Only the launcher and the native package for your platform are installed (macOS arm64 or x86_64, Linux arm64 or x86_64, Windows x86_64), with no install scripts. Use a credential from a Runtime evaluation or an Order naming Wolf Runtime. WolfXL-only credentials are refused with HTTP 401.
Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.
Encode the credential for npm. Type both values at the prompts to keep the secret out of shell history
python -c "import base64, getpass; u = input('Username: '); s = getpass.getpass('Secret: '); print(base64.b64encode((u + ':' + s).encode()).decode())"
~/.npmrc on macOS or Linux (then run chmod 600 ~/.npmrc), or %USERPROFILE%\.npmrc on Windows
@wolfsdk:registry=https://packages.wolfxl.com/wolf/npm/
//packages.wolfxl.com/wolf/npm/:_auth=<encoded credential>
Run
npx --yes @wolfsdk/wolf --version
CI or agent sandbox
# WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD come from your secret store.
NPM_CONFIG_USERCONFIG="$(mktemp)"
export NPM_CONFIG_USERCONFIG
trap 'rm -f "$NPM_CONFIG_USERCONFIG"' EXIT
printf '%s\n' "@wolfsdk:registry=https://packages.wolfxl.com/wolf/npm/" "//packages.wolfxl.com/wolf/npm/:_auth=$(printf '%s:%s' "$WOLFXL_INDEX_USERNAME" "$WOLFXL_INDEX_PASSWORD" | base64 | tr -d '\n')" > "$NPM_CONFIG_USERCONFIG"
npx --yes @wolfsdk/wolf --version
The credential is sent only to packages.wolfxl.com/wolf/npm/. The encoded value is reversible, so protect it like the secret. Do not run the CI step with shell tracing (set -x). In a sandbox that limits outbound network access, allow packages.wolfxl.com.