In 2002 two astronomers at Johns Hopkins took the light of more than 200,000 galaxies, added it all up, and asked what colour the sum was. They announced a pale turquoise. Six weeks later they announced a milky off‑white instead, ran a public competition to name it, and the winning entry was cosmic latte. The hex code that came out of that, #FFF8E7, has been copied into colour pickers, paint blogs and wallpaper packs ever since.
It is a lovely story and almost every retelling of it gets the moral wrong. The usual version is that a bug produced a silly answer, the bug was fixed, and now we know the true colour of the universe. That is not what happened. The bug was in a convention, not in the data, and the convention is still there in the number everyone quotes.
Ivan Baldry, one of the two authors, still publishes the averaged spectrum as a plain text file on his university page. So we downloaded it and did the colorimetry ourselves.
Rebuilding the measurement from the survey data
The file is the volume averaged, luminosity weighted spectrum of galaxies in the 2dF Galaxy Redshift Survey at redshift 0.059 to 0.069. It is 1,553 points of flux per unit wavelength, sampled every 0.25 nm from 348.5 nm to 736.5 nm in the rest frame. Putting that through the CIE 1931 two degree observer by direct integration gives:
- Chromaticity x = 0.3462, y = 0.3465. The published figure is 0.345, 0.345. We land 0.0015 away, which is about as close as two independent pipelines get.
- Correlated colour temperature 4,944 K by McCamy, 4,960 K by Hernández‑Andrés. The universe glows at roughly the temperature of a warm white bulb, well below the 6,500 K people tend to assume for anything described as neutral.
- The truncated spectrum is not a problem. The window from 349 nm to 736 nm captures 99.996 percent of the luminous efficiency function, and padding the red tail flat out to 780 nm moves the result by 0.000 dE00.
So the physics is reproducible and the input is sound. Now comes the part that decides what colour you see, and it has nothing to do with galaxies.
The famous hex code is the equal energy answer
A spectrum does not have a colour on its own. It has a set of tristimulus values, and turning those into a pixel requires you to nominate some spectrum as white, because the eye judges everything relative to its adaptation state. This is not a technicality bolted on at the end. It is the whole reason colour constancy works at all: the same surface reads as the same colour under a sunset and a fluorescent tube because the visual system keeps rescaling against whatever it has decided is white.
Nominate a different white and the same 2dF spectrum renders as a different pixel. Here is the whole set, computed from that one file, with CAT02 adaptation into sRGB and the brightest channel normalised to 255, which is the convention #FFF8E7 itself follows:
| White | What it is | xy | The universe | Chroma C* |
|---|---|---|---|---|
| E | Equal energy, a flat spectrum | 0.3333, 0.3333 | #FFF9EB | 7.4 |
| D50 | Print and proofing, 5003 K | 0.3457, 0.3585 | #FEF2FF | 7.9 |
| D55 | Mid morning daylight, 5503 K | 0.3324, 0.3474 | #FFEBEB | 7.2 |
| C | Average daylight, the old standard | 0.3101, 0.3162 | #FFE8CA | 17.8 |
| D65 | Screens and sRGB, 6504 K | 0.3127, 0.3290 | #FFE1CF | 14.7 |
| D75 | North sky daylight, 7504 K | 0.2990, 0.3149 | #FFDABE | 20.5 |
| FL7 | Broadband daylight fluorescent | 0.3129, 0.3292 | #FFE1D0 | 14.3 |
| FL2 | Cool white fluorescent | 0.3721, 0.3751 | #D7DFFF | 16.8 |
| A | Tungsten filament, 2856 K | 0.4476, 0.4074 | #74AEFF | 46.0 |
Look at the top row. Under illuminant E, a flat spectrum with equal energy at every wavelength, the 2dF spectrum renders as #FFF9EB. The published cosmic latte is #FFF8E7. Those two are 1.17 dE00 apart, which is under half a just noticeable difference and therefore the same colour as far as anyone’s eye is concerned.
Now look at the D65 row, the white point your monitor is actually built around and the one baked into every sRGB image on the web. The same spectrum renders #FFE1CF. That is a soft peach. It sits 10.57 dE00 from cosmic latte, better than four JNDs, and its hue angle has swung 34 degrees.
Which means the number in every colour picker is not the answer for the device displaying it. Baldry’s own page says D65 is the most common choice for white, and the published swatch does not use it. Cosmic latte is the equal energy answer, quietly rendered on screens calibrated for daylight.
Our reading of that
Equal energy is arguably the more honest choice here, and we suspect that is why it was made. D65 is a description of the sky above one particular planet. Adopting it means announcing the colour of the universe relative to an overcast afternoon in Europe, which is a strange thing to do to a cosmological result. Illuminant E has no location in it at all. A flat spectrum is the only white that does not smuggle in a viewpoint.
The problem is not the choice. The problem is that the choice was never carried along with the hex code, so the number travels the internet looking like a measurement when half of it is a stipulation.
The convention is louder than the measurement
You can put a number on how much of #FFF8E7 is universe and how much is bookkeeping. Under equal energy white, the rendered colour has a chroma of C* 7.43. That is the entire colour signal, the full extent to which the averaged light of 200,000 galaxies departs from grey.
Switching the white point from E to D65 moves the result 10.61 dE00. The convention change is 1.43 times larger than the signal it is supposed to be rendering. Across all nine standard whites in the table the spread reaches 39.4 dE00, from a cool peach to that startling cornflower blue under tungsten.
We have measured this shape before in a different setting. When we looked at metamerism, the finding was that two spectra matching under one illuminant part company by a median 9.13 dE00 under another. Same lesson, arriving from the other direction: the pairing of spectrum and white point is the real unit of colour, and quoting either one alone produces confident nonsense.
Why the universe was green for six weeks
The original turquoise announcement was traced to the software treating a slightly pinkish spectrum as white. Adapt against a white that leans pink and everything else leans green, because chromatic adaptation is a rescaling and a rescaling has a direction.
We can measure exactly how small that error had to be. Hold the 2dF spectrum fixed, slide the assumed white point off equal energy along the green to magenta direction, and solve for the point where the red‑green axis changes sign:
| Target | White point y | Error off E | The universe becomes |
|---|---|---|---|
| a* = 0, the line between beige and green | 0.3339 | 0.16% | #FFF8EB |
| a* = -2.3, one just noticeable step of green | 0.3300 | 1.01% | #FFFDEA |
| a* = -5, plainly green to anyone | 0.3250 | 2.49% | #FCFFE7 |
| a* = -15, roughly the turquoise announced in 2002 | 0.3079 | 7.64% | #E7FFD6 |
A white point wrong by 2.49 percent in one coordinate is enough to make the universe plainly green. To reach the turquoise that was actually announced takes 7.64 percent, which is a real mistake but not an outlandish one, and nothing about the output would look obviously broken to someone who had not expected beige.
The first row is the one worth staring at. The sign of the red‑green axis flips at a white point 0.16 percent off equal energy. Under illuminant E itself the universe already computes to a* = -0.35, which is to say very faintly green. The cosmic spectrum sits so close to neutral that the answer to “is the universe greenish or pinkish” is not a measurement at all. It is a rounding artefact of whatever white you started from.
That reframes the 2002 embarrassment considerably. Two astronomers did not fumble a calculation and land somewhere absurd. They picked a number on a knife edge, and the knife edge was in the colour science rather than the astronomy. Everyone who has since written the story up as a cautionary tale about sloppy code has missed that the quantity itself is pathologically sensitive.
Every spectral feature astronomers care about is invisible
The 2dF average spectrum is not smooth. It carries the absorption lines that stellar population work lives on, and the paper it came from used exactly those features to constrain star formation history. Measured against a 50 nm continuum fit, the depths are substantial:
- Calcium II K at 393.4 nm, 18.0 percent below continuum. Calcium II H at 396.8 nm, 18.7 percent.
- The G band at 430.5 nm, 14.8 percent. Magnesium b at 517.5 nm, 13.0 percent.
- Sodium D at 589.3 nm, 7.8 percent.
- Hydrogen alpha at 656.3 nm runs the other way, sitting 28.6 percent above continuum, because the average galaxy is still making stars and the gas around them is emitting.
Now the colorimetric test. Replace the spectrum with a smoothed version at progressively coarser resolution and see whether the colour notices. At 5 nm, 10 nm and 20 nm smoothing the rendered hex does not change at all: 0.000 dE00. Only at 50 nm, by which point the continuum shape itself is being flattened, does anything move, and even then only 0.416 dE00.
So the calcium break that tells you how old the stars are, the magnesium feature that tells you about metallicity, and the hydrogen emission that tells you stars are still forming are, colorimetrically, worth nothing. Three colour channels cannot carry 1,553 numbers. This is the dimensional collapse at the heart of vision, and the cosmic spectrum is an unusually pure demonstration of it: an entire research programme rides on structure the eye discards completely.
Nobody has ever seen cosmic latte, including the survey
One more thing hides in the data file. The spectrum is in the rest frame. Every galaxy has been de‑redshifted back to where it would sit if it were not receding. The light that actually landed in the telescope was stretched.
Redshift the spectrum by the survey’s own z and the colour walks:
- z = 0, the published rest frame: #FFF9EB.
- z = 0.064, the mean redshift of the sample, which is to say the light as it arrived: #FFFBDF, a straw yellow 5.44 dE00 from the published colour.
- z = 0.10: #FFFDD7, 8.58 dE00 away.
- z = 0.148: #FFFCCB, 11.03 dE00 away. Past this the published spectrum no longer reaches 400 nm in the observed frame, so the measurement runs out of blue.
Cosmic latte is therefore a counterfactual. It is the colour the universe would be if nothing were moving away from us, viewed under a white that exists nowhere in nature, normalised so its brightest channel maxes out. Three stipulations deep before any galaxy gets a say.
We do not think that makes it worthless. Rest frame is the right frame if the question is what the stars are doing rather than what our telescope catches. But “the average colour of the universe” is doing a lot of rhetorical work for a quantity with that many riders attached.
It is not a latte, and it already had a name
The name is charming and, as a colour match, wrong. Measured against #FFF8E7:
- A café latte around #C69C6D is 24.8 dE00 away and 30 units darker in L*.
- A cappuccino at #D8B08C, 19.6 dE00. A flat white, 30.5 dE00.
- Espresso, 75.0 dE00, which is most of the way across colour space.
- Whole milk at #FDFFF5, 4.62 dE00. The closest drink on the list is the one with no coffee in it.
Cosmic latte is a very light warm off‑white at L* 97.7. Every actual coffee drink lives 20 to 40 L* below it. If you painted a wall this colour and told guests it was the universe, they would call it magnolia, and they would be within 2.58 dE00 of correct.
Then we ran it against all 148 named colours in CSS Color 3, and found something we did not expect. Exactly one keyword lands within a JND:
oldlace, #FDF5E6, sits 1.21 dE00 from cosmic latte. That is closer than the gap between the published hex and our own recomputation of it from the survey data. The colour of the universe is indistinguishable from a keyword that came out of the X11 rgb.txt list, which predates the 2dF result by roughly two decades. Somebody picking names for a window manager palette in the 1980s got there first, by eye, and called it old lace.
We find that more interesting than a coincidence. Cosmic latte is a very light, very slightly yellow off‑white, and that region of colour space is where human naming is densest, because it is where paint, paper, linen and skin all live. When we counted colour naming behaviour we found 101 hex codes filed under two or more different words. The near white warm corner is crowded. Any measurement landing there was always going to collide with an existing name.
What to actually do with #FFF8E7
If you want the number for a design, use it and enjoy it. It is a good off‑white, better than most, and it comes with a story.
If you want to be accurate about it, three things are worth saying out loud whenever the hex code gets quoted:
- It is the equal energy rendering. On a D65 display, which is every display, the honest sRGB triplet for that spectrum is #FFE1CF.
- It is a rest frame colour, not an observed one. The light as it reached the telescope was #FFFBDF.
- It is 7.62 dE00 from pure white, about 3.3 JNDs. The universe is off‑white by a margin you can just about see, and only 671 of the 16.7 million sRGB codes sit within one JND of it.
That last figure is the one we keep coming back to. The entire colour of everything, averaged over 200,000 galaxies and a few billion years of star formation, amounts to a barely perceptible warm tint. Our piece on planet colours found the same thing one scale down: measured properly from albedo data, the solar system is mostly beige and cyan, not the saturated marbles of the posters. Average enough light together and you get grey. It happens to stars, it happens to planets, and it happens on a palette too.
If you want to find out whether you can actually see a 7.62 dE00 difference, the near white end is where our own game is hardest. Try the Name That Colour mode, where the task is putting a word to a swatch, and notice how quickly the vocabulary runs out up in the pale warm corner. Or play the standard colour memory game and watch what happens when two rounds in a row land near white. The universe picked the hardest part of the space to sit in.
A note on method
Everything above comes from one input file and one pipeline: Baldry and Glazebrook’s published 2dFGRS average spectrum, the CIE 1931 two degree observer at 1 nm, direct integration for tristimulus values, CAT02 for chromatic adaptation, the sRGB transfer function for encoding, and CIEDE2000 for every distance. Max channel normalisation throughout, matching the published swatch. Nothing here needs data we do not link to, and the chromaticity check against the authors’ own 0.345, 0.345 is the evidence that the pipeline is wired correctly.
The one judgement call worth flagging: we used CAT02 rather than a plain von Kries scaling in XYZ for the white point changes. Von Kries moves the D65 answer a little further into peach, so if anything the 10.57 dE00 gap between the equal energy and daylight renderings is a conservative figure. And our colour temperature numbers use approximation formulae rather than a full Planckian locus solve, which we did properly in the colour temperature chart piece and which is where we also found that 6,500 K is not D65.