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 sync Write the manifest and wheels into the package for local development.
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.
  • --no-sync skips writing the local manifest and wheels into the package.
  • --skip-lock-check skips verifying that uv.lock matches pyproject.toml.

Local development

Blender loads an extension from a source directory only if that directory holds blender_manifest.toml and the wheels it lists. extbpy sync (also run at the end of extbpy build) writes both into the package for this machine's platform, hard-linking wheels from the cache. Point Blender or the Blender VS Code extension at the package directory and iterate. Add these to .gitignore:

.extbpy/
my_extension/blender_manifest.toml
my_extension/wheels/

[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.1

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.1
File Size Uploaded
extbpy-0.3.1.tar.gz 22.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for extbpy 0.3.1
File Interpreter ABI Platform
extbpy-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 52.0 kB

Release files / extbpy-0.3.1.tar.gz

Download URL extbpy-0.3.1.tar.gz
Size 22.7 kB
Tags Source
SHA-256 checksum
How to use checksums
0901dab68e5a798d3d6e3e09b56decac4883495ed6eab5a7909e445ca2fdbb19
BLAKE2b-256 checksum
How to use checksums
1647a5f5b60ef2cf77ab7f9992630b06b3ca7922586bc7ee792fe25c34a17bac
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.1-py3-none-any.whl

Download URL extbpy-0.3.1-py3-none-any.whl
Size 29.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7ed716453c40ffbdd736086ba0c5a002df6a12deef318c1ee12a18def65e27c1
BLAKE2b-256 checksum
How to use checksums
500f6b688cc91cec11af13d14e219f6be8ce5dee4d7f5507bbfc43adb8f219c7
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

This release

0.3.1 This release

2 release files

0.3.0

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