SCAD+
~/projects/untitled.scad
Transform
View
Axes
Origin
Snap
Sketch
$fn
SCAD · UTF-8
Console
Console Ready.
Idle Perspective $fn 32
Rendering…
VIEW PERSP

About SCAD+

SCAD+
Version 1.0.0

A browser-based 3D CAD editor and CSG engine. Write OpenSCAD-style code and see your models render instantly in the viewport.

OpenSCAD Compatibility: SCAD+ aims to be compatible with OpenSCAD, but not all functions and features are currently supported. Some standard OpenSCAD modules, functions, and language features may be missing or behave differently.
Built With
  • Manifold-3D — WASM-based CSG engine
  • Three.js — WebGL 3D rendering
  • CodeMirror 6 — Code editor
  • TypeScript + Vite — Build toolchain
Press ? to open the language reference.

SCAD Language Reference

3D Primitives

FunctionParametersDescription
cubesize, center, anchor, fillet, chamfer, edges, $fnBox. size: number or [x,y,z]. Fillet > 0 convex, < 0 concave.
spherer, d, anchor, $fnIcosphere. r = radius, d = diameter.
cylinderh, r, d, r1, r2, d1, d2, center, anchor, fillet, fillet_top, fillet_bot, chamfer, chamfer_top, chamfer_bot, $fnCylinder or cone. r1/r2 for conical.
torusr1, r2, angle, $fnTorus. r1 = major, r2 = minor. angle for partial sweep.
ellipsoidr, rx, ry, rz, $fnEllipsoid. r: scalar or [rx,ry,rz].
pipeh, r, t, r_inner, center, anchor, fillet, chamfer, $fnHollow cylinder. t = wall thickness.
wedgesize, center, anchorTriangular prism. size: scalar or [w,d,h].
capsuleh, r, center, anchor, $fnPill shape. Sphere if h ≤ 2r.
rounded_cubesize, r, center, anchor, $fnRounded box via hull of 8 spheres.
polyhedronpoints, facesRaw mesh from vertices and face indices.
chamfered_cylinderh, r, d, r1, r2, d1, d2, chamfer, chamfer_top, chamfer_bot, center, $fnCylinder with chamfered edges. Same radius params as cylinder.
threadd, pitch, length, starts, profile_angle, center, anchor, $fnHelical screw thread.
springr, r_wire, pitch, turns, center, anchor, $fnHelical coil wire.

2D Primitives

Use inside linear_extrude() or rotate_extrude(), or as thin top-level 3D shapes.

FunctionParametersDescription
circler, d, $fnCircle. r = radius, d = diameter.
squaresize, center, $fnRectangle. size: scalar or [w,h].
polygonpoints, paths, $fn2D polygon from point array. paths for holes.
regular_polygonr, n, $fnRegular n-gon. n = sides (default 6).
hexagonrAlias for regular_polygon(r, n=6).
slotw, h, center, $fnStadium / obround shape.
starpoints, r_outer, r_innerStar polygon. points = number of points.
texttext, size, halign, valign, spacing, $fnText as 2D outline. halign: "left"/"center"/"right". valign: "baseline"/"bottom"/"center"/"top". Use with linear_extrude() for 3D text.

Extrusions

FunctionParametersDescription
linear_extrudeheight, twist, slices, scale, centerExtrude 2D shape along Z. scale: scalar or [sx,sy].
rotate_extrudeangle, $fnRevolve 2D profile around Z-axis.
tapered_extrudeh_start, h_end, length, axis, chamfer/fillet[_top/_bot]Variable-height extrusion. Height linearly interpolates from h_start at the lower end of axis ("x" or "y") to h_end at length mm further along. length defaults to the profile's bbox extent along axis. Equivalent to intersection(linear_extrude(max(h_start,h_end)) profile, tilted_ceiling). Optional chamfer / fillet args (with _top / _bot per-end overrides) are baked into the flat extrusion before the wedge cut, so the horizontal top + bottom edges round cleanly while the slanted slope of the wedge stays sharp. Wrapping a chamfer() module around tapered_extrude doesn't work — the chamfer's prismatic-shape assumption is violated by the tilted top.

Edge treatment

Generalized chamfer / fillet that wraps any 3D child. The child is sliced at the inner boundary of the edge zone to get its silhouette, and the zone is rebuilt as hull-stitched thin wafers following either a linear taper (chamfer) or a quarter-circle arc (fillet). The hull step gives smooth slanted sides — no staircase.

FunctionParametersDescription
chamferc, top=true, bottom=true, $fnLinear taper on the top / bottom edges. c = chamfer size in mm.
filletr, top=true, bottom=true, $fnRounded quarter-arc on the top / bottom edges. r = fillet radius in mm. Higher $fn → smoother arc.
chamfer(1.5) cube([30, 20, 8]);
fillet(2, bottom=false) linear_extrude(10) circle(8);
chamfer(c=1, top=false) cylinder(h=20, r=10);
fillet(r=3, $fn=64) hexagon(r=12, h=6);

Scope. Only the top and bottom horizontal edges are touched — the square outline at zMax and zMin. Vertical side edges (e.g. the 4 corner edges of a cube) are not affected by these operators. For fully-rounded primitives use rounded_cube, or the fillet / chamfer args on cube / cylinder / pipe.

Silhouette complexity. The taper is built directly as a closed polyhedron for each topologically-disconnected island in the silhouette. For complex shapes where an offset would change topology (text, shapes with many thin features or holes that can collapse), the operator gracefully passes the child through unchanged rather than render a stepped approximation. If your chamfer(...) / fillet(...) wrapper seems to do nothing, that silhouette is too intricate for this algorithm and the shape is being returned as-is — add the bevel directly into the 2D profile or use a simpler shape.

2D Sketch Editor

Assignable curve-based profiles with an interactive 2D editor. Every gesture rewrites the SCAD source — the editor is a view of the text, not a separate model.

Entry

ActionHow
+ New SketchToolbar button opens a plane picker: XY / XZ / YZ create a sketch immediately; From Face… arms face-pick mode.
From Face…After clicking the button, hover a face in the 3D viewport — the whole coplanar face highlights in amber. Left-click to pick the face; a sketch using that face's normal + point as origin is created and opens in the 2D editor.
Edit SketchPlace the caret inside an existing sketchN = sketch(...); the toolbar button lights up showing the sketch name (e.g. Edit sketch2). Click to open.
Cursor switchWhile the 2D editor is open, moving the text caret into a different sketchN auto-switches the editor to that sketch.

Sketch entity functions

Each returns a tagged record stored inside entities=[...]. Identity is preserved across edits so handles know where to go.

FunctionSignatureDescription
linefrom=[x,y], to=[x,y]Straight segment between two points.
recta=[x,y], b=[x,y]Rectangle by two opposite corners.
arccenter=[x,y], r, start, endCircular arc. Sweep is always CCW.
circle_entitycenter=[x,y], rClosed circle. Standalone closed path.
bezierp0, c1, c2, p3Cubic Bézier segment.
splinepoints=[[x,y], …]Smooth Catmull-Rom curve through all knots.
dimfrom, to, valueDimension annotation (no geometry; ignored by polygon()).
imagesrc, corner=[x,y], size=[w,h], opacity, rotationReference / tracing image. src is a localStorage key pointing to a data URL. Always rendered behind the sketch; ignored by polygon().
sketchplane, origin, entitiesTop-level wrapper. Assign to a variable and consume via polygon().

Consuming a sketch

sketch1 = sketch(plane="XZ", origin=[0,0,0], entities=[
  line(from=[0,0], to=[20,0]),
  arc (center=[20,10], r=10, start=-90, end=90),
  line(from=[20,20], to=[0,20]),
  line(from=[0,20], to=[0,0])
]);

linear_extrude(5) polygon(sketch1);

The walker links open segments by matching endpoints (order-independent). rect and circle_entity are standalone closed paths. EvenOdd fill handles multiple paths as holes automatically.

Keyboard shortcuts (inside the 2D editor)

KeyTool
VSelect / drag anchors & bodies
LLine (chains until Esc)
RRectangle (two-corner)
CCircle (center + edge)
AArc (center, start, end)
BBézier (4 clicks)
SSpline (Enter / dblclick to finish)
Shift+clickAdd / remove from selection
drag empty spaceRubber-band selection
drag on selectedTranslate the whole group (snapped to grid)
Ctrl+drag rect cornerScale symmetrically about the rect center
Ctrl+drag image cornerLock the image's native aspect ratio while resizing
Del / BackspaceDelete the current selection
Ctrl+Z / Ctrl+Shift+ZUndo / redo (routed to code history)
EscClear selection, cancel in-progress draw, or close editor
middle / right dragPan canvas
scroll wheelCursor-centered zoom

Toolbar extras

ButtonPurpose
Auto DimToggles a non-persistent overlay showing every entity's natural dimension — length for lines, width + height for rects, R⟨value⟩ radius for circles / arcs, L⟨length⟩ for bezier / spline, width + height for images. Each value is a click-editable inline input (Enter or blur to commit). Dims render on the outside of the shape using a centroid-based heuristic.
DimPersistent two-point dimension — inserts a dim(from, to, value) record that survives edits (selectable + deletable).
3D BGLayers the 3D model behind the 2D canvas, aligned head-on to the sketch plane (orthographic). Hides the 3D grid / HUD / gizmo / outline. Pan + zoom stay in sync across both views; the model's opacity is set by the BG slider (0–100%).
ImageImport a reference image. The file is stored as a data URL in localStorage (key lives in src); the image is inserted as an image(...) entity at canvas center. Has four draggable corner handles (Ctrl+drag locks aspect). Opacity, rotation, and 90° rotate buttons are in the properties panel when the image is selected.
Constr.Construction mode. While ON, the next shape drawn is saved with construction=true and renders dash-dot. Construction geometry is skipped by the extruder — it's a reference only (centerlines, axes, offset framing, bisectors). Toggle on an existing entity via the construction checkbox in the properties panel.
PointsPersistent snap-point markers on every entity. Glyph legend: filled dot = endpoint / spline knot / circle radius handle, hollow ring with pip = center / edge-midpoint / circle quadrant, square = rect / image corner, diamond = Bézier control handle. Off by default — toggle ON when placing a new shape so you can aim exactly at a reference on another shape without hovering to discover the snap point.
AxesToggles the two long coloured axis lines drawn through the origin. Axis colours + labels adapt to the current sketch plane: on XY horizontal is X→ / vertical is Y↑; on XZ vertical becomes Z↑; on YZ horizontal becomes Y→ and vertical Z↑. Labels sit at the ends of each axis. The origin marker (amber ring + "0") stays visible even when axes are hidden.
RulersThin tick-marked strips along the top and left edges of the canvas with numeric labels at major grid steps and a coloured cursor-position triangle that tracks the mouse. Useful for quick measurement without relying on Auto Dim. Shares the grid's zoom-dependent step (1 mm / 0.1 mm / 0.01 mm).
Plane badgeBottom-left chip showing the active sketch plane (PLANE XY / PLANE XZ / PLANE YZ / vector for a custom normal). Passive readout — no interaction.
Cursor readoutBottom-right chip showing live SCAD world X / Y / Z of the mouse cursor (the existing sketch-local X / Y remains in the status bar). Each axis value is coloured per SCAD convention.
FilletRounds the corner between two existing line entities that share a vertex. Click the tool → click the first line → click the second line (must share a vertex with the first). The shared corner is replaced with a tangent arc of the radius shown in the spinner next to the button (persisted per session). Source is rewritten atomically: the two lines are trimmed back to the tangent points, and a new arc(...) entity is inserted. Post-commit you can fine-tune by selecting the new arc and dragging its radius anchor. Esc cancels mid-selection. v1 limitation: only operates on line() entities; rect / bezier / spline / arc are not yet supported.
ChamferStraight bevel version of Fillet. Same two-click workflow, but instead of a tangent arc the shared corner becomes a straight line between two trim points whose distance from the vertex equals the "r" value in the spinner. Useful for 45° cuts and other linear corner treatments. Same v1 limitation: line entities only.

Smart guides

While drawing a new shape, dragging an anchor, or moving a selection, dashed yellow alignment lines appear when the cursor aligns with another entity:

  • Horizontal / vertical through any anchor — cursor snaps to that axis.
  • Line extension — cursor snaps along the infinite extension of any line segment.
  • Midpoint between two anchors — labeled ½, cursor snaps to the exact middle.

When two or more guides cross at the same point a bright × marker appears — this is a meaningful placement: e.g. horizontally aligned with object A, vertically aligned with object B, and along the extension of line C. Ideal for placing the third part of an arrangement.

Properties panel

When a single entity is selected, a panel in the bottom-right of the canvas shows every parameter as an editable input (point fields as X/Y pairs, scalars as single numbers). Images also get an opacity slider and +90° / +180° / −90° rotate buttons. All edits round-trip through the SCAD source.

Precision

Every coordinate and numeric value is rounded to 0.01 mm at mutation time. Grid snap tiers by zoom: 1 mm default → 0.1 mm when zoomed in → 0.01 mm when zoomed deeper. Drag, zoom-pan, click-to-edit, and serialization all pass through the same rounding, so there's no float-noise accumulation across operations.

Transforms

FunctionParametersDescription
translate[x, y, z]Move children by offset vector.
rotate[x, y, z]Rotate children (degrees).
scale[sx, sy, sz]Scale children. Scalar for uniform.
mirror[x, y, z]Mirror children over plane with given normal vector.
resize[x, y, z], autoResize to target dimensions. auto fills unspecified dims proportionally.
offsetr, delta, chamfer2D offset. r = round, delta + chamfer = square, delta alone = miter.
colorc, alphaApply color (hex or CSS name) and opacity.

Boolean Operations

FunctionParametersDescription
unionchildrenCombine all shapes.
differencechildrenFirst child minus the rest.
intersectionchildrenKeep only overlapping volume.
hullchildrenConvex hull of children.
minkowskichildrenMinkowski sum of children.

Control Flow

SyntaxExampleDescription
forfor (i = [0:5]) { ... }Loop. Supports [start:end], [start:step:end], arrays.
if / elseif (x > 0) { ... } else { ... }Conditional geometry.
modulemodule name(p=1) { ... }Define reusable module.
$fn$fn = 64;Global resolution (circle segments).
##cube(10);Debug: highlight in translucent pink.
importfileImport a mesh file. Load via Import Mesh menu first, then import("file.stl").
includeinclude <https://...>Include remote SCAD file by URL. Fetched and inlined before evaluation.
childrenInside a user-defined module, renders the caller's child shapes.

Layout Modules

Place inside a shape's { } block to position children relative to the parent shape.

FunctionParametersDescription
positionanchor, pad, extend, axis, modePlace child center at parent's anchor point. No rotation.
alignface, alignment, inset, pad, extend, axis, modeFlush child face to parent face with auto-anchoring. Standalone mode moves anchor to origin.
attachparent_anchor, child_anchor, overlap, spin, align, pad, extend, axis, modeRotate child UP to parent face normal, position child_anchor at parent_anchor. BOSL2-style.
framesizeInvisible phantom bounding box for layout. Shown as dashed wireframe.
groupchildrenExplicit union. Layout children use combined bounding box.

Layout Modes

ModeDescription
"add"Default. Union child with parent.
"cut"Subtract child from parent.
"intersect"Keep only overlap of child and parent.

Hardware Components

FunctionParametersDescription
boltsize, length, d, head_h, head_d, pitch, thread_length, chamfer, standard, center, $fnISO metric hex bolt. size: "M1".."M30". standard: "din" or "iso". Origin at head bottom.
nutsize, h, d, s, thread, pitch, chamfer, standard, center, $fnISO metric hex nut. thread: boolean for threaded bore.
enclosuresize, wall, r, fillet_top, fillet_bottom, chamfer_top, chamfer_bottom, lid_h, lip_h, lip_gap, mount, screw_size, screw_d, screw_inset, boss_r, hole_depth, nut_pocket, part, center, $fnParametric box with lid. size: [w,d,h]. mount: "none"/"screw"/"bolt". part: "assembly"/"body"/"lid".
shellthickness, openHollows out child shapes. thickness: wall thickness (pos 0, default 2). open: anchor face to remove (e.g. TOP). Uses scale-from-center.
standoffh, r, d, hole, hole_d, hole_depth, screw_size, center, anchor, $fnMounting pillar with optional hole. screw_size (e.g. "M3") auto-derives dimensions. hole: "pilot" (default), "through", or "none".
bolt_holetype, size, d, head_d, head_h, clearance, length, through, anchor, $fnUniversal bolt-hole drill. type: "countersunk" / "counterbore" / "through". size: ISO metric string "M1".."M20" auto-sizes shank & head per DIN 7991 / DIN 912. Takes children to subtract from, or returns drill shape for difference().

Hole Patterns

Cut repeating patterns of holes through a shape. Two forms:

// 1) Generic wrapper — works on any shape
hole_pattern(pattern="hex", spacing=8, d=5, margin=4) { my_shape(); }

// 2) Shortcut arg on a primitive (cube / sphere / cylinder)
cube([80, 50, 4], cut_pattern="hex", spacing=8, hole_d=5, margin=4);

On primitives, prefix collision-prone args with hole_ — every arg that collides with a primitive's own args: hole_d, hole_r, hole_h, hole_center, hole_count, hole_radius, hole_through, hole_chamfer(_top/_bot), hole_fillet(_top/_bot), hole_thickness, hole_corner_r, hole_gap, hole_spokes. Non-conflicting args stay unprefixed: spacing, rows, cols, margin, angle, start_angle, anchor, clip, rib, equilateral, cut_shape. Inside hole_pattern(), drop all prefixes.

Pattern (layout)

ValueDescription
"grid"Rectangular rows × cols grid.
"hex"Hex-packed staggered grid (odd rows shifted by spacing/2).
"ring"Circular ring of count holes at radius.
"isogrid"Triangular tessellation — alternating point-up/down triangles. Auto-selects shape="triangle".
"linear"1D repeat along a line. spacing, hole_count (0 = auto-fit), and angle (degrees; 0 = +X, 90 = +Y, 45 = diagonal).

Shape (cutter)

ValueDescription
"circle"Cylindrical hole (default; uses $fn).
"hex"Hexagonal prism. Combine with pattern="hex" for honeycomb.
"triangle"Triangular prism. Default for pattern="isogrid".
"square"Square prism (rotated 45° for X/Y-aligned flats).
"plus" / "cross"+ shape. Uses hole_thickness for arm width; hole_corner_r rounds corners.
"x"X shape (bars rotated ±45°). Same params as plus.
"bowtie">< — two triangles apex-to-apex. Grid of bowties leaves X-shaped ribs between cuts.
"diamond" / "rhombus"<> — two outward-pointing triangles. hole_gap sets the space between their bases (0 = solid rhombus).
"radial" / "spokes" / "star"N triangular spokes radiating from center. hole_spokes = count (default 4; 2 = bowtie, 4 = elevator-pillar style, 6 = hexagonal rosette). hole_gap sets central hub size (auto-computed with rib).

Parameters

ArgDescription
spacingGrid pitch. Scalar or [sx, sy]. For hex/isogrid, acts as edge length.
rows, colsLayout counts. 0 = auto-fit from parent bbox / spacing (default).
marginInset from bbox edge for auto-fit counts.
count, radius, start_angleRing-only: number of holes, ring radius, starting angle (degrees). Auto-sizes hole_d from arc length when rib is set.
angleLinear-only: direction in degrees (0 = +X, 90 = +Y, 45 = diagonal). Default 0.
d / hole_d, r / hole_rCutter diameter / radius (d wins).
h / hole_hCutter height. 0 = auto from parent thickness + 0.2 overshoot.
through / hole_throughOvershoot for through-holes (default true).
thickness / hole_thicknessArm width for plus/x; bowtie mid-width; diamond minor axis; radial spoke base chord.
spokes / hole_spokesNumber of spokes for radial/star shape (default 4; 2 = bowtie, 6 = hexagonal rosette).
corner_r / hole_corner_r2D corner rounding for complex shapes (plus, x, bowtie, diamond).
gap / hole_gapSpace between the two triangles in diamond (0 = solid rhombus).
ribAuto-fit mode: material width between cells. When set, evaluator computes spacing, hole_d, thickness, hole_gap, and margin. Cell size: grid/hex uses bbox/(rows×cols); linear uses projected length/count; ring uses arc length (2π·radius/count). For radial shapes, spoke sides become parallel so material between spokes is uniform.
equilateralWith rib on plus/x/bowtie/diamond: sets thickness = hole_d / sqrt(3). Ignored for radial (which uses the parallel-spoke formula instead).
anchorFace to cut from: TOP (default), BOTTOM, LEFT, RIGHT, FRONT, BACK.
center / hole_center[x, y] in-plane offset of the whole pattern.
clipDrop cutters that straddle the parent silhouette (default true).
chamfer / hole_chamferFlat taper at both ends; widens opening by that amount.
chamfer_top, chamfer_botPer-end chamfer (or hole_chamfer_top, hole_chamfer_bot). Pass 0 to keep that end flat.
fillet / hole_filletRounded transition at both ends (6-slice quarter-circle).
fillet_top, fillet_botPer-end fillet (or hole_fillet_top, hole_fillet_bot).

Examples

// Hex-vented panel
cube([80, 50, 4], cut_pattern="hex", spacing=8, hole_d=5, margin=4);

// Honeycomb (hex layout + hex cutter)
cube([90, 60, 4], cut_pattern="hex", cut_shape="hex", spacing=9, hole_d=7);

// Isogrid tessellation
cube([120, 80, 4], cut_pattern="isogrid", spacing=16, hole_d=14, margin=4);

// Bolt-circle flange
cylinder(h=6, r=30, cut_pattern="ring",
  hole_count=8, hole_radius=22, hole_d=4);

// Countersink top only, flat bottom
cube([80, 50, 6], cut_pattern="grid", rows=3, cols=6, spacing=12,
  hole_d=5, hole_chamfer_top=1.5, hole_chamfer_bot=0);

// Irregular shape — pattern auto-clips to silhouette
hole_pattern(pattern="hex", spacing=7, d=3, margin=3) { dogbone(); }

Gears & Mechanical

FunctionParametersDescription
spur_gearteeth, mod, pressure_angle, width, bore, backlash, center, hub_d, hub_h, helix_angle, optimized, $fnInvolute spur gear. hub_d/hub_h add a boss cylinder above the gear. helix_angle (degrees) twists each tooth along the axis. optimized=true adds a ring of lightening holes between bore and teeth.
helical_gearteeth, mod, pressure_angle, width, helix_angle, bore, backlash, center, $fnSpur gear with helical twist.
herringbone_gearteeth, mod, pressure_angle, width, helix_angle, bore, backlash, center, $fnV-pattern double helical gear.
rackteeth, mod, pressure_angle, width, height, backlash, center, $fnLinear gear rack.
bevel_gearteeth, mod, pressure_angle, width, cone_angle, bore, backlash, center, $fnBevel gear for angled shafts.
wormstarts, mod, pressure_angle, length, d, r, bore, center, $fnHelical worm for worm-gear drives.

Structural Profiles

Thin-walled extrusions. All share: w (width), h (height), t (thickness), l (length), fillet, chamfer, center, $fn.

FunctionExtra ParametersDescription
l_profilefillet_outside, chamfer_outsideL-shaped cross-section.
u_profilefillet_outside, chamfer_outsideU-shaped (channel).
o_profilefillet_outside, chamfer_outsideRectangular tube.
t_profiletwT-shaped. tw = web thickness.
i_profiletwI-beam. tw = web thickness.

Anchor Constants

Combinable with + for edges and corners (e.g. TOP + RIGHT + FRONT).

ConstantValueDescription
CENTER[0, 0, 0]Bounding box center
TOP[0, 0, 1]Z+ face
BOTTOM[0, 0, -1]Z- face
RIGHT[1, 0, 0]X+ face
LEFT[-1, 0, 0]X- face
BACK[0, 1, 0]Y+ face
FRONT[0, -1, 0]Y- face

Axis Constants

ConstantValueUsage
X[1, 0, 0]X axis only
Y[0, 1, 0]Y axis only
Z[0, 0, 1]Z axis only
XY[1, 1, 0]X and Y axes
XZ[1, 0, 1]X and Z axes
YZ[0, 1, 1]Y and Z axes

Math Functions

CategoryFunctions
Trigonometry (degrees)sin(x), cos(x), tan(x)
Roundingabs(x), ceil(x), floor(x), round(x)
Exponentssqrt(x), pow(x, y)
Logarithmsln(x), log(x)
Comparisonmin(a, b, ...), max(a, b, ...)
ConstantsPI

View Navigation

KeyAction
Num 1Front view
Ctrl + Num 1Back view
Num 3Right view
Ctrl + Num 3Left view
Num 7Top view
Ctrl + Num 7Bottom view
Num 5Toggle Ortho / Perspective

Transform

KeyAction
TTranslate mode
RRotate mode (Shift = 45° snap)
SScale mode

Selection & View

KeyAction
FFit view to selection
NFit view with normal
EscDeselect all
DeleteDelete selected object

Dimension Dragging

KeyAction
XConstrain to X-axis
YConstrain to Y-axis
ZConstrain to Z-axis

AI Assistant

The AI assistant helps you create, modify, and debug SCAD code through natural language conversation. It understands your current code and errors.

Setup

Open the hamburger menu and select AI Settings to configure a provider. Or click the dimmed AI button in the toolbar.

ProviderNotes
Claude (Anthropic)Recommended. Best SCAD understanding.
OpenAIGPT-4o and other OpenAI models.
DeepSeekCost-effective alternative.
GroqFast inference, open-source models.
OpenRouterAccess 100+ models with one key.
Ollama (Local)Run locally, no API key needed.
CustomAny OpenAI-compatible endpoint.

Usage

FeatureDescription
ApplyReplace your entire code with the AI's suggestion.
InsertAppend the AI's code after your current code.
ImagesPaste or upload reference images for the AI to see.
New ChatStart a fresh conversation. Previous chat is saved to History.
HistorySwitch to the History tab to browse and reload past conversations.

Tips

TipExample
Be specific about dimensions"Make a box 40mm wide, 20mm deep, 15mm tall"
Reference your code"Add mounting holes to the enclosure"
Ask to fix errors"Fix the error in my code" (errors are sent automatically)
Iterate on designs"Make the walls thicker and add fillets"

Your API key is stored in your browser's localStorage and never sent to our servers. Code context is sent directly to your chosen AI provider.