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.

330 to 450 g/L holds 90% of corrected sessionsGrey bars show the share of raw entries at each density from 300 to 500 g/L, with large spikes at round numbers and 15.8% of entries at 400. A blue line shows the corrected, smoothed density, a broad flat-topped curve with median 390. The band from 330 to 450 holds about 90% of corrected sessions.330–450 g/L holds 90% of corrected sessionsShare of raw entries per g/L (grey bars) against the de-heaped, one-vote-per-session density (blue line)0%2%4%6%300 g/L: 1.02% of raw entries301 g/L: 0.05% of raw entries302 g/L: 0.03% of raw entries303 g/L: 0.03% of raw entries304 g/L: 0.07% of raw entries305 g/L: 0.10% of raw entries306 g/L: 0.05% of raw entries307 g/L: 0.04% of raw entries308 g/L: 0.09% of raw entries309 g/L: 0.06% of raw entries310 g/L: 0.27% of raw entries311 g/L: 0.02% of raw entries312 g/L: 0.02% of raw entries313 g/L: 0.14% of raw entries314 g/L: 0.01% of raw entries315 g/L: 0.11% of raw entries316 g/L: 0.01% of raw entries317 g/L: 0.03% of raw entries318 g/L: 0.02% of raw entries319 g/L: 0.10% of raw entries320 g/L: 0.48% of raw entries321 g/L: 0.20% of raw entries322 g/L: 0.13% of raw entries323 g/L: 0.10% of raw entries324 g/L: 0.19% of raw entries325 g/L: 0.32% of raw entries326 g/L: 0.12% of raw entries327 g/L: 0.12% of raw entries328 g/L: 0.18% of raw entries329 g/L: 0.16% of raw entries330 g/L: 0.78% of raw entries331 g/L: 0.25% of raw entries332 g/L: 0.16% of raw entries333 g/L: 0.27% of raw entries334 g/L: 0.18% of raw entries335 g/L: 0.19% of raw entries336 g/L: 0.30% of raw entries337 g/L: 0.26% of raw entries338 g/L: 0.20% of raw entries339 g/L: 0.26% of raw entries340 g/L: 1.53% of raw entries341 g/L: 0.20% of raw entries342 g/L: 0.25% of raw entries343 g/L: 0.39% of raw entries344 g/L: 0.35% of raw entries345 g/L: 0.72% of raw entries346 g/L: 0.24% of raw entries347 g/L: 0.30% of raw entries348 g/L: 0.36% of raw entries349 g/L: 0.18% of raw entries350 g/L: 1.97% of raw entries351 g/L: 0.38% of raw entries352 g/L: 0.45% of raw entries353 g/L: 0.33% of raw entries354 g/L: 0.44% of raw entries355 g/L: 0.65% of raw entries356 g/L: 0.45% of raw entries357 g/L: 0.42% of raw entries358 g/L: 0.39% of raw entries359 g/L: 0.40% of raw entries360 g/L: 1.74% of raw entries361 g/L: 0.39% of raw entries362 g/L: 0.50% of raw entries363 g/L: 0.38% of raw entries364 g/L: 0.45% of raw entries365 g/L: 1.14% of raw entries366 g/L: 0.83% of raw entries367 g/L: 0.44% of raw entries368 g/L: 0.58% of raw entries369 g/L: 0.57% of raw entries370 g/L: 1.80% of raw entries371 g/L: 0.65% of raw entries372 g/L: 0.65% of raw entries373 g/L: 0.49% of raw entries374 g/L: 0.54% of raw entries375 g/L: 1.32% of raw entries376 g/L: 0.58% of raw entries377 g/L: 0.74% of raw entries378 g/L: 0.78% of raw entries379 g/L: 0.43% of raw entries380 g/L: 2.27% of raw entries381 g/L: 0.49% of raw entries382 g/L: 0.46% of raw entries383 g/L: 0.55% of raw entries384 g/L: 0.62% of raw entries385 g/L: 0.95% of raw entries386 g/L: 0.65% of raw entries387 g/L: 0.56% of raw entries388 g/L: 0.67% of raw entries389 g/L: 0.57% of raw entries390 g/L: 5.54% of raw entries391 g/L: 0.98% of raw entries392 g/L: 0.73% of raw entries393 g/L: 0.57% of raw entries394 g/L: 0.53% of raw entries395 g/L: 1.06% of raw entries396 g/L: 0.49% of raw entries397 g/L: 0.52% of raw entries398 g/L: 0.49% of raw entries399 g/L: 0.54% of raw entries400 g/L: 15.77% of raw entries401 g/L: 0.55% of raw entries402 g/L: 0.74% of raw entries403 g/L: 0.59% of raw entries404 g/L: 0.86% of raw entries405 g/L: 0.62% of raw entries406 g/L: 0.55% of raw entries407 g/L: 0.46% of raw entries408 g/L: 0.63% of raw entries409 g/L: 0.46% of raw entries410 g/L: 1.50% of raw entries411 g/L: 0.43% of raw entries412 g/L: 0.76% of raw entries413 g/L: 0.58% of raw entries414 g/L: 0.54% of raw entries415 g/L: 0.76% of raw entries416 g/L: 0.40% of raw entries417 g/L: 0.58% of raw entries418 g/L: 0.60% of raw entries419 g/L: 0.35% of raw entries420 g/L: 1.61% of raw entries421 g/L: 0.31% of raw entries422 g/L: 0.42% of raw entries423 g/L: 0.44% of raw entries424 g/L: 0.42% of raw entries425 g/L: 0.68% of raw entries426 g/L: 0.30% of raw entries427 g/L: 0.34% of raw entries428 g/L: 0.39% of raw entries429 g/L: 0.27% of raw entries430 g/L: 1.17% of raw entries431 g/L: 0.42% of raw entries432 g/L: 0.21% of raw entries433 g/L: 0.19% of raw entries434 g/L: 0.18% of raw entries435 g/L: 0.38% of raw entries436 g/L: 0.19% of raw entries437 g/L: 0.23% of raw entries438 g/L: 0.18% of raw entries439 g/L: 0.14% of raw entries440 g/L: 0.92% of raw entries441 g/L: 0.18% of raw entries442 g/L: 0.33% of raw entries443 g/L: 0.14% of raw entries444 g/L: 0.30% of raw entries445 g/L: 0.31% of raw entries446 g/L: 0.30% of raw entries447 g/L: 0.21% of raw entries448 g/L: 0.13% of raw entries449 g/L: 0.20% of raw entries450 g/L: 1.23% of raw entries451 g/L: 0.19% of raw entries452 g/L: 0.23% of raw entries453 g/L: 0.17% of raw entries454 g/L: 0.14% of raw entries455 g/L: 0.35% of raw entries456 g/L: 0.10% of raw entries457 g/L: 0.14% of raw entries458 g/L: 0.13% of raw entries459 g/L: 0.10% of raw entries460 g/L: 0.42% of raw entries461 g/L: 0.06% of raw entries462 g/L: 0.10% of raw entries463 g/L: 0.06% of raw entries464 g/L: 0.05% of raw entries465 g/L: 0.25% of raw entries466 g/L: 0.07% of raw entries467 g/L: 0.04% of raw entries468 g/L: 0.07% of raw entries469 g/L: 0.07% of raw entries470 g/L: 0.30% of raw entries471 g/L: 0.10% of raw entries472 g/L: 0.10% of raw entries473 g/L: 0.07% of raw entries474 g/L: 0.06% of raw entries475 g/L: 0.16% of raw entries476 g/L: 0.01% of raw entries477 g/L: 0.04% of raw entries478 g/L: 0.11% of raw entries479 g/L: 0.00% of raw entries480 g/L: 0.34% of raw entries481 g/L: 0.05% of raw entries482 g/L: 0.03% of raw entries483 g/L: 0.03% of raw entries484 g/L: 0.05% of raw entries485 g/L: 0.06% of raw entries486 g/L: 0.00% of raw entries487 g/L: 0.06% of raw entries488 g/L: 0.01% of raw entries489 g/L: 0.05% of raw entries490 g/L: 0.20% of raw entries491 g/L: 0.03% of raw entries492 g/L: 0.00% of raw entries493 g/L: 0.04% of raw entries494 g/L: 0.03% of raw entries495 g/L: 0.09% of raw entries496 g/L: 0.11% of raw entries497 g/L: 0.00% of raw entries498 g/L: 0.04% of raw entries499 g/L: 0.02% of raw entries500 g/L: 0.78% of raw entries330450median 39015.8% of raw entriessit at 400 (bar clipped)300350400450500Bulk density (g/L)
Source: 9,326 density form entries, August 2021 to October 2026; densities 300–500 g/L shown.
WindowMedian (g/L)5th percentile95th percentile90% highest-density intervalShare 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 2024381.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 2024380.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.

WeightingMedian5th percentile95th percentileShare inside 330–450
Raw, unweighted39532746087.9%
Entries ending in 0 at half weight39232745887.7%
Data-driven de-heaping39032845588.3%
De-heaping plus one vote per session39033245390.0%
Entries ending in 0 or 5 dropped38932845488.0%
Dropped, plus one vote per session39133345489.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.

SubsetEntries (sessions)Median5th percentile95th percentile90% highest-density intervalShare inside 330–450
Fine (0.1 g certain), all years4,379 (3,346)390.0 (388.5–391.4)331.3 (328.6–333.0)454.4 (452.2–457.6)328–45289% (88–90%)
Coarse (ends in 0 or 5), all years3,164 (2,240)383.3 (381.5–385.6)320.5 (315.8–324.6)473.8 (466.8–481.4)298–500, unstable85% (84–86%)
Fine, since March 20242,046 (1,550)381.2 (378.2–383.5)326.8 (323.0–329.1)448.7 (443.4–452.8)321–44689% (87–90%)
Coarse, since March 20241,472 (1,042)378.9 (376.7–381.2)318.2 (310.2–323.6)458.1 (452.4–469.3)299–454, unstable87% (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.

IntervalRange (g/L)RecipesSessions inside
Central 80% (equal tails)344–4399680%
Narrowest 80%343–4359380%
Current series330–45012190%
Mean ± 2 SD316–46515095.5%
Central 95% (equal tails)322–46914895%

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.