All dispatches
2026 · 09 · 01Release · ProtoCAD

ProtoCAD, a low-poly modeller you can use in a browser tab

The third Workshop prototype is a tool rather than a game: a small 3D editor for chunky, hand-painted models, running live on the site with nothing to install and nothing uploaded.


ProtoCAD is now running on the site. It is a browser-based editor for low-poly 3D models with texture painting built in, and unlike the two prototypes before it, it is a tool rather than something to play.

It is aimed at the kind of model that fits in a game jam: a chunky prop, a character made of six boxes, a chair with a hand-painted texture. Drop in some primitives, drag vertices around, paint a small sheet, export a .glb. Nothing is uploaded anywhere, and projects are plain JSON files you keep.

Modelling

Box, plane, pyramid and cylinder primitives, with per-vertex, per-edge and per-face editing on top. Extrude, inset, subdivide, bevel and loop cut. Extruding several faces at once grows them as one welded shell rather than as separate boxes that happen to touch, which is the difference between modelling a limb and modelling four sticks.

The live mirror is a modifier, not a one-off: model half a thing and watch the other half follow, with the seam welded and faces crossing the plane cut at it. The file keeps only the half you authored. “Apply mirror” turns it into real geometry when you want to break the symmetry.

Move, rotate and scale gizmos work on objects or on any vertex, edge or face selection, and selections span objects, so two primitives can be aligned and edited as one thing. Dragged vertices snap onto nearby geometry with a marker showing the target, which is how two shapes meet exactly instead of nearly.

Texturing

One small texture sheet for the whole model, picoCAD-style, painted in the app. Pencil, eraser, fill, eyedropper, gradient, and line, rectangle and ellipse tools, with a marquee and a colour wand for selections, alpha lock, and mirrored painting. The UVs of the selected faces are drawn over the canvas so you can see what you are painting.

The Paint tool puts the same brush straight onto the 3D view: click the model and the sheet takes it, through whatever the UV mapping says. Hovering shows the exact texel footprint clipped over the surface before you commit.

128x128 by default, switchable to 256 or 512 whenever a model outgrows it, with the art scaling so the model looks the same afterwards. The palette travels with the file, so opening someone else’s model gives you the colours it was painted from.

Files and export

Save and load .protocad JSON. Export GLB as one self-contained file with the texture embedded, readable glTF, or OBJ with its MTL and PNG. Unlit faces travel via KHR_materials_unlit, folders come across as real nodes, and object timelines become standard transform channels. There is also a presentation export: a transparent PNG of the current camera, or a fitted turntable sprite sheet.

There is a headless CLI and library too, sharing the exporters the buttons call, so a scripted export cannot quietly differ from a clicked one. It can also render a diagnostic view of a model and report geometry that loads fine while being wrong.

How it was built

TypeScript, SolidJS, Three.js and Vite, in four layers with a one-way dependency rule. The geometry, UVs, texture operations and every exporter are pure functions in a core layer that imports no renderer and no UI, which is why the same code runs in a terminal.

Like Infinite before it, this repository is primarily agent-driven: most of the code was written by coding agents rather than typed by hand, and the codebase is shaped for that. Invariants are stated in prose and pinned by tests, comments explain why rather than what, and the architecture document is treated as load-bearing rather than decorative. Human review still gates what lands.

It is early, and it has sharp edges. glTF import is missing, bevel is single-segment, and the mesh checker exists but is only reachable from the CLI, so a fault is still invisible while you model.