NEONFERATU

NEON
FERATU

One palette file, one build step, every app you actually use.

$ git clone https://github.com/espresso20/neonferatu && ./install.py

measured, not vibed

The palette

Every colour is placed in OKLCH and checked at build time. Contrast is against this tube's editor background.

five accents, and that's the budget

The hierarchy

build/color.py
# the ceiling on how saturated this hue gets, at this lightness
def max_chroma(L: float, H: float) -> float:
    """Walk chroma down until the color fits in sRGB."""
    lo, hi = 0.0, 0.5
    for _ in range(48):
        mid = (lo + hi) / 2
        if in_gamut(L, mid, H):
            lo = mid
        else:
            hi = mid
    return lo

one command each

Targets

python 3, no dependencies

Install

git clone https://github.com/espresso20/neonferatuNothing here phones home.
python3 build/build.pyRegenerates every theme file, after the palette passes its checks.
./install.py --variant phosphorInstalls a tube and activates it. They live side by side.