{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreic62itulso7477jprqrfh25e5wu5cz7grn3kyppu4hu547rt6j3tq",
    "uri": "at://did:plc:5opbpi2nomj4y3d5kpwamkrd/app.bsky.feed.post/3mfhosyj2eyp2"
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreifmo272fvtypbx4iv5paotbt7mebvvuqkxzbpo3uhobybrrp5qwhy"
    },
    "mimeType": "image/png",
    "size": 1305851
  },
  "description": "How I taught my AI assistant to generate 3D-printable models from simple text descriptions\n\n\nThe Problem\n\nI've been 3D printing for years, but there's always been a gap in my workflow: organic shapes are hard. Sure, I can design a technical items, holders, brackets or enclosure in Shapr 3D, but when I want something sculptural—a figurine, a decorative piece, or a creative toy for my cats—I'm stuck either:\n\n 1. Downloading pre-made models from Thingiverse (limited selection)\n 2. Spending hours le",
  "path": "/ai-powered-3d-printing-from-text-to-stl-with-meshy-and-openclaw/",
  "publishedAt": "2026-02-22T17:43:33.000Z",
  "site": "https://corti.com",
  "tags": [
    "Meshy.ai",
    "OpenClaw",
    "meshy.ai"
  ],
  "textContent": "_How I taught my AI assistant to generate 3D-printable models from simple text descriptions_\n\n## The Problem\n\nI've been 3D printing for years, but there's always been a gap in my workflow: **organic shapes are hard**. Sure, I can design a technical items, holders, brackets or enclosure in **Shapr 3D** , but when I want something sculptural—a figurine, a decorative piece, or a creative toy for my cats—I'm stuck either:\n\n  1. Downloading pre-made models from Thingiverse (limited selection)\n  2. Spending hours learning Blender (steep learning curve)\n\n\n\nAI text-to-3D services like Meshy.ai have changed this. You describe what you want, and AI generates a 3D model. But the workflow was still manual:\n\n  * open a browser, log in\n  * type a prompt, wait\n  * download\n  * convert formats, repair the mesh\n  * slice, print\n\n\n\n**What if my AI assistant could do all of that for me?**\n\n## The Solution: A Custom OpenClaw Skill\n\nI use OpenClaw—an AI agent framework that gives Claude access to my local machine, files, and tools. It already helps me with code, email, calendar, and home automation. Why not 3D printing?\n\nI created a custom skill called **text-to-stl** that lets me say:\n\n> \"Generate a small cat figurine in a playful pose\"\n\n...and get back a print-ready STL file, automatically uploaded to my Google Drive, ready to slice.\n\nHere's how I built it.\n\n* * *\n\n## Part 1: Setting Up the Meshy API\n\n### Getting API Access\n\n  1. Sign up at meshy.ai\n  2. Navigate to **Settings → API Keys**\n  3. Generate a new API key (starts with `msy_...`)\n  4. Store it securely—you'll need it for the skill configuration\n\n\n\nMeshy operates on a **credit system** :\n\n  * Preview generation (no texture): **5 credits** (Meshy-5 model) or **20 credits** (Meshy-6 model)\n  * Refine (adds texture): additional credits\n  * Free tier gives you enough credits to experiment\n\n\n\nFor 3D printing, **preview mode is all you need** —printers don't use textures anyway.\n\n### API Workflow\n\nMeshy's text-to-3D API works in two phases:\n\n  1. **Create a task** with your text prompt\n  2. **Poll for completion** (takes 30-90 seconds)\n  3. **Download the model** (returns GLB/FBX/OBJ, NOT STL)\n  4. **Convert GLB → STL** (using Python's trimesh library)\n  5. **Repair the mesh** (using admesh to fix non-watertight geometry)\n\n\n\nLet's build this step by step.\n\n* * *\n\n## Part 2: Creating the OpenClaw Skill\n\n### Skill Structure\n\nOpenClaw skills live in your workspace's `skills/` directory. I created:\n\n\n    ~/openclaw/skills/text-to-stl-SKILL.md\n\n\nThis markdown file defines:\n\n  * **When to activate** (user asks to generate a 3D model)\n  * **Prerequisites** (API key, tools needed)\n  * **Step-by-step instructions** for the AI to follow\n\n\n\n### Configuration\n\nFirst, I added the Meshy API key to OpenClaw's config at `~/.openclaw/openclaw.json`:\n\n\n    {\n      \"skills\": {\n        \"entries\": {\n          \"text-to-stl\": {\n            \"enabled\": true,\n            \"env\": {\n              \"MESHY_API_KEY\": \"msy_YOUR_API_KEY_HERE\"\n            }\n          }\n        }\n      }\n    }\n\n\nThis makes the API key available as an environment variable when the skill runs.\n\n### Prerequisites Check\n\nThe skill requires:\n\n  * `curl` (for API calls)\n  * `jq` (for JSON parsing)\n  * `python3` with `trimesh` (for GLB→STL conversion)\n  * `admesh` (optional, for mesh repair)\n\n\n\nInstall them:\n\n\n    # Ubuntu/Debian\n    sudo apt install curl jq admesh\n    pip3 install trimesh --break-system-packages\n\n    # macOS\n    brew install curl jq admesh\n    pip3 install trimesh\n\n\n* * *\n\n## Part 3: The Workflow (What the AI Does)\n\nWhen I ask for a 3D model, here's what happens behind the scenes:\n\n### Step 1: Create the Preview Task\n\n\n    export MESHY_API_KEY=\"msy_...\"\n\n    TASK_ID=$(curl -s -X POST \"https://api.meshy.ai/openapi/v2/text-to-3d\" \\\n      -H \"Authorization: Bearer ${MESHY_API_KEY}\" \\\n      -H \"Content-Type: application/json\" \\\n      -d '{\n        \"mode\": \"preview\",\n        \"prompt\": \"A small cat figurine in a playful crouching pose, tail curved upward, thick solid body with detailed fur texture, sculpture style, wide stable base for 3D printing\",\n        \"negative_prompt\": \"low quality, low resolution, ugly, broken geometry, floating parts, thin features, fragile details\",\n        \"should_remesh\": true,\n        \"topology\": \"triangle\",\n        \"target_polycount\": 50000\n      }' | jq -r '.result')\n\n    echo \"Task ID: ${TASK_ID}\"\n\n\n**Key parameters:**\n\n  * `mode: \"preview\"` — generates base geometry without texture (cheaper, faster)\n  * `prompt` — descriptive text with details about shape, style, and \"solid geometry for 3D printing\"\n  * `negative_prompt` — things to avoid (thin features break during printing)\n  * `target_polycount: 50000` — good balance between detail and file size\n\n\n\n### Step 2: Poll Until Complete\n\n\n    while true; do\n      RESPONSE=$(curl -s \"https://api.meshy.ai/openapi/v2/text-to-3d/${TASK_ID}\" \\\n        -H \"Authorization: Bearer ${MESHY_API_KEY}\")\n\n      STATUS=$(echo \"$RESPONSE\" | jq -r '.status')\n      PROGRESS=$(echo \"$RESPONSE\" | jq -r '.progress')\n\n      echo \"Status: ${STATUS} | Progress: ${PROGRESS}%\"\n\n      if [ \"$STATUS\" = \"SUCCEEDED\" ]; then\n        echo \"Preview complete!\"\n        break\n      elif [ \"$STATUS\" = \"FAILED\" ]; then\n        echo \"ERROR: Task failed\"\n        exit 1\n      fi\n\n      sleep 5\n    done\n\n\nGeneration takes **30-90 seconds** depending on complexity.\n\n### Step 3: Download GLB and Convert to STL\n\nMeshy returns models in **GLB format** (GLTF binary), not STL. We need to convert:\n\n\n    # Extract GLB URL from response\n    GLB_URL=$(echo \"$RESPONSE\" | jq -r '.model_urls.glb')\n\n    # Download GLB\n    curl -sL \"$GLB_URL\" -o model.glb\n\n    # Convert to STL using Python/trimesh\n    python3 << 'EOF'\n    import trimesh\n\n    mesh = trimesh.load('model.glb', force='mesh')\n    mesh.export('model.stl')\n\n    # Print stats\n    stl_mesh = trimesh.load('model.stl')\n    print(f\"Vertices: {len(stl_mesh.vertices):,}\")\n    print(f\"Faces: {len(stl_mesh.faces):,}\")\n    print(f\"Watertight: {stl_mesh.is_watertight}\")\n    EOF\n\n\n**Output:**\n\n\n    Vertices: 24,975\n    Faces: 49,958\n    Watertight: False\n\n\n**Problem:** AI-generated meshes are almost never watertight. They have tiny gaps, duplicate vertices, and bad normals. Most slicers can auto-repair this, but it's better to fix it properly.\n\n### Step 4: Mesh Repair with admesh\n\n\n    admesh -n -d -v -u -f \\\n      -b model_repaired.stl \\\n      model.stl\n\n\n**What this does:**\n\n  * `-n` — find and connect nearby facets\n  * `-d` — check and fix normal directions\n  * `-v` — check and fix normal values\n  * `-u` — remove unconnected facets\n  * `-f` — fill holes\n  * `-b model_repaired.stl` — write binary STL output\n\n\n\n**Result:**\n\n\n    Checking exact...\n    All facets connected.\n    Filling holes...\n    Checking normal directions...\n    Verifying neighbors...\n\n    Number of facets: 49,964\n    Total disconnected facets: 0\n    Volume: 0.534 cubic units\n\n\nNow we have a **print-ready STL** with:\n\n  * All edges connected\n  * No holes\n  * Correct normals\n  * Verified topology\n\n\n\n* * *\n\n## Part 4: The Full Skill File\n\nHere's the `text-to-stl-SKILL.md`:\n\n\n    ---\n    name: text-to-stl\n    description: When the user asks to generate a 3D model, create an STL file, make something 3D printable, or convert a text description into a 3D object, use the Meshy API to generate a 3D-printable STL file from a text prompt. Supports preview, refine, remesh, and mesh repair workflows.\n    metadata: {\"openclaw\":{\"emoji\":\"🧊\",\"requires\":{\"env\":[\"MESHY_API_KEY\"],\"bins\":[\"curl\",\"jq\",\"python3\"]},\"install\":[{\"id\":\"jq-brew\",\"kind\":\"brew\",\"formula\":\"jq\",\"bins\":[\"jq\"],\"label\":\"Install jq (brew)\"},{\"id\":\"jq-apt\",\"kind\":\"shell\",\"command\":\"sudo apt-get install -y jq\",\"bins\":[\"jq\"],\"label\":\"Install jq (apt)\"},{\"id\":\"trimesh-pip\",\"kind\":\"shell\",\"command\":\"pip3 install trimesh --break-system-packages\",\"label\":\"Install trimesh (pip3)\"}]}}\n    ---\n\n    # Text to STL — 3D Printable Model Generation\n\n    Generate 3D-printable STL files from text descriptions using the Meshy API (v2).\n\n    ## When to Use\n\n    Activate this skill when the user wants to:\n\n    - Generate a 3D model from a text description\n    - Create an STL file for 3D printing\n    - Make a 3D-printable object from a prompt\n    - Convert an idea or description into a printable mesh\n\n    ## Prerequisites\n\n    - `MESHY_API_KEY` environment variable must be set (obtain from https://www.meshy.ai/api)\n    - `curl` and `jq` must be available on the system\n    - `python3` with `trimesh` library installed (for GLB→STL conversion)\n    - Optionally, `admesh` for post-processing mesh repair (`apt install admesh` or `brew install admesh`)\n\n    ## Workflow\n\n    The Meshy text-to-3D pipeline has two phases:\n\n    1. **Preview** — generates base geometry (no texture). Costs 5 credits (Meshy-5) or 20 credits (Meshy-6).\n    2. **Refine** — adds texture to the preview mesh. Optional for 3D printing since printers typically don't use textures.\n\n    For 3D printing, the preview phase alone is usually sufficient. Only run refine if the user specifically wants a textured model or color 3D printing.\n\n    **⚠️ Important:** Meshy returns models in GLB/FBX/OBJ formats, NOT STL directly. After generation, download the GLB file and convert it to STL using trimesh (Python library).\n\n    ## Step-by-Step Instructions\n\n    ### Step 1: Create a Preview Task\n\n    ```bash\n    TASK_ID=$(curl -s -X POST \"https://api.meshy.ai/openapi/v2/text-to-3d\" \\\n      -H \"Authorization: Bearer ${MESHY_API_KEY}\" \\\n      -H \"Content-Type: application/json\" \\\n      -d '{\n        \"mode\": \"preview\",\n        \"prompt\": \"<USER_PROMPT>\",\n        \"negative_prompt\": \"low quality, low resolution, low poly, ugly, broken geometry, floating parts\",\n        \"should_remesh\": true,\n        \"topology\": \"triangle\",\n        \"target_polycount\": 50000\n      }' | jq -r '.result')\n\n    echo \"Preview task created: ${TASK_ID}\"\n    ```\n\n    **Prompt guidelines for the user's description:**\n    - Focus on a single object, not a full scene\n    - Include 3-6 key descriptive details about shape, proportion, and surface\n    - Mention style if relevant: \"realistic\", \"low-poly\", \"cartoon\", \"sculpture\"\n    - For printing, add \"solid\", \"thick walls\", \"no thin features\" to reduce fragile geometry\n\n    **Parameters to adjust based on user needs:**\n    - `target_polycount`: 10000-100000. Higher = more detail but larger file. Default 50000 is a good balance.\n    - `topology`: Always use `\"triangle\"` for STL/3D printing.\n    - `should_remesh`: Always `true` for print-ready output.\n\n    ### Step 2: Poll Until Complete\n\n    ```bash\n    while true; do\n      RESPONSE=$(curl -s \"https://api.meshy.ai/openapi/v2/text-to-3d/${TASK_ID}\" \\\n        -H \"Authorization: Bearer ${MESHY_API_KEY}\")\n      STATUS=$(echo \"$RESPONSE\" | jq -r '.status')\n      PROGRESS=$(echo \"$RESPONSE\" | jq -r '.progress')\n\n      echo \"Status: ${STATUS} | Progress: ${PROGRESS}%\"\n\n      if [ \"$STATUS\" = \"SUCCEEDED\" ]; then\n        echo \"Preview complete.\"\n        break\n      elif [ \"$STATUS\" = \"FAILED\" ]; then\n        ERROR=$(echo \"$RESPONSE\" | jq -r '.task_error.message // \"Unknown error\"')\n        echo \"ERROR: Task failed — ${ERROR}\"\n        exit 1\n      fi\n\n      sleep 5\n    done\n    ```\n\n    Preview generation typically takes 30-90 seconds.\n\n    **Alternative: Use SSE streaming instead of polling:**\n    ```bash\n    curl -N \"https://api.meshy.ai/openapi/v2/text-to-3d/${TASK_ID}/stream\" \\\n      -H \"Authorization: Bearer ${MESHY_API_KEY}\"\n    ```\n\n    ### Step 3: Download GLB and Convert to STL\n\n    Meshy returns models in GLB format. Download the GLB file and convert it to STL using trimesh:\n\n    ```bash\n    # Extract GLB URL from the response\n    GLB_URL=$(echo \"$RESPONSE\" | jq -r '.model_urls.glb')\n\n    if [ -z \"$GLB_URL\" ] || [ \"$GLB_URL\" = \"null\" ]; then\n      echo \"ERROR: No GLB URL in response\"\n      exit 1\n    fi\n\n    # Download GLB\n    curl -sL \"$GLB_URL\" -o model.glb\n    echo \"Downloaded: model.glb ($(wc -c < model.glb) bytes)\"\n\n    # Convert GLB to STL using trimesh\n    python3 << 'EOF'\n    import trimesh\n    import sys\n\n    try:\n        # Load GLB and export to STL\n        mesh = trimesh.load('model.glb', force='mesh')\n        mesh.export('model.stl')\n\n        # Get stats\n        stl_mesh = trimesh.load('model.stl')\n        print(f\"✓ Converted to STL successfully!\")\n        print(f\"  Vertices: {len(stl_mesh.vertices):,}\")\n        print(f\"  Faces: {len(stl_mesh.faces):,}\")\n        print(f\"  Watertight: {stl_mesh.is_watertight}\")\n\n        if not stl_mesh.is_watertight:\n            print(\"  ⚠️  Mesh is not watertight - enable auto-repair in your slicer\")\n    except Exception as e:\n        print(f\"ERROR: Conversion failed - {e}\")\n        sys.exit(1)\n    EOF\n\n    echo \"STL file ready: model.stl ($(wc -c < model.stl) bytes)\"\n    ```\n\n    **Note:** If `trimesh` is not installed, install it with:\n    ```bash\n    pip3 install trimesh --break-system-packages\n    # or in a venv:\n    python3 -m venv venv && source venv/bin/activate && pip install trimesh\n    ```\n\n    ### Step 4 (Optional): Mesh Repair for Print Readiness\n\n    AI-generated meshes are frequently not watertight or manifold. If `admesh` is available, run a repair pass:\n\n    ```bash\n    if command -v admesh &>/dev/null; then\n      admesh --fix-all --normal-directions --normal-values \\\n        --remove-unconnected --fill-holes \\\n        --write-binary-stl=model_fixed.stl model.stl\n      echo \"Repaired mesh saved to model_fixed.stl\"\n      echo \"Mesh stats:\"\n      admesh model_fixed.stl 2>&1 | head -20\n    else\n      echo \"NOTICE: admesh not installed. Skipping mesh repair.\"\n      echo \"For best print results, install admesh and re-run, or import into your slicer and check for errors.\"\n    fi\n    ```\n\n    ### Step 5 (Optional): Refine for Textured Output\n\n    Only if the user wants textures (e.g., for color 3D printing):\n\n    ```bash\n    REFINE_ID=$(curl -s -X POST \"https://api.meshy.ai/openapi/v2/text-to-3d\" \\\n      -H \"Authorization: Bearer ${MESHY_API_KEY}\" \\\n      -H \"Content-Type: application/json\" \\\n      -d \"{\n        \\\"mode\\\": \\\"refine\\\",\n        \\\"preview_task_id\\\": \\\"${TASK_ID}\\\"\n      }\" | jq -r '.result')\n\n    echo \"Refine task created: ${REFINE_ID}\"\n    # Poll same as Step 2, using REFINE_ID\n    ```\n\n    After refine, `model_urls` will include textured GLB/FBX/OBJ formats (convert to STL using the same trimesh workflow as Step 3).\n\n    ## Output\n\n    Present the user with:\n\n    1. The file path to `model.stl` (or `model_fixed.stl` if repaired)\n    2. File size in MB\n    3. Mesh stats (vertices, faces, watertight status)\n    4. A reminder that they should preview in their slicer (Cura, PrusaSlicer, OrcaSlicer, BambuStudio) before printing\n    5. If mesh is not watertight (common for AI-generated models), suggest they enable auto-repair in their slicer or run Step 4 mesh repair\n\n    ## Error Handling\n\n    | Error | Cause | Resolution |\n    |-------|-------|------------|\n    | 401 Unauthorized | Invalid or missing API key | Verify `MESHY_API_KEY` is set and valid |\n    | 402 Payment Required | Insufficient credits | User needs to top up credits at meshy.ai |\n    | 429 Too Many Requests | Rate limit exceeded | Wait and retry. Meshy rate limits vary by plan tier |\n    | Task status FAILED | Prompt too vague or unsupported | Retry with a more descriptive prompt; avoid full scenes |\n    | Empty GLB URL | Model format not available | Check API response; Meshy should always provide GLB |\n\n    ## Example Prompts\n\n    **User says:** \"Make me a 3D printable phone stand\"\n    **Meshy prompt:** \"A minimalist phone stand with a wide stable base and angled slot to hold a smartphone upright, solid thick walls, smooth surface\"\n\n    **User says:** \"Create an STL of a dragon figurine\"\n    **Meshy prompt:** \"A detailed dragon figurine sitting on a rock base, wings folded, thick body with textured scales, sculpture style, solid geometry suitable for 3D printing\"\n\n    **User says:** \"Generate a 3D gear I can print\"\n    **Meshy prompt:** \"A single mechanical spur gear with 24 teeth, thick hub with center hole, industrial style, solid geometry\"\n\n    > **Note:** For precise mechanical parts like gears with exact dimensions, text-to-3D generation may not produce dimensionally accurate results. Suggest the user consider OpenSCAD or FreeCAD for parametric parts that require tight tolerances.\n\n    ## Configuration\n\n    The skill reads `MESHY_API_KEY` from the environment. Set it in `~/.openclaw/openclaw.json`:\n\n    ```json\n    {\n      \"skills\": {\n        \"entries\": {\n          \"text-to-stl\": {\n            \"enabled\": true,\n            \"env\": {\n              \"MESHY_API_KEY\": \"your-api-key-here\"\n            }\n          }\n        }\n      }\n    }\n    ```\n\n    Or export it in your shell: `export MESHY_API_KEY=\"your-api-key-here\"`\n\n* * *\n\n## Part 5: Real-World Results\n\nI tested this with a simple prompt:\n\n> \"A small cat figurine in a playful crouching pose\"\n\n**What I got:**\n\n  * Generation time: ~90 seconds\n  * Raw STL: 24,975 vertices, 49,958 faces, 2.4 MB\n  * Repaired STL: 49,964 faces, all connected, watertight\n  * Dimensions: ~53mm × 68mm × 95mm\n\n\n\n**The model:**\n\n**The print:**\n\n**It worked perfectly.** The model sliced cleanly in BambuStudio, printed in a few minutes on my Bambu Lab X1 Crbon, and came out better than I expected for an AI-generated model.\n\n* * *\n\n## Key Learnings\n\n### ✅ What Works Well\n\n  1. **Meshy is fast** — 30-90 seconds from prompt to model\n  2. **Descriptive prompts matter** — \"thick solid body, wide stable base for 3D printing\" gets much better results than just \"cat figurine\"\n  3. **Negative prompts help** — explicitly avoiding \"thin features\" and \"fragile details\" reduces print failures\n  4. **admesh is essential** — AI models are almost never watertight; admesh fixes 90% of issues automatically\n  5. **Preview mode is enough** — no need to pay extra for texture refinement when you're just printing in PLA\n\n\n\n### ⚠️ Limitations\n\n  1. **Not for precision parts** — AI models are sculptural, not dimensionally accurate. For brackets, mounts, or gears, stick with a CAD solution..\n  2. **Mesh repair isn't magic** — some models still need manual cleanup in Meshy or your slicer\n  3. **Credit costs add up** — 5-20 credits per model means you'll want a paid plan if you do this regularly\n  4. **Prompt engineering required** — getting exactly what you want takes iteration\n\n\n\n### 💡 Tips for Better Results\n\n**Good prompts:**\n\n  * \"A cat figurine sitting upright, thick body, stable flat base, sculpture style, solid geometry for 3D printing\"\n  * \"A decorative key holder shaped like a tree branch, thick walls, mounting holes at the back\"\n\n\n\n**Bad prompts:**\n\n  * \"A cat\" (too vague)\n  * \"A highly detailed ultra-realistic cat with individual whiskers\" (too fragile to print)\n  * \"A cat on a table next to a lamp\" (AI will try to generate a full scene, not a single object)\n\n\n\n**Golden rule:** Describe a single object with 3-6 key details about shape, proportion, and style. Always mention \"solid geometry\" or \"thick walls\" for printability.\n\n* * *\n\n## Automation Wins\n\nThe real power isn't just generating models—it's the **full end-to-end workflow** :\n\n  1. I say: \"Generate a cat figurine\"\n  2. AI creates the task, polls for completion, downloads GLB\n  3. Converts to STL, runs admesh repair\n  4. Uploads to my Google Drive\n  5. Sends me the link with mesh stats\n\n\n\n**Total time:** 2 minutes, fully automated.\n\nCompare that to:\n\n  * Opening a browser\n  * Logging into Meshy\n  * Typing a prompt\n  * Waiting and refreshing\n  * Downloading manually\n  * Converting in Blender\n  * Running repair in Meshy\n  * Exporting STL\n  * Moving to slicer\n\n\n\nThe skill saves me **10-15 minutes per model** and removes all the context-switching friction.\n\n* * *\n\n## What's Next\n\nI'm already thinking about improvements:\n\n  1. **Batch generation** — generate multiple variations with different prompts, pick the best one\n  2. **Automatic slicing** — integrate with PrusaSlicer CLI to generate G-code directly\n  3. **Photo-to-3D** — Meshy also supports image-to-3D; could extend the skill for that\n  4. **Size normalization** — automatically scale models to a target size (e.g., \"make it 100mm tall\")\n  5. **Print queue integration** — send G-code directly to my Bambu Lab printer via API\n\n\n\n* * *\n\n## Try It Yourself\n\nTo use it:\n\n  1. Install OpenClaw: `npm install -g openclaw`\n  2. Sign up for Meshy.ai and get an API key\n  3. Add the skill file to `~/openclaw/skills/text-to-stl-SKILL.md`\n  4. Configure the API key in `~/.openclaw/openclaw.json`\n  5. Install prerequisites: `apt install curl jq admesh && pip3 install trimesh`\n  6. Ask your AI assistant: \"Generate a 3D printable [description]\"\n\n\n\n* * *\n\n## Conclusion\n\nAI is transforming how we create. Not just code, not just text, but **physical objects**.\n\nWith the right tools and a bit of automation, you can go from an idea in your head to a physical print in under 10 minutes. And that's just the beginning.\n\n* * *\n\n_Have you tried AI-generated 3D models? What worked (or didn't) for you? Let me know._",
  "title": "AI-Powered 3D Printing: From Text to STL with Meshy and OpenClaw",
  "updatedAt": "2026-02-22T17:43:33.000Z"
}