I tackled the Spent Spool Storage System (R2S4) project to answer a prompt/challenge “what can we do with spent spools”. Pleased with the result, I was given another prompt: the drawers of a rolling toolbox storing fasteners are filled with boxes of various sizes, exactly as shipped from McMaster-Carr. When we want to grab a fastener from the drawer, it gets to be a pain to read through different label formats to find the right box, then opening the box to verify the fastener is as expected, before removing whatever quantity is required for the project at hand. It’s also not very space efficient, since many of the cardboard boxes are much larger than they need to be.
Can I do better?
Existing Solutions
While I sometimes take on projects just for the sake of learning how to do it myself (I’m currently in the “it is good CadQuery practice” phase) I still think it’s worth spending time to look around and see if a solution exists. Several web searches pointed to Gridfinity, a 3D-printable storage system design built around a standardized unit. Larger bins can be created as multiples of the basic dimension and each tray is held in place with a matching grid base plate. Optional magnets allow the bases to be held more even securely, and the bins can stack vertically on top of each other. Gridfinity is really cool and I like a lot of its concepts except for two particular aspects that make it a less ideal fit for the goal at hand:
Fixed Cell Size: Gridfinity cell size is a feature but also a bug. If we wanted to use Gridfinity in this drawer of fasteners, we would inevitably end up with some space on the sides because this drawer’s internal dimensions are not a clean multiple of Gridfinity cell size.
Filament Use: Gridfinity is designed to be sturdy enough for general purpose, including being strong enough for vertical stacking. This robustness comes at a cost of filament efficiency. Even “thin” trays have walls several millimeters thick. This is overkill if we have a specific application in mind that is light duty and does not require stacking. Such as displaying an array of small nuts, and washers.
My favorite approach to reduce material consumption is to print in “vase mode”, where the print head makes a single loop around shape perimeter leaving a thin wall only as thick as the print nozzle output diameter. (Typically 0.4mm.) Vase mode was the approach used by a few 3D printable storage trays published online. For example this particular design (which I heard about from Alpenglow Industries.)
Making Different Tradeoffs
I started designing a storage system based on a different set of tradeoffs than those made by Gridfinity.
Adjustable Cell Size: I still want my system to be laid out on a grid, but the size of individual cells on that grid can be adjusted to make full utilization of any given space. The idea is that I should be able to turn any given container into a “tackle box” of fully subdivided storage units. Unlike Gridfinity, it means trays printed to one grid size won’t fit with trays made to another, but I’m OK with that for my project.
Minimize Filament Use: I wanted to design a system that I can print in vase mode for minimal filament use in light duty applications. I don’t think I’m giving up the option of stronger trays because I expect heavier duty trays can be printed with thicker walls while still conforming to the same grid.
Interlocking: As part of reducing filament use, I wanted to skip Gridfinity’s base plate. The solution came to me as I was experimenting with vase mode printing. Since vase mode only prints a single perimeter, long straight walls tend to buckle and sag unless we add some structural support features. I had been adding ribs of either triangular or hexagonal profile, but it occurred to me I can solve two problems at once: I can design dovetails into the sides of the tray, and those dovetails will serve as both vase mode structural reinforcement as well as a functional way to lock adjacent trays together.
I will design a storage system that uses interlocking dovetails to keep trays together, and those trays will be sized to fit on a grid of these dovetails. Hence the name of the project: Dovetail Storage Grid.
Prototype
Once I had established my project objectives, it was time to start prototyping.

I started with tiny trays to verify my dovetail interlock concept works in a vase mode printed shape, and to find the optimal size for these dovetails. It looks like the ideal grid size for vase mode printing with 0.4mm nozzle is in the ballpark of 15-20mm. Any smaller and they have trouble locking together. Any larger, and the flat sides become big enough to distort while printing. I can vary grid size within that range in order to fully utilize a specific space.

My first test of this concept is to fill an Adafruit shipping box, because Adafruit is where I buy a lot of my little electronic bits and bobs that need organizing with so I might as well make use of the boxes. The gaps visible all around the trays in this picture show this first attempt failed to fully utilize space. Some of the lessons learned were:
- When choosing a grid size by diving up a space, don’t round to the nearest millimeter. I rounded down and that little difference added up to a bad fit when multiplied by the number of grid cells.
- If the goal is for a completely full fit, I need an option to skip printing dovetails for trays destined to sit around the outside because they’re not interlocking with an adjacent tray. The slots across the back and right sides took away usable volume, and the tabs across the front and left sides actually protrude out of the grid and ruin the fit.
At least the height worked out as expected!

I also learned that, despite the dovetails acting as reinforcement ribs, I will still have distortion as the trays grow beyond around three cells wide. The exact limit will vary on different printers using different filament. This particular four-wide tray bent enough during printing that the handle/label area in front couldn’t hold together.
Production
After incorporating lessons from the Adafruit box test run, I felt confident enough to start cranking them out for deployment to the fastener drawer.

Since the light duty trays are printed in vase mode, they had to be printed one at a time on a 3D printer bed. Despite this limitation it is still possible to print multiple trays in a single print job by utilizing PrusaSlicer’s Sequential Printing capability. (UPDATE: PrusaSlicer 2.9.1 included features that made sequential printing a lot easier to use.)

What about the heavier duty trays with thicker walls? They could be printed simultaneously and, because there’s a gap between trays (adjustable, default is 0.2mm) it is possible to print trays in their interlocked position in order to maximize print volume utilization. Here’s a picture taken during an interlocked print. The picture is slightly blurry because the print bed is moving and my camera couldn’t focus precisely.

And here’s a picture after my Pulse XE has completing printing 19 trays together. I tried printing 20 but there was a persistent print adhesion issue with the front right corner that I couldn’t solve so I deleted that corner unit from my print job.
Success of this interlocked print technique is highly dependent on a printer’s dimensional precision. (Versus accuracy, link to Wikipedia review.) Here are some data points ranked by success:
- Prusa MK4 interlocked print separated with only minor effort.
- Prusa Mini+ took slightly more effort.
- Pulse XE took significant effort. Much twisting and shoving and pounding and generous application of bad words.
- A low mileage Creality Ender 3 V2 took even more effort than Pulse XE. It wasn’t fun but after our effort we did get usable trays out of the print.
- A high mileage Creality Ender 5 could not do it. All the trays fused together into a single blob. Trays would be distorted to be unusable or outright destroyed by the time they were separated from their neighbors.
Deployment
Once we had the collection of trays on hand, it was time to put them to work organizing the collection of fasteners in the big sliding drawer.

Initial signs are very promising! Thanks to that tiny gap making interlocked print possible, individual trays can be easily lifted out for use. In its absence, its neighbors will maintain formation thanks to their interlocking dovetails, maintaining the space so it’s easy to later slide a tray back in position.

The dovetails also prevent the trays from sliding all over the place when the drawer is opened and closed, which was a problem with cardboard boxes. Speaking of which, here’s a picture of the drawer partway through the conversion process. To the left are fasteners in their new trays, and to the right are fasteners still in their varied boxes and bags.
Future Evolution
One of the goals of this storage system was to increase space efficiency in this fastener drawer. The variable tray size accomplished this very well. Allowing us to use trays just big enough to hold what’s needed instead of a generic cardboard box with a lot of empty unused space inside. It looked like we might have doubled or tripled the capacity of this drawer, but that was only in theory. In practice we ran into a new problem: packing things tightly meant a lot of weight and now we are weight constrained. Meaning we would exceed the weight limit for the drawer before we run out of space packing it with tiny bits of steel. Oops. Well, at least the space efficiency of this system meant we have room to spare that we can use to improve user experience in other ways.
One potential evolution is to add visual distinctiveness. Using this tray system meant we lost the visual cue of different packages and it would help to add some visual cues to help us find the fastener we seek. The easiest approach is to place some one-grid-wide and/or one-grid-long trays and leave them empty purely to serve as visual dividers. Another idea is to print trays using different color filament so we can, for example, use one color for M3 fasteners/washers/nuts/etc. Then a different color for all M4, another for all M5, etc.
While those ideas are being discussed, these uniform orange trays will at least make finding things a little easier than rummaging through a pile of assorted boxes and bags.
Publishing V1
With a better-organized fastener tray, I declare this project a successful version 1.0. I cleaned up the code and made it publicly available on GitHub: https://github.com/Roger-random/storage_grid
The tray generator is written in CadQuery. If you are comfortable setting up a command line Python virtual environment to install CadQuery, you should have no trouble running my script.
For people who are not comfortable with such things, as an alternative my GitHub repository includes a notebook file that can be opened in Google Colab. A web-based Python virtual environment and Google’s variation on a Jupyter notebook. My repository README has more details on how to use it. Anyone with a Google account can load up my script in a Colab notebook, install CadQuery on that Colab virtual machine, run my script, and generate STL files for 3D printing. All without having to install CadQuery on their own computer.
If you are not comfortable with the Python command line and anti-Google, it should be possible to use my notebook on another Jupyter provider (Amazon SageMaker, GitHub Codespace, Kaggle, or your own private Jupyter Lab.) but you’ll have to figure out the details for yourself.
This project is publicly available on GitHub: https://github.com/Roger-random/storage_grid







