WaveBoxes: an Interlocking Organizer System




Waveboxes are 3d printed objects, that can be assembled together by sliding their interlocking faces one against another.

They will allow you to design and build customized organisers, that can be reconfigured at will, by merely adding, displacing or removing boxes.

using the provided library, you'll be able to build boxes of arbitrary sizes, dividers for your boxes, drawers, baskets and plates to store small objects (eg screwdrivers bits) , with just a few lines of easy to understand instructions.

The interlocking pattern allows you to assemble your boxes, without having to keep them aligned : you can add a box anywhere along the edge of another box. just slide it from the top, and you're done.

Step 1: What You Will Need

  1. OpenSCAD, version 2015.03 or higher: this is an awesome, free, Open Source procedural 3D Modeler, available for windows, Mac OS X and Linux download it from http://www.openscad.org/downloads.html
  2. wavebox.scad : the OpenSCAD library that i wrote for this project.
  3. Some way to 3d print stuff : if you dont own a 3D Printer, you can use an online 3D printing platform, such as 3D Hubs or Shapeways

Step 2: Set It All Up and Design Your First Box

OpenSCAD installation is pretty straightforward : download the installer, execute it, and you're done.

Now create a new folder (you may name it 'MyBoxes', or whatever pleases you), and download the two attached files into it.

double-click the "WaveBox_Template.scad" file, that should start OpenScad and load your file in it.

if it doesnt, locate the OpenSCAD icon, start it, and use the "File" menu to navigate to your folder, and open the template file.

You should see a screen similar to the picture above.

press F5 to preview your box

press F6 to have it rendered

press the STL button to export the resulting model, et voila !

congratulations, you just created your first WaveBox.

all your model files will look like the template we just used : they'll start with the line

include <wavebox.scad>;

followed by the actual definition statements for your objects.

remember that the "wavebox.scad" library file must always be in the same folder as your model file.

Step 3: Using the Library : the Box

the box statement we just used had no parameters, so it used the defaults, that is :


L and W (Length and Width) are expressed in terms of number of occurrences of the interlocking pattern. Using the global defaults (we will cover this later), a pattern occurrence is roughly 7.5mm wide.

H (Height) is directly expressed in millimeters.

so, by using


You'd get a 30x45x20 mm box, (internal dimensions) , with the protruding pattern adding 7.5mm to all faces, that is, 45x60x20mm overall.

Note that parameters can be specified by order or by name, that is, you could also write this as


the two other parameters , wall_thck and bot_thck, are used to control the thickness of the walls and floor.

their default value is 0.8mm

Step 4: Enriching Your Boxes : the Splitter

Splitters are used to create separations inside a box.

the default values for the splitter are as follow :


L and W are the dimensions of the box that will receive the splitter. you must use the same values for the box and for the splitter

H is the height of the splitter. you can choose to make it smaller or taller than the receiving box

divx and divy control the number of divisions (cells) that will be created by the splitter on the Length and Width of the box

ep controls the thickness of the dividing walls

reduc allows some slack to ease the insertion of the splitter in the box

the illustration above shows the result of the following code :

translate([-80,0,0]) splitter(8,12,40,3,3);
translate([80,0,0]) splitter(8,12,20,2,5);

the translate statements are part of the core OpenSCAD langage : they are used to displace the splitters on the X axis by 80mm on each side, so they stand away from the box

the resulting file can be fed directly to a 3D printer, resulting in a box and two different splitters.

Step 5: Baskets and Plates : Stacking Stuff Inside a Box

Wavebox also provides baskets and plates, that can be inserted into boxes, along with stems to be used as handles for them, and "toes" that can be added to boxes in order to prevent plates to sink all the way down.

lets have a look at the code used to produce the box in these images

toes(6,6,alt=50,corners=1); toes(6,6,alt=80,corners=2);
translate([-60,0,0]) basket(6,6,30,corners=3);
translate([-90,-20,0]) rotate([0,0,90])stem(100,1);
translate([0,-60,0]) drill(6,6,5,5,1) {plate(6,6,10,corners=1);hex(6);}
translate([-60,-60,0]) drill(6,6,5,5,1) {plate(6,6,10,corners=2);cyl(5);}

it starts with a classic box, with two sets of toes

toes are used as stops, to prevent plates from sinking to the bottom of the box

the default parameters are


as usual, L and W must match the box that will have toes added to it

alt stands for altitude, and defines the height at which the plate shall be stopped

corners can be either 0,1,2 or 3. 0 means no corner will have stoppers, 1 is for NE/SW corners, 2 for NW/SE, and 3 for all corners. This allows to place two sets of toes at different height with alternates corners, so that two plates with matching alternate corners will sink at two different altitudes.

a basket is a little box that fits inside a wavebox, traversed by a hole to receive a stem that acts as a handle.


L and W must match the box, H sets the height of the sides , fond sets the thickness of the floor, ep sets the thickness of the walls, reduc sets a slack to allow smooth insertion.

corners uses the same notation as the corners parameters of toes, but instead of adding toes, it adds sockets that will allow the basket to pass the toes.

in this example, we use corners=3 to let the basket sink all the way down.

also note the way we used to set parameters for the basket :


L,W and H are specified in order, but as we want to specify corners without having to set values to fond, ep and reduc, we use the parameter name notation for corners.

stem is pretty straightforward : it only takes a length and a boolean value to determine if a foot should be added at the end of it (you can make a footless stem and glue it to the basket)


plates are some special kind thick, of border-less baskets. i use them to store screwdriver bits or cutter blades (pro tip : using a plate inside a drawer to store blades is a bad idea)


in order to use plates, you have to drill some holes into them

the syntax of this operation is a bit unusual : drill does not define an object, it modifies it instead.

drill(L,W,nL,nW,fond,corners=0) {plate();hole()}

in this example

drill(6,6,5,5,1) {plate(6,6,10,corners=1);hex(6);}

this will create a 6,6,10 plate, and then drill it with a 5x5 array of holes, leaving a 1mm floor under the holes.

the holes will be hexagonal, with a 6mm diameter.

wavebox defines 3 predefined hole types, but you can use any valid OpenSCAD statement to drill your plate.


Step 6: Going Horizontal : Drawers

3D printing hates overhang.

for our boxes, that means that we always have to print the interlock pattern vertically, and that boxes will always have aligned patterns.

WaveBox provides a way to mix vertical and horizontal boxes (drawers) by providing an Horizontal to Vertical Adapter.


will produces 2 matching plates.

glue them together, and use them as a link between sets of horizontal and vertical boxes.

chirality warning ! depending on the way you glue your plates together, the resulting object will allow for left or right attachment, but not both.

to avoid errors, attach your plates to the elements that you want to assemble, and check that you can place them the way you intend to, then note the orientations of the plates and glue them together.

you can now use your horizontal boxes to receive drawers :


note that this time, length sets the value that was used as Height for your box.

ep sets the thickness of the walls, and reduc provides the usual slack to allow an easy insertion in the box.

Step 7: Global Parameters

//interlock pattern metrics:
scale=2; //pattern scale.
slack=0.65; //slack between male and female parts of the pattern
//default box metrics
wall=0.8; //wall thickness
bottom=0.8; //floor thickness (floor is a keyword, so lets call this 'bottom' )

there are a few global parameters, that can be overridden by assigning them new values at the beginning of your object definition file.

scale defines the scale of the pattern. modifying it will change the "size = 7.5mm x n" rule. I have not tested other values, finding a working interlocking pattern was a painful process, i stuck to the one that worked once i found it.

of course, you will not be able to assemble boxes printed with different scales

slack is an interesting and important parameter : it defines the extra space that exists between the male and female parts of the pattern. a smaller values yields tightly attached boxes, that are difficult to assemble and disassemble, and will need a fair dose of post-print cleanup.

On the other hand, a larger value will create loosely attached boxes, very easy to assemble, but you will not be able to grab and lift a box set without it falling appart.

0.65 mm works pretty well for me, it's the sweet spot for my printer, allowing easy assembly and good grip.

you should experiment with small boxes until you find a value that suits your needs.

you can mix boxes printed with different slack values.

wall and bottom defines the thickness of the walls and floors of your boxes.

Step 8: Printing

WaveBoxes are easy to print, but can take a fairly long time

4x4x10	0h43	0,66m		6g	
6x6x50	2h43	3,94m		35g
6x6x80 4h15 6,11m 54g
6x8x40 2h37 3,77m 33g

these are timings and plastic utilization on my My Ultimaker Original +, with 0.2mm layers, 0.4mm nozzle, 0.8mm walls, 20% infill, 40mm/s with external wall printed at 25mm/s.

0% infill is ok, if you dont need your boxes to be sturdy.

i successfully printed them with PLA, ABS and HIPS.

finding the right parameters will take some try and errors. Check the path generated by your slicer beforehand. with some adjustment, you can have it draw the pattern with near zero retraction.

avoid to use a 'fat' first layer, the 'elephant foot' would make boxes assembly difficult.

3D Printing Contest 2016

First Prize in the
3D Printing Contest 2016



    • Games Contest

      Games Contest
    • DIY Summer Camp Contest

      DIY Summer Camp Contest
    • Planter Challenge

      Planter Challenge

    13 Discussions


    2 years ago

    This is really cool. I'm going to print some out!


    3 years ago

    Wow. We *need* this at the hackerspace. So very well documented.

    9 replies

    Reply 3 years ago

    I'm really glad to know like it. The lack of feedback so far was kinda saddening :s

    As this instructables is running for the 3d printing contest, I'm not allowed to modify it till the judging process ends, but I plan to add a few steps about advanced customization. Stay tuned and check back in about two weeks.

    Thanks again for the nice words ☺


    Reply 3 years ago

    Will there be a vote button? Am I too late? Or will this be judge-only?


    Reply 3 years ago

    Voting is over, now it's up to the judging process.


    Reply 3 years ago

    And might you know when results shall come? Probably all contestants are worthy of reading...


    Reply 3 years ago

    By the way, as soon as the new metal j-head arrives from China (burnt the old plastic one) I'm gonna build those boxes like crazy! With at least 64% infill!


    Reply 3 years ago

    you may first have a look at what you get with 20% infill and beefed up default values for wall and bottom

    as little as { wall=1.2;bottom=1; } yelds a sturdier feeling


    Reply 3 years ago

    My printer never did well with so little infill, will have to test as soon as I'll have the newer j-head installed.