You commented 3D. Here's the lot — repo, install, and the exact prompt I ran.
The repo: github.com/img2threejs/img2threejs
The gallery (every model runs live in your browser): img2threejs.github.io/img2threejs-showcase
What it actually is
It's a skill for Claude Code. You give it one reference photo of an object. It writes that object as a Three.js factory in TypeScript — built from primitives, procedural shaders and generated geometry.
Not photogrammetry. Not a mesh you download. Code. The output is diffable TypeScript plus a JSON spec, so it lives in git like the rest of your project.
It also runs under Codex and OpenCode — it uses whatever vision the host gives it.
The setup
1. Install it. Drop it in your skills folder:
git clone https://github.com/img2threejs/img2threejs.git ~/.claude/skills/img2threejs2. Point it at an image and run this:
/img2threejs Rebuild this object as a Three.js model, keep the proportions, angles, and colours.That's genuinely enough. It classifies the subject, runs its own detail inventory, and gates every pass itself.
Undo: rm -rf ~/.claude/skills/img2threejs. It's a folder. Nothing else is touched.
The prompt that actually changes the output
This is the bit worth having. The one-liner leaves every judgement call to the skill. The version below is buried in the docs, and each line maps onto a real gate in the pipeline — so it changes what gets enforced, not just what gets described.
/img2threejs Rebuild the subject in this image as a procedural Three.js model.
Fidelity Hold proportions and silhouette to the reference. Enumerate the
identity-defining details first — bevels, panel seams, fasteners,
engraved or painted linework, gloss vs matte zones, wear — and drop
any detail you cannot place on a real component instead of faking it.
Materials Derive the finish class and gradient stops from the reference pixels,
not from memory. Flag any colour that will not survive tone-mapping.
Runtime Expose pivots and sockets for whatever should move, plus a
userData.tick for a looping idle animation.
Gates Run --strict-quality, and do not advance a pass until the side-by-side
review passes. Report per-region confidence for anything the image
cannot show.Three more worth knowing:
A person or character: "Maximise likeness: fit the parametric template to the landmarks, de-light and camera-match the reference, then project it. Tell me which regions are inferred."
An animal: "This is a creature, not a humanoid — use the quadruped body plan."
Keeping the cost down: "Stay at low effort and skip the presentation composer; I only need the evaluation render."
Why it won't eat your whole session
Every image-to-3D agent loop I've tried burns context on bookkeeping. This one pushes that into plain Python and spends model tokens only where judgement is needed:
Scripts enforce, the model judges. Validation, gating, spec authoring and packaging are all deterministic scripts. The model's tokens go to one job — looking at a single side-by-side sheet and deciding pass or fail.
Zero dependencies. Pure Python 3.10+ standard library. No pip, no numpy, no Playwright. PNG read/write is done with
structandzlib.Pass-gated generation. It emits only the currently unlocked build pass, so it never re-reads the whole model each iteration. A strict-quality gate also kills shallow specs before any Three.js gets generated.
The honest bit
Three things the demo reel can't show you:
One photo of a person won't come out perfect. It says so itself — it reports per-region confidence and asks for more angles rather than quietly guessing.
It's a pipeline, not a one-shot. Blockout, structure, form, materials, surface, lighting, interaction, optimisation — each pass has to clear a render-vs-reference review before the next unlocks. Good results, not instant ones.
The gallery leans hard on game-weapon demos. Ignore them — the bike, the earbuds and the isometric house are the honest test of what it does with an ordinary object.
Where I'd actually use it
Product pages. A spinning model on a landing page used to mean a 3D artist or a mesh you bought and hoped nobody else used — and then a heavy file your site drags around forever. This gives you a few hundred lines of TypeScript instead, and you can read every line of it.
Verified today: 5,575 stars, 429 forks, Apache-2.0, first commit 15 July. Free, and it stays free.
One ask
If you build something with it, reply and show me — I read every reply, and the good ones end up in here.
PS — if you'd rather this sort of thing just got built for you, that's what I do at optimax-ai.com.