DIY · kitchen

Coffee Grinder Simulator

A blade grinder is a propeller in a cup. Watch what the beans actually do.
bed depth decides everything

The chamber

The beans

The motor

Try one

Inside the grinder

a slice through the middle
0.0 s speed
whole bean part-ground ground fine blade sweep the shaded band is the bed the blade cannot stir
What is happening in there
Bed depth
in bean diameters
Lid strikes
per bean per second
Grind spread
coarsest tenth ÷ finest
Median grind

Where they hit, and what came out

Left: the lid seen from above, each ring shaded by strikes per unit of area — an outer ring holds far more lid than an inner one, so raw counts would flatter the middle.

How much should you put in?

press to run every fill level
nine fill levels, three seconds of grinding each

A blade grinder does not have a grind setting

A burr grinder has a gap. Anything larger than the gap cannot get through, so the size is set by the machine and every particle has to obey it. A blade grinder has no gap. It has a flat bar going round at 24,000 rpm — a tip speed near 70 m/s, about 250 km/h — and it smashes whatever happens to be in front of it. What is not in front of it stays whole.

So the grind is not set by a setting. It is set by how well the beans circulate. That is the whole subject of this page, and it is why the lid matters: a bean can only reach the lid if it got clear of the bed, and the rate at which beans reach the lid is the most direct measure of circulation there is.

Bed depth is the master variable

Not grams, and not how full the chamber looks — how many beans deep the pile is. A struck bean has to fight its way out through the beans above it, and each contact it makes costs it energy. Bean on bean has a restitution near 0.35, so a bounce returns about an eighth of the height; four layers of bed absorb over 99% of a strike. A deep bed is not a delay, it is a wall.

In this simulation, going from a bed one bean deep to one five beans deep drops lid strikes per bean by five to six times. That is the mechanism behind the advice printed in every blade grinder manual: grind small batches.

The damage is done early

The grind spread — the coarsest tenth divided by the finest tenth — goes from about 1.9 at one bean deep to about 2.4 by three beans deep, and then it roughly stops getting worse. That is worth knowing, because it means the useful advice is about the first few bean-layers rather than about the last few grams. Halving an already deep batch buys much less than you would hope; taking a shallow batch and keeping it shallow buys a lot.

Why an uneven strike count makes such an uneven grind

Grinding follows Bond's law: the energy needed goes as the difference of the inverse square roots of the sizes, so the last halving costs far more than the first. A bean struck twice as often does not come out half the size — twenty strikes lands near 750 µm and ten strikes leaves it at about 1,700. That non-linearity is what turns a moderately uneven strike count into boulders and dust in the same batch, which is the standard complaint about blade grinders and the reason a blade grind tastes both sour and bitter at once: the dust over-extracts while the boulders barely extract at all.

Grinding for longer is not a fix

Leave it running and the spread narrows again — about 2.4 at ten seconds, 1.7 at thirty. That is not the boulders being rescued, it is everything arriving at the bottom of the scale together: thirty seconds of this takes the median to around 130 µm, finer than espresso and well past anything you would want to drink. The grind time control is there so that changing the chamber or the fill is compared at equal grinding, which is the only way the comparison means anything — the first version of the pulsing test in the model got this wrong and duly measured grind time instead of evenness.

What the lid can and cannot tell you

The heatmap shows where beans are landing, and that responds to real things: a small blade under a wide chamber throws from a smaller circle, and the pattern narrows. But the percentage of the lid covered saturates almost immediately and then barely moves — it sits near 0.8 whether the chamber is a quarter full or brimming. It is a poor number and this page deliberately does not lead with it. The rate per bean is the honest one.

And there is a trap at the top of the range. Past about five beans deep, lid strikes per bean start rising again. Nothing has improved. The bed is simply so close to the lid that a bean barely has to move to touch it. Above that fill, a lid strike stops being evidence of circulation at all — which is a good reminder that a proxy is only a proxy over the range where it was checked.

A blade smaller than the chamber costs speed, not fairness

A 28 mm blade radius under a 95 mm floor leaves a dead ring, and because area goes as radius squared that ring is most of the floor. It is tempting to conclude that the beans out there never get ground and the result is uneven. Tested at equal bed depth, that is not what happens: the spread is the same within run-to-run scatter, and what changes is the time — roughly 2,100 µm against 1,450 for the same seconds. Beans do not stay in the dead ring; they get shoved back in. They just have to queue.

Field notes

What this does not model, and the one thing it could not settle

It is a 2D slice. A vertical cut through the middle of an axisymmetric chamber, so a lid strike at distance r from the axis is spread over the whole ring at that radius. That also means the bean counts on screen are not the number of beans in your grinder: a slice of a 75 mm chamber is only ten beans wide, so a quarter-full chamber is about twenty beans here. The fill fraction and every dimension are real; the head-count is a slice of one.

The micron scale is calibrated, not predicted. The Bond constant was chosen so that a ten-second grind at a quarter fill lands on filter grind — which in this simulation is about twenty blade strikes per bean. How much of a blade's energy actually goes into fracturing a bean, rather than into heat, noise and moving air, is not something this model knows. The spread is physics; the absolute number is a calibration, and it should be read as a band rather than a figure.

Beans shrink here; real beans shatter. Following every fragment down to filter grind is about two thousand particles per bean, so each bean is carried as a single shrinking particle whose size comes from the energy it has absorbed. That gets the distribution shape right and gets the count of pieces entirely wrong.

Not modelled at all: air drag, static cling (which is why grounds climb the lid in real life and is not what the heatmap shows), heat, moisture, oil, how a bean's shape makes it tumble rather than roll, and the third dimension.

The one it could not settle: pulsing

Every manual says to pulse the grinder and shake it between bursts, and that advice is almost certainly right. This simulation cannot see the effect. Compared at equal blade-on time over ten seeds, steady running gave a spread of 2.48 and pulsing gave 2.55, with a seed-to-seed scatter of 0.27 — the difference is a quarter of the noise. Adding a shake between bursts did not rescue it either.

The likely reason is the slice. A real chamber convects in three dimensions, and a pause lets that pattern collapse and re-form with different beans on top. A 2D cut with a symmetric outward throw has no way to represent that. The pulse control is still here, because it is a real thing people do — but the honest report is that this model does not show it helping, and tuning it until it agreed would have been the easy move and the wrong one.

An illustration, not a measurement. Free-flying grains in a slice, with a calibrated size scale — good for comparing one setting against another, not for predicting the microns your grinder will produce. Verified against grinder_model.py.
Version history · unchanged

No change to this page at all since the earliest archived release (v4.90). The full history for the site is in the changelog.