Index repository for Blender Extensions. Serves index.json and landing pages via GitHub Pages. Actual addon zip files are distributed directly from each addon repository's GitHub Release assets.
Landing page: https://kxn4t.github.io/blender-extensions/
Repository URL (for Blender): https://kxn4t.github.io/blender-extensions/index.json
- In Blender, open Edit > Preferences > Get Extensions
- Repositories dropdown → + → Add Remote Repository
- Enter the URL:
https://kxn4t.github.io/blender-extensions/index.json
| Addon | Description | Links |
|---|---|---|
| Vertex Group Merger | Merge multiple vertex groups into a single target group | GitHub / BOOTH |
| Pose to Rest Pose | Apply pose as rest pose while preserving shape keys and drivers | GitHub / BOOTH |
- Each addon repo: Builds and publishes zip as a GitHub Release asset
- This repo (blender-extensions): Serves
index.jsonand landing pages via GitHub Pages - Blender downloads zip directly from the addon repo's Release asset → GitHub Release
download_countreflects actual usage
Addon repository Index repository (blender-extensions)
| |
Tag push → release.yml |
Build zip → create draft release |
| |
Manually publish |
| |
dispatch.yml → repository_dispatch ──────────>|
| update-extension.yml:
| Download zip (temp, for hash/size)
| Get Release asset URL via API
| Update index.json (archive_url → Release asset)
| Update landing pages
| Commit & push (index.json + READMEs only)
| |
| pages.yml → Deploy to GitHub Pages
- In the addon repository, update the version in
blender_manifest.tomland push a taggit tag v1.2.0 git push origin v1.2.0
release.ymlruns, builds the zip, and creates a draft release- Review the release page on GitHub and click Publish release
dispatch.ymlruns and sends arepository_dispatchto the distribution repositoryupdate-extension.ymlin the index repository temporarily downloads the zip (for hash/size), fetches the Release asset URL, and updatesindex.json- The push triggers
pages.yml, which deploys to GitHub Pages
Everything after step 3 (Publish) is fully automatic. The only manual steps are pushing the tag and publishing the release.
The id field in blender_manifest.toml serves as the system-wide identifier. Everything is unified based on the id.
| Usage | Format | Example |
|---|---|---|
id in blender_manifest.toml |
snake_case |
vertex_group_merger |
| Zip filename | {id}-{version}.zip |
vertex_group_merger-0.6.0.zip |
index.json entry identification |
Matched by id field |
Only the latest entry per id |
The
idis used internally by Blender to identify packages. Only lowercase letters, digits, and underscores are allowed (no hyphens). Once published, theidmust not be changed.
Checklist for converting an existing addon to the Extension format (official docs: Getting Started / Add-ons):
Code migration:
- Create
blender_manifest.toml - Remove
bl_info(version info is now in the manifest) - Replace hardcoded module names with
__package__(AddonPreferences.bl_idname, translation registration, etc.) - Convert all imports to relative imports (
from .module import ...) - If using third-party Python modules, bundle them as wheels
- If writing to the addon's own directory, use
bpy.utils.extension_path_user(__package__)instead
Manifest notes:
taglinemust not end with punctuation (.)versionmust follow semantic versioninglicensemust use SPDX identifiers with theSPDX:prefix- Optional fields that are not set should be omitted entirely, not left as empty strings or empty lists
Testing:
- Test by installing from disk
- Add
blender_manifest.tomlto the addon repository - Update
.github/workflows/release.ymlto support the Extension format (include manifest, unify filename toid) - Add
.github/workflows/dispatch.yml(template:templates/dispatch.yml) - Set
EXTENSIONS_REPO_TOKENin the repository Secrets - Add a new entry in
scripts/addons_meta.json(used for landing page descriptions and links) - Push a tag, create a draft release → publish, and the addon is automatically added to the distribution repository
The only change needed on the index repository side is adding an entry to addons_meta.json.
RELEASE_ASSET_URL=<url> python scripts/generate_index.py add <addon_id> <version>Reads blender_manifest.toml from the specified version's zip, computes archive_size and archive_hash, and sets archive_url to the RELEASE_ASSET_URL environment variable. Entries with the same id are replaced with the latest version.
In the CI pipeline, the zip is temporarily downloaded to a runner, and RELEASE_ASSET_URL is automatically set from the GitHub Release API.
python scripts/generate_pages.pyReads index.json and scripts/addons_meta.json, then updates the addon lists on the landing pages (ja/README.md and en/README.md). It replaces the content between <!-- EXTENSIONS_LIST_START --> and <!-- EXTENSIONS_LIST_END --> markers in each README.
Normally runs automatically within the update-extension.yml pipeline, so manual execution is not needed. Use it manually when you want to regenerate pages after editing descriptions or links in addons_meta.json.
To roll back to a previous version, re-run the update-extension.yml workflow via workflow_dispatch with the old tag. The workflow will download the zip from the old Release, recalculate the hash/size, and update index.json with the correct Release asset URL.