Local models
2026-10-13

Designing parts with a model that never leaves the house

Five open models on one laptop, six printable parts, every result graded by measuring the part.

I design parts with frontier models in the cloud. This is the backup for when the cloud or the internet is down: the same kind of work, offline, on the laptop described on the local models page. It is not a replacement for the frontier models, and the results below show why.

Since then: the harness, not the model (2026-10-14). The stock model from this page, given tools to measure its own parts, went from 18 to 27 of 28 harder parts fully right.

How it works

I describe a part in a chat, from my phone or a terminal. The model writes it in OpenSCAD, a language that describes a part as code, using the BOSL2 library for things like pipe threads. Then it loops:

  1. Build. One command builds the part in a locked-down sandbox, checks the mesh is sealed, and draws four views of it on one sheet: iso, front, side and top.
  2. Look. The model reads that sheet with its vision, and a cross-section at any height if it wants one, and compares what it sees with what was asked.
  3. Fix and build again, up to 8 times. Then it says what it made, and what it isn't sure of.

Every version is kept. My phone shows the part turning in 3-D as each version lands, and FreeCAD on the same laptop picks up each one about a second after it's built, keeping the camera where I left it. Nothing goes to the internet.

In the first real test, the model drew a cube with a hole through it, looked at the sheet, wrote “The sheet shows a solid cube”, found the hole hadn't cut, and fixed it. That loop is the whole point: a model that can see its own part catches mistakes a model writing blind can't.

The models

Qwen 3.8 27B RVN Heretic abliterated

3-bit (IQ3_XXS) · 10.6 GB + 0.9 GB vision · 4 of 6 parts fully right · 67/77 checks · 33 min in all

0bserverx/Qwen3.8-27B-Heretic-GSQ-RCO-GGUF

Qwen 3.8 27B stock

2-bit (IQ2_S) · 9.6 GB + 0.9 GB vision · 2 of 6 parts fully right · 65/80 checks · 53 min in all

ISTA-DASLab/Qwen3.8-27B-GSQ-RCO-GGUF

Qwen 3.8 27B, vision off stock, blind

the same file, without the vision part · 2 of 6 parts fully right · 60/66 checks · 40 min in all

ISTA-DASLab/Qwen3.8-27B-GSQ-RCO-GGUF

Underdog Saluki 27B 1.0 fine-tune

2-bit mix · 8.3 GB + 0.9 GB vision · 2 of 6 parts fully right · 52/65 checks · 44 min in all

Kujira/Underdog-Saluki-27B-1.0-MTP-GGUF

Qwen 3.5 9B Heretic v2 small

8-bit · 9.5 GB + 0.6 GB vision · 0 of 6 parts fully right · 31/65 checks · 21 min in all

trohrbaugh/Qwen3.5-9B-heretic-v2

All run with llama.cpp on a 16 GB RTX 5080 Laptop GPU, with 48k of context. The four 27B models share one vision part. “Abliterated” means its refusals were removed; for CAD that changes nothing on purpose, but this copy is also a less squeezed 3-bit file than the stock 2-bit one, so part of its lead may come from that alone.

How it was graded

Each model got each prompt once, as a fresh part, with 15 minutes and at most 10 build attempts. A separate grader then measured the final part, not the model's own account of it: overall size and position, one body, a sealed mesh, and probes at points that must be solid or empty, such as inside each hole.

For the pipe threads it measures the thread itself: 14 threads per inch, the 1:16 taper running the right way, the size at the large end, the thread depth, and the length. The coupling must also have no flat ledge in its bore: these parts carry water or air, so a diameter changes along a taper, never at a step. Before trusting the grader, I ran it on correct reference parts, which pass every check, and on five deliberately wrong ones: a metric thread, a plug threaded upside down, a reversed coupling, one with a ledge, and a standoff turned the wrong way. Each failed on exactly the check it should.

A part is “fully right” only when every check passes. A part that never built gets a single check, the one it failed.

An L-bracket

Two plain extrusions and two holes, with every position given.

Make an L-bracket. The base leg lies flat on the bed: 40 mm long along +X starting at x = 0, 25 mm wide along Y centred on y = 0, 4 mm thick. The upright leg is at x = 0 to 4 and rises to 30 mm tall. Put a 4.5 mm through hole in each leg: in the base at x = 26, y = 0; in the upright at z = 18, y = 0.
Qwen 3.8 27B RVN Heretic: Put the upright through the middle of the base: a cross, not an L.
Heretic 5/10 · 3:34Put the upright through the middle of the base: a cross, not an L.
Qwen 3.8 27B: Right first time it built.
Stock 10/10 · 5:12Right first time it built.
Qwen 3.8 27B, vision off: Right, in one build.
Stock, blind 10/10 · 2:16Right, in one build.
nothing built
Saluki 0/1 · 2:15Never built: every try was an OpenSCAD syntax error.
nothing built
9B 0/1 · 2:15Never built: kept calling BOSL2's cuboid() as a function.

A plate with two pegs and a rib

Protrusions standing on a plate, at given places.

A base plate 60 x 40 x 5 mm with its corner at the origin (x 0 to 60, y 0 to 40), lying flat on the bed. On top of it, two round pegs 8 mm in diameter and 12 mm tall, centred at x = 15, y = 20 and at x = 45, y = 20. Between them, a straight rib from x = 20 to x = 40, 3 mm wide, centred on y = 20, standing 8 mm tall on the plate.
Qwen 3.8 27B RVN Heretic: Right, though it used the whole 15 minutes checking it.
Heretic 15/15 · 15:02Right, though it used the whole 15 minutes checking it.
Qwen 3.8 27B: One wrong build (a single peg in the middle), then ran out of time.
Stock 7/15 · 15:01One wrong build (a single peg in the middle), then ran out of time.
Qwen 3.8 27B, vision off: Right in three minutes.
Stock, blind 15/15 · 3:09Right in three minutes.
Underdog Saluki 27B 1.0: Pegs and rib too short.
Saluki 12/15 · 2:22Pegs and rib too short.
Qwen 3.5 9B Heretic v2: One peg and the rib at the edge, the other peg off the plate.
9B 6/15 · 5:01One peg and the rib at the edge, the other peg off the plate.

A hex standoff

A straight extrusion that must face the right way, with a hole through it.

A hex standoff, 10 mm across the flats and 25 mm tall, standing on the bed and centred on the origin. Turn it so the flats face +Y and -Y (the corners point along X). An M4 clearance hole goes straight through the middle.
Qwen 3.8 27B RVN Heretic: Right, in 98 seconds.
Heretic 14/14 · 1:38Right, in 98 seconds.
Qwen 3.8 27B: Right shape, but the hole stops short of the top.
Stock 13/14 · 3:29Right shape, but the hole stops short of the top.
Qwen 3.8 27B, vision off: The same miss as stock: the hole stops short of the top.
Stock, blind 13/14 · 0:43The same miss as stock: the hole stops short of the top.
Underdog Saluki 27B 1.0: Right.
Saluki 14/14 · 4:13Right.
Qwen 3.5 9B Heretic v2: A round rod with no hole.
9B 4/14 · 3:36A round rod with no hole.

A 1/2" NPT pipe plug

A hex head and a tapered pipe thread, small end up.

A 1/2-inch NPT pipe plug. A hex head 22 mm across the flats and 8 mm tall sits flat on the bed, centred on the origin. On top of the head, a 1/2 NPT male thread of the standard length, with its small end at the top. The plug is solid, with no bore.
Qwen 3.8 27B RVN Heretic: Right, in 73 seconds.
Heretic 11/11 · 1:13Right, in 73 seconds.
Qwen 3.8 27B: Right: 14 threads per inch, the 1:16 taper the right way up, the right size.
Stock 11/11 · 10:03Right: 14 threads per inch, the 1:16 taper the right way up, the right size.
Qwen 3.8 27B, vision off: The thread tapers the wrong way.
Stock, blind 10/11 · 3:59The thread tapers the wrong way.
Underdog Saluki 27B 1.0: Right.
Saluki 11/11 · 14:56Right.
Qwen 3.5 9B Heretic v2: No hex head.
9B 8/11 · 2:32No hex head.

A 1/2" NPT coupling

A female pipe thread from each end, and a smooth bore between them.

A 1/2-inch NPT coupling: a round body 30 mm in diameter and 44 mm long, standing on the bed and centred on the origin, with a 1/2 NPT female thread of the standard length going in from each end, so a pipe screws into the top and another into the bottom. Between the two threads the bore is open and smooth.
Qwen 3.8 27B RVN Heretic: The bottom thread tapers the wrong way, and the top end is a plain bore.
Heretic 10/15 · 9:30The bottom thread tapers the wrong way, and the top end is a plain bore.
Qwen 3.8 27B: Closest: both threads, the right pitch, taper and size, a smooth bore. Both threads cut too shallow.
Stock 16/18 · 12:58Closest: both threads, the right pitch, taper and size, a smooth bore. Both threads cut too shallow.
Qwen 3.8 27B, vision off: Ran out of time with one thread cut.
Stock, blind 12/15 · 15:02Ran out of time with one thread cut.
Underdog Saluki 27B 1.0: Closed at the top; no thread it could find.
Saluki 8/12 · 15:01Closed at the top; no thread it could find.
Qwen 3.5 9B Heretic v2: No usable thread, and a flat ledge in the bore.
9B 6/12 · 6:06No usable thread, and a flat ledge in the bore.

A block copied from a picture

Sizes in words; where the holes and slot go, only from the picture.

Make the part in the picture. It is a 40 x 20 x 10 mm block with its corner at the origin (x 0 to 40, y 0 to 20). The two round holes go straight through, top to bottom, and are 5 mm across. The slot across the top is 6 mm wide and 4 mm deep. Work out where the holes and the slot are from the picture.
The picture the models were given: a grey block with two round holes through it, one in each half, and a slot across the middle of the top.
The picture each model was given.
Qwen 3.8 27B RVN Heretic: Right: the holes and the slot where the picture has them.
Heretic 12/12 · 2:11Right: the holes and the slot where the picture has them.
Qwen 3.8 27B: Turned the slot to run along the block instead of across it.
Stock 8/12 · 5:51Turned the slot to run along the block instead of across it.
nothing built
Stock, blind 0/1 · 15:01Can't see the picture, and built nothing in 15 minutes.
Underdog Saluki 27B 1.0: A plain block: no holes, no slot.
Saluki 7/12 · 5:34A plain block: no holes, no slot.
Qwen 3.5 9B Heretic v2: A block with one notch.
9B 7/12 · 1:18A block with one notch.

All six

ModelBracketPegsStandoffPlugCouplingPictureRight
Heretic5/1015/1514/1411/1110/1512/124 of 6
Stock10/107/1513/1411/1116/188/122 of 6
Stock, blind10/1015/1513/1410/1112/150/12 of 6
Saluki0/112/1514/1411/118/127/122 of 6
9B0/16/154/148/116/127/120 of 6

One run each, so a single result can swing either way. The stock model's bracket ran first, before the instructions gained a section on pipe threads; that section doesn't bear on a bracket.

What I learned

  • A 27B model on a laptop can make a correct NPT thread. Three of them made a fully right 1/2-inch NPT plug: the right pitch, the taper the right way up, the right size. None got the female coupling fully right. A pipe thread on the inside is the hard one.
  • Vision earns its keep on pictures, not on numbers. With every size given in words, the blind model did as well as the stock one, and faster. Given a picture, it built nothing.
  • The small model, and the fine-tune, tripped on the language itself. In OpenSCAD a shape can't be stored in a variable; it can only be built by calling a module. Saluki and the 9B both spent their ten attempts trying. One line in the instructions would likely fix that, but adding it now would make this comparison unfair.
  • BOSL2's female-thread cutter has its small end at the bottom. Subtract it as it comes, and a coupling ends up narrowest at both faces, so no pipe would ever thread in. I hit it building the reference part, and the abliterated model hit it too.
  • Grade the part, not the model's report. Every model ended with a confident summary. Several of those parts had a hole that didn't go through or a thread running the wrong way.
  • FreeCAD's mesh loader processes window events while it loads. So a timer fired in the middle of loading a version, started loading the next one, and nested forever. A guard against re-entry fixed it.
  • None of this replaces a frontier model. The best local model got four of six simple parts fully right on one try. That's useful when the cloud is down, and nothing to lean on otherwise.