|
Tapetum Selenium |
Tapetum Selenium Light |
|
|---|---|---|
| background | #14131A |
#F5F2F0 |
| foreground | #D6DEEC |
#1E1C22 |
| keyword | #B1A2D0 |
#60537D |
| function | #BDD4E0 |
#31454F |
| string | #A7BBDE |
#3A506E |
| type | #BD86AD |
#865277 |
| number | #D17F90 |
#9F5263 |
| tag | #D58075 |
#A7564E |
| comment | #807A8A |
#736C7C |
Hadal


Water eats colour by depth. Red is gone by 5 metres, orange by 20, yellow by 50, green by 100, and below 200 there is only blue. Hadal makes that the rule: the colours that survive deepest get the most light and the most saturation, and the ones that die shallow are left faded on purpose. The red is almost grey, and it should be.
The depth at which each colour dies underwater
Tapetum Hadal |
Tapetum Hadal Light |
|
|---|---|---|
| background | #04131C |
#F6FAFC |
| foreground | #C6DCE1 |
#152225 |
| keyword | #97CCF2 |
#0A587B |
| function | #0FCDD2 |
#0E6365 |
| string | #0CC681 |
#0A6D46 |
| type | #B69F4B |
#76630E |
| number | #CB8661 |
#915431 |
| tag | #CA828B |
#9F5B66 |
| comment | #768B90 |
#586C71 |
Effect


Pure code and code that touches the world look identical in every theme. Here they do not. Await, async, throw, catch and every mutation burn. Functions that only compute, the types, and the data stay cold. It is the same idea a type system uses to track effects, except you can see it without reading a signature.
Which code touches the world and which only computes `effect` scheme
Tapetum Effect |
Tapetum Effect Light |
|
|---|---|---|
| background | #07100D |
#F3F8F5 |
| foreground | #C6D2CC |
#1D2622 |
| keyword | #6E8079 |
#5E6E68 |
| function | #5FD8C0 |
#0A6E5E |
| string | #93B4CA |
#2E5C78 |
| type | #8E9CBE |
#3E4E80 |
| number | #FF5C4D |
#C22A18 |
| tag | #FFA03C |
#9A5200 |
| comment | #6E7B76 |
#65736E |
Dichroic


A dichroic filter absorbs nothing. It splits. What passes through has one colour and what reflects has exactly its complement, and there is no third. Structure travels through the filter and takes the teal, data reflects back and takes the magenta. That is the whole palette. The terminal is the one place that breaks the rule, because red and green have to stay red and green.
A dichroic filter. 2 hues in the whole of the code
Tapetum Dichroic |
Tapetum Dichroic Light |
|
|---|---|---|
| background | #07110F |
#F5EEF3 |
| foreground | #C4D2CE |
#1E2321 |
| keyword | #3FE8BE |
#065246 |
| function | #14BFA0 |
#076659 |
| string | #FA7DC8 |
#850752 |
| type | #31A892 |
#097869 |
| number | #F658AE |
#AC136E |
| tag | #E968AB |
#BD327F |
| comment | #728781 |
#606F6B |
Cochineal


Cochineal is a scale insect that lives on cactus, and carminic acid is what it makes to keep ants away. It gave Europe its first true scarlet, worth close to silver by weight, and it took about 70000 insects to make a pound of dye. The background is the crimson sunk into the cloth, the syntax is the same dye at different strengths.
Carminic acid, the first real scarlet Europe had
Tapetum Cochineal |
Tapetum Cochineal Light |
|
|---|---|---|
| background | #1C0A0F |
#FBF2F3 |
| foreground | #EDD6DA |
#2A161B |
| keyword | #F98794 |
#B01238 |
| function | #FFA6B6 |
#8A2050 |
| string | #E8B54A |
#8A5A00 |
| type | #8FC9A4 |
#1E6A46 |
| number | #FF8A5C |
#A64414 |
| tag | #B49BE8 |
#5B48A0 |
| comment | #9A7A82 |
#7C6268 |
Aerogel


Aerogel is 99 percent air and scatters short wavelengths the same way the sky does. Look at a block against a dark background and it is blue. Hold it up to a lamp and the light that gets through is amber. Same material, 2 colours, so the dark variant is the reflection and the light variant is the transmission. This is the only pair here that comes from 1 physical fact rather than 2.
Rayleigh scattering. Blue reflected, amber transmitted
Tapetum Aerogel |
Tapetum Aerogel Light |
|
|---|---|---|
| background | #0A0D12 |
#FBF6EC |
| foreground | #C6D8DF |
#251C18 |
| keyword | #F2A47A |
#913E0A |
| function | #54B2F2 |
#0F638F |
| string | #0ED8D8 |
#0B5A5A |
| type | #A187E9 |
#6D57B4 |
| number | #F27884 |
#C40A43 |
| tag | #66A567 |
#39773D |
| comment | #75888F |
#74645D |
A quick tour of all 58
Every theme in the collection, applied live while scrolling the picker.

The dark half. 28 of them, each drawn from something in the physical world that emits or bends light: emission lines, phosphor, anodised metal, deep sea bioluminescence, the blue glow of a reactor pool. No 2 of them share a palette: across the 6 roles that carry a hue, the closest pair still averages 12 dE apart, so switching family is a real change and not a shade of one.

The light half. Not inversions of the dark ones. A colour that reads clearly on black is often unreadable on white, and the reverse holds just as firmly, so every light palette was placed by hand and measured on its own ground. Same families, same sources, different physics.
Anodise
Anodised titanium has no pigment in it at all. The colour is an oxide layer a few hundred nanometres thick, and which colour you get depends only on the voltage: bronze around 20 volts, violet at 30, blue at 40, gold at 70. The metal underneath never changes. Anodise is the quietest family, all interference and no dye.
Interference on anodised titanium
Tapetum Anodise |
Tapetum Anodise Light |
|
|---|---|---|
| background | #0C0C0D |
#F8F8F9 |
| foreground | #E2E2E4 |
#1D1D20 |
| keyword | #E8B54A |
#8A5A00 |
| function | #75ADE2 |
#2A5FA8 |
| string | #46C7C2 |
#0E6E8A |
| type | #39B871 |
#22683F |
| number | #E07A45 |
#B0501F |
| tag | #C77DD8 |
#8A3D9E |
| comment | #7E7E82 |
#66666A |
Borrow
Rust made a whole language out of one question: can this change, and who is allowed to change it. Borrow puts that question on the colours. Constants and anything read only are cold. Reassignable variables are warm. Parameters are borrowed, so they are green and italic. And at the exact point where you write into a variable, the name lights up. You stop looking for mutation and start seeing it.
Whether a thing can change, and where it is written to `borrow` scheme
Tapetum Borrow |
Tapetum Borrow Light |
|
|---|---|---|
| background | #12151A |
#F5F6F9 |
| foreground | #C8CDD6 |
#22262E |
| keyword | #64AEF9 |
#0C5FA8 |
| function | #EAECF0 |
#141820 |
| string | #66C070 |
#2C6620 |
| type | #A585EC |
#6A2FC0 |
| number | #F09A18 |
#9A5A00 |
| tag | #FA6362 |
#C00A18 |
| comment | #767D89 |
#6B7280 |
Cavitation
Drive a bubble in water with sound and it collapses in under a nanosecond, reaching temperatures people still argue about, and emits a flash of light. Nobody fully agrees why. The flash is blue white and almost too fast to measure. Cavitation is the quietest palette in the collection, cold and low in chroma, with 1 hot colour for the core.
Sonoluminescence, the flash of a collapsing bubble
Tapetum Cavitation |
Tapetum Cavitation Light |
|
|---|---|---|
| background | #05070B |
#F8FAFD |
| foreground | #C3D4DB |
#162227 |
| keyword | #40D0ED |
#0C5B6A |
| function | #7CACDD |
#3C709E |
| string | #5CB8A5 |
#0B6355 |
| type | #CE8C54 |
#8F5621 |
| number | #F955AB |
#CC0C82 |
| tag | #D0A4DB |
#724A7D |
| comment | #72858C |
#5A6C73 |
Cherenkov
A particle moving faster than light does in water drags a shockwave of light behind it, and that is the blue glow in a reactor pool. The intensity rises as 1 over lambda squared, so the shorter the wavelength the stronger it gets, which is why it looks violet blue. There is not a single warm colour in the code, because the physics does not produce one. The terminal keeps its red and yellow, and so do the error and warning marks, because those have to mean what they have always meant.
A reactor pool. No warm colour in the code
Tapetum Cherenkov |
Tapetum Cherenkov Light |
|
|---|---|---|
| background | #061527 |
#F5F8FD |
| foreground | #CADEE6 |
#152125 |
| keyword | #EE7DFA |
#B61CCB |
| function | #3AB2F8 |
#0C75A9 |
| string | #0DE6D6 |
#0A3934 |
| type | #4FBE6F |
#0C7638 |
| number | #15C6EC |
#0D6377 |
| tag | #BCC2F2 |
#0B4496 |
| comment | #798C93 |
#586B71 |
Cinnabar
Before synthetic chemistry, colour was something you dug up and ground. Cinnabar is mercury sulfide and gave the vermilion of Pompeii. Orpiment is arsenic and was the only clean yellow for 1000 years, poisonous enough that painters avoided mixing it with lead. Malachite, azurite and lapis came out of the same kind of rock. Warm and heavy, because pigment is.
Mineral pigments ground before synthetic chemistry
Tapetum Cinnabar |
Tapetum Cinnabar Light |
|
|---|---|---|
| background | #100C09 |
#FAF7F0 |
| foreground | #DED2CD |
#251D19 |
| keyword | #F28F83 |
#BC0D22 |
| function | #47AFFA |
#0A699D |
| string | #0CCEA0 |
#0C644C |
| type | #F2BA24 |
#674D0A |
| number | #FA54AC |
#CB0B82 |
| tag | #9C86F5 |
#6254D1 |
| comment | #90827B |
#72655E |
Coherence
A mixed argon and krypton ion laser puts out 6 visible lines from 1 tube at once, which is what a white laser actually is. Argon gives 457.9, 488.0 and 514.5 nm, krypton gives 413.1, 568.2 and 647.1. Every colour in the code is one of those lines. There is no magenta anywhere in it, because magenta is not a spectral colour and no laser can emit one, so the terminal's magenta slot carries the krypton violet instead. The interface falls to true black so the only thing emitting on the screen is the code.
6 lines from 1 argon and krypton ion laser
Tapetum Coherence |
Tapetum Coherence Light |
Tapetum Coherence High Contrast |
Tapetum Coherence High Contrast Light |
|
|---|---|---|---|---|
| background | #040406 |
#FDFDFE |
#000000 |
#FFFFFF |
| foreground | #C9CED6 |
#16181C |
#FFFFFF |
#000000 |
| keyword | #16DFF4 |
#0A5B64 |
#12EBFF |
#00616C |
| function | #C891F9 |
#7C39C4 |
#E9C3FF |
#6F00F5 |
| string | #0EF477 |
#0A6830 |
#10FF7D |
#006727 |
| type | #F4D00C |
#716008 |
#FFE20E |
#695500 |
| number | #F46B57 |
#CF151A |
#FFA05C |
#B50005 |
| tag | #4E97F4 |
#0C67B5 |
#BAD2FF |
#0059A6 |
| comment | #7D8189 |
#63676E |
#9F9F9F |
#686868 |
Epitaxy
A polished silicon wafer is a dark mirror with a violet cast, and that is the background. The syntax colours are the real emission peaks of the materials grown on top of it: GaN at 405 nm, InGaN at 450 and 505, GaP at 555, AlGaInP at 590, AlGaAs at 660. The light variant is lit the way a cleanroom is lit, in yellow, because photoresist cannot see that end of the spectrum.
A silicon wafer and real LED emission peaks
Tapetum Epitaxy |
Tapetum Epitaxy Light |
|
|---|---|---|
| background | #15151C |
#FBF9F0 |
| foreground | #D7DCE5 |
#251F19 |
| keyword | #77ABF9 |
#0A66B2 |
| function | #13C5B5 |
#0C6A61 |
| string | #F2C17A |
#6E4C0A |
| type | #60D53D |
#1F660B |
| number | #F2726E |
#CF0B30 |
| tag | #C771F8 |
#9841CD |
| comment | #838A96 |
#71675E |
Fraunhofer
In 1814 Joseph von Fraunhofer pointed a prism at the sun and found hundreds of dark gaps in the spectrum. They are elements in the sun's own atmosphere eating their own colours on the way out. He labelled the strongest with letters and those letters are still in use. Fraunhofer is the brightest family here, built around the sodium D line, the hydrogen alpha and the magnesium triplet.
Absorption lines in sunlight
Tapetum Fraunhofer |
Tapetum Fraunhofer Light |
|
|---|---|---|
| background | #080A10 |
#FBFAF6 |
| foreground | #DDE1E8 |
#1B1D22 |
| keyword | #AF9CF9 |
#3A2FC9 |
| function | #4FC3F7 |
#0D6FA8 |
| string | #7CE85C |
#3D7A1F |
| type | #00E5C0 |
#007A66 |
| number | #FFC93C |
#9A6A00 |
| tag | #FA6245 |
#C13A1A |
| comment | #727A88 |
#6A6C70 |
Glacier
Glacier ice is blue because pressure squeezes the air bubbles out, the light path gets long, and red is absorbed on the way through. The older and more compressed the ice, the deeper the blue. Nothing in this family drops to black, not one surface, because nothing in a crevasse does either. The warm colours are the sun on the surface and the rock band running through it.
Compressed glacier ice. Nothing in it is black
Tapetum Glacier |
Tapetum Glacier Light |
|
|---|---|---|
| background | #1A2733 |
#F2FAFD |
| foreground | #DCEAF2 |
#18262F |
| keyword | #0ECCCB |
#0A6B6C |
| function | #9BD0F6 |
#0B5475 |
| string | #6BECBE |
#094B30 |
| type | #AEA0F0 |
#5461AD |
| number | #F6B464 |
#804E08 |
| tag | #F67F87 |
#BB4355 |
| comment | #8AA0B0 |
#5E7382 |
Incandescence
Heat steel and it tells you its temperature. Dull red around 600 degrees, cherry at 750, orange at 900, amber at 1000, almost white by 1300. Blacksmiths read it by eye and still do. In this family lightness is temperature, so the ladder is not an aesthetic choice, it is the scale. The 1 cold colour is the blue at the base of the forge flame.
The temperature scale of hot steel
Tapetum Incandescence |
Tapetum Incandescence Light |
|
|---|---|---|
| background | #0C0806 |
#FAF6F2 |
| foreground | #DDCFCD |
#251C1B |
| keyword | #E8CC6A |
#574A0A |
| function | #F2A854 |
#7A4B0A |
| string | #F88A63 |
#AE350A |
| type | #F7616A |
#D40B3B |
| number | #F95A93 |
#D30B6B |
| tag | #12A3E0 |
#0F6A92 |
| comment | #907F7D |
#746461 |
Noctiluca
Living light is nearly always blue green, because that is what travels furthest through seawater. Dinoflagellates glow at 480 nm and turn a breaking wave into a line of fire. Jellyfish green fluorescent protein sits at 509 and won a Nobel prize for being useful. Fireflies are further toward yellow. The red is the rarest thing here: 1 Brazilian beetle larva, the railroad worm, is the only land animal known to make it.
Light made by living things
Tapetum Noctiluca |
Tapetum Noctiluca Light |
|
|---|---|---|
| background | #04090C |
#F5FAFA |
| foreground | #C4D5D4 |
#172221 |
| keyword | #11D9A9 |
#0C5E48 |
| function | #AEBD0F |
#565D0B |
| string | #3AB2F2 |
#0C658E |
| type | #9291F2 |
#3657DD |
| number | #FA6051 |
#D70E21 |
| tag | #1BA4AF |
#0F737B |
| comment | #728786 |
#5A6C6B |
Palimpsest
A palimpsest is a parchment scraped clean and written over, with the old text still faintly readable underneath. Keywords, imports, punctuation and type annotations are the scraped layer here, pushed back toward the background. The names you chose and the data you wrote are the new text. Roughly 2 thirds of the screen recedes on purpose.
A scraped and rewritten manuscript `signal` scheme
Tapetum Palimpsest |
Tapetum Palimpsest Light |
|
|---|---|---|
| background | #191612 |
#EDE4CE |
| foreground | #E8E1D2 |
#2A241A |
| keyword | #8A8173 |
#6B6352 |
| function | #F5EEDE |
#16120C |
| string | #D9A94A |
#7E5B0E |
| type | #A19788 |
#6A6250 |
| number | #D9A94A |
#7E5B0E |
| tag | #D68164 |
#8A3A22 |
| comment | #837A6C |
#716A58 |
Passepartout
A passepartout is the card mat around a framed photograph. It is not decoration, it is what makes the eye fall on the picture. Every theme puts the interface at the same brightness as the editor or darker. This one inverts it: the mat is far lighter than the plate, and the editor sits inside it as the print.
The mat around a framed photograph
Tapetum Passepartout |
Tapetum Passepartout Light |
|
|---|---|---|
| background | #08080A |
#FDFDFB |
| foreground | #DEDCD6 |
#1F1E1A |
| keyword | #D8A83C |
#8A5F12 |
| function | #E4DFD2 |
#26241E |
| string | #B8A88C |
#5A5038 |
| type | #A8B0A0 |
#3E5040 |
| number | #D89A6A |
#8A4A18 |
| tag | #C0A0B8 |
#6A3E62 |
| comment | #83807A |
#6E6A60 |
Persistence
Oscilloscope phosphors are graded by how long they keep glowing after the beam has moved on. P1 is the willemite green everyone pictures, P7 goes blue then fades to a long yellow ghost, P11 is the blue used for photographing traces. Persistence is the green one, and the warmer colours are the ghost that P7 leaves behind.
Oscilloscope phosphor decay
Tapetum Persistence |
Tapetum Persistence Light |
|
|---|---|---|
| background | #0A0B09 |
#F7F8F4 |
| foreground | #DCE0D8 |
#1C1F1A |
| keyword | #7FE33F |
#3D7A14 |
| function | #8FB8FF |
#1A6E96 |
| string | #FFB742 |
#8A5A00 |
| type | #4ECFC0 |
#00786B |
| number | #FF6B4A |
#B8402A |
| tag | #B79BFF |
#6B3FA8 |
| comment | #7C8178 |
#676A63 |
Provenance
Every theme in the world colours by grammar. This one colours by where a symbol came from. What you defined here is gold and bold. What the language handed you is cyan and italic. What cannot change any more is violet. The rest of your own code is a single colour, and the keywords are deliberately dimmed, because you already know that function is a function. Open a file and you see instantly what is yours and what is borrowed.
Where each symbol came from `provenance` scheme
Tapetum Provenance |
Tapetum Provenance Light |
|
|---|---|---|
| background | #191B20 |
#F4F2ED |
| foreground | #C6C8CC |
#2E3036 |
| keyword | #8E939E |
#6A6E76 |
| function | #F0B75A |
#855606 |
| string | #9EB096 |
#4A5C42 |
| type | #A8B8A0 |
#5A6C52 |
| number | #B9A6E8 |
#5B48A0 |
| tag | #6FC7E0 |
#0F6480 |
| comment | #7C808A |
#70747C |
Quantum
Heat a gas and it does not glow across the spectrum, it glows at a handful of exact wavelengths and nothing in between. Hydrogen gives you 4 visible lines, neon gives you a fistful of reds, mercury a violet and a green so specific they are still used to calibrate instruments. Quantum takes its violet, blue and teal from that idea: a small set of exact positions rather than a smooth range.
Emission lines of heated gases
Tapetum Quantum |
Tapetum Quantum Light |
|
|---|---|---|
| background | #0B0E1A |
#FAFBFF |
| foreground | #C8D3F5 |
#24294A |
| keyword | #CD8FF9 |
#7B2CBF |
| function | #8AB4FF |
#2B5FD9 |
| string | #4DE0D0 |
#0A7570 |
| type | #6EE7A8 |
#06704A |
| number | #FF9F45 |
#C25100 |
| tag | #FF6E9C |
#C42B7B |
| comment | #6B739B |
#6D7291 |
Riso
A Riso duplicator does not mix colour. It pulls 1 pass per ink and lays them over each other, slightly out of register. The inks come from a fixed catalogue you order by name, and the fluorescent pink is impossible to mistake for anything else. These are 6 of them, printed on kraft.
The 6 spot inks you can order for a duplicator
Tapetum Riso |
Tapetum Riso Light |
|
|---|---|---|
| background | #16130E |
#F5F0E4 |
| foreground | #E8E2D4 |
#211E16 |
| keyword | #FA80BB |
#C4157E |
| function | #FFEE3C |
#7A6000 |
| string | #3FC97E |
#0A6E42 |
| type | #5FBCC4 |
#0E6068 |
| number | #FF7F42 |
#B4470E |
| tag | #A289DB |
#5A4694 |
| comment | #847C6C |
#7C7462 |
Safelight
Photographic paper cannot see the deep amber of an OC filter, which is why it is the only light you are allowed to switch on in a darkroom. You learn to read everything from one colour and how bright it is. Safelight works the same way: the code is a single amber in 4 intensities, and the only real colour in it is the red of the filter itself, kept for literals.
A darkroom under an OC filter
Tapetum Safelight |
Tapetum Safelight Light |
|
|---|---|---|
| background | #2A1A0D |
#EDE6D6 |
| foreground | #F0DCBE |
#2C2318 |
| keyword | #FFF6E4 |
#1A130A |
| function | #EBD3AE |
#463A26 |
| string | #FA8D6A |
#A83A16 |
| type | #CFB48A |
#6A5A3E |
| number | #FF9463 |
#8A3D12 |
| tag | #B39970 |
#706043 |
| comment | #9C8665 |
#75664A |
Silverpoint
Silverpoint is drawing with a silver stylus on prepared paper. There is no colour, only line and tone, and no way to erase. Leonardo and Durer worked in it. This family has no hue in the code at all: 6 greys, plus weight and italic doing the work that colour usually does. The interface keeps a single silver blue accent so you can still find your cursor.
A silver stylus on prepared paper. No hue anywhere `tone` scheme
Tapetum Silverpoint |
Tapetum Silverpoint Light |
|
|---|---|---|
| background | #1A1A1C |
#E8E6E1 |
| foreground | #D2D2D6 |
#26262A |
| keyword | #AAAAB0 |
#5E5E64 |
| function | #F0F0F4 |
#141418 |
| string | #BEBEC4 |
#3E3E44 |
| type | #AAAAB0 |
#4E4E54 |
| number | #C8C8CE |
#2C2C32 |
| tag | #97979D |
#64646A |
| comment | #7E7E84 |
#6C6C72 |
Stratum
A road cut through sediment is read by depth, not by content. Each band is a different million years. Stratum takes the colour off the syntax entirely and puts it on nesting depth: the code itself is 1 sandstone in 6 tones, and all 6 real colours are spent on bracket levels and indent guides. You see how deep you are without counting.
Sedimentary layers. Colour sits on nesting depth `tone` scheme
Tapetum Stratum |
Tapetum Stratum Light |
|
|---|---|---|
| background | #14110D |
#EFE9DC |
| foreground | #E4DACA |
#241F16 |
| keyword | #BFA77B |
#5C4E32 |
| function | #F5E9CE |
#1E1808 |
| string | #D8C298 |
#3E3418 |
| type | #A7946E |
#6E6040 |
| number | #D2BC94 |
#31280F |
| tag | #A69574 |
#6F6141 |
| comment | #7E7566 |
#77705E |
| nesting depth | #E0D3B0 #C99C55 #C4674A #93A468 #8E96A8 #B18FC0 |
#8A6A1E #A0521E #4C6A2A #2A5A78 #6B3F8A #7A4A2A |
Valence
Dissolve a transition metal and the water takes its colour. Permanganate is a violet so intense a few grains stain a litre, dichromate is orange, copper is sky blue, nickel green, cobalt chloride a deep blue that turns pink when it picks up water. These are transmission colours, not emission, which is why they read deeper and heavier than the rest of the collection.
Transition metals dissolved in water
Tapetum Valence |
Tapetum Valence Light |
|
|---|---|---|
| background | #0B090E |
#FCFBFD |
| foreground | #D4D1DC |
#222128 |
| keyword | #F976E7 |
#B70CA8 |
| function | #12B6E8 |
#0B6886 |
| string | #20D12E |
#0B6912 |
| type | #F2B486 |
#81440A |
| number | #F46469 |
#D20B38 |
| tag | #6E90FA |
#0C68DF |
| comment | #85828F |
#6B6874 |
Verdigris
Copper does not corrode into one colour, it corrodes into a catalogue. Verdigris is the blue green of an old roof, malachite the deeper green of the ore, azurite the blue, cuprite the brick red of the first oxide layer, bornite the purple tarnish that gives peacock ore its name. Brass sits underneath as the metal before any of it happened.
What copper turns into as it corrodes
Tapetum Verdigris |
Tapetum Verdigris Light |
|
|---|---|---|
| background | #0D0B08 |
#F7F4ED |
| foreground | #DBD2CE |
#211B18 |
| keyword | #0FCBB7 |
#0C6157 |
| function | #B09BFA |
#6354B0 |
| string | #E4BF39 |
#5F4E0B |
| type | #41BF76 |
#0B6A3A |
| number | #F46577 |
#BE2A49 |
| tag | #2AA2C8 |
#0C728F |
| comment | #8F817D |
#70635F |
6 ways of colouring code
Almost every theme in existence answers a single question: what kind of symbol is this. Keyword, string, number, type. Tapetum ships that one and 5 others, and the answer is a property of the theme, so changing theme changes the question.
grammar · 22 families
What kind of symbol it is. The classic, and what nearly every theme does.
provenance · Provenance
Where the symbol came from. Gold and bold for what you wrote here, cyan and
italic for what the language handed you, violet for what cannot change.
Keywords are dimmed, because you already know function is a function.
borrow · Borrow
Whether a value can change. Cold for frozen, warm for mutable, green and italic
for borrowed parameters, and a name lights up at the exact point you write to it.
effect · Effect
Whether a line touches the outside world. await, async, throw and every
mutation burn. Pure computation stays cold.
signal · Palimpsest
Signal against boilerplate. Keywords, imports, punctuation and type annotations
are scraped back toward the background. Only the names you chose and the data
you care about stay lit.
tone · Stratum, Silverpoint
Nothing at all. No hue in the code, only 6 tones plus weight and italic.
3 of these read your language server rather than the grammar. provenance,
borrow and effect use the semantic tokens it emits, including the
declaration, defaultLibrary, readonly, static, modification and
async modifiers that most themes never touch. They fall back to grammar rules
when no server is running, so open a real file rather than a scratch buffer the
first time you try one.
In grammar, 6 roles carry their own hue: keywords, strings, functions, types,
numbers and tags. Parameters and properties take the foreground colour and are
told apart by italic instead, because a 7th saturated hue cannot be held away
from the other 6 without washing all of them out.
How they are checked
Colour is a judgement call, so every value here was placed by hand. An earlier version let an optimiser choose them and it converged on something worse: 2 of the families came out under 2 dE apart, and it had bleached the keywords to near grey chasing its own objective.
What a machine is good for is catching what a person misses. On all 58 variants:
| Contrast | every syntax colour against its own background, and every piece of interface text against the surface it actually sits on. Syntax clears 4.5 to 1, comments clear 4.0, and the lowest value anywhere is 4.07 |
| Separation | CIEDE2000 between every pair of coloured roles, and between every pair of families, so no 2 look like each other |
| Coverage | all 974 colour keys VS Code 1.136.0 registers and has not deprecated, including the chat, agents, sessions window, inline edit and modern tab surfaces most themes leave to the defaults |
| Editors | verified one by one on the current VSCodium, Cursor, Windsurf, code-server, Positron, Kiro, Trae, Antigravity and Void, and on the macOS, Linux and Windows builds of VS Code 1.136.0 |
None of that comes from a hand written list. tools/extract-keys.mjs reads the
colour registry out of every window bundle of the installed editor, including the
sessions window that 1.136 moved into a bundle of its own, and records which keys
are deprecated. tools/extract-pairs.mjs reads every stylesheet and collects
each foreground and background used in the same rule, so what gets checked is
what the editor actually paints together. tools/extract-derivations.mjs reads
the keys whose default is another key, which catches the class of bug where a
value quietly contradicts the surface beneath it. The 3 files they write are
committed, checked in CI against every theme, and refreshed by a weekly workflow
that downloads the current VS Code build, so a new surface is noticed by a
machine rather than by a person.
The same measurements run against the editors that install from Open VSX, and
against the other platforms. The current VSCodium, Cursor, Windsurf, code-server,
Positron, Kiro, Trae, Antigravity and Void builds were each read the same way,
registry, stylesheets and derivations, and every theme checked on every one of
them; the keys their older cores do not know yet are ignored by them, and the 35
surfaces those editors paint in colours of their own, listed with their reasons
in tools/forks.mjs, take the family's colour instead. The Linux and Windows
builds of VS Code 1.136.0 carry the same registry, stylesheets and
derivations as the macOS build, byte for byte, so what holds on one holds on all
3.
node tools/analyze.mjs # all 58, against the real pairs
node tools/audit.mjs # structure, schemes, manifest, files and this README
node tools/compare.mjs # against every theme Microsoft ships
Install
code --install-extension tuguidragos.tapetum
Or from the VS Code Marketplace, or Open VSX, which is where VSCodium, Cursor, Windsurf, Positron, Kiro, Trae, Antigravity, Void, Gitpod, code-server and Theia install from.
Press Cmd K then Cmd T, or Ctrl K then Ctrl T on Windows and Linux, and
type a family name to filter. Every family is Tapetum <Family> for the dark
variant and Tapetum <Family> Light for the light one.
Making one your own
Any colour can be overridden per theme, without forking anything:
{
"workbench.colorCustomizations": {
"[Tapetum Quantum]": {
"editor.background": "#080B14"
}
},
"editor.tokenColorCustomizations": {
"[Tapetum Quantum]": {
"comments": "#7580AD"
}
}
}
Tapetum Theme

