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.
--helpand 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
uvon 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/*.pyfile with acommand_groupand a@commanddecorator. Type hints become CLI arguments; Google-style docstrings become--helptext. - First-class third-party command packages. Plugins ship a static
toolr-manifest.jsoninside 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
ghCLI); pass--verify-attestation=skipto 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
- Quickstart
- Writing commands
- Third-party packages
- Agent skills (for LLM coding assistants)
- Internals (manifest, freshness, cache)
- CLI reference
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
Release files for toolr-py 0.32.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| toolr_py-0.32.0.tar.gz | 259.8 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| toolr_py-0.32.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| toolr_py-0.32.0-cp311-abi3-musllinux_1_2_x86_64.whl | CPython 3.11 | abi3 | Linux musl 1.2+ x86-64 | Details |
| toolr_py-0.32.0-cp311-abi3-musllinux_1_2_aarch64.whl | CPython 3.11 | abi3 | Linux musl 1.2+ ARM64 | Details |
| toolr_py-0.32.0-cp311-abi3-manylinux_2_28_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| toolr_py-0.32.0-cp311-abi3-manylinux_2_28_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| toolr_py-0.32.0-cp311-abi3-macosx_11_0_x86_64.whl | CPython 3.11 | abi3 | macOS 11.0+ x86-64 | Details |
| toolr_py-0.32.0-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 4.6 MB
Release files / toolr_py-0.32.0.tar.gz
| Download URL | toolr_py-0.32.0.tar.gz |
|---|---|
| Size | 259.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fe4812b5a58b4552fae125e9b9beb7c9076c18177ad8a79265bf7755c4d260a7
|
|
BLAKE2b-256 checksum How to use checksums |
b98498868aa1f604a858933c4e706f0c678a28ac3a8ea8f59a1651f3b0c19cbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / toolr_py-0.32.0-cp311-abi3-win_amd64.whl
| Download URL | toolr_py-0.32.0-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 989.9 kB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
8d7d246c5731f184b29cee1f71a76881049906a355e5da3ea085232585a58516
|
|
BLAKE2b-256 checksum How to use checksums |
6005461272793bfeadd59ea129a41e63e89632fa3aea0ad25d50b9e35101c7c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / toolr_py-0.32.0-cp311-abi3-musllinux_1_2_x86_64.whl
| Download URL | toolr_py-0.32.0-cp311-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 488.1 kB |
| Tags | CPython 3.11 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
660edc45ff676c7ca0a8dd4817b20bf94da60936da043effae384df4e084d83e
|
|
BLAKE2b-256 checksum How to use checksums |
cbf77d749151337aaabe0ba40e3e6137d0386e4647bcd18619c426bc89bcbded
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / toolr_py-0.32.0-cp311-abi3-musllinux_1_2_aarch64.whl
| Download URL | toolr_py-0.32.0-cp311-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 459.3 kB |
| Tags | CPython 3.11 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
455401f9459965fe219f5a991b7600960395438d35bea3c77e0a900f225f7e90
|
|
BLAKE2b-256 checksum How to use checksums |
eeaaca751a84ee521e8f405525835a9eab8958fcfa0cab74b690d6a77c6aec66
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / toolr_py-0.32.0-cp311-abi3-manylinux_2_28_x86_64.whl
| Download URL | toolr_py-0.32.0-cp311-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 554.4 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
7c85bb16d921e96977ce6586467bfd58fa497d69d386799c301af950d159b003
|
|
BLAKE2b-256 checksum How to use checksums |
9e7557968d9f75dfe61b85f70694a24997ade28698e50d8f6f0c16954e0beb4c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / toolr_py-0.32.0-cp311-abi3-manylinux_2_28_aarch64.whl
| Download URL | toolr_py-0.32.0-cp311-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 393.9 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
9b9dd8d62c367baeda10d992bd6299538aac6b5d7315c330913813a38a987679
|
|
BLAKE2b-256 checksum How to use checksums |
3b2ff06ec185e555e709a2f6e61e366fef766df5b371be4febaf72f2a161860f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / toolr_py-0.32.0-cp311-abi3-macosx_11_0_x86_64.whl
| Download URL | toolr_py-0.32.0-cp311-abi3-macosx_11_0_x86_64.whl |
|---|---|
| Size | 798.8 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
e15bcda8b56b74e245ac4f7edae997e7e82c43a2cb385ea1518e3ca6d3e4c206
|
|
BLAKE2b-256 checksum How to use checksums |
2d2feab9215cd1f75b6ac5a84b33278b3e8c8d8dc0fcaeb82594c3c64e1cfb36
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / toolr_py-0.32.0-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | toolr_py-0.32.0-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 680.3 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
9ea0e28d75690316e8b7cd57b87d0943a8cad5da8784f8a8bd49247392c83863
|
|
BLAKE2b-256 checksum How to use checksums |
89b3c05e7542637a9627ad9c91054231309d4ed56321df1e1e3c8a22245d1dc8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency log