Back of house
What is in here, and how it got that way
The ten that are poured by hand, the values almost nothing rolls, the exact count of every trait across all 999 cups, and the machinery underneath. Four answers to one question, so one page.
Ten of one
One-of-one latte art
Ten editions are poured with a design that exists exactly once in the collection. They are curated, not rolled — which is why they sit outside the rarest-rolled-value rule rather than breaking it. Neonbrew is the rarest thing the generator can produce; a one-of-one is not something the generator produces at all.
The editions themselves are still derived from the seed epoch, so a reroll moves them and none is hand-picked. Which cup each design lands on — vessel, glaze, brew, room — stays an ordinary roll, so a one-of-one can be an espresso in a diner mug at 5am. That is better than staging them: the art is the special thing, not the setting.
Why they are shot from higher up
Latte art at the collection's ordinary three-quarter tilt is a 52×21 sliver, and a swan in it is four grey pixels. A piece nobody can see is not a piece, so the ten are drawn from a higher camera angle. Narrow vessels are also widened by up to a third — the shape untouched, simply a bigger one of itself — because tilt only makes a mouth taller, and a bear's face at 42 pixels across is four grey smudges either way.
The scarce end
Everything under 2%
A value counts as scarce when a cup has a 2% or smaller chance of rolling it. That line is drawn from the weights rather than by hand, so this page cannot drift from the tables it describes: make a value rarer and it appears here, in the metadata and in the gallery filter without anyone remembering to add it.
19 scarce values across 7 different tables. 253 of 999 cups (25.3%) carry at least one; 37 carry two or more.
Two or more
The top of the collection, and the only place these traits meet. A handful of each below — the count beside every row opens the gallery filtered to all of them, which is the place to actually look through cups.
Why it holds
The scarce end is spread across the tables
A collection whose every grail lives in one table has a single axis of interest. The scarce values here sit in eight different categories — glaze, brew, atmosphere, anomaly, topping, steam, mark and counter — and the test asserts that spread, so a future weight change cannot quietly collapse it back into one.
traits.test.ts
A rare colour may not leak
Seven trait values put #ccff00 on a cup. Every OTHER cup in the collection is rendered and checked pixel by pixel: not one may fall in the ccff00 family, in the room, on the counter or in the steam. The check is narrow enough to tell matcha and a sage glaze apart from the real thing. A rare colour that leaks is not a rare colour.
render.test.ts
A scarce trait is one you can see
The converse, and it matters more: a rarity that renders invisibly prices a cup on metadata the picture does not back. Every cup carrying a ccff00 trait must show it, and the mark falls back to the saucer rather than vanishing when a short cup leaves no wall to print on.
render.test.ts
Counted, not sampled
Rarity
All 999 fit in memory, so every number on this page is an exact count of the collection rather than an estimate from a sample. Target is what the weights promise; actual is what this draw dealt. Drift is correct — a finite collection is a draw, not a quota.
One deliberate source of drift: cold drinks are rolled a steam trait and then overridden to None, because cold brew does not steam. It is done that way round so adding a cold drink later cannot re-roll any other trait, and it shows up honestly here instead of being hidden.
Grade
Percentiles of the rolled cups themselves, not of a synthetic sample — so Legendary means precisely the highest roast scores that exist. The ten one-of-ones are graded separately because they are not on the same scale.
| Grade | Share | Cups | % |
|---|---|---|---|
| Common | 689 | 68.97% | |
| Uncommon | 200 | 20.02% | |
| Rare | 80 | 8.01% | |
| Epic | 15 | 1.50% | |
| Legendary | 5 | 0.50% | |
| One of One | 10 | 1.00% |
Rarest ten
Vessel
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| Mug | 244 | 24.42% | 23.46% | Uncommon | |
| Diner | 156 | 15.62% | 14.66% | Uncommon | |
| Tulip | 99 | 9.91% | 10.75% | Uncommon | |
| Paper | 109 | 10.91% | 10.75% | Uncommon | |
| Bowl | 91 | 9.11% | 8.80% | Rare | |
| Cortado | 71 | 7.11% | 7.82% | Rare | |
| Demitasse | 54 | 5.41% | 6.84% | Rare | |
| Tumbler | 46 | 4.60% | 5.87% | Rare | |
| Mason | 48 | 4.80% | 4.40% | Rare | |
| Thermos | 26 | 2.60% | 2.44% | Epic | |
| Goblet | 34 | 3.40% | 2.44% | Epic | |
| Beaker | 21 | 2.10% | 1.76% | Epic |
Glaze
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| Bone | 161 | 16.12% | 15.59% | Uncommon | |
| Charcoal | 125 | 12.51% | 12.47% | Uncommon | |
| Kraft | 111 | 11.11% | 11.95% | Uncommon | |
| Cream | 100 | 10.01% | 10.40% | Uncommon | |
| Sage | 94 | 9.41% | 8.84% | Rare | |
| Slate | 87 | 8.71% | 8.32% | Rare | |
| Terracotta | 91 | 9.11% | 7.28% | Rare | |
| Cobalt | 47 | 4.70% | 6.24% | Rare | |
| Speckle | 64 | 6.41% | 5.72% | Rare | |
| Ink | 39 | 3.90% | 4.68% | Rare | |
| Steel | 29 | 2.90% | 3.12% | Epic | |
| Copper | 13 | 1.30% | 1.87% | Epic | |
| Obsidian | 13 | 1.30% | 1.46% | Epic | |
| Limewire | 16 | 1.60% | 1.14% | Epic | |
| Gilded | 9 | 0.90% | 0.94% | Legendary |
Brew
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| Drip | 150 | 15.02% | 14.99% | Uncommon | |
| Espresso | 110 | 11.01% | 11.99% | Uncommon | |
| Latte | 105 | 10.51% | 10.99% | Uncommon | |
| Americano | 76 | 7.61% | 9.49% | Rare | |
| Cappuccino | 86 | 8.61% | 8.49% | Rare | |
| Cold Brew | 92 | 9.21% | 7.49% | Rare | |
| Flat White | 74 | 7.41% | 6.49% | Rare | |
| Cortado | 58 | 5.81% | 5.49% | Rare | |
| Mocha | 55 | 5.51% | 4.80% | Rare | |
| Oat Latte | 35 | 3.50% | 4.20% | Rare | |
| Nitro | 25 | 2.50% | 3.50% | Epic | |
| Matcha | 36 | 3.60% | 2.80% | Epic | |
| Chai | 26 | 2.60% | 2.20% | Epic | |
| Red Eye | 20 | 2.00% | 1.60% | Epic | |
| Espresso Tonic | 16 | 1.60% | 2.00% | Epic | |
| Affogato | 5 | 0.50% | 1.20% | Epic | |
| Turkish | 12 | 1.20% | 1.40% | Epic | |
| Neonbrew | 18 | 1.80% | 0.90% | Legendary |
Pour
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| Still | 220 | 22.02% | 20.96% | Uncommon | |
| Crema | 161 | 16.12% | 15.72% | Uncommon | |
| Foam | 127 | 12.71% | 11.35% | Uncommon | |
| Heart | 75 | 7.51% | 8.30% | Rare | |
| Rosetta | 58 | 5.81% | 6.81% | Rare | |
| Tulip | 50 | 5.01% | 5.59% | Rare | |
| Ring | 47 | 4.70% | 5.07% | Rare | |
| Leaf | 27 | 2.70% | 4.54% | Rare | |
| Spiral | 51 | 5.11% | 4.02% | Rare | |
| Dots | 33 | 3.30% | 3.67% | Epic | |
| Wave | 30 | 3.00% | 3.32% | Epic | |
| Feather | 26 | 2.60% | 2.97% | Epic | |
| Clover | 19 | 1.90% | 2.45% | Epic | |
| Bloom | 25 | 2.50% | 2.10% | Epic | |
| Sunburst | 22 | 2.20% | 1.75% | Epic | |
| Chevron | 18 | 1.80% | 1.40% | Epic |
Topping
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| None | 603 | 60.36% | 59.44% | Common | |
| Cocoa Dust | 85 | 8.51% | 8.63% | Rare | |
| Cinnamon | 66 | 6.61% | 7.19% | Rare | |
| Foam Crown | 69 | 6.91% | 6.23% | Rare | |
| Whip | 54 | 5.41% | 4.79% | Rare | |
| Sugar Cube | 38 | 3.80% | 4.31% | Rare | |
| Cocoa Bean | 24 | 2.40% | 3.64% | Epic | |
| Marshmallow | 31 | 3.10% | 2.68% | Epic | |
| Cream Float | 17 | 1.70% | 1.92% | Epic | |
| Gold Leaf | 12 | 1.20% | 1.15% | Epic |
Sleeve
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| None | 594 | 59.46% | 58.35% | Common | |
| Kraft | 109 | 10.91% | 11.07% | Uncommon | |
| Ribbed | 77 | 7.71% | 8.55% | Rare | |
| Knit | 77 | 7.71% | 7.04% | Rare | |
| Printed | 49 | 4.90% | 5.53% | Rare | |
| Tape | 43 | 4.30% | 4.23% | Rare | |
| Napkin | 28 | 2.80% | 3.02% | Epic | |
| Receipt | 22 | 2.20% | 2.21% | Epic |
Mark
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| None | 508 | 50.85% | 49.64% | Common | |
| Bean | 84 | 8.41% | 9.82% | Rare | |
| Ring Stamp | 82 | 8.21% | 8.27% | Rare | |
| Drop | 74 | 7.41% | 7.24% | Rare | |
| Monogram | 55 | 5.51% | 6.20% | Rare | |
| Crest | 51 | 5.11% | 5.17% | Rare | |
| Barcode | 43 | 4.30% | 4.14% | Rare | |
| Chain | 34 | 3.40% | 3.31% | Epic | |
| Cherry | 27 | 2.70% | 2.48% | Epic | |
| CCoFF00 | 41 | 4.10% | 3.72% | Epic |
Steam
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| None | 342 | 34.23% | 25.95% | Common | |
| Wisp | 173 | 17.32% | 20.76% | Uncommon | |
| Twin | 136 | 13.61% | 16.44% | Uncommon | |
| Curl | 114 | 11.41% | 12.98% | Uncommon | |
| Heavy | 86 | 8.61% | 9.52% | Rare | |
| Rings | 75 | 7.51% | 6.92% | Rare | |
| Glyph | 47 | 4.70% | 4.33% | Rare | |
| Charged | 26 | 2.60% | 3.11% | Epic |
Counter
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| Oak | 241 | 24.12% | 22.95% | Uncommon | |
| Walnut | 152 | 15.22% | 15.57% | Uncommon | |
| Marble | 144 | 14.41% | 13.93% | Uncommon | |
| Concrete | 111 | 11.11% | 12.30% | Uncommon | |
| Steel | 96 | 9.61% | 9.84% | Rare | |
| Tile | 78 | 7.81% | 8.20% | Rare | |
| Napkin | 79 | 7.91% | 7.38% | Rare | |
| Reclaimed | 59 | 5.91% | 5.74% | Rare | |
| Void | 39 | 3.90% | 4.10% | Rare |
Atmosphere
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| Morning | 207 | 20.72% | 20.33% | Uncommon | |
| Roastery | 157 | 15.72% | 14.91% | Uncommon | |
| Dusk | 110 | 11.01% | 12.87% | Uncommon | |
| Fluorescent | 99 | 9.91% | 10.84% | Uncommon | |
| Rain Window | 84 | 8.41% | 8.81% | Rare | |
| Late Shift | 86 | 8.61% | 7.45% | Rare | |
| Neon | 60 | 6.01% | 6.10% | Rare | |
| Daylight | 60 | 6.01% | 5.42% | Rare | |
| Sunbeam | 47 | 4.70% | 4.88% | Rare | |
| Blackout | 42 | 4.20% | 3.79% | Epic | |
| Lime Haze | 25 | 2.50% | 2.98% | Epic | |
| Lime Flood | 22 | 2.20% | 1.63% | Epic |
Special Blend
| Value | Share | Cups | Actual | Target | Tier |
|---|---|---|---|---|---|
| None | 682 | 68.27% | 70.07% | Common | |
| Ring Stain | 71 | 7.11% | 7.01% | Rare | |
| Chipped | 62 | 6.21% | 5.51% | Rare | |
| Overflow | 41 | 4.10% | 4.20% | Rare | |
| Cracked | 38 | 3.80% | 3.40% | Epic | |
| Double | 31 | 3.10% | 2.60% | Epic | |
| Ghosted | 15 | 1.50% | 2.00% | Epic | |
| Shattered | 21 | 2.10% | 1.60% | Epic | |
| Burnt | 17 | 1.70% | 1.40% | Epic | |
| Levitating | 13 | 1.30% | 1.20% | Epic | |
| Irradiated | 8 | 0.80% | 1.00% | Epic |
How it is put together
The build
Zero runtime dependencies. TypeScript, a hand-rolled PNG encoder over node:zlib, and 51 tests. The whole collection is a pure function of one integer and the trait tables — there is no database, no asset pipeline, and no stored artwork anywhere in the system.
Held by tests, not by intention
The scarce end is spread across the tables
A collection whose every grail lives in one table has a single axis of interest. The scarce values here sit in eight different categories — glaze, brew, atmosphere, anomaly, topping, steam, mark and counter — and the test asserts that spread, so a future weight change cannot quietly collapse it back into one.
traits.test.ts
A rare colour may not leak
Seven trait values put #ccff00 on a cup. Every OTHER cup in the collection is rendered and checked pixel by pixel: not one may fall in the ccff00 family, in the room, on the counter or in the steam. The check is narrow enough to tell matcha and a sage glaze apart from the real thing. A rare colour that leaks is not a rare colour.
render.test.ts
A scarce trait is one you can see
The converse, and it matters more: a rarity that renders invisibly prices a cup on metadata the picture does not back. Every cup carrying a ccff00 trait must show it, and the mark falls back to the saucer rather than vanishing when a short cup leaves no wall to print on.
render.test.ts
Most of it looks like an ordinary cup of coffee
The exceptions only read as exceptions if the baseline is boring, so the baseline is asserted rather than hoped for: no topping, no sleeve, no anomaly, nothing scarce, across most of the collection.
traits.test.ts
Identity
A cup is a number. Nothing about it is stored anywhere — hand the generator an edition and it returns the same cup, forever.
The edition seeds the art
Deliberately, and not as a default. Seeding from a chain height or a wallet would tie every cup to a range that has not been decided yet, and the day it moved, all 999 would silently become different cups. Seeding from the edition makes the art final now and lets anything else be mapped onto it later without a pixel changing.
edition.ts
Out of range is refused, never clamped
#1000 is not a cup that exists, and quietly handing back #999 would make two URLs claim one piece. Junk input throws rather than coercing — Number("12abc") is NaN, and a NaN seed renders one identical cup for every piece of junk anyone types.
edition.ts
Every trait draws from its own stream
Salted per category off one edition. With a single shared sequence, appending one weighted pick would re-roll the entire collection — so adding a trait later would mean reprinting all 999.
random.ts
Sequential seeds were the risk
#136 and #137 differ in one character, and a weak hash would deal them near-identical streams: a collection that comes out in visible runs of siblings. FNV-1a avalanches the string and mulberry32 mixes hard on top. Two tests check consecutive editions explicitly, because this is the assumption the whole thing rests on.
random.ts
Drawing
Nothing in the geometry picks a colour, and nothing in the colour knows about geometry. That split is what lets one glaze repaint a whole cup and one anomaly repaint the whole collection.
Slots, not pixels
The sprite lays down palette slot indices — "this is body highlight", "this is liquid" — over a 128x128 grid, and the renderer maps slot to RGBA afterwards. Irradiated pushes an entire cup to ccff00 without touching a single line of geometry.
sprite.ts
Shapes clip themselves
The liquid paints only onto the interior it was poured into; the handle paints only onto the room it hangs in. That is cheaper and far more reliable than computing where each shape ends, and it cannot drift when a vessel profile changes.
sprite.ts
One outline pass, at the end
Outlining as part of each shape means every shape has to know what it might overlap, and the seams show wherever two of them meet. A single pass over the finished silhouette cannot produce a seam.
shapes.ts
Art is drawn in unit space
A design is a pure function of (u, v) over the liquid ellipse. Because that ellipse is wide and short, a circle in unit space comes out as a wide flat oval on screen — which is exactly what a round shape poured onto a liquid surface looks like from where the camera is. Screen-space designs would need hand-squashing, and re-squashing the day a vessel tilt changed.
art.ts
Anything that wraps the cup is an arc
A sleeve, a ridge, a thread, a foot ring, the level of coffee inside a glass — each is a circle around a cylinder, and a circle around a cylinder projects to an ellipse whose front half bows downward. Drawn as flat horizontal lines they read as stickers laid over the picture rather than as paper wrapped round a cup, which was the single thing that most gave the early renders away.
shapes.ts
Silhouette is the highest-leverage table
Eleven vessels as profile functions: half-width as a function of depth. Two cups with the same glaze and brew still look like different objects if their profiles differ, and no amount of colour variety rescues eleven cups that are all the same trapezoid.
vessels.ts
Light
The room is computed per pixel. Objects take a fraction of the same light, so the cup stands in the room rather than in front of it.
Exposure belongs to the room, not the material
A slot colour knows what marble looks like and knows nothing about where it is standing. Without a per-atmosphere exposure, a marble counter renders near-white at 3am and Late Shift looks like a daylit scene with a dark wall behind it.
render.ts
A near-black glaze inverts the keyline
Ink's deepest value is #090a0b. Pushing it further down for an outline leaves a silhouette that vanishes into a dim room entirely, so below a luminance floor the keyline goes UP instead — which is how a dark object separates from a dark ground in the first place.
render.ts
The counter is lit along its length
It is a horizontal plane taking grazing light from a lamp well above it, so distance-to-lamp leaves the whole surface flat. Lighting it by how far along it you are is what turns a bright band into a counter with a pool of light on it.
render.ts
Things that were wrong first
Each of these shipped once, looked wrong on screen, and is now held in place by a test.
Whipped cream rendered in coffee brown
The topping colour was read off the brew, so cream came out the same shade as the drink and looked like a spill. It was also drawn at 62% of the cup width in four stacked mounds, which buried the coffee — 470 pixels of cream on a cup whose whole body is 1,200. Toppings now have their own materials and sit toward the back of the surface, so the near crescent of the drink is always visible.
render.ts
A dusting buried a one-of-one
Cocoa over a skull that exists once in 999. Reordering the draw was not enough on its own: the design also has to be allowed to paint over topping slots, or "after" changes nothing. The cup keeps its cocoa; you see the skull through it.
sprite.ts
The ccff00 mark read as "ГH"
A lowercase r at this size is a two-pixel stem with a one-pixel shoulder, which renders as a capital gamma. The mark is uppercase now, and that is a legibility decision rather than a branding one.
art.ts
Goblets stood in a puddle
A goblet is a bowl on a stick and the coffee is in the bowl. Filling straight down the profile poured it into the foot. Drawn as a straight taper it came out a martini glass; drawn with a short bowl it came out a mushroom.
vessels.ts
One-of-ones were invisible
Latte art at the collection’s ordinary tilt is a 52x21 sliver, and a swan in it is four grey pixels. The ten are shot from a higher camera angle, and narrow vessels are widened up to a third — the shape untouched, simply a bigger one of itself — because tilt only makes a mouth taller.
sprite.ts
Rerolling
The collection is a pure function of one number and the trait tables. That number is the only supported way to change what was dealt.
Bump the epoch, never a weight
Changing SEED_EPOCH deals an entirely new hand from identical tables. Nudging a weight to "get a better spread" changes what the collection IS, whereas the epoch only changes which draw it got.
random.ts
The epoch is chosen, not taken
Surveyed against thirty candidates on stated conditions: nothing extinct, no scarce value down to one or two cups, and enough cups carrying two scarce traits at once that the top of the collection is interesting rather than a flat tier. An early draw left a grail with a single holder, which is a worse collection from identical tables.
epochs.ts
Grades are percentiles of this collection
Not of a synthetic sample. That is the benefit of a finite drop: Legendary means precisely the highest roast scores that exist, rather than roughly the top half-percent. The cuts are hardcoded so a grade means the same thing on every machine, and re-derived whenever a weight or the epoch changes.
traits.ts