Quick Start: Your First Part in 60 Seconds

Next: Tutorial 2: Bushing & L-Bracket → · Tutorial 3: Box, Gear & Sketch → · Full Reference & FAQ · Home

Sign in first: click account in the top bar, log in, and you're sent straight back to /design/. Alpha access is required.

Describe a part in plain English, with sizes in millimetres. You get a real 3D solid, an editable CADL recipe, and STL/STEP files. You can also send it straight to the slicer and the G-code simulator.

1

Describe in mm

Type the overall size first, then each hole: count, diameter, position. Click Generate.

2

Check 3D & Notes

Look for PASS and compare the bbox with your sizes. Yellow notes show what the AI guessed.

3

Tweak params & Rebuild

The CADL editor opens automatically. Change a number, then click Rebuild (no LLM) or press Ctrl+Enter. No AI is used.

4

Export or Slice

Download part.stl / part.step, or Open in Mesh / Slicer → Slice to G-code → Open in Simulator.

Live run on spinstop.com (2026-10-26)

Tutorial 1 run on the real site with the ollama model cadl-qwen3-30b-lora: ✅ PASS in 20.7 s, bbox 60 × 40 × 5 mm, 11682 mm³. Spec check passed and the vision check said "match".

Tip: on your first visit to /mesh/, if the model doesn't appear while Pyodide is still loading, refresh the page once.

The live CADL vs. the params version

// live output (ollama cadl-qwen3-30b-lora)
{"steps": [
  {"id": "plate", "op": "box",
   "size": [60, 40, 5]},
  {"id": "holes", "op": "hole",
   "target": "plate", "face": "top",
   "positions": [[6, 6], ["=60-6", 6],
     [6, "=40-6"], ["=60-6", "=40-6"]],
   "diameter": 4.5 → 5.5}
 ],
 "result": "holes"}
// params version: name each size once
{"units": "mm",
 "params": {"w": 60, "d": 40, "t": 5,
            "hole_d": 4.5, "inset": 6},
 "steps": [
  {"id": "plate", "op": "box",
   "size": ["$w", "$d", "$t"],
   "anchor": "corner"},
  {"id": "holes", "op": "hole",
   "target": "plate", "face": "top",
   "diameter": "$hole_d",
   "positions": [["$inset", "$inset"], ...]}],
 "result": "holes"}

With one hole size, editing "diameter" directly is simplest: the live rebuild gave 11525 mm³. Use params when a size repeats across steps or coordinates. The live compiler accepts corner-style hole positions like [6, 6] on a default (centred) box and shifts them automatically. Adding "anchor": "corner" makes that explicit.

What you'll make

Three tutorial parts: mounting plate, flanged bushing, L-bracket
All three tutorial parts, rendered from the real STEP/STL built by the CADL compiler.

▶ Watch the 90-second narrated walkthrough · Example files: plate.cadl, bushing.cadl, l_bracket.cadl (plus .stl and .step in examples/)

Starter prompts

Copy one, paste it into Describe the part (mm), and click Generate.

Mounting PlateFlat mounting plate 60x40x5 mm with four 4.5 mm through holes, 6 mm in from each edge at the corners
Flanged BushingFlanged bushing: 30 mm flange diameter, 4 mm flange thickness, 18 mm body outer diameter, 22 mm total height, with a 10 mm through bore and a 1 mm chamfer on the top edge
L-BracketL-bracket 50 mm wide, base leg 60 mm long and 6 mm thick, vertical wall 45 mm tall and 6 mm thick, with two 5 mm holes in the base and two 5 mm holes in the vertical wall
Hex StandoffHex standoff, 6 mm across flats, 15 mm long, 2.5 mm holes 6 mm deep in both ends
Enclosure BoxProject box 60x40x25 mm outer, open top, 2 mm walls and floor, with a 1.5 mm wide x 2 mm tall inner lid lip ledge around the top inside

What's inside a .cadl file

// CADL v1 — JSON + // comments
{
  "units": "mm",
  "plan": "1. Plate 60x40x5, corner at origin ...",
  "issues": [{"type": "assumption",
    "msg": "Holes 6 mm from each edge.", "ref": "$inset"}],
  "params": {"w": 60, "d": 40, "t": 5,
             "hole_d": 4.5, "inset": 6},
  "steps": [
    {"id": "plate", "op": "box",
     "size": ["$w", "$d", "$t"], "anchor": "corner"},
    {"id": "holes", "op": "hole", "target": "plate",
     "face": "top", "diameter": "$hole_d",
     "positions": [["$inset", "$inset"],
       ["=$w-$inset", "$inset"],
       ["$inset", "=$d-$inset"],
       ["=$w-$inset", "=$d-$inset"]]}
  ],
  "result": "holes"
}
params: every important size, named once. "$hole_d" uses a value directly, and "=$w-$inset" is a formula. Change hole_d to 5.5, rebuild, and all four holes grow.
steps: build the part in order. Each step has an id and an op (box, cylinder, revolve, hole, union, chamfer, fillet…) and can refer to earlier steps with target. Hole positions are global mm: on top they're [x, y], on front [x, z], and on left [y, z].
result: the step that becomes your final part.

plan and issues are notes only and never change the geometry. Issues show up as the yellow notes; click a note's $inset link to jump to that param.

The 6 things to know

ControlWhat it means for you
CADLThe editable text recipe for your part. Save it with Download .cadl and load it later with Open .cadl….
paramsThe named sizes at the top of the recipe. Change one, and every place that uses it updates.
Rebuild (no LLM)Remakes the part from your edited recipe in a few seconds (Ctrl+Enter). It doesn't use the AI or your 20 AI jobs a day.
Edit with AIType a change in English, e.g. make the holes 5 mm and move them 3 mm inward, and click Apply edit. You'll see a diff and the measured changes. ↺ Undo edit restores the previous part.
Mode3D print: largest flat face on the bed, no steep overhangs. CNC (3-axis): every feature reachable from above, flat base.
STL vs STEPSTL is a triangle mesh for slicers (PrusaSlicer, Bambu, Orca, Cura). STEP is an exact solid for CAD and CNC CAM (FreeCAD, Fusion, Onshape, SolidWorks).

Tips

Need more? Read the full Text-to-CAD guide, which covers every control, the result checks, editing, file types, limits and troubleshooting. This is alpha software, so check every part before you print or cut it.

← Home · Tutorial 2: Bushing & Bracket → · Tutorial 3 → · Full Reference & FAQ