Parts you write, see and print.

hackerscad is a parametric CAD where the model is code. Type and the 3D view follows; round an edge with the mouse and the code is written for you. Exact solids, real threads, files for every printer.

Downloadall systemsMake your first part
Linux, Windows and macOS · free and open source
hackerscad with Carlo open, half in the light theme and half in the dark one
AI assistants

Using an AI coding assistant?

Paste this to it: it installs hackerscad's skill, then hackerscad itself if it's missing (asking you first) and the MCP server. Then it reads the language from docs written for agents, checks and renders its models, and shows them in your window. More below

Install the hackerscad skill for all my projects from https://raw.githubusercontent.com/trikko/hackerscad/main/docs/SKILL.md, with https://raw.githubusercontent.com/trikko/hackerscad/main/docs/llms-full.txt next to it, then follow its "Setup and updates" section.
1 · write

Code is the model

A small, sandboxed language with units, selectors and libraries. It diffs, versions and reviews like any other code.

2 · click

The mouse writes code

Fillets, holes, sketches on a face, parts moved and patterned: every click lands in the file, readable.

3 · print

Send it to the printer

3MF with a colour per part, STL, STEP, or a drawing with views and dimensions.

Checked like code

unittest blocks hold what the part must do. The command line checks, renders and exports, in a script or in CI.

// batteries.hcad: a holder for AA cells
import std;

@param immutable cells = 4;
immutable aa = 14.5.mm, play = 0.4.mm;
immutable hole = aa + play, pitch = hole + 2.mm;

@part
Solid holder()
{
    auto b = box(cells * pitch + 2.mm,
            pitch + 2.mm, 22.mm)
        .fillet(edges.parallel(Z), r: 3.mm);

    // a pocket for each cell, its rim chamfered
    foreach (i; 0 .. cells)
        b -= cylinder(d: hole, h: 22.mm)
            .move(x: (i - (cells - 1) / 2.0) * pitch,
                z: 3.mm);
    b = b.chamfer(edges.of(faces.top), d: 0.6.mm);

    // a grip on both long sides, last
    return b
        .knurl(faces.front, kind: "diagonal",
            pitch: 3.mm)
        .knurl(faces.back, kind: "diagonal",
            pitch: 3.mm);
}

// a cell in the first pocket, to see it fit
@part("Yellow Pop", alpha: 0.4, export: false)
Solid cell()
{
    auto body = cylinder(d: aa, h: 49.5.mm);
    auto tip = cylinder(d: 5.5.mm, h: 1.mm)
        .move(z: 49.5.mm);
    return (body + tip)
        .move(x: -(cells - 1) / 2.0 * pitch, z: 3.mm);
}

unittest
{
    assert(hole > aa, "an AA cell does not fit");
    assert((holder & cell).volume < 0.01.mm ^^ 3,
        "the cell rubs against the holder");
}
$ hcad check batteries.hcad
part holder 69.6 × 19.9 × 22.0 mm volume 16091.0 mm³
part cell 14.5 × 14.5 × 50.5 mm (reference)
ok in 366 ms
$ hcad export batteries.hcad -o batteries.3mf
batteries.3mf · drag to turn

Ready-made, from screws to moulds

Hardware
Threads
Gears
Hinges
Snaps
Enclosures
Joints
Molds
Flex

Under the hood

For the curious.

Exact solidsOpenCascade B-rep: fillets, shells, sweeps, lofts and real threads.
Safe to openA C-style scripting language, familiar from C, Java or JavaScript, in a sandbox: no files, no network. Any model is safe to open.
A real editorCompletion, hover help and constrained sketches you edit with a click.

Rather just ask?

Tell Claude or another agent what you need. It models it, checks its sizes, shows it in your window and leaves you code you can change.

A wall hook for a 30 mm broom handle, two M4 screws.
The wall hook the agent made
hook.hcad · the handle's diameter a @param
the easy way

Ask your agent

Paste this: it installs the skill, then hackerscad itself if it is missing (asking you first) and the MCP server.

Install the hackerscad skill for all my projects from https://raw.githubusercontent.com/trikko/hackerscad/main/docs/SKILL.md, with https://raw.githubusercontent.com/trikko/hackerscad/main/docs/llms-full.txt next to it, then follow its "Setup and updates" section.
by hand

The skill and the MCP server

  1. hcad --version tells whether hcad is in your PATH; if not, use its full path below.
  2. The skill, the rules that avoid most mistakes, made by hcad itself (Claude Code shown):
    mkdir -p ~/.claude/skills/hackerscad
    hcad docs --skill > ~/.claude/skills/hackerscad/SKILL.md
    hcad docs > ~/.claude/skills/hackerscad/llms-full.txt
  3. The MCP server, the tools: one command, then restart the agent.
    $ claude mcp add -s user hcad -- hcad mcp
    $ codex mcp add hcad -- hcad mcp
    $ agy mcp add hcad hcad mcp
Every agent, folder and path →

Download

One package per system: the app, the command line tool and the MCP server.