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_py-0.25.2.tar.gz (230.4 kB view details)

Uploaded Source

Built Distributions

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

toolr_py-0.25.2-cp311-abi3-win_amd64.whl (977.7 kB view details)

Uploaded CPython 3.11+Windows x86-64

toolr_py-0.25.2-cp311-abi3-musllinux_1_2_x86_64.whl (474.0 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ x86-64

toolr_py-0.25.2-cp311-abi3-musllinux_1_2_aarch64.whl (445.2 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

toolr_py-0.25.2-cp311-abi3-manylinux_2_28_x86_64.whl (534.1 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ x86-64

toolr_py-0.25.2-cp311-abi3-manylinux_2_28_aarch64.whl (380.1 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ ARM64

toolr_py-0.25.2-cp311-abi3-macosx_11_0_x86_64.whl (787.4 kB view details)

Uploaded CPython 3.11+macOS 11.0+ x86-64

toolr_py-0.25.2-cp311-abi3-macosx_11_0_arm64.whl (666.9 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

Details for the file toolr_py-0.25.2.tar.gz.

File metadata

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

File hashes

Hashes for toolr_py-0.25.2.tar.gz
Algorithm Hash digest
SHA256 1d98f8a49ff74903f9525316424bda9784daeecbc63fd71f75a32f608cf163ba
MD5 b28173fbbc515386989df0181f170fed
BLAKE2b-256 961e23bbcfb6efd972e17f146aa17bfbbda067222fae9202d9ee495b066b1374

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-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_py-0.25.2-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: toolr_py-0.25.2-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 977.7 kB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for toolr_py-0.25.2-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 e79c7dbb3b9c752c02d3b4b01fee808a33392adfd5dcf6cc175a515e16c53757
MD5 2e59471544f06dc6825ee0738dff4f9b
BLAKE2b-256 c4d85cc67508839ffd7698e451f1babe597a91835147e21f68f945358ee4992b

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.2-cp311-abi3-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_py-0.25.2-cp311-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.2-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b958a49d6dcf99f8418a6edbc0028c923db1cd54019738b63b1457db0684e296
MD5 db94329e87b895b8581ae397dec45ca5
BLAKE2b-256 76678f32e33282fa0edcbd970f62ca7cb64b8421dc7ae2aed7c9b20c277810bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.2-cp311-abi3-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_py-0.25.2-cp311-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.2-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a4850ee03c0f13c90ddfbe6dc360e749610ca0ef10b18f8921d7b88ea9943a82
MD5 48f2c372e8ce44930ce99d205afbe03a
BLAKE2b-256 11c4d182e19cb7f42983b84ff6151f2d73eb88d4e387625d6d77066f94a4fee1

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.2-cp311-abi3-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_py-0.25.2-cp311-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.2-cp311-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 37e25d0e844bbfc847b1e5f58c9e44d1288edc4e5e25f2f1288346b044fb490d
MD5 537ec6eeb0513c5eddcfaea59c9025fa
BLAKE2b-256 2af04c013e6661e5aa597f8764c3bd0912d669048df0fc0b7bc055d4e0fc9ca1

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.2-cp311-abi3-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_py-0.25.2-cp311-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.2-cp311-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6cf1ccf78fb78c0139ce8cba035700947aa987a930e69f5185c332edcd12eefa
MD5 421077c95bb791c0c700b403339ba5cf
BLAKE2b-256 909508d42b526418535f585997a5d15f11c311e6b04bdfcdf556deaac8afa3ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.2-cp311-abi3-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_py-0.25.2-cp311-abi3-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.2-cp311-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 ef92f81768a7535500eaf9805feca0969ed04d337e0801fc7393270b954ac5f2
MD5 f6c6ad9aff84da7f96fb4e44741eb7a1
BLAKE2b-256 d113051c285d86510554deb63ff4cd3e7f48f8c19b13b306cce268ad0a9cfa31

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.2-cp311-abi3-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_py-0.25.2-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.2-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f47e01c614d2534c119df0a2a095e83479baa4d526a3204f03a258cc0b060165
MD5 e8bbe1c0721770266798770951405a9c
BLAKE2b-256 7356d76caa518df9ff89822bb4f0847e1dfda983d8c7c2034119c5f0a2232557

See more details on using hashes here.

Provenance

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