Skip to content
living-code-themePublic

Repository files navigation

Living Code

Calm slate. Living color.
A color scheme where the background stays quiet and the code comes alive.
For editors, terminals, browsers and the web.

Living Code Night Living Code Frost Living Code Paper Living Code Signal

This is the core of Living Code: the palette, the color math that resolves it, semantic roles, the [lc] brand and shared tooling. It is agnostic to any app. Each port lives in its own repository in living-code-theme, and living-code.dev lists them all.

Choose a flavor

Every flavor shares the same slate foundation and semantic roles. Night is the default.

Flavor Appearance Syntax and accents
Night Dark slate, full palette Cool structure, green strings, copper numbers and amber warnings. The default.
Frost Lifted, bluer slate Lower-chroma accents with green strings and copper numbers.
Paper Near-white slate Darker accents with green strings and copper numbers.
Signal Dark slate, one accent Minimal variant of Night: teal keywords and tags, everything else neutral.

Install

Install the port for your app: find it on living-code.dev/ports or in the organization's repositories. Each port's README has its installation steps. Nobody needs to clone this repository to use the theme.

Design

  • The ground stays calm. Backgrounds, panels, selections, punctuation and comments live on one slate ramp, so the eye goes to the code, not the chrome.
  • Cool for structure, warm for data. #00a692 Teal, aqua and steel mark keywords, functions and types; #8acb83 moss, #f0be6d amber and #e18c5f copper mark strings, numbers and warnings.
  • Same roles everywhere. Each port maps the same semantic roles (keyword, string, error, border...), so a theme feels the same in your editor, terminal and browser.
  • Built in OKLCH. Every palette value is defined in OKLCH; hex and RGB are derived. The build checks 24 text roles for WCAG AA contrast (≥ 4.5:1) against each flavor's background.

Flavors

Living Code Night

The default. Dark slate ground, teal structure, green strings and gray comments. Amber warnings and copper numbers keep their warm contrast.

Living Code Night: editor syntax, terminal output and ANSI palette

Palette

Neutrals

Name Hex OKLCH Used for
#020405 crust #020405 oklch(0.1 0.01 240) sidebars, tab bars, status lines
#05080b base #05080b oklch(0.13 0.01 240) background
#090e11 mantle #090e11 oklch(0.16 0.01 240) floats, cards, popups
#12171a surface0 #12171a oklch(0.2 0.01 240) line highlight, inactive tabs
#1d2226 surface1 #1d2226 oklch(0.25 0.01 240) borders, ANSI black
#2d3438 surface2 #2d3438 oklch(0.32 0.012 240) selection
#50565b overlay #50565b oklch(0.45 0.012 240) line numbers, punctuation
#747c80 comment #747c80 oklch(0.58 0.012 235) comments, operators
#9ba0a2 subtext #9ba0a2 oklch(0.7023 0.0065 223.49) muted text, ANSI white
#c8cfd4 text2 #c8cfd4 oklch(0.85 0.01 240) properties, parameters
#e2e9ee text #e2e9ee oklch(0.93 0.01 240) foreground

Accents

Name Hex OKLCH Used for
#00a692 teal #00a692 oklch(0.65 0.15 180) accent · cursor · borderActive · heading
#52d7c1 mint #52d7c1 oklch(0.8 0.12 180) hint · keyword · builtin
#9ae0dd aqua #9ae0dd oklch(0.86 0.07 192) function · link
#80b6d3 steel #80b6d3 oklch(0.75 0.07 232) info · type · namespace
#f0be6d amber #f0be6d oklch(0.83 0.115 78) lineNumberActive · match · warning · modified · code
#e18c5f copper #e18c5f oklch(0.72 0.12 48) number · constant · escape
#e96560 flare #e96560 oklch(0.67 0.165 25) error · removed
#8acb83 moss #8acb83 oklch(0.78 0.12 142) success · added · string
#bf91cd orchid #bf91cd oklch(0.72 0.1 318) regex · decorator · tag
#ddaec3 rose #ddaec3 oklch(0.8 0.06 350) Available for custom accents

ANSI

black red green yellow blue magenta cyan white
normal #1d2226 #e96560 #8acb83 #f0be6d #80b6d3 #bf91cd #00a692 #9ba0a2
bright #50565b #fa8880 #abe2a4 #ffdba5 #a1cfe8 #d5ade2 #1fc1ab #e2e9ee

Living Code Frost

Night on a lifted, bluer slate with a third less chroma. Calmer for long sessions; the warm/cool split survives at low saturation.

Living Code Frost: editor syntax, terminal output and ANSI palette

Palette

Neutrals

Name Hex OKLCH Used for
#050a0f crust #050a0f oklch(0.14 0.015 245) sidebars, tab bars, status lines
#0a1016 base #0a1016 oklch(0.17 0.015 245) background
#10171c mantle #10171c oklch(0.2 0.015 245) floats, cards, popups
#171e24 surface0 #171e24 oklch(0.23 0.015 245) line highlight, inactive tabs
#232a30 surface1 #232a30 oklch(0.28 0.015 245) borders, ANSI black
#333c43 surface2 #333c43 oklch(0.35 0.018 245) selection
#50565b overlay #50565b oklch(0.45 0.012 240) line numbers, punctuation
#7d8489 comment #7d8489 oklch(0.61 0.012 235) comments, operators
#9ba0a2 subtext #9ba0a2 oklch(0.7023 0.0065 223.49) muted text, ANSI white
#c8cfd4 text2 #c8cfd4 oklch(0.85 0.01 240) properties, parameters
#e2e9ee text #e2e9ee oklch(0.93 0.01 240) foreground

Accents

Name Hex OKLCH Used for
#43a997 teal #43a997 oklch(0.67 0.0975 180) accent · cursor · borderActive · heading
#8ad5c6 mint #8ad5c6 oklch(0.82 0.078 180) hint · keyword · builtin
#b6e2df aqua #b6e2df oklch(0.88 0.0455 192) function · link
#98bacd steel #98bacd oklch(0.77 0.0455 232) info · type · namespace
#e9c897 amber #e9c897 oklch(0.85 0.0748 78) lineNumberActive · match · warning · modified · code
#d49c80 copper #d49c80 oklch(0.74 0.078 48) number · constant · escape
#d68079 flare #d68079 oklch(0.69 0.1073 25) error · removed
#a2cb9d moss #a2cb9d oklch(0.8 0.078 142) success · added · string
#bc9ec6 orchid #bc9ec6 oklch(0.74 0.065 318) regex · decorator · tag
#d9bac8 rose #d9bac8 oklch(0.82 0.039 350) Available for custom accents

ANSI

black red green yellow blue magenta cyan white
normal #232a30 #d68079 #a2cb9d #e9c897 #98bacd #bc9ec6 #43a997 #9ba0a2
bright #50565b #e99e97 #bfe3bb #fce0b6 #b6d3e3 #d4b9dc #6fbfb0 #e2e9ee

Living Code Paper

Daylight. Same two temperatures on near-white slate, lightness inverted so every syntax color keeps WCAG AA contrast.

Living Code Paper: editor syntax, terminal output and ANSI palette

Palette

Neutrals

Name Hex OKLCH Used for
#e0e5e9 crust #e0e5e9 oklch(0.92 0.008 240) sidebars, tab bars, status lines
#f4f7f9 base #f4f7f9 oklch(0.975 0.004 240) background
#ebeff2 mantle #ebeff2 oklch(0.95 0.006 240) floats, cards, popups
#e3e9ed surface0 #e3e9ed oklch(0.93 0.008 240) line highlight, inactive tabs
#d2d8dd surface1 #d2d8dd oklch(0.88 0.01 240) borders, ANSI black
#c2ccd3 surface2 #c2ccd3 oklch(0.84 0.015 240) selection
#92999f overlay #92999f oklch(0.68 0.012 240) line numbers, punctuation
#6b7378 comment #6b7378 oklch(0.55 0.012 235) comments, operators
#50565a subtext #50565a oklch(0.45 0.01 240) muted text, ANSI white
#2e3437 text2 #2e3437 oklch(0.32 0.01 240) properties, parameters
#12171a text #12171a oklch(0.2 0.01 240) foreground

Accents

Name Hex OKLCH Used for
#187d6e teal #187d6e oklch(0.53 0.09 180) accent · cursor · borderActive · heading
#0f695e mint #0f695e oklch(0.47 0.08 182) hint · keyword · builtin
#1f7074 aqua #1f7074 oklch(0.5 0.075 200) function · link
#2b6991 steel #2b6991 oklch(0.5 0.09 240) info · type · namespace
#8f6213 amber #8f6213 oklch(0.53 0.105 75) lineNumberActive · match · warning · modified · code
#a04f27 copper #a04f27 oklch(0.52 0.12 45) number · constant · escape
#a74541 flare #a74541 oklch(0.52 0.13 25) error · removed
#3b7a35 moss #3b7a35 oklch(0.52 0.12 142) success · added · string
#81558e orchid #81558e oklch(0.52 0.1 318) regex · decorator · tag
#845b6e rose #845b6e oklch(0.52 0.06 350) Available for custom accents

ANSI

black red green yellow blue magenta cyan white
normal #d2d8dd #a74541 #3b7a35 #8f6213 #2b6991 #81558e #187d6e #50565a
bright #92999f #853532 #2d6029 #724d0d #1f5272 #664371 #116357 #12171a

Living Code Signal

A minimal variant of Night with a single accent. Teal marks keywords, tags and focus; everything else stays on the slate ramp. No warm literals or multicolor diagnostics.

Living Code Signal: editor syntax, terminal output and ANSI palette

Accent names such as amber, copper and moss remain available for port compatibility, but in Signal they are aliases of teal or neutral colors. Diagnostics are told apart by labels, signs and underlines instead of hue.

Palette

Neutrals

Name Hex OKLCH Used for
#020405 crust #020405 oklch(0.1 0.01 240) sidebars, tab bars, status lines
#05080b base #05080b oklch(0.13 0.01 240) background
#090e11 mantle #090e11 oklch(0.16 0.01 240) floats, cards, popups
#12171a surface0 #12171a oklch(0.2 0.01 240) line highlight, inactive tabs
#1d2226 surface1 #1d2226 oklch(0.25 0.01 240) borders, ANSI black
#2d3438 surface2 #2d3438 oklch(0.32 0.012 240) selection
#50565b overlay #50565b oklch(0.45 0.012 240) line numbers, punctuation
#747c80 comment #747c80 oklch(0.58 0.012 235) comments, operators
#9ba0a2 subtext #9ba0a2 oklch(0.7023 0.0065 223.49) muted text, ANSI white
#c8cfd4 text2 #c8cfd4 oklch(0.85 0.01 240) properties, parameters
#e2e9ee text #e2e9ee oklch(0.93 0.01 240) foreground

Accent

Name Hex OKLCH Used for
#00a692 teal #00a692 oklch(0.65 0.15 180) accent · cursor · borderActive · match · modified · keyword · builtin · decorator · tag · heading · link

ANSI

black red green yellow blue magenta cyan white
normal #1d2226 #e2e9ee #c8cfd4 #e2e9ee #c8cfd4 #c8cfd4 #00a692 #9ba0a2
bright #50565b #e2e9ee #e2e9ee #e2e9ee #e2e9ee #e2e9ee #00a692 #e2e9ee

Syntax roles

Role Night Frost Paper Signal
keyword #52d7c1 mint #8ad5c6 mint #0f695e mint #00a692 teal
function #9ae0dd aqua #b6e2df aqua #1f7074 aqua #e2e9ee text
type #80b6d3 steel #98bacd steel #2b6991 steel #c8cfd4 text2
string #8acb83 moss #a2cb9d moss #3b7a35 moss #e2e9ee text
number #e18c5f copper #d49c80 copper #a04f27 copper #e2e9ee text
decorator #bf91cd orchid #bc9ec6 orchid #81558e orchid #00a692 teal
property #c8cfd4 text2 #c8cfd4 text2 #2e3437 text2 #c8cfd4 text2
operator #747c80 comment #7d8489 comment #6b7378 comment #747c80 comment
comment #747c80 comment #7d8489 comment #6b7378 comment #747c80 comment

The table shows resolved roles for every flavor. The full role map (UI, diagnostics, markup) is in palette/flavors.mjs: defaultRoles plus each flavor's roles overrides.

Ports ship every flavor, except browser themes (Firefox and Chrome), which ship Night and Paper only: in a browser's few theme slots, Frost and Signal look the same as or barely different from Night, and both stores reject duplicate themes.

Using the palette in something else

Any app can follow the theme: read palette.json (hex, OKLCH, RGB, roles and ANSI for every flavor), or map these semantic roles onto the app's own color slots:

Slot Role Night
background / foreground bg / fg #05080b / #e2e9ee
panels, sidebars bgDeep, bgAlt #020405, #090e11
accent, cursor, focus ring accent #00a692
selection selection #2d3438
borders border / borderActive #1d2226 / #00a692
error / warning / info / success error … #e96560 #f0be6d #80b6d3 #8acb83

From JavaScript, install @living-code/palette; for CSS custom properties, @living-code/css.

Recolor images

Turn any image, such as a wallpaper, into a Living Code version. Requires ImageMagick 7.

node scripts/recolor.mjs wallpaper.jpg --flavor night --mode lut
Mode Result
lut Starts with the theme's slate ramp. Shadows and muted areas stay neutral; colorful midtones receive the selected flavor's accents over that base. Lightness is fitted to the theme's range. Tune the accent amount with --color (default: 0.65). Core accents are teal, mint, aqua, steel, amber and copper; --accents all includes the remaining accents.
gradient Maps brightness onto dark slate, an accent and light text. Pick the accent with --accent amber.
remap Posterizes to the exact palette colors. Add --no-dither for flat areas.
all Writes one file per mode.

In lut mode, --color 0 uses only the slate ramp; --color 1 allows stronger accents while still protecting shadows and muted areas. Unlike --strength, lowering --color does not bring back the original photo's colors. It controls accent blending, not a fixed percentage of the image's area. Other controls are --spread (hue blending), --keep-light (brightness preservation) and --smooth (color-noise smoothing). Use --flavor signal for slate and teal only; compatibility names such as amber do not add warm hues in Signal.

Output defaults to <image>-<flavor>-<mode>.png next to the input. Run with --help for every option.

Report a problem or request a port

You want to Where
Report wrong colors or a broken install in one app That app's repository: open its page on living-code.dev/ports, then Report an issue
Ask for Living Code in another app Request a port
Change a color or role in every app Palette or color feedback

Contributing a port

Each port is its own repository in living-code-theme with a root port.json and a README following the shared template; the website discovers it automatically. Start with Creating and contributing a port, the metadata/README contract, or CONTRIBUTING.md to find the right repository.

Map roles, never colors: take every color from a semantic role in palette.json, so the same kind of token gets the same color in every app.

Development

Requires Node 22.22 or newer and pnpm 12.9.0. Run pnpm install --frozen-lockfile for maintainer tooling. Palette generation uses only Node built-ins; port tooling dependencies are development-only.

Command What it does
pnpm build Regenerates palette.json, the portable port palette, this README, swatches, brand SVGs and the landing export from palette/flavors.mjs.
pnpm check Fails if a generated file is stale or a text role drops below 4.5:1. CI runs it.
pnpm test Runs the test suite.
pnpm preview Live palette preview with sliders and exports at http://localhost:4173/preview/.
pnpm screenshots Recaptures assets/preview-*.png from the palette preview only, with headless Chrome (CHROME_BIN overrides google-chrome); app captures live in each port.
pnpm icons:brand Rasterizes the brand SVGs to PNG and ICO. See assets/brand.
pnpm new:port <directory> --name "App" --group "Editors" --emoji "📝" Scaffolds a port's README, metadata and license, not its implementation or maintenance harness.
pnpm package:ports --ports-root <directory> Plans publication packaging from port-owned metadata. Add --output <new-directory> --apply to collect packages, checksums and submission instructions; never publishes. See Packaging and publication.
pnpm palette:update:ports --ports-root <directory> Plans a local palette rollout. Explicit --apply invokes each clean port's own updater, build, check and tests; never commits or pushes.
pnpm sync:ports --landing <checkout> Discovers public ports and writes validated snapshots/captures to the website. Supports --dry-run, --refresh and optional --r2 storage.
pnpm preview:port <directory> --landing <checkout> Validates a local port and previews it in an isolated website copy.
pnpm export:landing --landing <checkout> Delivers the generated theme JSON, CSS and hosted port schema to the website. Run pnpm build first.
pnpm test:standalone --landing <checkout> Installs, builds and tests only the website in isolation. Supports --keep.
pnpm test:scale --landing <checkout> Exercises 400 synthetic ports, immutable publication and a real isolated offline website build/test. Supports --keep and --report <new-file>.

To change a color, edit palette/flavors.mjs and run pnpm build. Do not edit generated files directly.

A palette change does not touch any port: each port repository owns its generator, application mappings, tests and files. Core exports app-agnostic resolved inputs in exports/ports/palette.json. A port explicitly adopts a committed core revision with pnpm palette:update /path/to/core, then regenerates and reviews its own files. Normal port builds use the checked-in pin and never read a sibling checkout or fetch from GitHub. For an explicitly reviewed multi-port update, use the batch palette rollout, which delegates to port-owned commands instead of generating application formats in core. The website takes committed inputs from exports/landing/. After pnpm build, run pnpm export:landing --landing <checkout> and review the changes there. Port discovery, validation, templates and preview/verification runners live here in core; landing contains Astro and website presentation only. No normal website build imports core or needs GitHub access. New ports require automatic native 2560×1600 captures and direct flavor-selected installation. See Port repositories for authoring and Port publication and capacity for the split index/documents, batched discovery, optional external capture storage and 400-port acceptance check.

License

MIT © Elliot Luque

Used by

Contributors

Languages