|
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 |
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 |
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 |
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 |
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 |
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 |
Coherence
A mixed argon and krypton ion laser puts out 6 visible lines from one 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. The interface falls to true black so the only thing emitting on the screen is the code.
6 lines from one 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 |
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 |
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 |
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 a thousand 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 |
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 |
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 |
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 this family, because the physics does not produce one.
A reactor pool. No warm colour exists in it
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 |
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, two colours, so the dark variant is the reflection and the light variant is the transmission. This is the only pair here that comes from one physical fact rather than two.
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 |
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 one 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 |
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: one 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 |
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 one 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 |
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 |
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 |
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 |
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 one 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 |
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 |
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 two 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 |
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 |
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 |
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 |
Selenium
Selenium toning shifts the blacks of a silver print toward purple and stretches the tonal range at the same time. The result is an image that is warm in the shadows and cool in the highlights at once. So this family does not pick 6 separate hues. It picks a ladder of lightness and lets the hue rotate as the ladder descends.
Selenium toning. Hue rotates as tone drops
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 |
Riso
A Riso duplicator does not mix colour. It pulls one 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 |
All 58, in one pass
Every theme in the collection, applied live while scrolling the picker.

That was the dark half. The light variants are not inversions of it. A colour that reads clearly at Lc 80 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.

6 ways of colouring code
Almost every theme in existence answers one question: what kind of symbol is this. Keyword, string, number, type. Tapetum ships that scheme and 5 others. The scheme is a property of the theme, so switching theme switches the rule.
| Scheme | What colour means | Families |
|---|---|---|
| grammar | What kind of symbol it is. The classic. | 22 |
| provenance | Where the symbol came from. Gold and bold for what you defined here, cyan and italic for what the language gave you, violet for what cannot change. Keywords are dimmed, because you already know function is a function. |
Provenance |
| borrow | Whether it can change. Cold for frozen, warm for mutable, green and italic for borrowed parameters, and the name lights up at the exact point you write to it. | Borrow |
| effect | Whether it touches the outside world. await, async, throw and every mutation burn. Pure computation stays cold. |
Effect |
| signal | Signal against boilerplate. Keywords, imports, punctuation and type annotations are scraped back toward the background. Only the names you chose and the data stay lit. | Palimpsest |
| tone | Nothing. There is no hue in the code at all, only 6 tones plus weight and italic. | Stratum, Silverpoint |
provenance, borrow and effect read the semantic tokens your language
server emits, including the declaration, defaultLibrary, readonly,
static, modification and async modifiers that most themes ignore. They
fall back to grammar rules where no language server is running, so open a real
file rather than a scratch buffer when you try them.
How they are checked
Colour is a judgement call, so every value here is placed by hand. An earlier version let an optimiser choose them and it converged: 2 of the families came out under 2 dE apart, and it had bleached the keywords to near grey chasing its own objective.
What is measured, 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. The lowest value anywhere is 4.53.
- Separation. CIEDE2000 between every pair of coloured roles, and between every pair of families so no two look like each other.
- Coverage. All 964 colour keys registered in the running VS Code build, including the chat, agents, inline edit and modern tab surfaces that most themes leave to the defaults.
The checks are not a hand-written list. tools/extract-pairs.mjs reads the
workbench stylesheet out of the installed editor and collects every foreground
and background used in the same rule, so what gets checked is what VS Code
actually paints together. tools/extract-derivations.mjs reads the binary for
the keys whose default is another key, which catches the class of bug where a
value contradicts the surface beneath it.
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
In the grammar scheme, 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, because a 7th saturated hue
cannot be held away from the other 6 without washing all of them out.
Customizing
Override anything per theme in your settings.json:
{
"workbench.colorCustomizations": {
"[Tapetum Quantum]": {
"editor.background": "#080B14"
}
},
"editor.tokenColorCustomizations": {
"[Tapetum Quantum]": {
"comments": "#7580AD"
}
}
}
Install
- VS Code Marketplace
- Open VSX, which is what VSCodium, Cursor, Windsurf, Gitpod, code-server and Theia install from
code --install-extension tuguidragos.tapetum
Every family ships as Tapetum <Family> for the dark variant and
Tapetum <Family> Light for the light one. Switch with Cmd+K Cmd+T, or
Ctrl+K Ctrl+T on Windows and Linux, and type the family name to filter.
Tapetum Theme

