Skip to main content
  1. Posts/

Catppuccin Mocha: Why I Theme Everything the Same Color

··678 words·4 mins·
Nick Liu
Author
Nick Liu
Building infrastructure for Facebook Feed Ranking at Meta. Previously at Walmart, Twitter, AWS, and eBay. MS in Computer Science at Georgia Tech.
Table of Contents
Your development environment should feel like **one cohesive tool**, not a collection of unrelated windows with clashing colors. I theme everything with the same palette: Catppuccin Mocha . The result is a workspace where context-switching between tools is effortless.

Why One Palette Everywhere?
#

Most developers pick a theme for their editor and call it a day. Their terminal is one color, their editor another, their tmux status bar a third, and their Git diffs something else entirely. Every time they switch contexts, their brain spends a fraction of a second recalibrating.

That friction adds up. When red means error in every single tool (terminal output, editor diagnostics, Git diffs, monitoring dashboards), you process information faster because your visual vocabulary is consistent.

The Palette
#

Catppuccin is a community-driven pastel theme with four flavor variants. I use Mocha, the darkest flavor, across everything.

Base Colors
#

Base, Surface0, Surface1: the foundation. Deep blues that are easy on the eyes during long sessions.

Accent Colors
#

Blue (info/links), Red (errors/deletions), Green (success/additions): these carry semantic meaning across every tool.

Warm Accents
#

Peach (warnings), Yellow (highlights), Mauve (keywords): used for syntax highlighting and UI accents.

Where I Use It
#

Every tool in my daily workflow runs Catppuccin Mocha:

Configuration Snippets
#

Here’s how I set up Catppuccin Mocha in each tool:

# ~/.config/ghostty/config
theme = catppuccin-mocha
background-opacity = 0.75
background-blur-radius = 20

Ghostty ships with Catppuccin built-in. Just set the theme name. The transparency lets the palette blend with the desktop for a frosted-glass aesthetic.

-- LazyVim extra or manual plugin
{ "catppuccin/nvim",
  name = "catppuccin",
  opts = {
    flavour = "mocha",
    transparent_background = true,
    integrations = {
      treesitter = true,
      telescope = { enabled = true },
      which_key = true,
    },
  },
}

The Catppuccin Neovim plugin has first-class integrations with virtually every popular plugin: Treesitter, Telescope, nvim-cmp, and more all get coordinated colors.

# ~/.config/tmux/tmux.conf
set -g @plugin 'catppuccin/tmux'
set -g @catppuccin_flavor 'mocha'
set -g @catppuccin_window_status_style "rounded"

The tmux plugin adds a themed status bar with window indicators, session name, and system info, all matching the terminal and editor.

# ~/.zshrc
export FZF_DEFAULT_OPTS=" \
--color=bg+:#313244,bg:#1e1e2e,spinner:#f5e0dc \
--color=hl:#f38ba8,fg:#cdd6f4,header:#f38ba8 \
--color=info:#cba6f7,pointer:#f5e0dc,marker:#f5e0dc \
--color=fg+:#cdd6f4,prompt:#cba6f7,hl+:#f38ba8"

FZF’s color configuration takes raw hex values, so you set each UI element individually. Once configured, fuzzy finding matches the rest of your environment perfectly.

# ~/.gitconfig
[delta]
    syntax-theme = Catppuccin Mocha
    minus-style = syntax "#3B1219"
    plus-style = syntax "#1C3A2D"

Delta (the Git pager) uses the Catppuccin bat theme for syntax highlighting in diffs. The custom minus/plus styles tint additions green and deletions red using the Mocha palette.

The Cognitive Load Argument
#

The real benefit isn’t aesthetics: it’s that context-switching between terminal, editor, and browser no longer requires your brain to re-adapt to different color semantics. Red means error everywhere. Blue means info everywhere. Green means success everywhere.

When I jump from reading a Git diff (red = deleted, green = added) to my editor (red = error diagnostic, green = test passing) to my terminal output (red = failed command, green = success), my brain doesn’t skip a beat. The color semantics are identical.

This is the same principle behind why airports, hospitals, and road signs use standardized color systems. Consistency reduces cognitive overhead.

The Full Color Reference
#

For anyone wanting to replicate this setup, here are the key Catppuccin Mocha values I use most:

RoleColorHexUsage
BaseDark blue#1e1e2eBackgrounds
TextLight lavender#cdd6f4Primary text
BlueSoft blue#89b4faLinks, info, variables
RedSoft red#f38ba8Errors, deletions
GreenSoft green#a6e3a1Success, additions
PeachWarm peach#fab387Warnings, numbers
YellowSoft yellow#f9e2afHighlights, strings
MauvePurple#cba6f7Keywords, headings
OverlayMuted gray#6c7086Comments, secondary text

Getting Started
#

If you want to try Catppuccin Mocha yourself, the project has ports for 300+ apps. Start with your terminal emulator and editor, then expand from there.

For my complete configuration files including all the snippets above, check out my dotfiles:

Related

My Terminal Setup in 2026: Ghostty, tmux, and Neovim

··822 words·4 mins
After years of refining my terminal workflow, I've landed on a stack I genuinely enjoy using every day: **Ghostty** as the terminal emulator, **tmux** with **sesh** for session management, and **Neovim** with **LazyVim** for editing. Everything runs on macOS (Apple Silicon) with a consistent Catppuccin Mocha theme across all tools.

Modern CLI Tools That Replaced My Unix Classics

··901 words·5 mins
I've been gradually replacing classic Unix tools with modern alternatives, mostly written in Rust . After a year of daily use, these aren't experiments anymore. They're muscle memory. The Replacements # Classic Modern Why cat bat Syntax highlighting, line numbers, git integration ls eza Icons, git status, tree view, color-coded grep ripgrep 10x faster, respects .gitignore, smart case find fd Simpler syntax, respects .gitignore, colored output cd zoxide Learns your habits, fuzzy matching sed sd Intuitive regex syntax, no escaping nightmare du dust Visual directory size with a tree view df duf Colorful, filterable disk usage top btop Beautiful TUI with mouse support, per-core graphs ps procs Colorized, searchable, tree view history atuin Encrypted sync, full-text search, workspace filtering Setting Up Aliases # In my .zshrc, I alias the classics to their replacements so the transition is invisible:

Make tmux Show What Each Window Is Doing

··781 words·4 mins
If you use tmux, you've hit this: ten windows open and they're all named `zsh` or `node`. Which one had your AI agent running? No idea. Let's make tmux label windows usefully. Taming Claude Code Sessions · Part 3 of 6 1 2 3 4 5 6 🧪 Tested with Claude Code 2.1.x · macOS / Linux New to tmux? It’s a “terminal multiplexer”: it splits one terminal into many windows and panes that survive disconnects. The only vocabulary you need here: a window is like a browser tab inside tmux; the bar at the bottom lists them. The prefix is the key you press before a tmux command, commonly Ctrl+b (mine is Ctrl+a). Why everything is named zsh # By default tmux has a setting called automatic-rename turned on. It renames each window after whatever program is running in it. A shell? zsh. A Node program (like Claude Code)? node. Helpful in theory, useless when everything collapses to the same word.