Skip to main content

ToolR - AI Generated Logo

In-project CLI tooling, with a Rust front-end.

Pronounced /ˈtuːlər/ (tool-er)

ToolR is a Python task runner that boots in milliseconds because the front-end is a Rust binary. Python only runs when you invoke a command, inside a per-repo uv-managed venv.

Tool runner -h steady-state First run Second run
toolr 10.4 ms 277.0 ms 21.8 ms
doit 83.4 ms 143.0 ms 88.9 ms
invoke 84.6 ms 101.7 ms 77.4 ms
nox 91.8 ms 395.9 ms 115.3 ms
duty 166.4 ms 188.5 ms 252.4 ms
python-tools-scripts 252.2 ms 340.3 ms 189.0 ms

<tool> -h, 20 runs, steady-state = mean of last 18. Measured on Apple M3 Pro / macOS 26.5 / arm64. Reproduce locally with python3 scripts/bench.py (stdlib-only; emits the table above to stdout).

Why ToolR

  • Sub-millisecond discovery. The CLI is a Rust binary. --help and Tab completion read a cached static manifest; Python never boots for non-execute paths.
  • No system-Python dependency. Toolr resolves a per-repo Python venv via uv on first invocation. The host OS doesn't need Python at all to install toolr — it's a single static binary.
  • Write Python, not framework boilerplate. Drop a tools/*.py file with a command_group and a @command decorator. Type hints become CLI arguments; Google-style docstrings become --help text.
  • First-class third-party command packages. Plugins ship a static toolr-manifest.json inside the wheel. Discovery is a glob + JSON parse; no Python import to find them.
  • Signed releases. Every release archive ships with a SLSA build-provenance attestation. The install scripts verify it by default (requires the gh CLI); pass --verify-attestation=skip to bypass, accepting the supply-chain risk.

Two wheels, two roles

Package What it is Where it lives
toolr The Rust CLI binary you run from the shell. On $PATH, installed once.
toolr-py The Python runtime your tools/*.py import. In your tools/pyproject.toml.

Most projects want both: the CLI installed globally, toolr-py declared in the per-repo tools/pyproject.toml so from toolr import Context, command_group works when your commands run.

Install

Five first-class install paths.

mise

mise use aqua:s0undt3ch/ToolR@latest

Pulls toolr from the aqua registry via mise's built-in aqua backend — no plugin to register. For projects that already pin tool versions via .mise.toml, toolr's version becomes part of your project's reproducible tool set. See docs/installation/mise/.

pip

pip install toolr   # Rust CLI binary

This installs the toolr binary into whatever venv pip is pointing at. Do not pip install toolr-py into that same venv — toolr-py is the Python runtime your tools/*.py files import, and it belongs in the per-repo tools venv that toolr project init scaffolds for you (where it's declared in tools/pyproject.toml and materialised via uv sync). See "Two wheels, two roles" above for the split.

curl | sh (Linux + macOS)

curl -fsSL https://raw.githubusercontent.com/s0undt3ch/ToolR/main/installation/install.sh | sh

Verifies the SLSA attestation by default (requires the gh CLI; pass --verify-attestation=skip to bypass). Pin a version with sh -s -- --version X.Y.Z. Custom prefix: sh -s -- --prefix /opt/toolr/bin.

PowerShell (Windows)

irm https://raw.githubusercontent.com/s0undt3ch/ToolR/main/installation/install.ps1 | iex

GitHub release archives

Download toolr-<version>-<target-triple>.tar.gz (or .zip for Windows) from https://github.com/s0undt3ch/ToolR/releases, verify the .sha256 sibling and the SLSA attestation, drop the binary on $PATH. Useful in locked-down environments that audit binaries before allowing them on a machine.

Scaffold your repo

After the binary is on $PATH:

toolr project init                  # writes tools/{pyproject.toml,.gitignore,example.py}
toolr example hello                 # run the generated example
toolr self completion install bash  # or zsh / fish

The full install matrix (per-OS notes, attestation flags, prefix overrides) lives in docs/installation/.

What you write

# tools/example.py
"""Example commands."""
from toolr import Context, command_group

example = command_group("example", title="Example", description=__doc__)


@example.command
def hello(ctx: Context, name: str = "world") -> None:
    """Say hello to <name>.

    Args:
        name: who to greet.
    """
    ctx.print(f"Hello, {name}!")
$ toolr example hello --name Pedro
Hello, Pedro!

toolr project init writes a richer four-command starter than this two-liner — open it and edit, or delete it and start from scratch.

Where to go next

Project status

ToolR is pre-1.0. The on-disk manifest is versioned (schema_version in tools/.toolr-manifest.json); the binary refuses to load a higher version than it understands. The public Python surface is toolr.__all__; anything not listed there is implementation detail. Backwards-incompatible changes will be explicit in the changelog (generated by git-cliff on release).

Contributing

See CONTRIBUTING.md.

License

Apache-2.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

toolr-0.27.0.tar.gz (294.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

toolr-0.27.0-py3-none-win_amd64.whl (4.1 MB view details)

Uploaded Python 3Windows x86-64

toolr-0.27.0-py3-none-musllinux_1_2_x86_64.whl (4.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

toolr-0.27.0-py3-none-musllinux_1_2_aarch64.whl (4.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

toolr-0.27.0-py3-none-manylinux_2_28_x86_64.whl (4.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

toolr-0.27.0-py3-none-manylinux_2_28_aarch64.whl (4.0 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

toolr-0.27.0-py3-none-macosx_11_0_x86_64.whl (4.2 MB view details)

Uploaded Python 3macOS 11.0+ x86-64

toolr-0.27.0-py3-none-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file toolr-0.27.0.tar.gz.

File metadata

  • Download URL: toolr-0.27.0.tar.gz
  • Upload date:
  • Size: 294.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for toolr-0.27.0.tar.gz
Algorithm Hash digest
SHA256 503321d09b1aa4188e5a64e8bfbe1e72f5871871860ae20775a676acaf2b3a7a
MD5 fc8f320eba2aeb89dcda060121ec1b67
BLAKE2b-256 31dcd7c04f3101082be08d40e22d24d7a5481fedbc4440eeb815b6f16185c49b

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.27.0.tar.gz:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr-0.27.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: toolr-0.27.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 4.1 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for toolr-0.27.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 895d240320716b888e52b685e9fdb0f0400edc7367cee17ff9f833eb783be863
MD5 4301d22508be6dfd5c7d793b1fe36ae6
BLAKE2b-256 4939b1c0f009b1e023e9d88d145caab0e330842d0f1324ad3356ef4b9d9fa36d

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.27.0-py3-none-win_amd64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr-0.27.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for toolr-0.27.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 34ed404169ce83e325bf86f1f3c4e95aa11a4bd5038a9ae69b793493a985893c
MD5 b44febff76be13ff727da72391eb7cde
BLAKE2b-256 cc9e81c96d3c6f658457e68c8ec9cc07447a8e94ff376d3c9e64d861a659fe0b

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.27.0-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr-0.27.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for toolr-0.27.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ed0f5166ce97b2bd6ad6985b68a287b78a935420eb395ca00a4c0a9341d38b16
MD5 f0012fa2d2a80109b75911d92f673967
BLAKE2b-256 8d6c0c655e0dcbdb39eeebde68c648188217f0acb98c114529859762f4e26382

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.27.0-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr-0.27.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for toolr-0.27.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fe9b0512ef905b880ce8d826bcdadb0af225bcb75462cdafb9f3c41d7667bfef
MD5 851250c15db0578fe97c3558df9dbcf9
BLAKE2b-256 f61aa6ffe826044720ce6cf4f31933a54fa5b3d0fcd117a05ab9d83e1cd90abd

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.27.0-py3-none-manylinux_2_28_x86_64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr-0.27.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for toolr-0.27.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3ab998f92a30766106b7d6d6bfc82fa16627e02e1678758111ebdc3a862545b4
MD5 a94acc8c693d7c698c80b5d92d37cd92
BLAKE2b-256 45c542afdc09abd8d687f856441478ab6b0ce06e90c50faecb57b72aab686783

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.27.0-py3-none-manylinux_2_28_aarch64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr-0.27.0-py3-none-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for toolr-0.27.0-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c968dbd748feb727f3980f4fa61f178af9f9aae3ed244b77146a59138ea895ad
MD5 ab6c3384ba09195349eadd9e09d3557e
BLAKE2b-256 9e670e3c1e949c49cb82d54f8853f3ceff3e3b3835dda8808364bafff414af22

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.27.0-py3-none-macosx_11_0_x86_64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr-0.27.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for toolr-0.27.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 641f6ad24ad7a8621e31b1407b8585f388fdae66f6781b2d3abdae71edd2154d
MD5 8bc23a54faa5e6a1ba15927768830aa4
BLAKE2b-256 1c3b54e299c9ce9197c988ab1ca57d605597c44d46e436300bc792f1cfff6b40

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.27.0-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page