An icon that only works at 24 pixels is not finished
Icon sets get designed at 24 pixels and shipped into interfaces that render them at 15. For a hand drawn set that gap is where the whole thing is decided, because the wobble that reads as charm at 48 reads as a broken renderer at 15.
The size a control actually uses
Look at the toolbar of the editor you are reading this in. Those glyphs are somewhere between 14 and 16 pixels. A sidebar row, a form field affordance, a button with a label next to 13 pixel text: all of them land in the same band.
24 is the grid the icons are drawn on. It is not the size they live at.
| glyph | 15 px | 20 px | 24 px | 48 px |
|---|---|---|---|---|
| flask-conical | ||||
| git-branch | ||||
| bell | ||||
| trash-2 |
What goes wrong first
At 15 pixels a 24 unit grid gives you roughly 0.62 device pixels per unit. A stroke that bows by half a unit has moved a third of a pixel. Two strokes that pass within a unit of each other are now sharing one.
The failure is not that the icon looks wobbly. It is that adjacent strokes merge and the shape stops being readable, which is why the generator caps the bow at half the run's own length and scales the drift down with the shorter run at each vertex.
Keep the stroke at 2 below 20
The instinct at small sizes is to thin the stroke so the glyph feels lighter. On a bowed path that is the fastest route to mud: a 1.25 stroke at 15 pixels is under a device pixel in places and the renderer starts dropping it in and out along the curve.
Above 32 the opposite holds. The hand becomes obvious at that scale, and a 2 unit stroke makes the glyph look inflated rather than drawn, so 1.5 or 1.75 sits better.
Check it before you commit to it
Every glyph page on this site renders its icon from 15 up to 64, and the browser has a size control, because deciding this from a 48 pixel preview is how sets end up unusable. Set the control to the size you will actually ship and look at the one you need.
Open the catalogue, or read how the wobble is bounded in the generator post. The relevant constant is BOW_SHARE, and it is 0.5 for this reason.