Image to Three.js Model
img2threejs/img2threejs
Rebuilds the object in a reference image as a procedural, animation-ready Three.js model written entirely in code, using staged sculpting with quality checks.
Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically.
$ npx skills add partcad/partcad --skill add-interfaces -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install partcad/partcad add-interfaces --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/partcad/partcad.git skills-src && mkdir -p .claude/skills && cp -r skills-src/ai-agents/common/skills/add-interfaces .claude/skills/add-interfaces && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "add-interfaces" agent skill from https://github.com/partcad/partcad/tree/devel/ai-agents/common/skills/add-interfaces into .claude/skills/add-interfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-interfaces", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/partcad/partcad/tree/devel/ai-agents/common/skills/add-interfacesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add partcad/partcad --skill add-interfaces -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install partcad/partcad add-interfaces --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/partcad/partcad.git skills-src && mkdir -p .agents/skills && cp -r skills-src/ai-agents/common/skills/add-interfaces .agents/skills/add-interfaces && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-interfaces" agent skill from https://github.com/partcad/partcad/tree/devel/ai-agents/common/skills/add-interfaces into .agents/skills/add-interfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-interfaces", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add partcad/partcad --skill add-interfaces -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install partcad/partcad add-interfaces --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/partcad/partcad.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/ai-agents/common/skills/add-interfaces .cursor/skills/add-interfaces && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "add-interfaces" agent skill from https://github.com/partcad/partcad/tree/devel/ai-agents/common/skills/add-interfaces into .cursor/skills/add-interfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-interfaces", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/partcad/partcad.git --path ai-agents/common/skills/add-interfaces--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add partcad/partcad --skill add-interfaces -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install partcad/partcad add-interfaces --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/partcad/partcad.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/ai-agents/common/skills/add-interfaces .gemini/skills/add-interfaces && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "add-interfaces" agent skill from https://github.com/partcad/partcad/tree/devel/ai-agents/common/skills/add-interfaces into .gemini/skills/add-interfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-interfaces", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install partcad/partcad add-interfacesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add partcad/partcad --skill add-interfaces -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/partcad/partcad.git skills-src && mkdir -p .github/skills && cp -r skills-src/ai-agents/common/skills/add-interfaces .github/skills/add-interfaces && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "add-interfaces" agent skill from https://github.com/partcad/partcad/tree/devel/ai-agents/common/skills/add-interfaces into .github/skills/add-interfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-interfaces", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add partcad/partcad --skill add-interfaces -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install partcad/partcad add-interfaces --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/partcad/partcad.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/ai-agents/common/skills/add-interfaces .opencode/skills/add-interfaces && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "add-interfaces" agent skill from https://github.com/partcad/partcad/tree/devel/ai-agents/common/skills/add-interfaces into .opencode/skills/add-interfaces/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-interfaces", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
add-interfacesEnrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically.
Add Interfaces is an agent skill from partcad/partcad. Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically. Use for /pc:add-interfaces or when the user asks to add interfaces, ports, connectors, or mating information to a part, or to make parts snap/connect/assemble together.
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Game Development. It works with Python. The repository describes itself as: Package manager for things. Start designing modular hardware! PartCAD is the standard for documenting manufacturable physical products (a.k.a. Digital Thread or TDP). It comes… The licence is Apache-2.0.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 37fddfa. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Add Interfaces loads about 3.3k tokens when it runs. Until then it costs about 80 tokens; SKILL.md has 1,656 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from partcad/partcad at commit 37fddfa, republished under its Apache-2.0 licence (© partcad). 1,656 words, ~3,282 tokens.
.claude/skills/add-interfaces/SKILL.md (or your agent's skills folder).Add interfaces, ports, and implements: metadata to an existing
PartCAD part so PartCAD can mate it to other parts by connection rather than by
hand-placed coordinates. The text after the command ($ARGUMENTS) names the
target part (and, optionally, how it is meant to connect). You decide the
interface types and the exact port coordinates by examining the geometry, and
you prove they are right twice: by drawing them on the part itself
(pc render --with-all, step 4) and by mating two instances in a throwaway
assembly and rendering that (step 5). Hard requirement: the enriched part
passes pc test and the validation assembly renders correctly
connected.
Interfaces are the reusable half of this: define the connector once, then every
part that has that feature implements: it, and any two compatible parts mate.
Reference: docs/source/configuration.rst (the "Interfaces" and "Parts"
sections) and the feature_interface example (connect-interfaces.assy).
$ARGUMENTS is the object name (a part by default). Read its
desc:/requirements:/summary: from partcad.yaml. Make sure PartCAD is
available as /pc:init describes (pc, then partcad, then
python -m partcad_cli.click.command).
Decide what connects to what: which physical feature on this part joins to a
feature on another part (a bolt hole to a screw, a plug to a socket, a stud to a
receptacle, a rail to a slot). Each such feature becomes a port; a named set
of ports is an interface. A male feature and the female feature it enters are
two different, complementary interfaces that mates: each other.
You need each connection feature's position and orientation in the part's own coordinate frame, in millimeters. Get them two ways and cross-check:
Render it to see orientation and where the origin sits:
mkdir -p /tmp/pc-render
pc render -t png -O /tmp/pc-render <part> # one isometric PNGTo see other angles, place the part at rotated locations in a throwaway
.assy and render that. Run /pc:describe on the part for a written read of
the shape.
Once the part already has some ports, add --with-ports to see them drawn on
that same picture — see "Look at the ports" below. That is also how you check
a port you have just written before doing anything else with it.
Read the exact coordinates from the source when you can — the CAD script, the STEP/BREP, or (for a generated/meshed part) the upstream data file. Exact numbers beat measuring off a render.
Confirm the origin and axes by reasoning about the render: where is (0,0,0), and which way is "up" for this part (it is not always +Z — a mesh-imported part can land with +Y up). Every port coordinate below is in this frame.
A port is an OCCT Location, [[x,y,z],[ax,ay,az],angle_deg]: translate to
[x,y,z], then rotate angle_deg about axis [ax,ay,az]. Optionally give it a
sketch: (a 2D boundary) so it is visible when rendered.
Follow the port-matching convention so mates are unambiguous:
[1,1,0], which sends +Z -> -Z.Useful consequence to place features precisely: if you orient the two ports so
the 180 deg flip cancels the rotation, the mated part ends up translated by
target_port_position - source_port_position with no rotation. So the mating
offset is carried entirely by the two port positions — put the female (receiving)
port on the part's own mating plane and the stacking/insertion depth falls out
automatically, per part. Verify any non-obvious orientation cheaply, without
rendering, using the pure-Python partcad.geom.Location (__mul__, .inverse(),
.as_packed()) against the assembly's mate formula
target_loc * target_port * turn(180@[1,1,0]) * source_port.inverse().
Declare it in partcad.yaml:
sketches:
<port-boundary>: # optional, for visualization
type: basic
circle: <radius>
interfaces:
<male-iface>:
desc: <what it is; note Z points outward>
ports:
<port>:
sketch: <port-boundary>
mates:
<female-iface>:
# freedom of movement, if any; omit or use 0 for a rigid seat
moveZ: { min: 0, max: 0, default: 0 }
<female-iface>:
desc: <the complementary receptacle; Z points inward>
ports:
<port>:
sketch: <port-boundary>Interfaces can inherits: others (share ports/parameters) and declare
parameters: (moveX/Y/Z, turnX/Y/Z, or a custom dir:) for parametrized
mating such as a slotted hole. Reuse an existing interface if one already fits
rather than inventing a new one.
implements:A part implements an interface, placing that interface's ports onto the
part. Place each occurrence with its own Location; use several named instances
to place the same interface at several spots:
parts:
<part>:
# ...existing config...
implements:
<male-iface>:
<instanceA>: [[x, y, z], [ax, ay, az], angle]
<instanceB>: [[x, y, z], [ax, ay, az], angle]
<female-iface>:
<instanceA>: [[x, y, z], [ax, ay, az], angle]If the part is served by an external / plugin-backed package (a dynamic
catalog with no static partcad.yaml entry to edit), do not try to edit the
source. Enrich it in a consuming package instead: add a type: enrich part
there that points at the upstream part with source: and carries the added
implements:. Enrich copies your implements: onto the resolved part:
parts:
<local-name>:
type: enrich
source: //path/to/upstream/pkg:<upstream-part>
implements:
<fully-qualified-iface-name>: # e.g. //my/consuming/pkg:<male-iface>
<instance>: [[x, y, z], [ax, ay, az], angle]Use fully-qualified interface names in an enriched part's implements: (the
enriched part is instantiated in the upstream package's namespace, so a bare name
would resolve there, not in your package). For the consuming package to resolve
//path/to/upstream/pkg:<part>, that upstream package must be reachable from the
invocation root — the simplest arrangement is to make the consuming package a
sub-package of the upstream one and run pc from the upstream root. If enrich
cannot carry the metadata for a given part, fall back to a local wrapper
(type: alias, or a thin re-declared part) that adds the implements:.
implements: is what actually puts the ports on the part, so this is the first
moment there is anything to look at — and the cheapest check there is, before
any assembly exists. A port is a coordinate frame and an interface is a named
set of them, so neither shows up in an ordinary render; pc render draws them
when asked:
pc render -t png -O /tmp/pc-render --with-ports <part> # every port marked and named
pc render -t png -O /tmp/pc-render --with-interfaces <part> # every interface, joined to its ports
pc render -t png -O /tmp/pc-render --with-all <part> # bothView the PNG and read it against what you wrote:
+Z — the direction a
part travels along when it is connected through that port. A male port's +Z
points out of the material, a female port's points into it. An arrow pointing
the wrong way is the single most common mistake, and it is obvious here.location: was omitted — the coordinates are wrong.X and Y: use them to check the roll convention (X
toward the "next" equivalent port).--with-interfaces names each instance once and draws a line out to every
port in it, so a bolt pattern that should be one interface with four ports
reads as exactly that. Four separate names means four instances — usually not
what was intended. The small outlines are the port boundary sketches.Every port drawn is also listed in the log with the exact name to write in an
ASSY file — look for the N port(s) drawn on the projection: line and the
indented list under it. That is where the with:/to:/withInstance:/
toInstance: values below come from; do not guess them.
This is the real proof the coordinates are right. Scaffold a throwaway assembly that connects two parts purely through the interfaces:
pc add assembly assy check.assy# check.assy
links:
- part: <part-or //pkg:part>
name: a
- part: <the mating part>
name: b
connect:
with: <b's interface> # omit if unambiguous
withInstance: <b's instance> # if the interface has several
name: a
to: <a's interface>
toInstance: <a's instance>connect: mates by interface; location/connectPorts/connect are mutually
exclusive per node. Mark the assembly manufacturable: false so pc test
passes, then:
pc test -a <name> # geometry instantiates + mates resolve
pc render -a -t png -O /tmp/pc-render <name> # writes /tmp/pc-render/<name>.png
pc render -a -t png -O /tmp/pc-render --with-ports <name> # the same, with every port drawnView the PNG and check the two parts are actually connected the way the real feature connects: mating faces touching, correct offset/grid, no unintended interpenetration and no gap. A wrong port position shows up as a gap or overlap; a wrong orientation shows up as the incoming part rotated or facing the wrong way.
Then view the --with-ports PNG, which is what says why. On an assembly
the option walks every part and draws each one's ports where the assembly put
them, so the two ports that were supposed to mate are two frames on the same
picture:
+Z
arrows pointing in opposite directions.+Z arrows agreeing rather than
opposing, or rolled against each other: the orientation is wrong, not the
position.implements: location is
wrong, not the interface.Names on the picture are the instance path (<part-instance>:<port>), and the
same list is written to the log, so you can tell which of two identical-looking
frames belongs to which part.
Adjust the port coordinates/orientations and repeat step 5 until the render is
correct — no fixed retry count. Read the --with-ports render each time rather
than guessing from the plain one: it distinguishes a wrong position from a wrong
orientation, which the plain render does not. Re-check with a second instance
placed at a different port (an offset, not just the aligned case) to confirm
the whole interface is consistent, not just one lucky pair.
Summarize the interfaces you defined (with the male/female Z convention), which
ports/instances you placed and where, where you stored them (the part's package,
or the consuming package for a plugin-backed part), and how to view a connected
example (pc inspect -a <name>, or
pc render -a -t png --with-all <name> for a picture with the connection
metadata on it).
If the part's ports are worth keeping a picture of — a catalog part other
packages will mate against — declare the drawing as a file type so pc render
keeps it up to date instead of leaving it to be redrawn by hand:
parts:
<part>:
render:
svg-with-ports:
package: //builtin/render
path: render_svg.py
extension: ports.svg
with_ports: trueSee examples/feature_interface, which does exactly this for a part and for the
assembly it belongs to.
© partcad, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in ai-agents/common/skills/add-interfaces of partcad/partcad.
Open the folder on GitHubat commit 37fddfa
Add Interfaces next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Add Interfaces this skillpartcad/partcad | 503 | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Image to Three.js Modelimg2threejs/img2threejs | 18k | 1 repos | ~8.2k | Automated safety check: Pass | Apache-2.0 | |
| 2D Map and Scene Generator0x0funky/agent-sprite-forge | 4.3k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Bambu Studio AIheyixuan2/bambu-studio-ai | 219 | — | ~4.3k | Automated safety check: Pass | MIT | |
| Spine AnimationGenielabsOpenSource/spine-animation-ai | 515 | — | ~17k | Automated safety check: Pass | CC-BY-NC-4.0 | |
| Unreal BridgeTornLux/UnrealBridge | 305 | — | ~8.4k | Automated safety check: Notes | MIT |
img2threejs/img2threejs
Rebuilds the object in a reference image as a procedural, animation-ready Three.js model written entirely in code, using staged sculpting with quality checks.
0x0funky/agent-sprite-forge
Plans and builds 2D game maps and scenes, from tilemaps and parallax backgrounds to HD-2D plates, with collision checks, a playable HTML preview and Tiled, Godot or LDtk export.
heyixuan2/bambu-studio-ai
End-to-end 3D printing for Bambu Lab printers. An agent skill from heyixuan2/bambu-studio-ai.
GenielabsOpenSource/spine-animation-ai
Create Spine 2D skeletal animations from pre-existing character assets (separated body-part PNGs, atlas spritesheet, or a full character image).
TornLux/UnrealBridge
Execute Python scripts inside a running Unreal Engine 5.3+ editor via TCP bridge.
0x0funky/agent-sprite-forge
Produces game-ready 2D characters, creatures, props, icons and effects as master stills, sheets or clips, and exports frames for common game engines.
partcad/partcad
Convert a CAD file or a PartCAD object to another geometry format - STEP, BREP, STL, 3MF, OBJ, IGES, glTF, three.js, SVG, DXF, URDF, ASSY - with pc convert for an object a package declares (which…
partcad/partcad
Write a narratable, accessibility-oriented text description of an existing PartCAD part, assembly, or sketch from its measured bounding box and volume, from renders taken at several viewing angles…
partcad/partcad
Write a CAD file out of an object a PartCAD package declares - STEP, BREP, STL, 3MF, OBJ, IGES, glTF, three.js, URDF for 3D, SVG or DXF for a sketch, or a file type the package implements itself -…
partcad/partcad
Generate a PartCAD part from a natural-language description (and optional reference images/requirements) by authoring a CAD script and validating it with the PartCAD CLI.
partcad/partcad
Generate a PartCAD 2D sketch from a natural-language description by authoring the sketch (build123d / cadquery / dxf / svg / basic) and validating it with the PartCAD CLI.
partcad/partcad
Initialize a PartCAD package in the current directory by running the installed PartCAD CLI (pc init / partcad init).
Works with
Categories
Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically. Add Interfaces is an agent skill from partcad/partcad. Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically.
Add Interfaces fits situations like: /pc:add-interfaces; the user asks to add interfaces; mating information to a part; make parts snap/connect/assemble together.
Run `npx skills add partcad/partcad --skill add-interfaces -a claude-code`. Or copy the skill folder (ai-agents/common/skills/add-interfaces in partcad/partcad) into .claude/skills/add-interfaces in your project. Claude Code loads it when a task matches its description.
Run `npx skills add partcad/partcad --skill add-interfaces -a codex`. Or copy the skill folder (ai-agents/common/skills/add-interfaces in partcad/partcad) into .agents/skills/add-interfaces in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add partcad/partcad --skill add-interfaces -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-interfaces, .gemini/skills/add-interfaces, .github/skills/add-interfaces and .opencode/skills/add-interfaces in your project.
Going by SKILL.md and its folder, Add Interfaces needs the command-line tools its instructions call (python). Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Add Interfaces is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Add Interfaces: Image to Three.js Model (img2threejs/img2threejs, 18k stars), 2D Map and Scene Generator (0x0funky/agent-sprite-forge, 4.3k stars), Bambu Studio AI (heyixuan2/bambu-studio-ai, 219 stars) and Spine Animation (GenielabsOpenSource/spine-animation-ai, 515 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
partcad (a GitHub organization) maintains it in partcad/partcad, which has 503 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on October 8, 2026.
Source: partcad/partcad on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.