image-to-3d/SKILL.md
Convert a single photograph into a textured 3D model (GLB/OBJ/STL). Supports local GPU inference via TripoSR (RTX 3060) and cloud inference via Replicate API (TRELLIS). Auto-previews output on the 3D Canvas (port 18794). Use when a user wants to turn a photo, image, or picture into a 3D model, mesh, or printable object.
npx skillsauth add leprachuan/pot-o-skills image-to-3dInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Convert any photograph into a textured 3D model with a single command. Uses AI-powered reconstruction (TripoSR locally or TRELLIS via cloud) to generate publication-quality meshes from a single image.
| Trigger | Example | |---|---| | User wants to convert a photo to 3D | "Turn this photo into a 3D model" | | Creating 3D assets from images | "Make a 3D version of snorty_final.png" | | Preparing images for 3D printing | "Generate an STL from this picture" | | Quick 3D prototyping from reference | "Create a 3D mesh from this product photo" | | Batch image-to-3D conversion | "Convert all images in /tmp/photos/ to GLB" |
import sys
sys.path.insert(0, '/opt/skills/image-to-3d/claude/implementation')
from image_to_3d import ImageTo3D
converter = ImageTo3D()
# Convert an image to 3D (auto-selects best backend)
result = converter.convert(
image="/path/to/photo.jpg",
output_format="glb",
quality="standard",
preview=True # auto-opens in 3D Canvas
)
print(f"Model saved to: {result['model_path']}")
print(f"Vertices: {result['metadata']['vertices']}")
print(f"Time: {result['inference_time_ms']}ms")
converter = ImageTo3D(backend="auto") # "auto", "local", "cloud"
# Core conversion
result = converter.convert(
image: str, # file path or URL
output_format: str = "glb", # "glb", "obj", "stl", "ply"
quality: str = "standard", # "draft", "standard", "high"
texture_resolution: int = 1024,# 512, 1024, 2048
output_dir: str = "/tmp/3d-output",
preview: bool = True, # open in 3D Canvas
remove_background: bool = True # auto-remove background
)
# Check backend availability
status = converter.health_check()
# List available backends
backends = converter.list_backends()
{
"success": True,
"model_path": "/tmp/3d-output/photo.glb",
"format": "glb",
"backend_used": "triposr_local",
"inference_time_ms": 1850,
"metadata": {
"vertices": 45230,
"faces": 90456,
"texture_resolution": "1024x1024",
"file_size_bytes": 8453201
},
"preview_url": "http://localhost:18794?session=img3d-abc123"
}
REPLICATE_API_TOKEN environment variableSTABILITY_API_KEY environment variable| Mode | Behavior |
|------|----------|
| auto | Try local GPU first, fall back to cloud |
| local | Force local TripoSR (fails if GPU unavailable) |
| cloud | Force cloud API (requires API key) |
When quality="high", auto mode prefers cloud (TRELLIS) for best results.
| Format | Use Case | Textures | 3D Canvas | |--------|----------|----------|-----------| | GLB | Web, Unity, Unreal, 3D Canvas | ✅ Embedded | ✅ | | OBJ | Blender, Maya, general 3D | ✅ Separate MTL | ✅ | | STL | 3D printing (FDM, SLA) | ❌ | ✅ | | PLY | Point clouds, research | ✅ Vertex colors | ❌ |
Generated models automatically preview in the 3D Canvas (port 18794) when preview=True:
result = converter.convert("photo.jpg", preview=True)
# Browser opens with interactive 3D view
# User can rotate, zoom, and export to STL/OBJ/GLB
result = converter.convert(
image="/opt/n8n-copilot-shim/snorty_final.png",
output_format="glb",
quality="standard",
preview=True
)
# → GLB file with textured 3D Snorty mascot
# → Opens in 3D Canvas for interactive preview
result = converter.convert(
image="https://example.com/product.jpg",
backend="cloud",
quality="high",
texture_resolution=2048,
output_format="glb"
)
result = converter.convert(
image="/path/to/object.png",
output_format="stl",
quality="standard"
)
# → STL file ready for slicing in Cura/PrusaSlicer
The local backend uses a FastAPI server (port 18795):
# Start manually (auto-started by skill when needed)
cd /opt/skills/image-to-3d
python -m core.server
# Health check
curl http://localhost:18795/health
# Convert via API
curl -X POST http://localhost:18795/api/convert \
-F "[email protected]" \
-F "format=glb" \
-F "quality=standard"
cd /opt/skills/image-to-3d/docker
docker compose up -d
# Server available at http://localhost:18795
| Variable | Required | Description |
|----------|----------|-------------|
| REPLICATE_API_TOKEN | For cloud | Replicate API key |
| STABILITY_API_KEY | For SF3D | Stability AI key |
| IMG3D_SERVER_PORT | No | Override server port (default: 18795) |
| IMG3D_SERVER_HOST | No | Override server host (default: localhost) |
| IMG3D_MODEL_CACHE | No | Model weights cache dir |
| IMG3D_OUTPUT_DIR | No | Default output directory |
data-ai
Interactive GitHub issues kanban board with agent assignments, due dates, and glassmorphism theming. Fully configurable for any GitHub repository.
data-ai
Interactive TODO board for Wee Canvas. Displays TODOs from both GitHub Issues (leprachuan/fosterbot-home) and flat files in two views: list and kanban. Features filtering, drag-and-drop status changes, quick-add, and auto-refresh every 30 seconds. Use when Foster asks to "show TODOs", "open TODO board", "view my tasks", or "TODO kanban".
tools
Web-based terminal tools for Wee Canvas: remote SSH terminal (WebSSH) and local bash terminal (ttyd). Embeds interactive terminal panels in Wee Canvas iframes. Use when the user asks for a 'web terminal', 'local terminal', 'browser SSH', 'webssh', or wants to interact with a host through the WebUI canvas. For browser windows, see the browser-window skill.
development
Use when you need to send WebEx notifications to flipkey-home-bot - supports markdown formatting, auto-retry with backoff, rate limiting, and message history tracking