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.

All 37 →


0.9 Neonbrew — Brew 18 dealt
0.9 Gilded — Glaze 9 dealt
1.0 Irradiated — Special Blend 8 dealt
1.1 Limewire — Glaze 16 dealt
1.2 Gold Leaf — Topping 12 dealt
1.2 Affogato — Brew 5 dealt
1.2 Levitating — Special Blend 13 dealt
1.4 Chevron — Pour 18 dealt
1.4 Turkish — Brew 12 dealt
1.4 Burnt — Special Blend 17 dealt
1.5 Obsidian — Glaze 13 dealt
1.6 Red Eye — Brew 20 dealt
1.6 Shattered — Special Blend 21 dealt
1.6 Lime Flood — Atmosphere 22 dealt
1.7 Sunburst — Pour 22 dealt
1.8 Beaker — Vessel 21 dealt
1.9 Copper — Glaze 13 dealt
1.9 Cream Float — Topping 17 dealt
2.0 Espresso Tonic — Brew 16 dealt

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.

GradeShareCups%
Common 68968.97%
Uncommon 20020.02%
Rare 808.01%
Epic 151.50%
Legendary 50.50%
One of One 101.00%

Rarest ten

Vessel

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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

ValueShareCupsActualTargetTier
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