The Coffee Recipe Series (CRS) spans a roasted-bean bulk density of 330 to 450 g/L, centred on 390 g/L. After correcting for the form artefacts in 9,465 self-reported measurements, that interval contains 90% of independent measurement sessions (bootstrap 95% CI 89–91%), with 4% of sessions below 330 and 6% above 450. A density-floor (highest-density) interval at the same 90% mass runs from 330 to 451. The median is 390 g/L (95% CI 388.5–391) across all years, and about 381 g/L in data since March 2024. The same range appears in the 47% of entries that cannot have come from a coarse scale (median 390.0, highest-density interval 328–452). This article describes the data, the corrections that were needed, and why the raw counts cannot be used as they stand.
Why the series needs a bounded range
CRS is a density-based recipe system. A user measures the bulk density of their roasted beans in g/L, finds the recipe indexed to that density, and then moves up or down the series by taste. The series therefore has to be finite: each brew method carries 121 recipes, one per integer density from 330 to 450. Measurements outside the range can still be entered and are recorded, but the recipe returned is the nearest end recipe.
The endpoints are a design decision with real costs. A range that is too wide spends recipes on densities almost nobody measures and makes adjacent recipes differ less. A range that is too narrow clamps many users onto the end recipes, where the series cannot follow their beans. The question here is which interval the measured population justifies, and with what confidence.
Data and its defects
The data are 9,465 submissions to the density form, recorded between 12 August 2021 and 7 October 2026. Each record holds a timestamp, an optional roast date (present in 59% of records) and the density the user entered. Users measure their own beans at home. The system is designed around a 100 mL measuring cylinder, and the site recommends a Class A cylinder with a tolerance of ±0.50 mL, preferably borosilicate, with links to two suppliers (Eisco Labs on Amazon and Lab Warehouse NZ). The record does not show what a given user actually used, so the sample is self-selected and the measurement error is only partly controlled. The values should be read as what home users report, not as laboratory measurements.
Four properties of the form make the raw counts unusable as a distribution.
A default value anchors entries. Until mid-November 2024 the form suggested 400 as a starting value, and 1,471 entries (15.5% of the total) are exactly 400, against roughly 55 at each neighbouring integer. The share of 400s falls from 35% in December 2023 to 12% in January 2024, and again to about 3% after the suggested value moved to 390 on 13–15 November 2024. These dates are inferred from the data, not from a form change log.
Entries heap on round numbers. 42% of entries end in 0, against 10% if last digits were uniform, and entries ending in 5 are also over-represented. Users with coarse scales or approximate readings round, and the effect is largest at multiples of ten.
Many entries are exploration, not measurement. The form returns a recipe immediately, so users type a run of values to see what each produces. Using a 10-minute gap to separate sessions, 9,465 entries form about 6,370 sessions, and 49% of entries sit in a session of two or more. These runs often walk monotonically through values (385, 387, 388, 389, 390), which is exploration.
Some values are not roasted-coffee densities. Sixty entries are below 250 g/L (typos such as 3 and 39) and 79 are above 600 g/L (many near 740–750, which is the density of green coffee). I excluded these 139 entries and kept 9,326 for analysis. The 250–600 window is a judgement call, and I did not test other cut-offs.
Method
De-heaping. For each integer density ending in 0 or 5, I estimated how many entries it should hold if the underlying distribution were smooth. The baseline is the mean count of the non-round integers within ±12 g/L, which are not subject to rounding. Each entry at a round value is weighted by the ratio of expected to observed count, capped at 1. The baseline is estimated separately for the 400-default and 390-default periods, because the default value is a different spike in each. The resulting weights average 0.24 for entries ending in 0 and 0.64–0.72 for entries ending in 5, and an entry at 400 in the first period counts for about 3% of a normal entry. This is a data-driven version of the intuition that entries ending in 0 deserve less weight, and it cuts the weight of those entries by more than half.
Session weighting. Entries within one session are not independent, so each session carries a total weight of one, split equally among its entries. Sessions are runs of entries separated by gaps of no more than 10 minutes.
Interval definitions. I report three things for each window: equal-tail percentiles (5th–95th and 2.5th–97.5th), the median as the midpoint, and a highest-density interval, which is the narrowest interval holding 90% of the mass on a Gaussian kernel density estimate (bandwidth 4 g/L). The highest-density interval is the formal version of a gap analysis. Both pick the region where the density stays above a floor, here about 26% of the peak.
Uncertainty. Confidence intervals come from a cluster bootstrap that resamples whole sessions with replacement (2,000 replicates; 1,000 for the highest-density interval). Resampling entries instead would treat exploration runs as independent evidence and make the intervals too narrow.
Robustness checks. I repeated the analysis under six weightings (raw, a flat 0.5 weight on entries ending in 0, data-driven de-heaping, de-heaping with session weights, dropping entries ending in 0 or 5, and that with session weights), and in three time windows.
Stratifying by scale resolution. The site recommends a 0.1 g scale, which resolves 1 g/L in a 100 mL cylinder, whereas a 1 g scale resolves only 10 g/L and a 0.5 g scale 5 g/L. An entry whose last digit is not 0 or 5 therefore cannot have come from a coarse scale, and the same holds for a 200 mL cylinder. I analysed these 4,379 entries (47% of the total) separately from the 4,947 that end in 0 or 5. The second group mixes coarse-scale readings with fine readings that happen to end in 0 or 5, which is about one in five of them. Within each subset the session weight is one divided by the number of entries from that subset in the session, and entries at the form’s default value (400 before 14 November 2024, 390 after) are removed from the coarse subset. The subsets are not de-heaped, since the fine subset has no round-number excess by construction.
Results
The corrected distribution is broad and flat-topped, centred near 390 g/L, and the interval 330–450 holds 90% of it in every window tested. The table gives point estimates with bootstrap 95% confidence intervals in brackets.
| Window | Median (g/L) | 5th percentile | 95th percentile | 90% highest-density interval | Share inside 330–450 |
|---|---|---|---|---|---|
| All years (Aug 2021 on) | 389.9 (388.5–391.0) | 332.2 (330.3–333.6) | 453.3 (451.2–456.7) | 330–451 (327–332 / 448–453) | 90.0% (89–91%) |
| Since March 2024 | 381.2 (379.2–383.6) | 327.3 (325.2–330.4) | 447.9 (443.7–451.9) | 322–441 (320–326 / 436–454) | 90% (88–91%) |
| Since 14 Nov 2024 | 380.8 (378.1–383.7) | 327.7 (324.5–330.7) | 447.4 (441.4–452.0) | 323–452 (320–327 / 434–458) | 90% (88–91%) |
Over all years, 4.1% of sessions fall below 330 and 5.9% above 450. The proposed endpoints therefore sit at about the 5th and 94th percentiles, and the highest-density interval ends within one g/L of them. At 330 and 450 the smoothed density is 27% of its peak at both ends, so the two endpoints are equally well supported by the data.
Midpoint. The median is the stable estimate of the centre. The mode is not, because the top of the curve is flat between about 370 and 410 and the bootstrapped mode ranges from 375 to 404. The midpoint of the 5th–95th percentile interval is 392.7, which is close to the median.
Tail asymmetry. The light-roast side (high density) is longer, but modestly. The 95th percentile lies 1.10 times as far above the median as the 5th lies below it (95% CI 1.05–1.17), and at the 2.5th and 97.5th percentiles the ratio is 1.17 (1.10–1.24). That is distinguishable from symmetry, but it is far from the heavy light-roast tail that the raw counts suggested. Part of the far light tail (above about 500 g/L) is probably measurement error such as packed cylinders, ground coffee or green beans, so it is not evidence about roast level.
Robustness and drift
The range survives every weighting, but how much of the lower tail it captures depends on whether sessions are counted once. The table compares the six weightings over all years.
| Weighting | Median | 5th percentile | 95th percentile | Share inside 330–450 |
|---|---|---|---|---|
| Raw, unweighted | 395 | 327 | 460 | 87.9% |
| Entries ending in 0 at half weight | 392 | 327 | 458 | 87.7% |
| Data-driven de-heaping | 390 | 328 | 455 | 88.3% |
| De-heaping plus one vote per session | 390 | 332 | 453 | 90.0% |
| Entries ending in 0 or 5 dropped | 389 | 328 | 454 | 88.0% |
| Dropped, plus one vote per session | 391 | 333 | 454 | 89.6% |
The median ranges from 389 to 395 across these choices, and the upper end is stable at 453–460. The session weighting matters most at the dark end. Without it, the 2.5th percentile is 314, and with it 322. A likely cause is that users exploring the form step toward the extremes, so counting each step inflates the low tail; I did not test this directly.
The centre has moved. The yearly median falls from 401 in 2021 to 397–398 in 2022–23, then to 384 in 2024 and 380–382 in 2025–26. The step happens between the fourth quarter of 2023 and the first quarter of 2024, which is before the default changed to 390 in November 2024. The default change therefore does not explain it. Twelve weeks either side of 14 November 2024 the median is 388 before and 376 after, which suggests the default shift may contribute, but the data cannot separate that from a change in who uses the site. The 5th–95th percentile interval moves from 332–453 over all years to 327–448 since March 2024, a shift of about 5 g/L at each end.
A shifted range does no better. A range of 325–445 centred on 385 covers 89.5% of all-years sessions and 90.4% of sessions since March 2024. The difference from 330–450 is inside the bootstrap error. The tail balance favours 330–450 over all years (4.1% below, 5.9% above, against 3.0% and 7.6%) and 325–445 in the recent data (4.0% and 5.6%, against 5.8% and 4.5%). With no consistent advantage, the existing range is retained.
The careful measurements give the same range. Restricted to entries that must have come from a 0.1 g scale, the median is 390.0 g/L, the 5th and 95th percentiles are 331 and 454, the highest-density interval is 328–452, and 89% of sessions fall inside 330–450. These match the corrected full-sample result to within about 2 g/L. The entries ending in 0 or 5 are noisier: their central estimate is lower and the distribution is much wider, especially on the light side, where the 95th percentile is 474. The range 330–450 is therefore the range of the careful measurements, and a range fitted to the coarse subset would have run to roughly 320–475.
| Subset | Entries (sessions) | Median | 5th percentile | 95th percentile | 90% highest-density interval | Share inside 330–450 |
|---|---|---|---|---|---|---|
| Fine (0.1 g certain), all years | 4,379 (3,346) | 390.0 (388.5–391.4) | 331.3 (328.6–333.0) | 454.4 (452.2–457.6) | 328–452 | 89% (88–90%) |
| Coarse (ends in 0 or 5), all years | 3,164 (2,240) | 383.3 (381.5–385.6) | 320.5 (315.8–324.6) | 473.8 (466.8–481.4) | 298–500, unstable | 85% (84–86%) |
| Fine, since March 2024 | 2,046 (1,550) | 381.2 (378.2–383.5) | 326.8 (323.0–329.1) | 448.7 (443.4–452.8) | 321–446 | 89% (87–90%) |
| Coarse, since March 2024 | 1,472 (1,042) | 378.9 (376.7–381.2) | 318.2 (310.2–323.6) | 458.1 (452.4–469.3) | 299–454, unstable | 87% (85–89%) |
The downward shift in the centre appears in the fine subset too (390.0 over all years, 381.2 since March 2024), so it is not an artefact of coarse scales. The fine subset is also a different kind of user, probably a more careful one, so the comparison shows what the careful measurers report and not that coarse scales cause the extra spread.
Why 90%, and why not two standard deviations
Is the distribution normal? Close enough to reason with, though not exactly. The corrected sample (de-heaped, one vote per session) has a mean of 390.6 g/L and a standard deviation of 37.2 (383.5 and 36.3 since March 2024). The share of sessions more than 1, 2 and 3 standard deviations from the mean is 30.3%, 4.5% and 0.4%; a normal curve gives 31.7%, 4.6% and 0.3%. Skewness is +0.27 (a longer tail on the dense, light-roast side) and excess kurtosis is +0.56 (slightly more peaked than normal). With thousands of entries a formal normality test rejects this, as it would reject almost any real data, so the useful statement is that the departures are small and mostly one-sided.
What a two-standard-deviation range would be. Mean ± 2 SD is 316–465 g/L over all years and 311–456 since March 2024, which holds about 95% of sessions. It needs about 150 recipes per brew method, against 121 now.
| Interval | Range (g/L) | Recipes | Sessions inside |
|---|---|---|---|
| Central 80% (equal tails) | 344–439 | 96 | 80% |
| Narrowest 80% | 343–435 | 93 | 80% |
| Current series | 330–450 | 121 | 90% |
| Mean ± 2 SD | 316–465 | 150 | 95.5% |
| Central 95% (equal tails) | 322–469 | 148 | 95% |
Why the extra 5% is poor value. Each recipe near the centre of the series (370–410 g/L) serves about 1.0% of sessions. Each recipe just inside the current ends (330–345 and 435–450) serves about 0.4%. Each recipe in the band that a 95% range would add (320–330 and 450–460) serves about 0.2%. Moving from 90% to 95% therefore adds roughly 30 recipes, a 25% larger series, for 5% more coverage, and those recipes sit where measurements are scarcest and least reliable. The central recipes are not made worse by a wider range, since each recipe is fixed to a density, but the cost of building, testing and maintaining the extra recipes is real and the benefit is small.
Why 90%. It is a convention, not a result: the data do not single out 90%. It is defensible for three reasons. First, it is near the point where a recipe’s value falls to about a quarter or a half of a central recipe’s. Second, the two ends are balanced (4% below, 6% above) and equally well supported by the density curve. Third, it does not depend on rounding artefacts, because the careful 0.1 g subset gives the same range. Users outside it are not excluded: an out-of-range density can still be entered and is recorded, but the recipe returned is the end recipe of the series.
Why 121 recipes. The count follows from the range. Densities from 330 to 450 g/L inclusive, at 1 g/L steps, are 121 values, so the recipe number is the density minus 329. The 1 g/L step matches the resolution of a 0.1 g scale on a 100 mL cylinder. The 1 g/L step is a measurement-resolution choice, not a sensory one. The sensory adjustment is made by the Extract More and Extract Less steps, which give clear, obvious changes in the cup. A 2 g/L step would give about 61 recipes.
The Pareto principle. A literal 80/20 does not hold. The best 20% of the range (a 24 g/L window, 384–408) holds only 27% of sessions, because the distribution is bell-shaped and flat-topped, not heavy-tailed. The Pareto result that does apply is the 80% interval: 343–435 g/L, 93 recipes, centred on 389. Reaching 90% costs a further 28 g/L, and reaching 95% a further 23 g/L for half the gain.
Limitations
The sample is self-selected. Only people who own a scale and a cylinder and chose to try a density-based system submit values, so the distribution describes enthusiast home users, not the global supply of roasted coffee. It does not separate espresso from filter roasts, and that omission is deliberate: roast intent has no industry standard, and what a bag says is of very limited value as a measurement, so the form collects the density of the beans and nothing about the label.
Measurement error is only partly controlled. Cylinder size was tested at 100, 200 and 500 mL during design, and the series is built around 100 mL for cost and practicality. The recommended ±0.50 mL tolerance is about 0.5% of the volume, or roughly ±2 g/L at 390 g/L. The record does not show which cylinder a user had, so the recommendation cannot be assumed to have been followed. How tightly the beans are packed, whether the user taps the cylinder and the scale’s resolution also change the reading, and the site recommends a 0.1 g scale, which resolves 1 g/L in a 100 mL cylinder. A user with a 1 g scale resolves only 10 g/L, so some heaping at multiples of ten may be real quantisation, not rounding. The de-heaping weights treat all excess at round values as artefact, which is conservative for the width of the distribution but cannot recover the true value of any single entry.
The form’s history is inferred, not documented. The default-value dates come from the data, and the early-2024 downward shift in the centre is unexplained. It may reflect a form change, a new audience (monthly entries rose to about 340–370 in January and March 2024, from about 240 in December 2023), or both. Finally, the window for valid values (250–600 g/L) and the 10-minute session gap are judgement calls, and I have not tested the sensitivity of the results to either.
Conclusion
A series running from 330 to 450 g/L, centred on 390, is defensible: it holds 90% of independent measurement sessions, its two endpoints are equally well supported by the density curve, and no tested alternative improves on it by more than the sampling error. The centre is the weakest part of the result. The median is 390 over all years and 381 since early 2024, so a user at the midpoint of the series is, on recent evidence, a little above the typical user.
The range should be revisited if the median stays near 381 once the form’s defaults have been stable for a year. That would make it possible to separate a true shift in the population from an artefact of the instrument.
The form’s example value for users without a cylinder was changed from 390 to 380 g/L on 12 October 2026, the round number nearest the recent median of 381, and those users are now pointed at recipe 51. Entries at 380 should be expected to spike, as 400 and 390 did before, and the same de-heaping and winsorising will remove the excess. Those entries are guidance-following users, not measurements, so they will be down-weighted in any later analysis.