The balance check came back at 3,105 credits. One call to the Meshy API from the new tools/meshy.py wrapper, credential confirmation only, nothing generated yet. The key was already in Keychain under meshy-api-key. The wrapper is stdlib-only.
That was the first signal that Mixamo was not going to appear.
The original pipeline
The EVA Music 24/7 stream visualiser was designed from the start with a clear production chain: a 2.5D toon avatar of Cj, produced via image-to-3D → Blender → Mixamo, then imported into Godot 4. Three tools, two handoffs, one Godot import at the end. The reasoning was standard. Image-to-3D gives you geometry, Blender is where you clean it, and Mixamo auto-rigs the mesh and returns a humanoid skeleton. Godot imports the rigged character.
Mixamo is Adobe’s auto-rigging service. You upload a mesh, you get back a skeleton with named bones. The mixamorig: prefix on the bone names is the standard output format, recognised by game engines, animation tools, and everything downstream. Designing for Mixamo-compatible output meant designing for a known, widely-supported target.
Nothing about that reasoning was wrong on day one. The pipeline made sense given what was known.
The proxy
Before the real Cj avatar went in, the pipeline needed to be proven on something expendable. The principle was explicit: build and validate the downstream before committing to the real mesh. Get Blender scripts, bone handling, Godot import, and the audio-reactive stage all working against a stand-in, then drop in the real character later.
2026-09-02 produced blender/cj/proxy_rig.py: a Mixamo-named humanoid stand-in with 22 core mixamorig: bones at human proportions, skinned capsule geometry, and five VRM-named face shape keys. The geometry was placeholder. The skeleton naming was not. Every bone followed the mixamorig: convention the final Mixamo output was expected to produce, because when the real avatar arrived, the import path had to accept it without modification.
By the end of that day, everything below the mesh was confirmed working. That is P4 in the build log. Blender scripts exercised, Godot import confirmed, and the amplitude-band and beat-clock audio reactivity from P2 all validated against the capsule stand-in. Two days of work, none of it wasted, all of it proving a pipeline that was never going to run through Mixamo.
The Meshy wrapper
On 2026-09-03, the real avatar went in. The tool was Meshy: a text-to-3D and image-to-3D API that handles rigging as part of the generation step. The tools/meshy.py wrapper has seven tests, was written TDD-first, and uses only the Python standard library.
That last constraint did not happen by accident. The project had already chosen Python over .mjs for the manifest tooling in P2, to keep one test stack. Stdlib-only on the Meshy wrapper extends the same discipline to the API layer: no third-party HTTP client, no new wheel in the dependency tree, no additional surface for supply-chain exposure.
The tradeoff is ergonomics. Stdlib HTTP is more verbose than requests or httpx. Seven tests for a new API wrapper is a small suite. Neither point is hidden. The constraint holds the line on dependency creep; the tests hold the line on correctness.
The Keychain credential follows the same pattern as every other secret in this project. meshy-api-key is the Keychain entry name. The key is not in .env, not in any committed config file, and not visible in any script invocation. The balance check returned 3,105 credits, confirming the key was valid and the integration was wired before any generation ran.
The collapse
The original pipeline was three tools: image-to-3D, Blender, Mixamo. Meshy collapses image-to-3D and rigging into a single API call that takes image input and returns a rigged 3D mesh.
Blender remains available in the chain for post-processing. The Mixamo dependency, and whatever image-to-3D service the plan assumed before it, are both gone. The tool the proxy’s entire bone-naming scheme was built to be compatible with was never invoked. The 2026-09-03 devlog states it plainly: “The proxy is off stage; the real avatar is on it, and Mixamo was never needed.”
Why the proxy work still paid off
Proving the downstream before the mesh source was known turned out to be the right sequence, even though the actual pipeline simplified differently from what was planned.
When the Meshy-generated avatar dropped in, the Blender scripts, Godot import path, and bone-handling logic had all been validated against the proxy. Audio reactivity from the P2 amplitude-band and beat-clock work had been confirmed against a humanoid rig. The two days spent on a Mixamo-compatible stand-in meant the integration surface was already known, so the swap was clean: everything except the mesh source had been exercised.
The devlog does not record the exact bone naming Meshy produced, or the specific path from generated mesh to working Godot import. What it records is that the real avatar replaced the proxy without a documented rework cycle.
The design principle. When a pipeline step is likely to change, because better alternatives exist, because a service turns out to handle more than expected, or because an assumption proves wrong, building surrounding stages to a known standard rather than to a specific tool reduces rework. The proxy targeted the mixamorig: standard, not Mixamo as a service. When Meshy replaced the Mixamo step, the standard held.
One credential, one wrapper, one test suite
The operational state as of 2026-09-03: the Cj avatar in the EVA Music visualiser is produced by the Meshy API. The credential is in Keychain as meshy-api-key. The wrapper is tools/meshy.py, with seven tests, stdlib-only, confirmed against a live balance check before any generation ran.
Three tools became one external dependency. Two handoffs became none. The proxy work proved the downstream before the simplification was known; that sequencing meant the pipeline collapse arrived into a verified system rather than an unproven one.
The devlog is the canonical record. It lives at docs/devlog.md in youtube-music-visualiser-ent. The 2026-09-01 bootstrap entry still reads “image-to-3D → Blender → Mixamo” as the plan. The 2026-09-03 entry closes it: “Mixamo was never needed.” Three days apart.


