A tool to use a pyproject.toml instead of a blender_manifest.toml to build Blender add-ons
Project description
Peeler – Simplify Your Blender Add-on Packaging
This package is under active development. Feel free to ask for help here or open an issue here.
A tool to easily package your Blender add-on
Building and installing a Blender add-on with dependencies requires manually downloading the necessary wheels and specifying their paths in blender_manifest.toml. Peeler automates this process, allowing you to package your Blender add-on without manually handling dependencies (and their own dependencies !) or manually writing their paths in blender_manifest.toml.
Since Blender 4.2, add-ons must use blender_manifest.toml instead of the standard pyproject.toml used in Python projects. Peeler lets you use pyproject.toml instead (or alongside) to simplify dependency management and streamline your workflow.
Installation
You can install Peeler with your favorite package manager (pip, uv, pipx, etc.). To get started, simply run:
pip install peeler
If you use uv Peeler does not need to be added to your project dependencies - you can use Peeler directly as a tool:
uvx peeler [OPTIONS] COMMAND [ARGS]
Features
Each feature can be used independently.
🛠️ Manifest
Generate a
blender_manifest.tomlfile from yourpyproject.tomlfields.
📦 Wheels
Automatically download the required wheels from your add-on’s dependencies specified in your
pyproject.tomland write their paths toblender_manifest.toml.
Manifest
Generate the blender_manifest.toml from fields in a pyproject.toml.
1. Ensure your pyproject.toml contains basic field values
# pyproject.toml
[project]
name = "My Awesome Add on"
version = "1.0.0"
requires-python = "==3.11.*"
2. Some metadata are specific to Blender
For instance blender_version_min, you can specify these metadata in your pyproject.toml file under the [tool.peeler.manifest] table
Here's a minimal working version:
# pyproject.toml
[project]
name = "My Awesome Add on"
version = "1.0.0"
requires-python = "==3.11.*"
[tool.peeler.manifest]
blender_version_min = "4.2.0"
id = "my_awesome_add_on"
license = ["SPDX:0BSD"]
maintainer = "John Smith"
tagline = "My Add-on is awesome"
3. Run Peeler to create (or update) your blender_manifest.toml
peeler manifest /path/to/your/pyproject.toml /path/to/blender_manifest.toml
# Generated blender_manifest.toml
version = "1.0.0"
name = "My Awesome Add on"
schema_version = "1.0.0"
type = "add-on"
blender_version_min = "4.2.0"
id = "my_awesome_add_on"
license = ["SPDX:0BSD"]
maintainer = "John Smith"
tagline = "My Add-on is awesome"
The manifest is populated with values from your pyproject.toml [project] and [tool.peeler.manifest] tables, along with default values.
For a full list of required and optional values in a blender_manifest.toml visit Blender Documentation
4. Build your add-on
If your add-on has dependencies make sure to use the Wheels feature below.
Then to build your add-on use the regular Blender command:
blender --command extension build
Hint: Ensure Blender is added to your PATH
Wheels
Download the required wheels for packaging your add-on based on the dependencies specified in your pyproject.toml, automatically write their paths to blender_manifest.toml.
0. Installation
Peeler Wheels feature relies on a lockfile 📄 to work.
Currently supported lockfile formats:
- :snake: Python PEP 751 pylock.toml
- 🚀 uv uv.lock
Use your favorite tool such as PDM or uv to generate a pylock.toml file.
If you don't have a tool yet, just run:
pip install peeler[uv]
Then sit back and let Peeler handle it for you 😄
1. In your pyproject.toml, specify your dependencies
# pyproject.toml
[project]
name = "My Awesome Add-on"
version = "1.0.0"
requires-python = "==3.11.*"
# For instance rich and Pillow (the popular image manipulation module)
dependencies = [
"Pillow==11.1.0",
"rich>=13.9.4",
]
2. Run peeler wheels to download the wheels for all platforms
peeler wheels ./pyproject.toml ./blender_manifest.toml
Peeler updates your blender_manifest.toml with the downloaded wheels paths.
# Updated blender_manifest.toml
version = "1.0.0"
name = "My Awesome Add on"
schema_version = "1.0.0"
type = "add-on"
blender_version_min = "4.2.0"
# The wheels as a list of paths
wheels = [
# Pillow wheels for all platforms
"./wheels/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-win32.whl",
"./wheels/pillow-11.1.0-cp311-cp311-win_amd64.whl",
"./wheels/pillow-11.1.0-cp311-cp311-win_arm64.whl",
# Wheels for rich and its dependencies
"./wheels/rich-13.9.4-py3-none-any.whl",
"./wheels/markdown_it_py-3.0.0-py3-none-any.whl",
"./wheels/mdurl-0.1.2-py3-none-any.whl",
"./wheels/pygments-2.18.0-py3-none-any.whl"
]
Note that the dependencies of the dependencies (and so on) specified in pyproject.toml are also downloaded, ensuring everything is packaged correctly. Pretty neat, right?
# Pillow and rich dependency tree resolved from
# dependencies = [
# "Pillow==11.1.0",
# "rich>=13.9.4",
# ]
My Awesome Add on v1.0.0
├── pillow v11.1.0
├── rich v13.9.4
│ ├── markdown-it-py v3.0.0
│ │ └── mdurl v0.1.2
│ └── pygments v2.18.0
Authors
- Maxime Letellier - Initial work
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file peeler-0.5.0.tar.gz.
File metadata
- Download URL: peeler-0.5.0.tar.gz
- Upload date:
- Size: 56.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d9150b21f0e751896827e803880087357e6c3193b7f290afdf1e13b81e20577
|
|
| MD5 |
5c0408b7e9cd38e59b39e2b7538d3687
|
|
| BLAKE2b-256 |
bf299e89e3e20a359695384c551fd56158d6d2aa63f4ab90bd6e15e35e0a67a4
|
Provenance
The following attestation bundles were made for peeler-0.5.0.tar.gz:
Publisher:
release.yaml on Maxioum/Peeler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
peeler-0.5.0.tar.gz -
Subject digest:
2d9150b21f0e751896827e803880087357e6c3193b7f290afdf1e13b81e20577 - Sigstore transparency entry: 243761503
- Sigstore integration time:
-
Permalink:
Maxioum/Peeler@bcf0cc3e1cefcfad983f4ebdeaf9bb2f766c3499 -
Branch / Tag:
refs/tags/0.5.0 - Owner: https://github.com/Maxioum
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@bcf0cc3e1cefcfad983f4ebdeaf9bb2f766c3499 -
Trigger Event:
push
-
Statement type:
File details
Details for the file peeler-0.5.0-py3-none-any.whl.
File metadata
- Download URL: peeler-0.5.0-py3-none-any.whl
- Upload date:
- Size: 61.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39b51d4905d9f750ba563e5e4b2ed05716b6c74f3fba203fa4e67dd29366272c
|
|
| MD5 |
af47d8a920339a68a789b6d2bc54231b
|
|
| BLAKE2b-256 |
376b748e2b66f8db3ff35af2ad174c89891a2c035e126842cbf23b6057597c11
|
Provenance
The following attestation bundles were made for peeler-0.5.0-py3-none-any.whl:
Publisher:
release.yaml on Maxioum/Peeler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
peeler-0.5.0-py3-none-any.whl -
Subject digest:
39b51d4905d9f750ba563e5e4b2ed05716b6c74f3fba203fa4e67dd29366272c - Sigstore transparency entry: 243761506
- Sigstore integration time:
-
Permalink:
Maxioum/Peeler@bcf0cc3e1cefcfad983f4ebdeaf9bb2f766c3499 -
Branch / Tag:
refs/tags/0.5.0 - Owner: https://github.com/Maxioum
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@bcf0cc3e1cefcfad983f4ebdeaf9bb2f766c3499 -
Trigger Event:
push
-
Statement type: