Your Python project, moved onto uv, ruff and ty — in the order you should actually do it
Paste pyproject.toml — or your setup.py, requirements.txt,
.pre-commit-config.yaml, Makefile and CI workflow, whichever you have.
You get a posture verdict, a check-by-check table, numbered steps with the exact
uv commands, your pyproject.toml rewritten in full, and the files to
delete once it works.
Both examples ship with a saved model run, so you can see the whole plan — including the
rewritten pyproject.toml — without signing in and without spending a credit.
What this does, and what it does not
The prescan is a real TOML and INI reader, not a keyword search. Every table header is resolved
to its dotted name, every key is read at the section it belongs to, arrays are followed across
line breaks, and comments are stripped without eating a # inside a quoted string.
That is what lets it tell apart cases a grep cannot: [tool.ty] with a bare
python-version key is flagged because at the top level that key is silently
ignored, while the identical key under [tool.ty.environment] is correct
and is left alone; dev tools under [project.optional-dependencies] are flagged as
published-to-your-users, while the same names under [dependency-groups] are the
answer. Everything it finds is handed to the model as facts it must reconcile, and the plan is
checked against them afterwards — if the model skips a flag, this page says so.
It reads; it does not run anything, it never installs a package, and it never reaches your
repository. This is a plan for the text you pasted, not a dependency resolution, a CVE scan or
a substitute for uv sync — which is the command every plan here starts with. The
rewritten pyproject.toml is parsed by the same reader before you see it, so a
[tool.black] table the model forgot to drop is named rather than quietly shipped.
A token you paste is a token you should rotate: the plan is told to name it rather than repeat
it, and this page checks the rewrite for any value it echoed back anyway.
Nothing to hand? Load the ,
a 3.8-floored library with setup.py leftovers, black, isort, flake8 and mypy, or
the , already
on uv but with a narrow ruff select, the [tool.ty] key in the wrong
place and no security lane. Both replay a saved run for free.