Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Crimpdeq Grips

Crimpdeq Grips are 3D-printed grips for isolated finger training: each finger rests on its own roller. There are two designs, both parametric OpenSCAD models:

  • Photon: crafted specifically for your unique hand anatomy and optimized for targeted FDP training. In a claw grip, each fingertip rests on its roller under a block that holds its last joint.
  • Spark: crafted specifically for your unique hand anatomy and optimized for targeted FDS training. Each finger bends over a larger roller (22 to 40 mm), the middle joint level with its axis and the end joint on its top.

Measure a photo of your hand to download parts that place every roller for your fingers.

Every part, pins included, prints in the same plastic: no metal rods, screws or TPU. The only extra is a cord through the anchor.

Getting the parts

Each release attaches the STLs of both grips for both hands, at the models’ defaults, and a Bambu Studio project of each for the Bambu Lab A1; Photon defaults to one measured right hand. To fit the grips to your own hand, download the parts from the measuring page.

Credits

The grips build on OpenGrips and on Jared-Is-Coding’s fork, whose Prometheus v43 and Sisyphus v27 STEP files the OpenSCAD models rebuild as Photon and Spark. Like them, this project is released under CC0.

All illustrations are rendered from the OpenSCAD models, so they match the exported parts.

Fit to your hand

The measuring page fits the grips to your hand: it measures a photo of it and downloads print-ready STLs of Photon, Spark or both, for one hand or both, in one zip. Its steps are on the page. This chapter explains the values it computes and how to export the same parts yourself. To print the STLs of the zip as they are, skip it and go to Printing.

Values

Photon places each roller from three values per finger, relative to the pinky:

ValueMeaningComputed from
HeightRoller up/downFingertip position in the OpenGrips claw grip (proximal phalanx vertical, PIP and DIP flexed 55°), including how far each base crease sits along the hand
DepthRoller forward/backwardSame claw grip, front-to-back fingertip position
To_BlockerRoof height: roller top to blockerDIP→tip / tan(angle), with angles of 57° (index), 60° (middle, ring) and 55° (pinky)

The original OpenGrips instructions set Height to the full finger length minus the pinky’s. That rule ignores that the pinky starts lower on the hand, which put the rollers 8–14 mm too low on the measured example hand.

Photon’s frame length follows the middle finger, so no other finger’s Height + To_Blocker may reach much past the middle finger’s. Once every point is placed, the page checks the values against the model itself and shows its message when a grip cannot be made from them.

The values do not depend on which hand the photo shows, so one photo can fit both hands; the model is a left-hand grip and the right hand is its mirror.

Exporting yourself

Each folder of the zip holds parameters.txt, the values the parts were rendered with, and the clicked points. With OpenSCAD 2025 or newer installed, scripts/export.py exports the same STLs from it, e.g. after editing a value:

python3 scripts/export.py photon crimpdeq-grips-photon-right/parameters.txt --hand right --out my-right-hand

For a Bambu Lab A1, scripts/export_bambu_project.py turns a folder of STLs into a Bambu Studio project with all parts on one plate and the settings of Printing:

python3 scripts/export_bambu_project.py crimpdeq-grips-photon-right --output my-right-hand.3mf

It needs Bambu Studio installed and slices the project to check it.

Printing

Print all 14 parts in PETG (HF) with these settings:

SettingValue
Layer height0.2 mm
Walls5
Infill35% cubic, or more
PlateTextured PEI
SupportsFrame only
Brim5 mm on the frame and the ring, middle and index walls

The frame stands 111 mm tall, and without a brim a wall can lift on its first layers and the rest of it prints as spaghetti. Wash the plate with dish soap before printing.

Each release also has a Bambu Studio project for the Bambu Lab A1 per grip and hand (crimpdeq-grips-<grip>-<hand>.3mf) with all parts on one plate and these settings.

The STLs are already in their print pose: frame, walls and rollers on their pinky-side face with the pin holes vertical, pins lying on their flat, the post on its chamfered side. In this pose the walls need no supports, as in the original design.

Parts

How to put together a printed Photon grip. The pictures show the right-hand grip at the model’s defaults; a left-hand grip is its mirror image and goes together the same way.

You need the 14 printed parts, a cord for the anchor, a mallet or hammer with a small wood block, and optionally an inert lubricant such as Super Lube.

The middle and index walls look alike: label them as you take them off the plate (the slicer’s object list names every part).

PartHow to recognize it
FrameThe largest part, with the top crossbar engraved Crimpdeq Photon and the cord hole
Ring wallRound hump around a pin hole
Middle wallLooks like the index wall
Index wallLooks like the middle wall
End wallThin plate engraved crimpdeq.com
Pinky roller30 mm, one narrow and one wide end
Ring, middle and index rollers (3)19 mm, both ends the same
Pinky pinThe longer pin, about 36 mm
Ring, middle and index pins (3)About 25 mm, interchangeable
PostLong square bar, about 105 mm, one corner chamfered

The illustrations come from the OpenSCAD model; regenerate them with docs/illustrations/render.sh.

Assembly

Build from the pinky side to the index side. Walls slide into the slot in the frame’s crossbar from its open end, along the roller axis; they cannot drop in from above. Each pin rests in a hole in the wall on both sides of its roller.

Once together, the parts are hard to take apart without marring them: read the steps through first and check each part’s orientation before pushing it in. A little inert lubricant, such as Super Lube, on the post and in the crossbar slot helps the parts slide in; wipe off the excess so it does not get on your fingers.

1. Pinky roller and pin

Lay the pinky roller in the frame, narrow end against the frame’s outer wall. Push the long pin through it into the frame’s hole; about 3 mm sticks out.

2. Ring wall

Slide the ring wall into the crossbar slot and push it along until the pinky pin enters its hole and the wall sits against the roller.

3. Ring roller and pin

Lay the ring roller on the ring wall and push a short pin through it into the wall.

4. Post

Install the post now: pushed through more walls later, it can hardly go in without breaking. Turn it so its chamfered corner matches the corner of the square hole, and push it through the ring wall into the frame as far as it goes. The rest sticks out and guides the next walls.

5. Middle wall

Slide it into the crossbar slot and onto the post at the same time, and push it onto the ring pin. From here on, tap each wall home with the mallet over the wood block, alternating between its crossbar end and its post end so it goes in straight.

6. Middle roller and pin

7. Index wall

8. Index roller and pin

9. End wall

Slide it in last, onto the index pin and the post, engraving facing out. The post ends flush with it.

10. Cord

Thread the cord through the round hole in the frame’s anchor, behind the crossbar.

If something does not fit

  • The wall tongues fit their slot with no clearance. With lubricant and careful taps, a wall goes in even when it seems too tight. If one still will not move, sand its tongue instead of forcing it, or reprint the walls and the post slightly scaled down; keep the frame at full size.
  • Pins, rollers and the post have clearance: every roller should spin freely and nothing should rattle.
  • Finally, hold the grip: each fingertip should rest on its roller with the last finger joint against the block above it.

Fit to your hand

The measuring page fits the grips to your hand: it measures a photo of it and downloads print-ready STLs of Photon, Spark or both, for one hand or both, in one zip. Its steps are on the page. This chapter explains the values it computes and how to export the same parts yourself. To print the STLs of the zip as they are, skip it and go to Printing.

Values

Fitting Spark is optional: untick Fit Spark to my hand on the page and Spark keeps the roller positions of Sisyphus v27, with no photo needed for it. Fitted, the page sets one value per finger:

ValueMeaningComputed from
HeightRoller position along the fingers, relative to the pinkyPIP crease plus half the roller diameter, including how far each base crease sits along the hand

In the original Sisyphus grip the proximal phalanx is vertical against the roller and the DIP joint rests on its top. The page puts the PIP joint at the roller axis, so each roller top sits half its diameter past the PIP crease. The roller diameters (index 30, middle 40, ring 38, pinky 22 mm) keep their defaults.

Each roller sits on a seat in its wall, in front of a finger stop. Once every point is placed, the page checks the values against the model itself and shows its message when a grip cannot be made from them, for example when a finger’s Height runs its seat into its finger stop.

The values do not depend on which hand the photo shows, so one photo can fit both hands; the model is a left-hand grip and the right hand is its mirror.

Exporting yourself

Each folder of the zip holds parameters.txt, the values the parts were rendered with, and the clicked points. With OpenSCAD 2025 or newer installed, scripts/export.py exports the same STLs from it, e.g. after editing a value:

python3 scripts/export.py spark crimpdeq-grips-spark-right/parameters.txt --hand right --out my-right-hand

For a Bambu Lab A1, scripts/export_bambu_project.py turns a folder of STLs into a Bambu Studio project with all parts on one plate and the settings of Printing:

python3 scripts/export_bambu_project.py crimpdeq-grips-spark-right --output my-right-hand.3mf

It needs Bambu Studio installed and slices the project to check it.

Printing

Print all 14 parts in PETG (HF) with the settings of Photon; Spark has not been test-printed with them yet.

SettingValue
Layer height0.2 mm
Walls5
Infill35% cubic, or more
PlateTextured PEI
SupportsFrame only
Brim5 mm on the frame and the ring, middle and index walls

The frame stands 113 mm tall, and without a brim a wall can lift on its first layers and the rest of it prints as spaghetti. Wash the plate with dish soap before printing.

Each release also has a Bambu Studio project for the Bambu Lab A1 per grip and hand (crimpdeq-grips-<grip>-<hand>.3mf) with all parts on one plate and these settings.

The STLs are already in their print pose: frame, walls and rollers on their pinky-side face with the pin holes vertical, pins lying on their flat, the post on its chamfered side. In this pose the walls need no supports, as in the original design.

Parts

How to put together a printed Spark grip. The pictures show the right-hand grip at the model’s defaults; a left-hand grip is its mirror image and goes together the same way.

You need the 14 printed parts, a cord for the anchor, a mallet or hammer with a small wood block, and optionally an inert lubricant such as Super Lube.

The ring, middle and index walls look alike: label them as you take them off the plate (the slicer’s object list names every part). Each wall’s cradle matches its roller.

PartHow to recognize it
FrameThe largest part, with the anchor’s sloped bar engraved Crimpdeq Spark and the cord tube
Ring wallCradle for the 38 mm roller
Middle wallCradle for the 40 mm roller
Index wallCradle for the 30 mm roller
End wallThin plate engraved crimpdeq.com
Pinky roller22 mm, the smallest and longest
Ring roller38 mm
Middle roller40 mm, the largest
Index roller30 mm
Pinky pinThe longest pin, about 36 mm
Ring pinAbout 25 mm, 1 mm shorter than the middle and index pins
Middle and index pins (2)About 26 mm, interchangeable
PostLong square bar, about 105 mm, one corner chamfered

The illustrations come from the OpenSCAD model; regenerate them with docs/illustrations/render.sh.

Assembly

Build from the pinky side to the index side, in the same order as Photon. Walls slide into the slot in the frame’s crossbar from its open end, along the roller axis; they cannot drop in from above. Each roller lies in the cradle of its wall, and each pin rests in a hole in the wall on both sides of its roller.

Once together, the parts are hard to take apart without marring them: read the steps through first and check each part’s orientation before pushing it in. A little inert lubricant, such as Super Lube, on the post and in the crossbar slot helps the parts slide in; wipe off the excess so it does not get on your fingers.

1. Pinky roller and pin

Lay the pinky roller in the frame’s cradle. Push the long pin through it into the frame’s hole; about 3 mm sticks out.

2. Ring wall

Slide the ring wall into the crossbar slot and push it along until the pinky pin enters its hole and the wall sits against the roller.

3. Ring roller and pin

Lay the ring roller in the ring wall’s cradle and push the ring pin, the shortest one, through it into the wall.

4. Post

Install the post now: pushed through more walls later, it can hardly go in without breaking. Turn it so its chamfered corner matches the corner of the square hole, and push it through the ring wall into the frame as far as it goes. The rest sticks out and guides the next walls.

5. Middle wall

Slide it into the crossbar slot and onto the post at the same time, and push it onto the ring pin. From here on, tap each wall home with the mallet over the wood block, alternating between its crossbar end and its post end so it goes in straight.

6. Middle roller and pin

7. Index wall

8. Index roller and pin

9. End wall

Slide it in last, onto the index pin and the post, engraving facing out. The post ends flush with it.

10. Cord

Thread the cord through the anchor’s tube, behind the crossbar.

If something does not fit

  • The wall tongues fit their slot with no clearance. With lubricant and careful taps, a wall goes in even when it seems too tight. If one still will not move, sand its tongue instead of forcing it, or reprint the walls and the post slightly scaled down; keep the frame at full size.
  • Pins, rollers and the post have clearance: every roller should spin freely and nothing should rattle.
  • Finally, hold the grip: each finger should bend over its roller with the end joint on its top and the fingertip against the stop behind it.

Models and checks

grips/photon.scad and grips/spark.scad rebuild the OpenGrips Prometheus v43 and Sisyphus v27 STEP files of Jared-Is-Coding’s fork as the parametric Photon and Spark models, without the STEP files’ TPU guard: nothing attaches to it, and the anchor’s cord exits are rounded without it. Shared helpers are in grips/common.scad. The models need OpenSCAD 2025 or newer (the Manifold backend; older releases take minutes per part).

Previewing and exporting

Open a model in OpenSCAD, set the values in the Customizer (Window → Customizer), pick a part and hand, render (F6) and export the STL. part = "assembly" shows all parts in place; rendering it takes about a minute.

scripts/export.py exports all 14 parts of one hand at once:

python3 scripts/export.py photon my-right-hand.txt --hand right --out my-right-hand
python3 scripts/export.py spark --hand left --out spark-left

The parameter file is optional and uses the format of the parameters.txt files the measuring page puts in its zip (Name = value lines, # comments); names that are not parameters of the model are rejected. The STLs are named <model>_<hand>_<part>.stl. --in-place keeps the parts in assembly coordinates instead of their print pose.

Measuring page

docs/src/measure-hand.html renders the STLs in the browser with the official WebAssembly build of OpenSCAD, which scripts/fetch_openscad_wasm.py downloads to docs/src/openscad/ (pinned and checked, not in git; the CI book build runs it). It loads the models from docs/src/grips, a link to grips/, so the book carries the models it renders. Its script is in docs/src/measure-hand/:

ModuleRole
hand.jsPoints → finger lengths → grip parameters, plausibility warnings, parameters.txt
photo-canvas.jsThe photo: drawing, zoom and pan (wheel or pinch), placing and moving points, the magnifier
render.js, worker.jsOpenSCAD in web workers: every part in its own instance, up to three at once (one on phones and tablets), and the check of the parameters
zip.jsThe zip of the STLs
saved.jsChoices, photos and points kept in the browser’s IndexedDB
main.jsThe page: choices, the point grid, undo, the download

Once every point is placed, the page renders the post with the measured parameters: the models’ assertions run for any part, so the model itself says whether it can be made, before the download. To run the page locally:

python3 scripts/fetch_openscad_wasm.py
mdbook serve docs   # then open /measure-hand.html; opened as a file it cannot load the models

CGAL fails in WebAssembly, so the models avoid minkowski() of non-convex solids, which needs it and falls back to minutes per part: along_x_ball_swept() builds the ball-swept extrusions of the rounded edges from offset profiles in 0.2 mm layers, the print layer height.

Parameters

Photon

Names and meanings match the VarSet of the original FreeCAD model (Original/OpenGrips_Prometheus.FCStd at commit f14f3e9). The finger defaults (Height, Depth, To_Blocker) are one measured right hand, recorded at the top of photon.scad with the v43 values for comparison; the roller and frame sizes are the VarSet’s.

The outer faces of the frame and the end wall carry an engraved crimpdeq.com in Inter Bold, as on the Crimpdeq case, and the front of the crossbar an engraved Crimpdeq Photon; the font is bundled in grips/fonts/ (SIL Open Font License). The space for crimpdeq.com depends on the hand: when it is short, the text shrinks to fit, and below a 2.5 mm text size it is left out, so the engraving never rules a hand out. Crimpdeq Photon has a fixed space; the model stops with a message if it does not fit.

Spark

The values of the original model’s VarSet (Original/OpenGrips_Sisyphus.FCStd at commit f14f3e9), renamed consistently (Base_<F>_height → Base_<F>_Height, Base_R_diamter → Base_R_Diameter, I_width → Base_I_Width, Base_wall_width → Wall_Width):

ParameterMeaning
Base_<F>_HeightRoller position along the fingers, relative to the pinky
Base_<F>_BlockerHow far the seat under each roller reaches past its axis (the pinky’s stops short of it)
Base_<F>_Diameter, Base_<F>_WidthRoller size; all roller tops are level with the middle roller’s
Base_Frame_HeightWall length up to the lock slot

The finger stops and the anchor have no counterpart in the original model and keep v27’s dimensions.

As on Photon, the outer faces of the frame and the end wall carry an engraved crimpdeq.com, and the sloped top face of the anchor bar an engraved Crimpdeq Spark. Their space depends on the roller diameters and the frame length, not on the hand, so the model stops with a message if the text does not fit between the end wall’s post hole and lock or on the anchor bar.

Checks

CI runs these on every pull request:

  • uv run scripts/check_step.py exports each part at the STEP’s own values and compares it with the STEP solid, read from git history (needs a full clone) and tessellated with OpenCascade. The engravings, absent from the STEP files, are left out. Every part is within 0.5% of the STEP volume and within about 0.1 mm of its surface at the 95th percentile. It fails beyond 1% or 0.6 mm.
  • python3 scripts/check_stl.py on the exports of both grips for both hands: each STL is one closed body resting on z = 0.
  • uvx ruff check --line-length 120 scripts and mdbook build docs, after python3 scripts/fetch_openscad_wasm.py.

Known differences from the STEP files:

  • Photon blocker tips follow the original rule: v43’s hand-moved tips sit 0.15–0.38 mm lower.
  • Pins are centered in their holes; v43’s index pin and v27’s ring and index pins are 0.1 mm off.
  • Spark: the pinky cradle is approximated by one roller cut.
  • Some exports contain zero-area triangles where rounded surfaces meet flat ones; slicers ignore them.

The checks are geometric only; fit, strength and comfort still need a test print.

Illustrations

docs/illustrations/render.sh renders the part and assembly pictures of both grips from the right-hand defaults. Rerun it when a model changes.

Website

Every push to main builds this book with the measuring page and the WebAssembly OpenSCAD and, once every check of .github/workflows/ci.yml passes, its deploy job publishes it to grips.crimpdeq.com (Cloudflare Pages project crimpdeq-grips).

Releases

Creating a GitHub release runs .github/workflows/release.yml, which exports both grips for both hands, checks the STLs and attaches one zip of STLs and one Bambu Studio project per grip and hand. Run the workflow manually for a dry run.

scripts/export_bambu_project.py builds the project from the STLs of one grip and hand: it lays the parts out in rows on the A1 plate, far enough apart for their brims, assembles the project with the Bambu Studio CLI and the settings of Printing (Photon, Spark, untested in print), and fails if slicing it gives an error or a warning, such as a floating cantilever. The release workflow installs the pinned Bambu Studio AppImage with .github/actions/setup-bambu-studio; locally, set BAMBU_STUDIO if bambu-studio is not on the PATH or is a wrapper script.