Bereghici Dark and Light for terminals, editors, command-line tools and apps, generated from the Bereghici Design System tokens.
git clone https://github.com/abereghici/themes ~/.local/share/bereghici
~/.local/share/bereghici/install.shinstall.sh is for macOS: it reads the appearance with defaults and puts the font in ~/Library/Fonts. The theme files themselves work on any system, from each port's themes/. Each port's README lists what install.sh does for it and what to add to the tool's config.
install.sh:
- links each theme where its tool reads it, so a
git pullupdates those tools without installing again. VS Code and the font keep a copy: runinstall.shagain after pulling. - replaces only its own links and broken ones, never a file or link of yours, and replaces the font file in
~/Library/Fontswhen it differs from the repository's. - reports a step that fails, installs the rest, and then exits non-zero.
- links a clone kept elsewhere at
~/.local/share/bereghici, the one path every port's usage names.
pnpm test runs it in an empty home folder to check each of these (outputs.test.ts).
Claude Code and Codex take one theme rather than one per appearance: run install.sh sync dark or install.sh sync light from whatever switches the appearance.
To uninstall, delete the links install.sh made (each port's README lists them), ~/Library/Fonts/BereghiciSymbols.otf, the VS Code extension (code --uninstall-extension abereghici.bereghici-theme) and the clone.
Each port ships the flavors its tool can use, most as themes/bereghici-<flavor>.<ext> (each port's README lists its files):
- dark and light: Bereghici Dark and Light in their own colors.
- terminal: each role as the nearest of the 16 ANSI colors a Bereghici terminal theme defines (Ghostty's, for one). In a terminal running one, a tool in this flavor switches with the terminal, live, even when it has no light/dark setting of its own, such as fzf, Starship, eza or zsh. Its
surfaceandsurfaceRaisedare the terminal's own background.
The terminal ports leave the background to the terminal, so a translucent one (Ghostty's background-opacity) shows through. pnpm test checks the ones that would otherwise cover the screen (outputs.test.ts, editors.test.ts):
- tmux draws its status bar, popups and menus with
bg=default. - herdr's sidebar uses
sidebar_bg = "reset". - fzf's terminal flavor sets
bg:-1andgutter:-1; its dark and light flavors paint Bereghici's background, for a terminal in other colors. - Neovim's
setup({ transparent = true })clears the editor, floats, sign column, status and tab lines, folds, inlay hints and diagnostics. The completion menu stays solid, to read over code.
Desktop apps (VS Code, Chrome, Obsidian, Raycast) draw their own windows.
Every value comes from @abereghici/tokens: the design system's primitives and semantic colors, mapped to these roles in terminal.tokens.json. The roles take the design system's names: surfaces, text, the line highlight, selection and border, accent, and the six ANSI hues with their bright pairs. The Terminal column is the ANSI color the terminal flavor uses: the same color for the hues, and the nearest one for the others. Generated by pnpm build:
| Role | Dark | Light | Terminal |
|---|---|---|---|
surface |
#12150f |
#f3f5ee |
background |
surfaceRaised |
#181b14 |
#eaebe3 |
background |
surfaceNested |
#1e221a |
#e1e3dc |
ANSI 0 |
textSubtlest |
#858a81 |
#686a64 |
ANSI 8 |
textSubtle |
#a2a69d |
#535750 |
ANSI 7 |
text |
#eeefe9 |
#2e3229 |
ANSI 15 |
lineHighlight |
#1e221a |
#eaebe3 |
ANSI 0 |
selection |
#4b4f45 |
#c1c3bc |
ANSI 0 |
border |
#696d63 |
#a3a49e |
ANSI 8 |
accent |
#eceac9 |
#263316 |
ANSI 2 |
red |
#e99989 |
#a84837 |
ANSI 1 |
yellow |
#fabc86 |
#c3720f |
ANSI 3 |
green |
#a6d1b0 |
#1f7c44 |
ANSI 2 |
cyan |
#87c8cb |
#007a80 |
ANSI 6 |
blue |
#97bfe6 |
#2f6da4 |
ANSI 4 |
magenta |
#d4acca |
#8b537f |
ANSI 5 |
redBright |
#ffbfb2 |
#833426 |
ANSI 9 |
yellowBright |
#ffd8ac |
#925613 |
ANSI 11 |
greenBright |
#c9e7d0 |
#155f32 |
ANSI 10 |
cyanBright |
#b3e2e4 |
#005e63 |
ANSI 14 |
blueBright |
#bedbf8 |
#20537f |
ANSI 12 |
magentaBright |
#ebcde3 |
#6b3e62 |
ANSI 13 |
pnpm test holds every pair below to its minimum, in both variants, with the WCAG 2.2 contrast ratio (Color.js WCAG21, the formula 2.2 keeps). 4.5 is AA for text (SC 1.4.3) and 3 is AA for large text and interface marks (SC 1.4.11).
Yellow, and the hues on panels and the selection, sit below AA by design, as in Catppuccin Latte, whose yellow is 2.31:1 on its base: a yellow dark enough for 4.5 on a light background reads as brown, and six hues can't stay apart at 4.5 on every background. Those minimums are lower in the tables, not hidden. WCAG 3 doesn't settle a successor yet: its working draft says its contrast algorithm "is yet to be determined", so these are WCAG 2 ratios. Generated by pnpm build from the same pairs the tests check:
Text on the background and panels
| Foreground | Background | Minimum | Dark | Light |
|---|---|---|---|---|
text |
surface |
4.50 | 15.93 | 11.91 |
text |
surfaceRaised |
4.50 | 15.06 | 10.90 |
textSubtle |
surface |
4.50 | 7.44 | 6.71 |
textSubtle |
surfaceRaised |
4.50 | 7.03 | 6.14 |
textSubtlest |
surface |
4.50 | 5.22 | 4.98 |
textSubtlest |
surfaceRaised |
4.50 | 4.93 | 4.56 |
accent |
surface |
4.50 | 15.07 | 12.19 |
accent |
surfaceRaised |
4.50 | 14.25 | 11.16 |
text |
surfaceNested |
4.50 | 13.98 | 10.11 |
accent |
surfaceNested |
4.50 | 13.23 | 10.35 |
Syntax and ANSI colors on the background
| Foreground | Background | Minimum | Dark | Light |
|---|---|---|---|---|
red |
surface |
4.50 | 8.23 | 5.24 |
yellow |
surface |
3.00 | 11.06 | 3.33 |
green |
surface |
4.50 | 10.85 | 4.75 |
cyan |
surface |
4.50 | 9.79 | 4.67 |
blue |
surface |
4.50 | 9.57 | 4.97 |
magenta |
surface |
4.50 | 9.26 | 5.25 |
redBright |
surface |
4.50 | 11.71 | 7.69 |
yellowBright |
surface |
4.50 | 13.75 | 5.36 |
greenBright |
surface |
4.50 | 13.88 | 7.04 |
cyanBright |
surface |
4.50 | 13.08 | 6.87 |
blueBright |
surface |
4.50 | 12.88 | 7.33 |
magentaBright |
surface |
4.50 | 12.61 | 7.67 |
Syntax and ANSI colors on panels
| Foreground | Background | Minimum | Dark | Light |
|---|---|---|---|---|
red |
surfaceRaised |
3.00 | 7.78 | 4.80 |
red |
surfaceNested |
3.00 | 7.22 | 4.45 |
yellow |
surfaceRaised |
2.50 | 10.45 | 3.05 |
yellow |
surfaceNested |
2.50 | 9.70 | 2.83 |
green |
surfaceRaised |
3.00 | 10.26 | 4.35 |
green |
surfaceNested |
3.00 | 9.52 | 4.03 |
cyan |
surfaceRaised |
3.00 | 9.25 | 4.27 |
cyan |
surfaceNested |
3.00 | 8.59 | 3.96 |
blue |
surfaceRaised |
3.00 | 9.05 | 4.55 |
blue |
surfaceNested |
3.00 | 8.40 | 4.22 |
magenta |
surfaceRaised |
3.00 | 8.75 | 4.80 |
magenta |
surfaceNested |
3.00 | 8.12 | 4.45 |
redBright |
surfaceRaised |
3.00 | 11.07 | 7.04 |
redBright |
surfaceNested |
3.00 | 10.28 | 6.53 |
yellowBright |
surfaceRaised |
3.00 | 13.00 | 4.91 |
yellowBright |
surfaceNested |
3.00 | 12.06 | 4.55 |
greenBright |
surfaceRaised |
3.00 | 13.12 | 6.44 |
greenBright |
surfaceNested |
3.00 | 12.18 | 5.98 |
cyanBright |
surfaceRaised |
3.00 | 12.37 | 6.29 |
cyanBright |
surfaceNested |
3.00 | 11.48 | 5.83 |
blueBright |
surfaceRaised |
3.00 | 12.17 | 6.71 |
blueBright |
surfaceNested |
3.00 | 11.30 | 6.23 |
magentaBright |
surfaceRaised |
3.00 | 11.92 | 7.02 |
magentaBright |
surfaceNested |
3.00 | 11.07 | 6.51 |
Text and syntax colors on the selection
| Foreground | Background | Minimum | Dark | Light |
|---|---|---|---|---|
text |
selection |
4.50 | 7.25 | 7.35 |
red |
selection |
2.00 | 3.75 | 3.24 |
yellow |
selection |
2.00 | 5.03 | 2.06 |
green |
selection |
2.00 | 4.94 | 2.93 |
cyan |
selection |
2.00 | 4.46 | 2.88 |
blue |
selection |
2.00 | 4.36 | 3.07 |
magenta |
selection |
2.00 | 4.22 | 3.24 |
Text on diff and search backgrounds
| Foreground | Background | Minimum | Dark | Light |
|---|---|---|---|---|
text |
added |
4.50 | 12.11 | 9.64 |
text |
addedEmphasis |
4.50 | 8.12 | 7.74 |
text |
removed |
4.50 | 12.56 | 9.55 |
text |
removedEmphasis |
4.50 | 9.06 | 7.51 |
text |
addedStrong |
4.50 | 5.28 | 6.06 |
text |
removedStrong |
4.50 | 6.21 | 5.86 |
text |
changed |
4.50 | 12.34 | 9.62 |
text |
changedEmphasis |
4.50 | 8.56 | 7.66 |
text |
search |
4.50 | 9.93 | 9.27 |
| Port | For | Switches |
|---|---|---|
| Ghostty | Terminal | live |
| herdr | Terminal | live |
| tmux | Terminal | live |
| Neovim | Editors | live |
| VS Code | Editors | live |
| bat | Command line | on start |
| Claude Code | Command line | through install.sh sync |
| Codex | Command line | through install.sh sync |
| delta | Command line | on start |
| eza | Command line | live |
| fzf | Command line | live |
| glamour (gh, glow) | Command line | live |
| jq | Command line | live |
| lazydocker | Command line | live |
| lazygit | Command line | live |
| ripgrep | Command line | live |
| Yazi | Command line | on start |
| LS_COLORS (GNU ls, fd, eza, zsh completion) | Shell | live |
| Starship | Shell | live |
| zsh-syntax-highlighting, zsh-autosuggestions | Shell | live |
| Obsidian | Apps | live |
| Raycast | Apps | live |
| Chrome | Browser | by hand |
| Bereghici Symbols | Font | — |
Tools that draw with the 16 ANSI colors, such as htop, take the terminal theme's.
pnpm test runs each tool below on the port's themes, at the version mise.toml pins and mise.lock checksums, and fails when the tool rejects a theme or draws a color other than the palette's (tools.test.ts, checks.ts). CI installs every tool but Ghostty and herdr, whose checks run on the maintainer's Mac only.
| Port | Tool | Proves |
|---|---|---|
| bat | bat 0.26.1 | bat builds its cache from both themes without a warning and highlights TypeScript with them |
| Codex | bat 0.26.1 | bat, which reads TextMate themes with the same library as Codex (syntect), loads both themes and highlights TypeScript with them |
| Yazi | bat 0.26.1 | bat, which reads TextMate themes with the same library as Yazi (syntect), loads each flavor's tmtheme.xml and highlights TypeScript with it |
| delta | delta 0.20.1 | delta renders a diff with each feature, and its output carries the feature's added and removed line backgrounds |
| eza | eza 0.23.5 | eza reads each theme as its theme.yml and draws directories in the theme's blue |
| LS_COLORS (GNU ls, fd, eza, zsh completion) | eza 0.23.5 | eza reads each LS_COLORS and draws directories in the theme's blue |
| fzf | fzf 0.74.5 | fzf accepts every theme's --color (it exits with an error on an unknown color name or value) |
| jq | jq 1.8.2 | jq accepts every theme's JQ_COLORS (it warns on an invalid one) and colors object keys with the theme's blue |
| ripgrep | ripgrep 15.2.0 | ripgrep accepts every theme's --colors (it exits with an error on an invalid one) and marks matches in the theme's red |
| Starship | starship 1.27.0 | Starship draws each palette's colors by role name exactly as it draws their values (it ignores a name it doesn't know) |
| tmux | tmux 3.8, built from source in CI | tmux sources the theme without an error, and the status bar keeps the terminal's background |
| Ghostty | Ghostty on the maintainer's Mac; CI can't install it | ghostty +validate-config accepts a config that sets each theme |
| herdr | herdr on the maintainer's Mac; CI can't install it | herdr config check reports no issue with the theme as config.toml (it reports unknown keys) |
| VS Code | @vscode/vsce 4.1.0, from pnpm-workspace.yaml | vsce package packages the extension, and the package holds every theme the manifest contributes |
The other tests:
- parse every generated JSON, YAML, TOML and XML file, and run
bash -n,zsh -nandgit config --liston the shell and git ones (outputs.test.ts). - load the Neovim port in both appearances, with and without
transparent, and check that every highlight link has a target and every color is a hex color (editors.test.ts). - compare a sample of each item of CONTRIBUTING's syntax table across Neovim, VS Code and the TextMate theme (
editors.test.ts). - hold every contrast pair above to its minimum (
palette.test.ts), and check the font's logo glyph (font.test.ts).
wallpapers/ has seven dynamic macOS wallpapers in the palette, each switching between a light and a dark image with the appearance.
packages/paletteresolves the design system's DTCG source (@abereghici/tokens/source/*.tokens.json) and the terminal roles with Style Dictionary, into the three flavors every template reads.packages/buildrenders each port'stemplates/*.mustache. A template's frontmatter names its output and the flavors it renders in, as the frontmatter of Catppuccin's Whiskers templates does. A tag the view doesn't have fails the build, so a typo can't ship an empty color.ports.ymlregisters every port: its tool, its documentation, the oldest version it supports, how it switches, where it installs and what to add to the tool's config. The ports table in this README, each port's README andinstall.share generated from it, and the build fails on an entry it can't use.pnpm checkrenders everything without writing and fails when a committed file differs, so what's in the repository is what the tokens produce.packages/fontdraws the Bereghici logo into a font, for prompts.
CI runs pnpm lint, pnpm format, pnpm check-types, pnpm test and pnpm check on every push to main and every pull request.
See CONTRIBUTING.md for the repository layout, the development commands and how to add a port. Report vulnerabilities as described in SECURITY.md.
MIT © abereghici.
