A zip is not a fastener you press shut. Press two rows of elements together and nothing happens — they are the wrong shape to meet face to face. Each element is a mushroom: a narrow neck off the tape, widening to a head, and the heads are wider than half the pitch, so a head from the left tape has to occupy the same stretch of chain as the two right-hand heads either side of it. Two solids cannot share a stretch of chain, so they share it the way a carpenter would: a half lap, each head thinned where it laps its neighbours, the pair making up one thickness between them.
That lap is the fastener. In the middle of every one of them is a peg — a nub raised on the face of the lower head, sitting in a socket sunk into the upper. A peg in a socket is a shear pin, and to get it out you have to lift one head clear of the other, which every other element in the seam is in the way of. A zip does not hold because the teeth grip. It holds because nothing in a closed chain is free to move in the one direction that would release it.
Which is why it can only be threaded, one element at a time, by a machine that walks the two tapes past each other at an angle — the slider, and why there is exactly one and it never leaves. Take its top plate off and there is almost nothing in there: two channels converging into one, and a wedge between them. Closing runs the channels; opening runs the wedge, which gets in between the rows and prises them apart faster than the laps can hold. One part, one motion, both directions.
The number
Everything comes out of one measurement. The elements are 2.9 mm long on a 5.0 mm root separation — a #5, and the size number on a zip is the width of the closed chain in millimetres — so they cross the centreline and lap by
lap = 2 × 2.9 − 5.0 = 0.8 mm
The nub is 0.52 mm across, sitting in a socket 0.72 mm across in the middle of that lap. So the peg is home while the two tapes are where the slider put them, and it starts climbing out the moment they are held even slightly further apart — out of the socket altogether at 0.62 mm of spread, and on a seam actually being pulled, well before that.
Six tenths of a millimetre is the entire design margin on a 5 mm chain. Notice what sets it. Not the elements: they are moulded, they touch nothing, they do not wear. What holds the two tapes at 5.0 mm is the inside of the slider’s exit channel, which is a bearing surface with a chain running through it a hundred times a day — the one part in the assembly that can wear, carrying the whole of the tolerance.
So when a zip “breaks” and opens behind a slider that is still moving forward, nothing on the chain has failed. Nothing on the chain can fail. It will work perfectly again the moment that channel is squeezed back to 5.0 mm with a pair of pliers. The failure is never where the noise is.
Three loops
- close — the slider walking up the chain, elements arriving half a pitch apart and alternating into lap. Watch the last third of the body: the wedge stops well short of the throat, and everything below it is closed chain with nothing in there at all.
- open — the same walk back down, wedge first.
- split — the same walk up through a slider whose exit has opened 0.45 mm. The elements leave lying beside each other instead of behind each other, and the chain unzips itself backwards under the seam load while the slider carries on closing.
The demo
demo/ runs the sprite at size with the joint cut open beside it, in section
across one lap — the only plane in the fastener where both tapes and the peg
are visible at once.
spread is the wear on the slider’s exit channel, and it is the control worth dragging: watch the peg climb out of its socket, the upper element get jacked up off the lower one because the peg has nowhere to go, and the chain behind the throat let go. seam load is the other half of the argument — how hard the seam is being pulled, as a fraction of what a fully seated peg will take. The same worn slider that fails instantly on a coat stretched over a rucksack will go on working for years on a slack pocket, which is why zip failure feels arbitrary and isn’t. wear it out runs the wear on a clock so you can watch a new slider arrive at its own failure.
Reuse
export/zip-sheet.png— 1248×92 strip, twenty-four 52×92 frames in order:close-0…7,open-0…7,split-0…7.export/zip-{close,open,split}-*.png— the individual frames.export/zip@6x.png— the hero frame at 6×, for anywhere that wants it big.source/slider.mjsis the canonical source: the geometry is authored in millimetres and the pixels are derived from it, so changingZ.elementorZ.sizechanges the lap, the peg’s margin, the drawing and the demo’s readouts together.validateGeometry()refuses a chain whose heads are too narrow to lap or whose peg outlives its lap.node source/render.mjsregenerates every PNG here and rewritesdemo/slider.jsfrom the module, so the demo cannot drift from the source.node scripts/screenshot-demo.mjsshoots the demo and is its smoke test: eleven assertions checking the page’s own readouts against the mechanism.
Both need Playwright from site/node_modules.