uv 0.12.0
**[uv 0.12.0](https://github.com/astral-sh/uv/releases/tag/0.12.0)** Some interesting breaking changes in this release of `uv`, in particular to the default project produced by the `uv init` command. [uv init](https://docs.astral.sh/uv/concepts/projects/init/) is the `uv` shortcut for creating a new project. The previous version of `uv`, version 0.11.x, produced [this directory](https://github.com/simonw/uv-init-demos/tree/29656a55ec733a632005abfd7b89dea5c04fa10b/uv-init) when you ran `uv init uv-init`. Here's [what you get with uv 0.12](https://github.com/simonw/uv-init-demos/tree/9111a2bb85741f034eee2fd63efe13ef98b37a14/uv-init). I have a GitHub repository that [automatically snapshots](https://simonwillison.net/2025/Dec/24/uv-init-demos/) the output of `uv init`, so you can also [see the full diff](https://github.com/simonw/uv-init-demos/commit/9111a2bb85741f034eee2fd63efe13ef98b37a14#diff-e036881d034aedd813010ffa96464995ae5b0339213d6f4ab492f97442c5bdd4): `uv init` now defaults to a `src/` shaped package, instead of dropping `main.py` in the root of the project. It also configures the [uv_build backend](https://docs.astral.sh/uv/concepts/build-backend/) for building wheels and `.tar.gz` distribution files when you run `uv build`. Finally, it sets up `uv-init` as a script alias which, when run with `uv run uv-init`, executes a new `main()` function in `src/uv_init/__init__.py`. I've so far avoided using [src layout](https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/) in my own projects just out of inertia. I think it's time I switched. I wonder when `uv` will be judged ready for a 1.0 release? Tags: [packaging](https://simonwillison.net/tags/packaging), [python](https://simonwillison.net/tags/python), [uv](https://simonwillison.net/tags/uv)