print-bench

pop-fidget-card

A print-in-place 1st-birthday keepsake card (brief: issue #342) themed on a bubble/"POP" party motif — built for the parents, who keep fidgeting with it after the party. Flat landscape card, displays on a shelf via a punched easel flap, with four working fidgets printed in place on its face. Hard constraint: test-slice under 2 h; target 60 min on a fast modern printer.

Overview

Studio product shot of the bubble-pink 3D-printed pop-fidget-card

Hero Detail 1 / 8

Studio product shot of the bubble-pink 3D-printed pop-fidget-card

A print-in-place 1st-birthday card that is also a fidget toy — for the parents. The bubble-themed face carries four working mechanisms straight off the print bed, no supports, no assembly: two captive bubble spinners, a bistable "pop" button that snaps between two states, a captive bubble bead gliding on a slider track, and a punched easel flap (the big "1") that folds out on a print-in-place piano hinge to stand the card on a shelf. Personalise it at slice time — the child's name is one parameter — and print the whole thing in ~80 minutes on an MK4-class machine, closer to an hour on a fast Bambu.

The easel fold in motion — out to its ~97° built-in stop and back; the printed pose is flat (0°).

The hot path: the bubble spinners a thumb will work thousands of times, turning.

All the way around the bubble — the whole card, edge-on and slim, from every side.

What you get

  • pop-fidget-card — the card, one print-in-place piece (112 × 80 × 2.4 mm plate; fidgets rise ≤ 8 mm above the face).
  • pop-fidget-card-coupon — a 72 × 56 mm "print this first" tile with all four mechanisms (spinner, slider, hinge, pop button): a ~45-minute tile that saves an ~80-minute reprint, and the only way to feel the button's snap before the card commits. The hinge is why this matters — it's what failed the first real print, so fold the coupon's easel once and confirm it swings clean before you commit the full card.
  • Material: plain or matte PLA (any color; pastels suit the theme — but skip silk and glitter fills: their strings land exactly in the 0.2 mm rotor gap and the bead slot; an optional filament swap at the first text layer two-tones the lettering — and every other raised feature with it, which is the charm; set the color change at 2.4 mm = layer 13 on the 0.20 profile, since everything raised lifts off the face together)
  • Layer height: 0.20 mm (the axial clearances are quantized to it)
  • Infill: 15 % (the plate is mostly top/bottom skins)
  • Supports: none needed — every overhang is 45° by construction
  • Brim: none — the moving parts are bed-anchored islands
  • Seam: Back or scarf, not Aligned — the rotor bores and the hinge barrels are mating surfaces (the pin rotates inside the barrels), and an aligned seam stacks a ridge down the bore that stiffens the spin or the fold. If a rotor stays stiff after break-in, also set gap-closing to 0.1 mm (the 0.2 mm default merges exactly this clearance) and re-check on the coupon; that 0.1 mm also covers the flap's bottom perimeter, so a stiff first fold benefits too
  • Orientation: as modeled, face up
  • First motion — break it in before you gift it: spin both rotors and push the bead firmly once (this shears the deliberate break-free welds), pop the button a few times, fold the easel out to its stop (~76–80° leg angle → the card leans ~12–15° back off vertical). The first fold is firm — that's the bottom layer's squish, not a fused hinge; fold straight out in the fold plane and it frees. Doing this the night before means the parents receive a working toy, and a mushy button surfaces at your desk, not at the party

A note for gift-givers: this is a keepsake for the grown-ups' shelf. It is print-in-place, so nothing detaches by design, but it is not a teether — don't hand it to the birthday kid unsupervised.

Parameters

ParameterDefaultWhat it does
card_name""The child's name — set at slice time with -D 'card_name="ALEX"'; empty prints the generic card. Setting a name auto-shortens the greeting (drops "BIRTHDAY") so HAPPY 1st, <name>! fits at full stroke width for names up to ~15 letters; a longer name fails the render with a clear error (shorten the name, or set greeting_named). The committed previews are all the generic card, so slice-preview your name once before committing the 2½-hour print — it's the one line no preview here can show you
greetingHAPPY 1st BIRTHDAYBottom line on the unnamed card (! appended)
greeting_namedHAPPY 1stBottom line on the named card — the name and ! are appended (HAPPY 1st, ALEX!)
spinner_count2Bubble spinners (0–2) — drop to 1 to shave a measured ~11 minutes, the only time lever that pays (NOTES.md has the sweep; infill and card size barely move the meter)
xy_tol0.21 mmSpinner bore ↔ post radial gap — tune on the coupon (field-set from 0.20)
with_easeltrueThe punched "1" easel flap + hinge. Set false to print the card with no fold-out stand (the window fills solid)
tog_beam_t1.3 mmPop-button snap-beam thickness — 1.3 is PLA-tuned (softer snap); PETG can use 1.5
slide_tol0.25 mmBead stem ↔ slot sliding gap per side
hinge_clear0.4 mmEasel hinge pin clearance on every bore surface
card_w / card_h112 / 80 mmCard face size

All parameters are at the top of pop-fidget-card.scad, grouped in Customizer sections; override on the command line with -D 'name=value'.

Assembly & use

Nothing to assemble. Print the coupon first if this is your first run on a printer (tuning order and steps are in NOTES.md "Print this first"), then the card. After the break-free first motions everything runs free: the spinners flick from the rim scallops, the pop button clicks between its two states, the bead glides between the track ends, and the easel flap folds out to its built-in stop so the card stands leaning back ~12–15° on a shelf. One shelf habit: park the button flat (its as-printed state) — a PLA arch left popped for months slowly creeps and the snap softens; parked flat it will still snap for the second birthday. Printing it "stronger" doesn't help: a deeper dome raises snap force and stored strain together. If a fit is off, retune its parameter on the coupon and reprint. This design has one real print behind it (2026-08-22, PLA) — the field-test log in NOTES.md records what it found and what changed since. v0.2 addressed a PLA-softer button beam, a sliceable bubble-shine, and an auto-shortened named greeting; v0.3 finished the hinge fix — the fold-out tongue is now a full-thickness rigid link (the pin hinge does all the folding), so there is no thin living hinge to crack in PLA.

Workbench

View in 3D

Inspect the real geometry — drag to rotate, scroll to zoom. The model is rendered from this design's own source at its default settings, right in your browser; nothing is uploaded.

Make it fit

This design has 49 tunable parameters. Change them and render your own STL — OpenSCAD runs in your browser, so nothing is uploaded and nothing is installed.

An STL you configure here is ungated. The files this project ships have each passed a printability check and a PrusaSlicer test-slice; your variant has not. Treat it as a starting point, and print the fit coupon first if the design has one.

History

History of work together

  1. 2026-08-29 commit · git

    render.sh: emit the --render form the installed OpenSCAD build accepts (fixes the render camera opt) (#408)

    Shai Perednik shai
  2. 2026-08-29 commit · git

    Fix teardrop_hole() point orientation to +Z as documented; pin it with a mates manifest (#424)

    Shai Perednik shai
  3. 2026-08-24 commit · git

    pop-fidget-card: land PR #351 review's two act-now doc fixes (#383)

    Shai Perednik shai
  4. 2026-08-24 commit · git

    Add the missing product-manager characters to the People page (#381)

    Shai Perednik shai
  5. 2026-08-23 commit · git

    pop-fidget-card v0.3: rigid hinge tongue (remove living-hinge ramp) + review-round doc polish (#351)

    Shai Perednik shai
  6. 2026-08-22 decision · PM.md

    Greeting re-set as an arced, per-letter bounced line pulled clear of the kickstand hinge

    filer's direction mid-run: "letters a bit too close to the kickstand — be more creative with those"

    Poppy poppy
  7. 2026-08-22 decision · PM.md

    Slider re-based from the lib rail stack to a linear captive-spinner channel

    rail stack needs 5.7 mm of wall a 2.4 mm card cannot host; NOTES.md has the math

    Poppy poppy
  8. 2026-08-22 decision · PM.md

    Card slimmed to 112 × 80 × 2.4, layout edge-derived

    slice-clock data (CI round 1: 2 h 54 m on the gate's conservative meter)

    Poppy poppy
  9. 2026-08-22 decision · PM.md

    N2 evidenced by two meters (gate default + MK4-stock speeds)

    the gate's bare-default profile is no printer's stock profile; brief names the printer class

    Poppy poppy
  10. 2026-08-22 decision · PM.md

    Owner-directed post-signoff round: per-mechanism CI fitchecks (spin/slide + falsifiers), animated previews (easel-fold, turntable), and an 8-config time sweep

    owner asked to keep working the design in parallel experiments; every addition gate-checked

    Poppy poppy
  11. 2026-08-22 decision · PM.md

    60-min bonus target closed as measured-not-reachable on the 0.2 stock profile with all four mechanisms (floor ≈ 67 min at spinner_count=1; NOTES has the sweep)

    slice data across 8 configs, matrix-verified; the charter's "fidget set not gutted for the bonus" stands

    Poppy poppy
  12. 2026-08-22 decision · PM.md

    Jane's crescent-horn finding declined (soft horns are on-theme for bubbles)

    triage ruling; re-enters with B1 field-test evidence

    Poppy poppy
  13. 2026-08-22 decision · PM.md

    Crescent finding re-opened and fixed (v0.2) — the field print confirmed the sub-nozzle horns slice away ("gets hidden and doesn't work"). Crescent → constant-width dot; guard added

    the decline's own clause fired: field evidence overrode the on-theme ruling

    Poppy poppy
  14. 2026-08-22 decision · PM.md

    Hinge field fix (v0.2): grounded the flap root neck (0.36 mm floating flexure → 2.15 mm grounded rigid link) by shrinking the swing reliefs; accepted ~5–8° more upright prop (76–80° vs 72°)

    field print cracked the unintended living hinge in PLA; a rigid hinge that props slightly steeper beats a flexure that fails. N5 held — the fix stayed inside the proven pip_hinge clearances, only the flap's own relief geometry moved

    Poppy poppy
  15. 2026-08-22 decision · PM.md

    Spinner clearance N5 reopen (v0.2): xy_tol 0.20 → 0.21

    N5's "a coupon field test says otherwise" clause: the H2C print ran 0.20 slightly tight (+0.005–0.01)

    Poppy poppy
  16. 2026-08-22 decision · PM.md

    Pop-button beam PLA-tuned (v0.2): tog_beam_t 1.5 → 1.3

    field print: bistable snap too stiff in PLA; PETG can return to 1.5. Bistability guard only gets safer as the beam thins

    Poppy poppy
  17. 2026-08-22 decision · PM.md

    Greeting v2 (v0.2): named cards auto-shorten to "HAPPY 1st, <name>!"; fit floor 4.5 → 5.0

    field print: full greeting + 6-letter name overran; owner's hand-shortening was the fix

    Poppy poppy
  18. 2026-08-22 decision · PM.md

    Kept with_easel default ON (fixed), not flipped to OFF

    the easel is the headline "1" feature and the living-hinge failure is now fixed; the toggle exists and cleanly removes it for anyone who wants a plain card (owner's "defaultable off like any variable" — it is)

    Poppy poppy
  19. 2026-08-22 decision · PM.md

    Hinge fix v0.3 — removed the tongue relief ramp entirely (ramp_h/ramp_run deleted); tongue is now a full-thickness rigid link, fold is wholly the pin hinge

    owner call on the reprint: "we have a real hinge, we don't need a living hinge too." v0.2 only shortened the ramp and left a ~0.8 mm ramped flexure at the tongue root — a living hinge in series with the pin. Interference sweep proved the ramp vestigial (free through 96°, plate-root chamfer is the real stop at ~97°); same prop angle, no thin flexure. Jane/Drik round found no gate/geometry issues — this was the one substantive item

    Poppy poppy
  20. 2026-08-22 decision · PM.md

    Embossed "1" nudged down 1 mm (cosmetic, off the fold line)

    owner note "move the 1 so it doesn't fuse the kickstand"; the "1" already cleared the hinge by ~6 mm in the mesh (what looked fused on the v0.1 print was the living-hinge blob, now removed), so this is margin, not a fix. One-line to reposition if the owner wants it centred

    Poppy poppy
  21. 2026-08-22 decision · PM.md

    Reviewer-round doc polish landed in v0.3 (seam note names the hinge barrels; coupon-first names the hinge as the field-failure; card_name row tells long-name users to slice-preview; prop-angle stated two ways)

    Jane + Drik in-session (CI reviewer chain account-down); all advisory, all doc-level, none blocking

    Poppy poppy
  22. 2026-08-22 field test · NOTES.md

    Field test — Bambu-class printer (owner), PLA

  23. 2026-08-22 commit · git

    pop-fidget-card v0.2: field-test fixes (living-hinge + 5 more) (#349)

    Shai Perednik shai
  24. 2026-08-22 commit · git

    Add design: pop-fidget-card — print-in-place "POP" 1st-birthday fidget card (#343)

    Shai Perednik shai