A physical level-design toolkit. Seventy-one primitive parts — rectangles, cylinders, cones — that snap onto a peg grid to build any town, dungeon, inn or keep your table needs. Everything is a box or a circle on purpose: it prints in an hour, reads instantly across the table, and never fights the imagination for authorship.
One connector, one grid, one height. Every part in the system obeys these four numbers, which is what makes a wall printed today fit a tower printed next year.
One grid square, one mini. Wall height is also 25 mm, so 1U cubed is a cube — stacks, decks and floors all land on multiples of the same number.
Pegs sit at half-square intervals. Walls land on grid lines; furniture lands on square centres — both hit the same peg field, so nothing needs its own baseplate.
A 4 mm peg, 3 mm tall, 0.6 mm top chamfer. Socket is Ø4.3 × 3.4 deep. That's the entire mechanical vocabulary of the system.
Walls are 4 mm thick and straddle the grid line. A room's inside dimension is n×25 − 4 mm, which is still comfortable for 25 mm bases.
Seventy-one parts in seven families. Codes are permanent — a part number never changes meaning, so a build list written today still works after the set grows.
Four layouts drawn from the catalogue, with the exact parts list under each. Plans are true to scale — 1 square = 1U = 25 mm. Heavy dashed lines are baseplate seams.
The set is tuned for a stock 0.4 mm nozzle in PLA. The only number that matters is the socket diameter — print the fit comb (X-01) first and pick your tolerance before printing 40 walls.
| Setting | Value | Why |
|---|---|---|
| Layer height | 0.20 mm | Peg height 3.0 = 15 clean layers |
| Perimeters | 3 | Sockets need wall to grip against |
| Infill | 15% grid | Walls stay light; plates stay flat |
| Top / bottom | 4 / 3 | Peg tops must not pillow |
| Supports | none | Nothing overhangs past 45°, by design |
| Brim | off / 3mm | Only for the 100 mm baseplates if edges lift |
| Material | PLA | PETG creeps and the clutch goes slack |
| Plate time | ~55 min | Four 2U walls, or one 4×4 baseplate |
| Symptom | Fix |
|---|---|
| Walls fall off | Socket too big — drop 0.1 mm |
| Plates crack | Socket too tight — add 0.1 mm, chamfer the mouth |
| Pegs look squashed | Over-extrusion; add a 0.6 mm top chamfer, slow top layers |
| Baseplates rock | Bed not flat — print plates first, they're the datum |
Enough to build any of the four sample layouts and most things in between. Roughly 26 hours of print time and about 480 g of filament.
Nine parts printed in one azure spool, in an order that gets something usable on the table after 45 minutes. Water is the right family to start with: it is all flat plates, it needs no paint to read as water, and a plain baseplate in blue is open sea — so the cheapest part in the set is also the biggest piece of terrain.
Want to see it before you commit filament? Open the 3D viewer — the first two scenes are this batch and nothing else: the parts laid out flat, and the whole run assembled on a table.
Water gets three scales of relief, all of it free because it is all in XY: a rolling swell (0.55 mm, broad and soft), wave lines across it the way a map draws water (0.9 mm wide, 0.95 mm proud), and a few sharper crests on top. Plus the 2 mm recess below the bank. Straight off the bed that reads as water; a dry-brush of white over the crests is the only optional step.
The ford stones (B-14) and the shore edge (B-13) want a grey or sand dry-brush to separate them from the water. They are the only parts in the batch that are not meant to be blue.
Two river plates, a ford and four shore strips already build the Mill Ford layout above. Add the waterfall riser and a river can drop a level — which is when the height rule starts paying for itself.
Everything is one parametric OpenSCAD file. Change U at the top and the entire system rescales — 1-inch grid for hex-and-chit purists, 15 mm for a travel set.
peghold.scad // whole system, one file
U = 25; // one square
WALL_H = 25; // one storey
T = 4; // wall thickness
PEG_D = 4.0; // the connector
SOCKET_D = 4.30; // <- the one number you tune
// render a single part:
part("W-07"); // 2U wall with a doorway
part("B-01"); // 4x4U baseplate
part("P-01"); // round table
// or lay out a whole print plate:
plate(["W-02","W-02","W-02","W-02","W-04","W-04"]);