BindProof — Prove Your Skin Is Actually Bound
BindProof 1.2.2 — documentation
What it is for
A skinned mesh either follows its armature or it does not, and Blender will not tell you which. BindProof checks the bind you already have — whoever made it — and proves every finding by measurement. Checking never writes to your weights; the one button that does, Fix What The Engine Will Drop, is described below and works only when you press it.
Installing
Download the zip and leave it zipped. In Blender open Edit, then Preferences, then Add-ons. Click the arrow button in the top right corner of that window and choose Install from Disk, then pick the zip. Tick the checkbox next to the add-on name. Press N in the 3D Viewport: the BindProof tab appears in the sidebar.
Using it
- Select the skinned mesh.
- Press Check The Bind.
Select Unbound then selects the vertices carrying no weight, so you can press Tab and see where they are. That is the only thing the add-on changes, and only when you ask. It refuses to run from inside Edit Mode, where a selection written from the outside never reaches the mesh you are editing, and it refuses on a mesh whose data comes from a linked library, because that file belongs to someone else.
The findings
nothing is bound at all
Not one vertex carries a weight on any deforming bone. This is reported on its own rather than as a count, because it is not a patchy skin — it is an operation that reported success and did nothing. Measured on a real production model: Blender's Automatic Weights returned success having bound none of 11 763 vertices.
part of the mesh is bound to nothing
Some vertices carry no weight on any deforming bone. They will stay exactly where they are while the rest of the mesh moves. The report names one of them and proves it: on frame N it moved 0.00 mm while the furthest vertex of the same mesh moved 460.39 mm.
If the mesh does not move anywhere in the scene's frame range, no proof is printed — an empty comparison is worse than none.
some bones move nothing at all
A deforming bone with no weight anywhere. Each one is turned 35 degrees and the moved vertices are counted — zero — and beside it a bone that does carry weight, which moved 385 vertices by up to 102.9 mm. The pose is put straight back.
Measured on an ordinary humanoid, Blender's Automatic Weights leaves four of nineteen deforming bones empty every time — both hands and both feet — and six on a coarser mesh. The operator reports success.
more than four influences per vertex
Unity, Unreal and Godot read four influences per vertex and drop the rest silently on import. The report counts the vertices over the limit and works out, from the skinning maths, how far the worst one would move when the engine does that. Nothing is changed to find this out.
weights that do not add up to one
Blender normalises on the fly for its own armature modifier, so this is invisible in the viewport, and Blender's own Automatic Weights leaves most of a mesh this way — 1325 vertices out of 1932 on a measured character. It matters on export, where the skin shrinks towards the rig or blows away from it. The report says how far the worst vertex would land, measured in the armature's own space, and says plainly that this is normal inside Blender.
weight groups that deform nothing
The group carries weights but no deforming bone of that name reads them — either the bone has Deform switched off, or the group is a modifier mask and not skin weights at all. Harmless if it is a mask; a hole in the skin if you thought it was bound.
When it refuses
- No armature modifier. Parenting alone is not a bind: an object can be parented to a bone with no weights at all, and that is a different thing entirely.
- An armature with no deforming bones. Every bone has Deform switched off, so nothing can be bound to it.
- Edit Mode. In it the evaluated mesh is not what the viewer sees and the weights are not yet written back.
- An object with no evaluated mesh — switched off in the viewport by the monitor icon, or held only in collections that are switched off or excluded from the view layer.
- Every armature modifier switched off in the viewport. Nothing deforms the mesh there, so there is no bind to measure and nothing to praise.
When it says it cannot judge
The whole add-on rests on one control: a bone that does carry weight must move something when it is turned. Where that control gives zero, no verdict is possible, and it says so instead of printing a zero it cannot stand behind.
- Rest Position. The armature is showing its rest pose, so no bone moves anything at all. Switch it to Pose Position and measure again.
- A control rig. A driver or a constraint overrides the bone, so turning it directly proves nothing. Rigify, Auto-Rig Pro and mocap rigs are built this way.
Things it names rather than blames
- Bones that move the mesh without carrying weight. A Mirror modifier or a parent bone does that, and it is not a fault — they are listed so a weight counter does not talk you into rebinding a rig that works.
- Envelopes. If the modifier has Vertex Groups switched off, weights are not what moves your mesh, and everything the panel says about weights describes data the modifier never reads. That is said plainly.
- The modifier's own mask. A vertex group set in the Vertex Group field of the armature modifier shuts the vertices outside it out of the deformation entirely, however much weight they carry. Those are counted and reported.
- The mesh that ships. Weights live on the mesh you edit; your renderer and your engine receive the evaluated one, which a Subdivision modifier can make fifteen times larger. Both numbers are given, and the second one is measured by moving the whole rig and counting what stayed still.
What it does not do
It does not set weights and it does not fix them. There is a shelf of add-ons that write weights and one of them is ours — and a tool that fixes cannot be the witness that the fix worked. It also does not judge deformation quality: candy wrapper, volume loss and weight leak are a different question, and comparing a mesh before and after an edit is a different one again.
Repairing what the engine will drop
Fix What The Engine Will Drop keeps the four heaviest influences on every vertex that carries more, drops the rest, and makes what is left add up to one. That is exactly the arithmetic a game engine performs while loading your mesh, done here where you can still see it.
The proof is two numbers from one measurement. Before the repair the add-on predicts how far the worst vertex will sit out of place once the engine has dropped the surplus. After the repair it measures how far the deformation in Blender actually moved. On the measured example the prediction was 893.917 mm and the movement was 893.917 mm, a difference of one ten-thousandth of a millimetre; at a scene scale of 0.01 the same pair read 8.9392 and 8.9392. If those two numbers disagreed, the prediction would have been wrong and you would see it.
What it deliberately leaves alone: vertices with no weight at all, and bones that carry no weight. Both are decisions an artist makes on purpose, and an add-on that quietly reverses them is worse than one that does nothing.
What it changes, and only when you ask
Measuring changes nothing. A fingerprint that includes the weights themselves and the whole pose is taken before and after every check and compared; the panel prints the result every time. The bone probes put their pose back immediately.
Two buttons do write to your file, and only when pressed: Fix What The Engine Will Drop, described above, and the selection when you press Select Unbound. Report to Text writes a text block. Nothing else is touched.
Tested
108 checks on each of Blender 4.2.9, 5.1 and 5.2, zero problems, and ten deliberate sabotages of the product turn the suite red — among them treating a zero weight as a bind, no longer telling deforming bones from ordinary vertex groups, and looking for the armature through parenting instead of through the modifier.
License
GPL-3.0.
Checking a whole folder
The sidebar has a Whole Delivery panel. It has two buttons.
Check A Folder Of .blend Files runs this product over every .blend in the folder you pick. Check A Folder With Every Check You Own runs every tool from this line that you have installed, over the same files, in one pass — one report, one verdict.
Each file is opened in its own background Blender. Your open scene is never touched: not opened over, not saved, not modified in any way. This is also why a file that will not open costs you only that file — the rest of the delivery is still checked. Press Escape to stop; nothing partial is written, because a report covering half a delivery is a report nobody should trust.
When it finishes, an HTML report named bind_proof_report.html is written into the folder you picked. If a file with that name is already there, it is left as it is and the new report takes the next free name (bind_proof_report_2.html, bind_proof_report_3.html and so on); the message at the bottom of Blender names the file it wrote. The same goes for the baseline file when Save As Baseline is ticked. It is one file with nothing loaded from the internet, so it can be attached to an email, put in the delivery folder, or opened years later on a machine that has never seen this add-on.
Running it from a pipeline
The same check runs headless, with no interface and no person, and finishes with a code your build system can read: one code for clean, another when something blocking was found, and a third when a file could not be checked at all. Those last two are deliberately different. A check that did not run has not passed, and a gate that treats silence as success will one day wave through the delivery it existed to stop. The command is blender --background --factory-startup --python-expr "import bind_proof; bind_proof.proofkit_cli()" -- --folder /shots --report report.html. Return codes: 0 clean, 1 something blocking, 2 a file could not be checked, 3 the command itself was called wrongly.
Comparing against last week
Any run can be saved as a baseline. A later run then reports what changed: which numbers moved and in which direction, which findings are new, and which ones you have fixed since. Direction matters and is not guessed — each measurement carries its own sense of which way is worse, so rising coverage reads as better and rising drift reads as worse.
Signing a file off
When a file is clean you can sign it off. The record lives inside the .blend itself, not in a folder next to it, so it travels with the file: open it next month and it tells you when it was checked, by which version, and how it came out. If the file is saved after that, the record says plainly that it is out of date — a sign-off that survives an edit it never saw would be worse than no sign-off at all.
One tab instead of twelve
Every tool in this line can put its panel under a single shared sidebar tab instead of its own. One button does it for all of them at once, and each panel arrives collapsed, so twelve tools cost you one tab and no scrolling. Your choice is remembered, and a tool that you later use on its own can be given its own tab back the same way.
What is deliberately not claimed
A check that could not run is reported as exactly that, never as a pass. If a tool from this line is not installed, or is an older version that predates the combined run, the report names it in a list of checks that did not take part, so the gap is visible rather than quietly absent.
Changelog
v1.2.2 — The Whole Delivery folder check no longer replaces a file in the folder you pick. Before, the report was always written as bind_proof_report.html (and the baseline as bind_proof_report_baseline.json), and a file with that name already there, such as an earlier report you kept, was overwritten. Now a free name is taken (bind_proof_report_2.html and so on), the message at the bottom of Blender names the file it wrote, and a run that fails while writing removes only the file it created. The report is written as UTF-8, as the page declares. The report and the baseline keep one number (bind_proof_report_2.html with bind_proof_report_2_baseline.json). A folder that cannot be written to is now refused in words instead of a Python error (and no empty report is left behind when only the baseline cannot be created), a folder that already has the report's name is skipped like a taken file, and the closing message is shown: before, a run with no problems or with unchecked files ended in a Python error instead of the message. Checking a folder no longer stalls on a file whose check prints a lot: on Windows such a file sat until the 30-minute limit and was reported as not finished. A file Blender cannot open, or one with nothing to check, is now explained in words instead of a Python error.
v1.2.1 — maintenance release. The package ships the full licence text and an updated README (install, first run, uninstall). No changes to the tools.