Phone Stand
A one-piece desk stand for a smartphone with no moving parts: just drop the phone into the tilted cradle. The side profile is built from points along the phone's tilt direction, so the backrest, slot and front lip keep their shape at any angle, and an open truss frame supports the cradle. A cable channel runs from the bottom of the slot through the frame and out the back, so you can charge the phone while it stands. Overall size is 82 x 70 x 100 mm with the default settings. For the strongest part without supports, print it lying on its side (rotate 90 degrees in the slicer). You can change the phone tilt angle, phone thickness including the case, stand width and cable channel width.
# Phone Stand - adjustable angle and phone thickness, with a cable pass-through
# A single piece: the side profile is drawn on the XZ plane and extruded along Y (width). No moving parts.
# Coordinates: X+ is the front (screen side), Z+ is up. The phone leans toward X- (back) onto the backrest.
@param 50..80 desc:"Phone tilt (angle from horizontal, deg)"
angle = 65
@param 6..16 step:0.5 desc:"Phone thickness (including case, mm)"
phone_t = 11.0
@param 50..90 desc:"Stand width (mm)"
width = 70
@param 8..16 desc:"Cable pass-through width (mm)"
cable_w = 12
clear = 1.0 # cradle slot clearance over the phone thickness (total)
lift = 32 # height of the cradle floor (room below for the cable plug)
back_len = 75 # backrest length (from the slot floor, along the slope)
back_t = 5 # backrest thickness
floor_t = 4 # cradle floor thickness
lip_h = 12 # front lip height
lip_t = 4 # front lip thickness
base_t = 4 # base plate thickness
frame_w = 5 # frame width of the lower truss
rear_extra = 10 # base plate extension behind the backrest (prevents tipping backward)
front_extra = 3 # base plate extension in front of the frame's front edge
# Direction vectors: u = up along the phone (leaning back), n = screen-side normal
ux = -cos(angle)
uz = sin(angle)
nx = sin(angle)
nz = cos(angle)
g = phone_t + clear
# Back corner of the cradle floor P0 = (0, lift). Points below are built as P0 + s*u + t*n
def px(s, t) = s * ux + t * nx
def pz(s, t) = lift + s * uz + t * nz
# Tilted U-shaped cradle (backrest + floor + front lip)
cradle = workplane XZ | polyline [
(px(-floor_t, g + lip_t), pz(-floor_t, g + lip_t)),
(px(lip_h, g + lip_t), pz(lip_h, g + lip_t)),
(px(lip_h, g), pz(lip_h, g)),
(px(0, g), pz(0, g)),
(px(0, 0), pz(0, 0)),
(px(back_len, 0), pz(back_len, 0)),
(px(back_len, -back_t), pz(back_len, -back_t)),
(px(-floor_t, -back_t), pz(-floor_t, -back_t))
]
# Frame supporting the cradle. Its front edge runs down to the floor parallel to the phone (extending the lip's outer face).
# The inside is removed with offset to make a truss
xr = px(back_len, -back_t) # X of the back side of the backrest top
xa = px(-floor_t, g + lip_t) # point A at the bottom (front) of the lip
za = pz(-floor_t, g + lip_t)
xf = xa + za * cos(angle) / sin(angle) # point reached from A along -u down to the floor (z=0)
web = workplane XZ | polyline [
(px(-floor_t, -back_t), pz(-floor_t, -back_t)),
(xr, pz(back_len, -back_t)),
(xr, 0),
(xf, 0),
(xa, za)
]
window = web | offset (-frame_w)
base = workplane XZ | rect (xf - xr + rear_extra + front_extra) base_t at:((xf + xr + front_extra - rear_extra) / 2, base_t / 2)
profile = cradle + web - window + base
# Cable pass-through (1): from the cradle floor down along the phone, through the frame's top bar into the window
s0 = 1 # start slightly above the slot floor
s1 = -(floor_t + frame_w + 6) # through the frame's top bar into the window
slot = box (g - 3) cable_w (s0 - s1)
| rotate 0 (angle - 90) 0
| translate (px((s0 + s1) / 2, g / 2)) 0 (pz((s0 + s1) / 2, g / 2))
# Cable pass-through (2): notch from the window floor through the rear post to the back
notch_h = 10
notch = box (frame_w + 4) cable_w notch_h
| translate (xr + frame_w / 2) 0 (base_t + 0.5 + notch_h / 2)
profile
| extrude width
| translate 0 (-width / 2) 0
| diff slot
| diff notch