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

Uploaded Python 3Windows x86-64

toolr-0.25.2-py3-none-musllinux_1_2_x86_64.whl (4.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ x86-64

toolr-0.25.2-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.25.2.tar.gz.

File metadata

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

File hashes

Hashes for toolr-0.25.2.tar.gz
Algorithm Hash digest
SHA256 f0d05e07b4355b081b9db1d9768c13a565eb53aa6d1ca5932f13b72bcb4a7f84
MD5 02c8cd1134978819062c321a4fb09597
BLAKE2b-256 940252cc6687fc868ef93a27c0a214c18a9564d4d0245c3ec54a1a7bfe2b9577

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: toolr-0.25.2-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.13

File hashes

Hashes for toolr-0.25.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 3d324907de7a00a15c58b7bd95f30381628d3b27e6ba9c8409f76581ef9d0711
MD5 4d0c20eb4acc1a7d7f87dedb80ac5423
BLAKE2b-256 5b3dd3a95149075f1dd43a55914d44e077ff9d0ffc353b2f5aa82e9dceb0b860

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.25.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f0c502c68e0d635d58aeb32f6c3f34a74dc5cecac95c4d234c9a615adb890de0
MD5 5b6fbedc9785b3e771ed7e58557c1389
BLAKE2b-256 8d10dcda0924d1e17cf2f9a5a4beaa38ba12dc020db3e527294d53803377c24f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.25.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ab59997739a505c9a3f6083a97a894c088660c52587a097f98d981ca429e6af4
MD5 1756494f14ba0e67cf60b7ec74f44290
BLAKE2b-256 0547ac5674c2ef514a28dd022e3b356d9d401e0791da69ed33f49abce1f1924d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.25.2-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d77609c3688a936da43c692596e3f6c72885f991e0bd03ff75617e69c8098a58
MD5 f8394ca22856fb28bf74fbbeae0eadb8
BLAKE2b-256 4696b3f68106075f0cf864a98baa234632603d51b43062d634eee645aaac32c1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.25.2-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dc59dc5eb53c376aed05abe38fb32e45a56ede7ed98ed62bcb31248c0500764f
MD5 76da7f886baf6009b8b85d1bfe29e0d7
BLAKE2b-256 4c1fc3e46561b58126988a9e3667d399cd7194a4156b66fd5f477f88d442248e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.25.2-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 cee754ee292750d02348903dfb7aca37cf315f70a01808e28e4b810fc710c04d
MD5 766b14b527c0a49272001878e8e023f6
BLAKE2b-256 682b04a88d8e32d4fb4dc9cde149c290b6e1b14f9799629a3ac01e9b7ccd5873

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.25.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3eca2c6f3cef7064c45717a98477cdaafc22ce31f86d3e6bd3ba62e28848c54f
MD5 eca9d8c97b8d186b562bc968d2677437
BLAKE2b-256 aaf2c34c41d19c97f0c184b7f02bc4428065b36d8ac2995840463f47525e946c

See more details on using hashes here.

Provenance

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