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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ x86-64

toolr-0.26.0-py3-none-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for toolr-0.26.0.tar.gz
Algorithm Hash digest
SHA256 fe90ede2af4985eab2edf2c4521996635fef3d71cdc169eee9eacce0e9b5bbfc
MD5 bc2014d04e515ac2246fc74c96763bc8
BLAKE2b-256 55c6820284dcfdbce11f1ec5d886f7f9d96900b69dd2f224baf6f3f24e68936c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: toolr-0.26.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/6.1.0 CPython/3.13.13

File hashes

Hashes for toolr-0.26.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 ba0f997ec271e6c67300817f832984456e6c308047ffc1b96e3b82d50cc79b62
MD5 3cba3e9829283c3681d57eff0e6f97e6
BLAKE2b-256 326f0c4fdbdd5f99d80ce2243fd6218b1983de9cd6f67fe366d4da6b4494c774

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.26.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7b058f2a67338fcb3471a7c391f51079c39bdb903356d3040acbf7827b21576c
MD5 fe4cd785976bdbcb9bcdf8fcddbd5a14
BLAKE2b-256 bb9d8cc0d060acd4a2ccf83abf4b29c1db9a190c05f7f809f8c66fc1b0882bb0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.26.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 183aaf4209c23cd71daf131458aee1e08c3edb0afdc97dc759d6ae66944278e8
MD5 204bcc666609158afdf03cb754e1637b
BLAKE2b-256 e1d4cd1c1c9187179f919de779ca8438c17e1ca5426a55776db204da9560d0e6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.26.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c07ccd7076763d8a334a184de4035b86ff34e01127f6b6df09fbbe27b31994c2
MD5 24ca9cdffb31d0c572fb1da260132f52
BLAKE2b-256 a207644c8094f3bfa45062cec8a1c868f4454ef9699dd48f1acbe9e2ed9ee6c5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.26.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d7e460161d7918637a5817a6983351740961aeb6ca489e2c22f0abb7b99afa95
MD5 f0e2ecf200a71e74eeeb47c4b687f886
BLAKE2b-256 4121b7fb1bf0a856dbaf5947ddd1d971b04ead88405d5ce2e7289f8e75201d61

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.26.0-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 913b0a86f204257cd9f2c9f1ec15e3567f21867eab47ad4d8d2ae31019222ebf
MD5 fc90e198c3ddb0c35c8faaec5b7c4fb6
BLAKE2b-256 3b7eb0a0298f76bbb09b0cedb026eb6d40555ee504c2ae7e5b95c20f8dee41ea

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for toolr-0.26.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 30439166391c7d08b3a3ffb1997e0808e9600aaf92246190ddd0f2e9d2bb49c7
MD5 a59652cb1dc084d44c38522ece5652f7
BLAKE2b-256 d2ee493fb09a5eced077a396e5d8a3a78a24e9e8cdc333fe3abad4242ca79c23

See more details on using hashes here.

Provenance

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