Flit migration map for Python packages: finds every setup.py, setup.cfg and setuptools/old-flit pyproject.toml line and prints the exact flit_core 4 [project] line that replaces it, plus the blockers Flit cannot build. Runs entirely in your browser — nothing is uploaded.
Same engine as the VS Code extension, byte for byte.
Workspace key ($29 once): every setup.py, setup.cfg and pyproject.toml in the workspace as one dated migration plan, each item mapped to its flit_core 4 replacement. Team key ($149): licence and end-of-life exposure report across projects plus a CI gate that fails a build adding new setuptools-only
One payment, one licence key for this tool. The key is shown right after payment.
Buy the full version — $29· ReadyStack
Real numbers from this tool, line by line.

Six setup.py lines from a sample Python package show what a Flit migration really is: install_requires becomes [project] dependencies, extras_require becomes [project.optional-dependencies], a console_scripts entry becomes [project.scripts], data_files becomes [tool.flit.external-data], python_requires becomes requires-python, and license="MIT" becomes an SPDX license string that needs flit_core >=3.11. If you maintain a pure-Python library on PyPI and you are moving from setuptools, Hatch or the old Flit 3 layout to flit_core 4, this is the list you would otherwise write by hand.
flit_core 4.0 (on PyPI 2026-08-04) no longer reads [tool.flit.metadata]. The Flit release history says it plainly: the old table "is no longer used for project metadata"; use the [project] table, or build with flit_core <4. A package whose [build-system] asks for "flit_core >=3.2" with no upper bound now receives flit_core 4 when pip builds it from the sdist, and the build stops.
flit_core 4.1 (on PyPI 2026-09-16) accepts license expressions with WITH, such as "Apache-2.0 WITH LLVM-exception". That line needs "flit_core >=4.1,<5" in requires. A plain SPDX expression like "MIT" needs flit_core >=3.11, and import-names needs flit_core >=4. The Flit docs also ask every package to pin "<5".
Flit Migration Check is a VS Code extension with a free web version that runs the same engine. Open setup.py, setup.cfg or pyproject.toml and it prints one finding per line: the line number, what the line is, and the flit_core 4 line that replaces it. It has 38 rules, and each one names its source page on flit.pypa.io.
The bundled sample setup.py gives 22 findings on 22 lines (10 warnings, 12 notes, 0 blockers). A finished flit_core 4 pyproject.toml gives 0 findings, which is the point where you delete setup.py.
Three pyproject.toml cases show how the answer changes with the input:
Flit builds pure Python only: "If your package needs a build step, you won't be able to use Flit". The checker marks ext_modules, Extension(, cythonize( and custom cmdclass as BLOCKER lines. Version from git tags (setuptools_scm, versioneer) is also a blocker: write the version into the package and add dynamic = ["version"].
PyPI rejects an upload file over 100.0 MiB by default, and it refuses invalid Trove classifiers and a name too close to an existing project. The classifiers rule reminds you that "Private :: Do Not Upload" blocks an accidental upload.
The single-file map is free with no limit. A workspace key turns every setup.py, setup.cfg and pyproject.toml in the workspace into one dated migration plan. A team key adds an exposure report across projects and a CI gate that fails a build adding new setuptools-only use.
It reads the open setup.py, setup.cfg or pyproject.toml in VS Code and lists every line that still belongs to setuptools, Hatch, Poetry or the old Flit 3 layout, with its line number and the exact flit_core 4 line that replaces it. Compiled extensions and custom cmdclass are marked BLOCKER because Flit builds pure Python only. It has 38 rules.
Python library maintainers moving a pure-Python package from setup.py or setuptools to Flit, teams whose Flit 3 packages still use [tool.flit.metadata], and anyone switching from Hatch or Poetry to flit_core. flit_core 4.0 (on PyPI 2026-08-04) no longer reads [tool.flit.metadata], so an unpinned old-layout package no longer builds from its sdist.
The docs are free and correct, but you must map each setup() argument yourself. A chatbot's packaging advice from before August 2026 cannot know that flit_core 4.0 (on PyPI 2026-08-04) no longer reads [tool.flit.metadata], or that flit_core 4.1 (on PyPI 2026-09-16) accepts license expressions with WITH. The checker reads your actual file line by line, offline, and quotes the flit docs for each replacement.
The single-file map is free with no limit: every finding, line number and replacement line; the bundled sample setup.py gives 22 findings on 22 lines (10 warnings, 12 notes, 0 blockers). A $29 workspace key adds one dated migration plan across every setup.py, setup.cfg and pyproject.toml. A $149 team key adds the cross-project exposure report and a CI gate that fails a build adding new setuptools-only use.
By hand you read three flit.pypa.io pages and translate each setup() argument, then learn about a wrong flit_core bound when the sdist build fails. The free map does the translation per file. The workspace key is $29 once, one licence key per person or team seat, and it is not a subscription.
One question, answered by the person who built it. Your email only if you want the answer sent.