SD Card and USB Stick Holder
A desk organizer that holds SD cards, microSD cards and USB-A sticks upright in three rows. The rows are tiered, with microSD in front, USB in the middle and SD at the back on the highest step, so the labels of every card stay visible. Slots are sized from the SD and USB standards plus a clearance, and each card sticks out enough to grab with your fingers. The default version for 8 SD, 10 microSD and 4 USB sticks measures 53.6 x 58.8 x 20 mm, and the length grows automatically with the counts. Print it flat side down with no supports. You can set the number of SD cards (1-16), microSD cards (1-20) and USB sticks (1-10), the slot clearance and the wall thickness.
# SD / microSD / USB Stick Holder - tiered rows so every label stays visible
#
# Three rows from front to back: microSD -> USB-A -> SD. Each row sits on a higher step than the one in front,
# so the labels of the cards at the back stay visible. Slots in each row are laid out with `grid n 1 pitch`.
# Cards stand upright (thickness along X, width along Y, length along Z).
#
# Axes: X = slot row direction, Y = front (-) -> back (+), bottom z=0.
@param 1..16 desc:"Number of SD cards"
n_sd = 8
@param 1..20 desc:"Number of microSD cards"
n_micro = 10
@param 1..10 desc:"Number of USB sticks (USB-A plug)"
n_usb = 4
@param 0.2..0.8..0.05 group:"Fit" desc:"Card-to-slot clearance (total) (mm)"
clear = 0.6
@param 1.6..4..0.1 group:"Body" desc:"Wall between rows and around the outside (mm)"
wall = 2.5
# --- Card standards (SD Association: SD 32x24x2.1, microSD 15x11x1.0) ---
sd_w = 24
sd_l = 32
sd_t = 2.1
mi_w = 11
mi_l = 15
mi_t = 1.0
# USB-A plug (metal shell) 12x4.5, inserted length about 12 (USB 2.0 outline, rounded)
usb_w = 12
usb_t = 4.5
usb_l = 12
# --- Slot size = standard + clearance ---
sd_x = sd_t + clear
sd_y = sd_w + clear
mi_x = mi_t + clear
mi_y = mi_w + clear
usb_x = usb_t + clear
usb_y = usb_w + clear
# Insertion depth (the rest is left to grip with your fingers)
sd_depth = 18 # 14 of 32 sticks out
mi_depth = 9 # 6 of 15 sticks out
usb_depth = usb_l # the whole plug goes in
# Row pitch (slot width + divider)
sd_p = sd_x + 3
mi_p = mi_x + 2.5
usb_p = usb_x + 3.5
floor_t = 2
margin = 4 # margin from the end slots to the outside
# --- Outline ---
$len = max(n_sd * sd_p, n_micro * mi_p, n_usb * usb_p) + 2 * margin
# Row boundaries along Y (from the front)
y0 = 0
y1 = y0 + wall + mi_y + wall / 2 # back edge of the microSD row
y2 = y1 + wall / 2 + usb_y + wall / 2 # back edge of the USB row
y3 = y2 + wall / 2 + sd_y + wall # back edge of the SD row = total depth
h_mi = floor_t + mi_depth
h_usb = floor_t + usb_depth
h_sd = floor_t + sd_depth
# Row center Y (whole part centered on Y=0)
yc = y3 / 2
c_mi = (y0 + wall + mi_y / 2) - yc
c_usb = (y1 + wall / 2 + usb_y / 2) - yc
c_sd = (y2 + wall / 2 + sd_y / 2) - yc
# Stepped side profile (drawn directly on the YZ plane, extruded along X)
body = workplane YZ | sketch [
(y0 - yc, 0), (y3 - yc, 0), (y3 - yc, h_sd),
(y2 - yc, h_sd), (y2 - yc, h_usb),
(y1 - yc, h_usb), (y1 - yc, h_mi),
(y0 - yc, h_mi)
] | extrude $len | translate (-$len / 2) 0 0
| edges =Z | fillet 3
# --- Slots (make one, copy it n times with grid) ---
sd_slots = box sd_x sd_y (sd_depth + 1) | floor
| translate 0 c_sd (h_sd - sd_depth)
| grid n_sd 1 sd_p
mi_slots = box mi_x mi_y (mi_depth + 1) | floor
| translate 0 c_mi (h_mi - mi_depth)
| grid n_micro 1 mi_p
usb_slots = box usb_x usb_y (usb_depth + 1) | floor
| translate 0 c_usb (h_usb - usb_depth)
| grid n_usb 1 usb_p
body - sd_slots - mi_slots - usb_slots