A cinematic appearance layer for WezTerm.
Turn your terminal into a live-tunable visual workspace with a polished Textual manager and a native WezTerm UI bridge.
Preview • Why • Features • Quick Start • Controls • Architecture • Future Ideas
Replace the images above with your real screenshots or GIFs for the full effect.
WezTerm Theme Manager is a lightweight but high-impact theming workflow for WezTerm.
It combines two parts:
- a local Textual control panel for interactive appearance tuning
- a native WezTerm bridge that reads saved state and wires runtime UI controls
This means your terminal theme is no longer trapped inside a giant config file.
Instead, you get a small, clean, state-driven system for making WezTerm feel personal, dynamic, and premium.
WezTerm is powerful, but appearance customization usually ends up looking like this:
- too many scattered config edits
- too many reload cycles
- too much friction for tiny visual changes
- too much logic mixed with too much styling
- too little joy
This project separates:
- visual state
- runtime bridge logic
- interactive control surface
So instead of treating terminal styling like a pile of config fragments, you get something closer to a real product experience.
Not just a theme switcher.
A visual control layer for people who actually care how their terminal feels.
| Capability | Description |
|---|---|
| 🎨 Theme Presets | 10 custom themes |
| 🪟 Opacity Control | Cycle window transparency levels |
| 🌫️ Blur Control | Tune macOS blur intensity |
| 🔠 Font Size Presets | Switch sizing profiles quickly |
| 📦 Padding Presets | Change terminal spacing instantly |
| 🧩 Tab Modes | Fancy / Retro / Minimal styles |
| 📡 Right Status | Toggle runtime status bar content |
| 🧭 InputSelector Menus | Native overlay pickers inside WezTerm |
| 🏷 Custom Tab Titles | Better runtime tab presentation |
| ⚡ Command Palette Integration | Native command workflow |
| 💾 Persistent State | Saved settings survive restart/reload |
This project introduces a tiny state-driven appearance pipeline:
Textual Manager -> terminalcolor_state.lua -> WezTerm Bridge -> Live UI
- Launch the local Textual manager
- Browse themes and tweak appearance settings
- Save the chosen preset into:
~/.config/wezterm/terminalcolor_state.lua- The WezTerm bridge reads that state
- WezTerm applies the saved visual behavior on startup or reload
The result is simple:
- cleaner config
- faster iteration
- better runtime UX
- less visual chaos in
wezterm.lua
- 10 built-in themes
- previous / next switching
- direct numeric selection
- persistent saved preset state
- opacity presets
- blur presets
- font size presets
- padding presets
- fancy
- retro
- minimal
InputSelectoroverlays- right status bar
- custom tab titles
- command palette integration
- runtime theme / layout switching
cd /Users/liziwen/Desktop/terminalcolorsource .venv/bin/activatepython app.pyInside the Textual manager:
| Key | Action |
|---|---|
1-9 / 0 |
Pick one of the 10 themes |
← / → |
Previous / next theme |
o |
Cycle opacity |
b |
Cycle blur |
f |
Cycle font size |
p |
Cycle padding |
t |
Cycle tab mode |
r |
Toggle right status |
s |
Save current settings into WezTerm |
q |
Quit |
When you press s, the manager:
- writes the active state into:
~/.config/wezterm/terminalcolor_state.lua- touches:
~/.config/wezterm/wezterm.luaso WezTerm can pick up the new saved values more smoothly.
These hotkeys work directly inside WezTerm:
| Hotkey | Action |
|---|---|
Cmd+Shift+P |
Theme picker |
Cmd+Shift+O |
Opacity picker |
Cmd+Shift+B |
Blur picker |
Cmd+Shift+F |
Font size picker |
Cmd+Shift+T |
Tab mode picker |
Cmd+Shift+Y |
Padding picker |
Cmd+Shift+[ |
Previous theme |
Cmd+Shift+] |
Next theme |
Cmd+Shift+U |
Toggle right status |
Cmd+Shift+K |
Command palette |
This gives you two layers of control:
- a richer external manager for big changes
- native in-terminal controls for quick adjustments
terminalcolor/
├── app.py
└── wezterm_theme_lab.lua
| File | Role |
|---|---|
app.py |
Local Textual manager |
wezterm_theme_lab.lua |
WezTerm bridge + runtime UI integration |
~/.config/wezterm/terminalcolor_state.lua |
Persisted live state |
~/.config/wezterm/wezterm.lua |
Main WezTerm config entry |
Your ~/.config/wezterm/wezterm.lua should load the bridge:
dofile("/Users/liziwen/Desktop/terminalcolor/wezterm_theme_lab.lua")This bridge is responsible for:
- reading saved appearance state
- applying theme settings
- wiring native selector menus
- updating tab titles
- updating the right status bar
- switching tab presentation modes
The live saved state is stored here:
~/.config/wezterm/terminalcolor_state.luaThat file acts as the shared source of truth between the manager and WezTerm.
This makes the system:
- persistent
- inspectable
- easy to extend
- easy to debug
This project is built around one simple belief:
Terminal UX should not feel like editing a giant pile of visual constants.
A terminal can be:
- expressive
- polished
- personal
- responsive
- fun to tune
So the goal here is not just “switch themes.” The goal is to create a compact but beautiful appearance system for WezTerm.
A typical workflow looks like this:
- Open the Textual manager
- Preview a few themes
- Adjust opacity, blur, padding, and font size
- Save the combination you like
- Jump back into WezTerm
- Use native pickers for smaller changes later
That gives you:
- a full control panel outside the terminal
- a native control surface inside the terminal
/Users/liziwen/Desktop/terminalcolor
├── app.py
├── wezterm_theme_lab.lua
├── README.md
└── assets/
├── banner.png
├── preview-manager.png
└── preview-wezterm.png
Your current WezTerm config now loads:
/Users/liziwen/Desktop/terminalcolor/wezterm_theme_lab.luaIf you move this project directory, you must update that path inside:
~/.config/wezterm/wezterm.luaOtherwise WezTerm will no longer load the bridge.
This setup is primarily designed for macOS + WezTerm.
Some appearance behavior, especially blur-related features, may be platform-specific.
To make this README really hit on GitHub, create:
assets/banner.pngassets/preview-manager.pngassets/preview-wezterm.png
And ideally also:
assets/demo.gif
Then add this near the top:
<p align="center">
<img src="./assets/demo.gif" alt="Demo" width="100%">
</p>A good GIF of theme switching will make the repo page look dramatically better.
There is a lot of room to make this even more ridiculous:
- wallpaper-aware theming
- theme import / export
- per-workspace presets
- automatic day / night switching
- live palette editor
- font family presets
- richer status widgets
- preview thumbnails
- cloud sync
- animated transitions
WezTerm Theme Manager is a lightweight appearance control layer for WezTerm, combining a local Textual dashboard with native terminal-side controls to deliver a cleaner, faster, and much more beautiful terminal workflow.
⚡ Make your terminal look like it has taste.
If this project makes your setup cooler, cleaner, or simply more fun to use, give it a star.


