agentleFS
EL4CTEOEL4CTEO/blender-skills/skills/blender-core/SKILL.md

blender-core

Skill779 starsChanged 14 days agoMITView on GitHub

Foundation for any Blender 5.2+ task an agent drives - running bpy via MCP (live) or headless CLI, context overrides, locale-safe node lookup, enum discovery, 5.x API changes, verification. Use first for any Blender, bpy, .blend or 3D-asset request; routes to the specialized blender-* skills.

The file

We split this skill into the rules it gives an agent

8 rules. About 0 are common, 0 are distinctive, and 8 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 8

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Data API over operators: use bpy.data, bmesh, mesh.attributes, and foreach_get/set with numpy.

    line 60
  2. Very specific:

    If an operator is unavoidable: with bpy.context.temp_override(object=ob, active_object=ob, selected_objects=[ob], …

    line 61
  3. Very specific:

    Enums: read the valid values with [i.identifier for i in T.bl_rna.properties[p].enum_items].

    line 64
  4. Very specific:

    Evaluated data: use ob.evaluated_get(depsgraph), then .to_mesh(), then always .to_mesh_clear().

    line 66
  5. Very specific:

    Live sessions are the user's work: never read_factory_settings, never delete data you didn't create, and save a backup copy before …

    line 71
  6. Very specific:

    GPU module in background: call gpu.init() first (5.2+).

    line 72
  7. Very specific:

    Big meshes: no per-vertex bpy.ops. Use numpy foreach_get (see references/bpy-patterns.md).

    line 73
  8. Very specific:

    Look at it: MCP look (mode="angles", shading material/wireframe).

    line 81

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Blender Core (5.2 LTS+)

Route to the specialized skill

TaskSkill
Units, collections, naming, linking, asset librariesblender-scene-setup
Hard-surface modeling, bevels, booleans, normalsblender-hardsurface-modeling
Sculpting, multires, remeshblender-sculpting
Retopology, UV unwrap, texel densityblender-retopology-uv
PBR materials, color spaces, texture setsblender-pbr-materials
Wear, grime, dust, decals, trim sheets, texture paintingblender-texturing
Baking high→low maps (normal, AO, curvature, ...)blender-texture-baking
Geometry Nodes, procedural modelingblender-geometry-nodes
Body rigging, Rigify, weight paintingblender-character-rigging
Face rig, shape keys, ARKit, visemesblender-facial-shapekeys
Keyframes, actions, NLA, mocap retarget, loops, root motionblender-animation
Garments, layered clothing, body poke-throughblender-clothing
Hair, fur, grooming, hair cardsblender-hair-grooming
Poly budgets, LODs, draw calls, cleanupblender-game-optimization
Export: glTF/FBX/USD to Roblox, Unity, Unreal, Godot, webblender-export-pipelines
Cycles/EEVEE settings, compositor, batch renderblender-rendering
Lighting, HDRI, camera, turntableblender-lighting-lookdev
Toon/cel/anime shading, outlines, Line Art, Grease Pencilblender-stylized-npr
Terrain, biome scatter, modular kitsblender-environment-kits
Video editing (VSE), motion tracking, camera solveblender-video-editing
Time of day, night, sunset, fog, mood (cyberpunk, horror...)blender-time-of-day
Rain, snow, wet surfaces, puddles, lightning, dust/embersblender-weather-fx
Cloth, rigid body, fluids, hair, GN physicsblender-simulation
Writing add-ons / extensionsblender-addon-development
Batch/headless pipelines, file conversionblender-pipeline-automation
Checking a mesh/asset before delivery (always)blender-asset-qa
End-to-end playbooks (prop, character, Roblox, product shot)blender-workflow-recipes

Execute

Live (blender-mcp execute_blender_code): work in small steps and print only what you need. To call a skill script, import it:

import sys, importlib; sys.path.insert(0, r"<skills_dir>/blender-asset-qa/scripts")
import qa_check; importlib.reload(qa_check); print(qa_check.run(objects=["Chair"]))

Each MCP call runs in a fresh namespace: re-import in every call. That's cheap because modules stay cached in sys.modules. reload only after editing a script. Headless (any agent with a shell): this prints only the script's JSON (@@JSON@@ lines):

python <skills_dir>/blender-core/scripts/run_in_blender.py --blend in.blend <script.py> -- --objects Chair --save out.blend
python <skills_dir>/blender-core/scripts/run_in_blender.py --expr "import bpy; print(len(bpy.data.objects))"

Raw form: blender -b in.blend --factory-startup --python-exit-code 1 -P x.py -- args. Every script here exposes run(**kw) -> dict and the same flags after --. First call in a session: scripts/env_report.py, which returns the version, engines, GPU, add-ons, units, color management and scene counts.

Rules

  • Data API over operators: use bpy.data, bmesh, mesh.attributes, and foreach_get/set with numpy. Operators depend on context and selection, and many need a 3D View, which background mode doesn't have.
  • If an operator is unavoidable: with bpy.context.temp_override(object=ob, active_object=ob, selected_objects=[ob], selected_editable_objects=[ob]): bpy.ops.... Check that the result is {'FINISHED'}.
  • Edit mode isolation: ob.data isn't updated while in Edit Mode. Use bmesh.from_edit_mesh + bmesh.update_edit_mesh, or switch to OBJECT mode before reading.
  • Nodes: find them by type (n.type == "BSDF_PRINCIPLED"), never by name, because names are localized. Sockets by English name or identifier are fine.
  • Enums: read the valid values with [i.identifier for i in T.bl_rna.properties[p].enum_items]. Dynamic enums (render.engine, view_transform, look) under-report, so assign them inside try/except TypeError (the message lists the valid values).
  • Engines: BLENDER_EEVEE, CYCLES, BLENDER_WORKBENCH. Cycles device: scene.cycles.device = "GPU" + preferences compute_device_type.
  • Evaluated data: use ob.evaluated_get(depsgraph), then .to_mesh(), then always .to_mesh_clear(). Call view_layer.update() before reading matrix_world after a change.
  • Freed data: applying or removing a modifier, or removing an object or ID, frees it. Collect names first ([m.name for m in ob.modifiers]) and never touch the old Python reference afterward, because it returns garbage or crashes.
  • Never trust default names ("Cube.001"). Keep object references, rename explicitly, and look objects up via bpy.data.objects[name].
  • Scale: 1 unit = 1 m. Apply rotation/scale (transform_apply) before bevels, modifiers with distances, rigging, physics, baking and export.
  • Paths: bpy.path.abspath("//textures/x.png") resolves relative to the .blend. Save explicitly; use save_as_mainfile(filepath=..., copy=True) for backups.
  • Live sessions are the user's work: never read_factory_settings, never delete data you didn't create, and save a backup copy before destructive batch edits.
  • GPU module in background: call gpu.init() first (5.2+). bgl no longer exists.
  • Big meshes: no per-vertex bpy.ops. Use numpy foreach_get (see references/bpy-patterns.md).

5.x API changes that break old tutorials/LLM memory

action.fcurves → channelbags · scene.node_tree → scene.compositing_node_group · material.use_nodes is deprecated (new materials already have nodes) · mod["Socket_2"] → mod.properties.inputs.Socket_2.value (5.2) · BLENDER_EEVEE_NEXT → BLENDER_EEVEE · Boolean FAST → FLOAT · bone layers → bone collections · bl_info add-ons → extensions (blender_manifest.toml) · bpy.props values are no longer dict-accessible (scene["cycles"]). Full table: references/api-changes-5x.md.

Verify (required before saying "done")

  1. Numbers, not adjectives: report tris, objects, materials, dimensions (ob.dimensions) and the output files written.
  2. Geometry changed → run blender-asset-qa qa_check.py (z-fighting, detached parts, non-manifold, flipped normals, scale).
  3. Look at it: MCP look (mode="angles", shading material/wireframe). Headless: blender-asset-qa/scripts/review_shots.py renders contact sheets.
  4. Re-read your own output: confirm that exported files exist and that their size is non-zero.

References

  • references/api-changes-5x.md: 4.x→5.2 migration table. Load it when code fails with AttributeError/KeyError.
  • references/bpy-patterns.md: verified snippets for bmesh, attributes, numpy, temp_override, depsgraph, drivers, append/link, handlers and timers.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.