Move a Python project between requirements.txt, pyproject.toml and Pipfile
You inherited a project that uses requirements.txt but the rest of your team is on Poetry. Or you want to try uv, which expects PEP 621 style pyproject.toml. Or you finally want to drop Pipenv and ship a real lockfile. The annoying part is never the package manager: it is the 30 dependencies you have to rewrite by hand without breaking a version pin.
This tool converts dependency files between formats: requirements.txt, pyproject.toml (both Poetry and PEP 621 style used by uv, PDM and Hatch) and Pipfile. You paste one side, you get the other. Live conversion, no upload, nothing leaves your browser.
The parser understands version specifiers in each ecosystem, ^1.2.3 (Poetry caret) becomes >=1.2.3,<2.0.0 in PEP 621, ~=1.2.3 stays a tilde, ==1.2.3 stays pinned. Dev dependencies stay separated, inline comments (`# dev`, `# pinned for compat`) round-trip, VCS URLs (`git+https://...`), editable installs (`-e .`) and environment markers (`; python_version >= "3.11"`) are preserved.
How to use it
- Pick the input format in the top-left bar: requirements.txt, pyproject.toml or Pipfile. Paste your file into the left textarea, the converter starts running immediately.
- Pick the output format on the right. You cannot pick the same format on both sides, the matching button is grayed out.
- If you are exporting to pyproject.toml, choose the style: Poetry (used by Poetry itself) or PEP 621 (used by uv, PDM, Hatch, setuptools). The two are structured differently and your tooling will reject the wrong one.
- Toggle Group dev deps separately to keep development packages (linters, test runners) in their own section. The parser recognizes # dev comments in requirements, [tool.poetry.group.dev.dependencies] in Poetry, [dependency-groups].dev in PEP 621, and [dev-packages] in Pipfile.
- Toggle Preserve comments to keep your inline notes (`# pinned, see CVE-2024-...`) attached to the right dependency.
- Toggle Sort alphabetically if your team uses sorted dependency files. Off by default so your original ordering survives.
- Copy the result, or Download it as the right filename (`requirements.txt`, `pyproject.toml`, `Pipfile`).
- Swap direction flips the two sides and feeds the current output back as input, useful for sanity-checking a round trip.
When this is useful
Six situations where pasting and clicking beats rewriting by hand:
- Moving an old project to Poetry. You have a 40-line requirements.txt with two # dev sections. You paste it, switch to Poetry pyproject, the dev group lands in [tool.poetry.group.dev.dependencies] automatically.
- Trying uv on an existing Poetry project. uv is PEP 621 native and 10x faster than Poetry. You paste your Poetry pyproject.toml, switch the output to PEP 621, you get the format uv expects (`[project]` + `dependency-groups`).
- Leaving Pipenv behind. Pipfile is dying. You convert your Pipfile to pyproject.toml in two clicks. The python_version from [requires] lands in requires-python.
- CI pipelines that need requirements.txt. Your project uses Poetry, but your Docker image installs from a plain requirements.txt for caching. You paste the Poetry file, get requirements.txt with the same pins, drop it in.
- Auditing a versioning mess. Someone wrote ^, ~, >= and bare pins in the same file. Convert to requirements.txt to see all the version constraints in the canonical PEP 440 form side by side.
- Onboarding a new dev. The new person uses uv, the project uses Poetry. You paste the Poetry file, send them the PEP 621 output, they are unblocked in 60 seconds.