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.26.0.tar.gz (228.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_py-0.26.0-cp311-abi3-win_amd64.whl (977.0 kB view details)

Uploaded CPython 3.11+Windows x86-64

toolr_py-0.26.0-cp311-abi3-musllinux_1_2_x86_64.whl (472.1 kB view details)

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

toolr_py-0.26.0-cp311-abi3-musllinux_1_2_aarch64.whl (443.7 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

toolr_py-0.26.0-cp311-abi3-manylinux_2_28_x86_64.whl (531.3 kB view details)

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

toolr_py-0.26.0-cp311-abi3-manylinux_2_28_aarch64.whl (378.7 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ ARM64

toolr_py-0.26.0-cp311-abi3-macosx_11_0_x86_64.whl (788.0 kB view details)

Uploaded CPython 3.11+macOS 11.0+ x86-64

toolr_py-0.26.0-cp311-abi3-macosx_11_0_arm64.whl (669.7 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: toolr_py-0.26.0.tar.gz
  • Upload date:
  • Size: 228.8 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.26.0.tar.gz
Algorithm Hash digest
SHA256 57fab0b2c0e0c05b22743d72974be4253951381e1a03e6d4b3e6cc37bf2d9158
MD5 8256995de36ad610b558ef9280e11c58
BLAKE2b-256 2226c327d06d68b8a37f78335859bfa980d49f30b3ff92cd078e3ca73271644b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: toolr_py-0.26.0-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 977.0 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.26.0-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5b0bfef2a5deb07658fe6aaa42ce626c83e61300c94adfdbb97f653add1cffb7
MD5 836878dda91f01ca4f4fe97d59c9a2c8
BLAKE2b-256 1459c3ed7b022273b2afeb2b7ce75795e0b6842eec89d21cea148206a52c7aeb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr_py-0.26.0-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 71e86557590a5f3b8bb02629035126bc35abd54cd463651b26e5d23b6ae8b086
MD5 6a99ca65739ef74eb607ffd8dec547a8
BLAKE2b-256 c4a1e174aa9812759212af3993f5adf8cb3f9ff3a7e8c829190419ecb77526fa

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr_py-0.26.0-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e336997702bd53481a0d9bf1b301bb680a48446349a4a3514f27acd43f6e3801
MD5 e82594dd57b185c9eb25ee45c891db44
BLAKE2b-256 9db133caa24510a7548c0edd0d96ca72af50331f24637509879563ba13372171

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr_py-0.26.0-cp311-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 287242c7bbc77cb18cfc10fdc2c1f338677294d095ee2a4a639c524a9d10d693
MD5 1bcef9c832d4ae2245c023060157cdfc
BLAKE2b-256 545a4cc03a9677086914c4662210d02b3425594a5638c855bd8ccf452bb63315

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr_py-0.26.0-cp311-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0dec6ca1254d22dc9ecbcf153cbc29dbd3834ffd8f7f54e161b4fb02a8835b93
MD5 b6c45ba45ff578d825cafda721d0f9a7
BLAKE2b-256 88c8bbed7318d585300cbe28f0401a7698f5d401093113f9971907a469dd9a03

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr_py-0.26.0-cp311-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 b1c87cd01d1d7b181d40c540d0305e55269a7c69b73976d4c5d992f60762f630
MD5 6bc135034491818d460ab044e3b43876
BLAKE2b-256 aa419809a3a21ffe004fd5a848e37a4746907f564e66fa634f697048432e1e27

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr_py-0.26.0-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 21813b26d8eb7e112a73b73880d9d2154997987dac8ab027355271c3b8eb593d
MD5 44dced4dcb65d5a260a187c90edecd82
BLAKE2b-256 3332f481f5da764529716ab669a9c0dcac01d94e6e5ce6726b59b82b4ba83d16

See more details on using hashes here.

Provenance

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