← SkillSafe / Py Shift

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.

nothing pasted yet
Drag files in, or or a whole folder Everything is read in your browser. Nothing uploads until you run.
Paste a config to price the run.

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.