Skip to main content
// COLORSCHEME PROJECT

Pyrope

A deutan-aware dark colorscheme.

One palette. Seven design rules. Consistent roles across every tool.

VS CodeNeovimZedKateKDE PlasmaKittyAlacrittyLichess
16
ANSI Colors
7
Design Rules
// 01 — PALETTE

The Colors

Every color earns its place. No arbitrary additions, no decorative noise without purpose.

Click any swatch to copy its hex value.

Backgrounds — the surface stack

Foreground — text on a surface

Accent & Status — meaning-bearing only

Sapphire (blue) is used for exactly one meaning across the entire scheme. Reserving a strong, reliable hue for one purpose is a core deutan-safe strategy.

Decorative — visual variety, never meaning

These are for visual texture only — tag chips, avatar rings, decorative accents. They never encode status or meaning.

// 02 — PHILOSOPHY

Designed for Deutan Vision

Deuteranopia means the green photoreceptors are absent or non-functional. The blue channel runs at full strength. The red channel at ~75%. The green channel near zero. Most dark colorschemes ignore this entirely — Pyrope was built around it.

The green problem

Cool greens, mints, and seafoams carry a blue component that, under a fully-active blue cone, reads as blue instead of green. Amethyst and purple do the same thing. Pyrope's accent is a warm, yellow-leaning pear green — high red channel, low blue channel — so it actually reads as green-gold, not blue.

One palette, every tool

Sapphire is always 'success.' Amber is always 'warning.' Garnet is always 'error' — whether it's a terminal, a text editor, a browser game, or a desktop environment. Cognitive load drops when the color-role mapping never changes between tools.

Brightness as a backup signal

Every status and accent color in the palette differs in lightness as well as hue, so that if two colors ever blur together perceptually, one is still clearly brighter than the other. Hue alone is never the only signal.

The 7 Design Rules
1
Never pair pure red and pure green for meaning.
Route status pairs through brightness AND a non-red-green hue axis.
2
Blue (sapphire) stays rare.
Reserve it for one specific meaning (success) so it never gets visually crowded out.
3
Stagger lightness, not just hue.
Every status color differs in brightness as a backup cue.
4
Keep warm accents actually warm.
Blue-channel value under ~20% of total RGB is the real test, not the abstract color name.
5
Background warmth stays subtle.
Darkness does the contrast work — never push saturation up to compensate.
6
Night Color / Redshift: cap around 4800–5000K.
Not the typical 3000–3500K — full warm shift suppresses blue further. Disable entirely during color-dependent work.
7
Same hex, same role, every tool.
Consistency across the entire desktop environment is the whole point.
// 03 — TERMINAL

ANSI 16 in Action

The 16-color ANSI palette is the backbone of terminal theming. Every color maps directly to a Pyrope token.

Click any color block to copy its hex value.

kitty — 100×28
nirvik@pyrope:~ $ neofetch

ANSI green is the Pear accent itself — not a teal substitute. This is intentional. The git diff pairing (garnet/red vs pear-green) gives two colors that are separated by both hue AND lightness, making them distinguishable even without reliable green-cone function.

// 04 — SYNTAX

Syntax Roles

The same role assignments apply identically across VS Code, Neovim, Zed, and Kate.

example.tsx
12345678910111213141516171819202122232425262728293031323334
// Pyrope colorscheme — syntax role demo
import React, { useState, useEffect } from 'react'
 
interface ThemeConfig {
name: string
variant: 'dark' | 'light'
accentHex: string
}
 
const DEFAULT_CONFIG: ThemeConfig = {
name: 'pyrope',
variant: 'dark',
accentHex: '#a8c155',
}
 
const ThemeProvider: React.FC<{ config?: ThemeConfig }> = ({
config = DEFAULT_CONFIG,
}) => {
const [active, setActive] = useState<boolean>(true)
 
useEffect() => {
// Apply theme tokens to document root
document.documentElement.style.setProperty(
'--accent',
config.accentHex
)
}, [config.accentHex])
 
if (!active) return null
 
return <div className="pyrope-root" data-theme={config.variant} />
}
 
export default ThemeProvider
Keywords
Functions
Types
Strings
Numbers
Comments
Text
// 06 — EXCLUDED

What Didn't Make It — and Why

Design by exclusion is as important as design by inclusion. These colors were considered and rejected for specific, documented reasons.

Amethyst / Purple

#7b6fb0
Why it's out

Reads as blue once the blue cone overrides the muted red component. Looked 'blue' in practice despite the math suggesting otherwise.

Terracotta / Red as primary accent

#c96a3a
Why it's out

Disliked aesthetically. Unrelated to vision — just not the right visual fit for the warm-dark-jeweltone direction.

Cool mint / Seafoam

#5bb8a0
Why it's out

Same problem as amethyst — the blue component dominates perceptually under a fully-active blue cone.

Pure saturated green as meaning-bearing

#22c55e
Why it's out

With green cone function at ~0%, anything riding purely on green hue is invisible regardless of how 'safe' it looks in a color checker.

The blue-channel test: any color with a blue RGB component above ~20% of total is a candidate for perceptual collapse to blue. This is the actual filter applied when evaluating new palette additions.

// PYROPE — COLORSCHEME
Designed by Nirvik Dhungana · 2026
// 08 — CONTACT

Let's build something great.

If you have a project that needs some creative touch, let's chat.

Start a Conversation

info.nirvik.dh@gmail.com

Or find me on

Location

Kathmandu, Nepal

Status

Currently Learning

Response

Usually within 24h

© 2026 Nirvik Dhungana. All rights reserved.

KATHMANDU, NEPAL · BUILT WITH REACT, TYPESCRIPT & TAILWIND

This site uses cookie-free analytics. No personal data is collected.