Skip to main content

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/--platform selects platforms (-p linux-x64 -p windows-x64, -p current, -p all).
  • -o/--output-dir chooses where zips go (default: current directory).
  • --wheels-dir overrides the cache (default: <project>/.extbpy/wheels, add it to .gitignore).
  • --blender PATH / --no-check control validation with Blender.
  • --skip-lock-check skips verifying that uv.lock matches pyproject.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)

Source distribution for extbpy 0.3.0
File Size Uploaded
extbpy-0.3.0.tar.gz 21.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for extbpy 0.3.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

0.3.1

2 release files

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page