extbpy
Build Blender extensions from a standard uv project.
pyproject.toml is the single source of truth: [project] supplies the
generic metadata and [tool.extbpy] supplies what is specific to Blender.
extbpy generates blender_manifest.toml, picks the right wheel for every
dependency and platform from uv.lock, downloads them into a cache, and
writes one installable zip per platform. No Blender install is needed to
build; if one is on PATH the zips are validated with
blender --command extension validate.
Quick start
uv init my-extension && cd my-extension
uv add numpy scipy # any dependencies with wheels on PyPI
uv lock
Add the Blender-specific fields to pyproject.toml:
[project]
name = "my_extension" # becomes the extension id
version = "1.0.0"
description = "Does something useful in Blender" # becomes the tagline
license = "GPL-3.0-or-later"
requires-python = "~=3.13.0"
maintainers = [{ name = "Jane Doe", email = "jane@example.com" }]
dependencies = ["numpy", "scipy"]
[project.urls]
Homepage = "https://example.com/my-extension"
[tool.extbpy]
pretty_name = "My Extension"
blender_version_min = "5.2.0"
platforms = ["windows-x64", "linux-x64", "macos-arm64"]
tags = ["Geometry Nodes"]
copyright = ["2026 Jane Doe"]
[tool.extbpy.permissions]
network = "Downloads example data"
Put the extension package at my_extension/__init__.py (or src/my_extension/), then:
uvx extbpy build
This writes my_extension-1.0.0-<platform>.zip for every configured platform.
Commands
| Command | What it does |
|---|---|
extbpy build |
Resolve, download, pack and (if Blender is found) validate. |
extbpy download |
Only fill the wheel cache. |
extbpy manifest |
Print the generated blender_manifest.toml. |
extbpy info |
Show the parsed extension specification. |
extbpy clean |
Delete stray *.blend1 and similar files from the package. |
Useful build options:
-p/--platformselects platforms (-p linux-x64 -p windows-x64,-p current,-p all).-o/--output-dirchooses where zips go (default: current directory).--wheels-diroverrides the cache (default:<project>/.extbpy/wheels, add it to.gitignore).--blender PATH/--no-checkcontrol validation with Blender.--skip-lock-checkskips verifying thatuv.lockmatchespyproject.toml.
[tool.extbpy] reference
| Key | Required | Meaning |
|---|---|---|
blender_version_min |
yes | Minimum Blender version, e.g. "5.2.0". Determines Python version, supported platforms and vendored packages. |
pretty_name |
no | Human-readable name (default: project.name). |
tagline |
no | Overrides project.description. At most 64 characters, no trailing punctuation. |
id |
no | Extension id (default: project.name with - replaced by _). |
blender_version_max |
no | Exclusive upper Blender version. |
platforms |
no | Subset of the platforms Blender ships for (default: all of them). |
tags |
no | Blender extension tags. |
copyright |
no | List of "YEAR Name" entries. |
permissions |
no | Table of files, network, clipboard, camera, microphone with a short reason each. |
license |
no | Overrides project.license; SPDX identifiers. |
maintainer |
no | Overrides the first entry of project.maintainers. |
website |
no | Overrides project.urls.Homepage. |
package_dir |
no | Where the extension package lives, if not <id>/ or src/<id>/. |
exclude_packages |
no | Extra packages never to bundle, on top of what Blender vendors (numpy, requests, ...). |
extras |
no | Optional-dependency groups to bundle as well. |
min_glibc_version |
no | [MAJOR, MINOR] floor for Linux wheels (default from Blender version). |
min_macos_version |
no | [MAJOR, MINOR] floor for macOS wheels (default from Blender version). |
paths_exclude_pattern |
no | Extra gitignore-style patterns; __pycache__/, .* and /*.zip are always excluded. |
required_files |
no | Paths relative to the project that must exist before building. |
How wheels are chosen
For each platform, extbpy walks the dependency graph in uv.lock starting
from your project's dependencies, following only edges whose environment
markers hold on that platform and Blender's Python version. For every package
it keeps one wheel: the interpreter, ABI and platform tags must match, Linux
wheels must not need a newer glibc than Blender supports, macOS wheels must
not need a newer macOS, and among the remaining candidates the newest OS
floor and the most specific ABI win. Packages Blender ships itself are
skipped. Anything without a usable wheel stops the build with a message that
names the package, the platform, the packages that pull it in and the wheels
that were rejected.
Acknowledgements
The architecture (a pyproject.toml-driven spec, tag-based wheel selection
against a per-platform marker environment, hash-verified wheel cache, and an
in-process packer) follows blext by
Sofus Albert Høgsbro Rose. The code here is an independent implementation.
Development
uv sync --all-extras
uvx pre-commit install # ruff format, ruff check and ty run on every commit
uv run pytest
CI runs the same ruff and ty checks plus the test suite on Linux, macOS and Windows.
License
MIT
Metadata
Release files for extbpy 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| extbpy-0.3.0.tar.gz | 21.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| extbpy-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 50.0 kB
Release files / extbpy-0.3.0.tar.gz
| Download URL | extbpy-0.3.0.tar.gz |
|---|---|
| Size | 21.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7175dcba54eb18d2fb68c4eca4a9dff44f02d2f5cda14ef499c4a01493d30774
|
|
BLAKE2b-256 checksum How to use checksums |
95f6da6711467b560a208a787c8a8c7888eba6fa4d4fdc59d854ea6143734df3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / extbpy-0.3.0-py3-none-any.whl
| Download URL | extbpy-0.3.0-py3-none-any.whl |
|---|---|
| Size | 28.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
da0497e3cfb6505fe0ddbf4622115d09b314c1a8c99ed67d87d043f17c018d89
|
|
BLAKE2b-256 checksum How to use checksums |
bfbed3f28811cc330b11e6a5785cc2b2ea78a344796576f5b17dc41e26a39714
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency log