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.26.1.tar.gz (286.8 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.26.1-py3-none-win_amd64.whl (4.1 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

toolr-0.26.1-py3-none-musllinux_1_2_aarch64.whl (4.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.28+ x86-64

toolr-0.26.1-py3-none-manylinux_2_28_aarch64.whl (3.9 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ x86-64

toolr-0.26.1-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.26.1.tar.gz.

File metadata

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

File hashes

Hashes for toolr-0.26.1.tar.gz
Algorithm Hash digest
SHA256 c4b908f865825d079ca48036b30d7dd28312fc3edbe0efc2b4810ab176e29943
MD5 6e18af5481edf1118394034eeaf7c14f
BLAKE2b-256 0eee578b32425bb3c7a0bfdb51c95c6c851a337cb78c1f3f0a281409b5e2d6e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.26.1.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.26.1-py3-none-win_amd64.whl.

File metadata

  • Download URL: toolr-0.26.1-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/6.1.0 CPython/3.13.14

File hashes

Hashes for toolr-0.26.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 757861ee29b03a548171aca1cb58bff87d566bf7fbb22a2881f610af23f77ef3
MD5 aa671f414ce4fac0d495e840f2b1e1ad
BLAKE2b-256 402cc2aad28358953150979e82ee4fab4e5f1f8d2a56c28f241dea2c5d2699fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.26.1-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.26.1-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for toolr-0.26.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 17b51ff6d51360baf2947b28d32555966618bf20c777996552bedbfc297417b1
MD5 b6590845b86f4effbe43f8cf28a28ff3
BLAKE2b-256 7bb95e4d4372f62ce1120d1e9e65e5c023367297a89527710848c739ebdd2a93

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.26.1-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.26.1-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for toolr-0.26.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 455136342e3a57ccae73d806041f8adba7f23a9358686bf83faf2815abec2369
MD5 b78376fe6c812944120b45ba176f4503
BLAKE2b-256 0cc5a3c25f74dc371cd47c631a2abefebc43acc0737218cbd6a8203b17af3f5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.26.1-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.26.1-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for toolr-0.26.1-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3bd8f9ad7052953eb35f933776f52c31f5c199e8a7c61764fbf248744f62bd02
MD5 71a640efdf3ca957822082e767e2fa73
BLAKE2b-256 38330e7ac6fc2e6dc865c6a311e585aae207468bd9319fa6829d4febee1a1c74

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.26.1-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.26.1-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for toolr-0.26.1-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 04653dd531cf266b36817d7f9495099e11e69ac80ce48ff7b7d7ee6084804ce3
MD5 6f88bd98d6d72cdd2d4627dc08ed2b39
BLAKE2b-256 2b15791f7749f459461e08f5199d8e9db9ed44bc823ad68fa88b9278ff520b39

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.26.1-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.26.1-py3-none-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for toolr-0.26.1-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 df36491ef530fe0012419da9fb255b47c46a9bd0959d40d4e6b21f9bc5156042
MD5 c8591a25b46eaadbf82bf4a5f186000d
BLAKE2b-256 45bbf735c61ef8e5236757213931bc8730f3e4b873cac1e037dd8b66abedcbf3

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.26.1-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.26.1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for toolr-0.26.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c67703ea24e87c734034b9cf8325e3bd8b4dc3a0932338b468b1a8d540c58ad3
MD5 1f0faf258431e44c8a843b4d08553279
BLAKE2b-256 02ed6129fa91f41864b743b51b8cd22cb5281beaefb7ccdd2efc2ef2d71ee5cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr-0.26.1-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