How to Configure Tuicr Themes: CLI Flags, Config Files, and Custom Palettes
Tuicr themes are configured via the --theme CLI flag, the theme key in config.toml, or custom .tmTheme files placed in the themes directory, with all color definitions centralized in the Theme struct in src/theme/mod.rs.
Tuicr is a terminal-based code review tool that supports extensive visual customization through its theme system. You can configure Tuicr themes using command-line arguments, configuration files, or custom TextMate theme files to match your preferred color palette. The architecture separates theme definitions from UI rendering, allowing you to switch palettes without modifying the application code.
Understanding the Theme System Architecture
The core of Tuicr’s appearance is the Theme struct defined in src/theme/mod.rs (lines 101-138). This struct encapsulates every color used by the interface, including panel backgrounds, diff highlights, file-status indicators, comment-type hues, and status-bar styling.
Tuicr ships with nine built-in preset themes: Solarized, Catppuccin, Ayu, OneDark, GitHub, Tokyo Night, Gruvbox, Nord, and Everforest. These are implemented as constructor methods (e.g., Theme::dark(), Theme::light()) in src/theme/mod.rs (lines 140-400). The application uses syntect to parse TextMate theme files, enabling support for the standard .tmTheme format.
Selecting a Built-In Theme
Using the Command-Line Flag
The fastest way to change themes is the --theme flag, which overrides any configuration file setting. Launch Tuicr with your preferred preset:
tuicr --theme solarized_dark
This flag accepts any built-in theme name (such as catppuccin_mocha, github_dark, or nord) and applies it immediately on startup.
Using the Configuration File
For persistent preferences, set the theme key in your config.toml. Tuicr follows the XDG Base Directory specification:
- Unix/Linux/macOS:
$XDG_CONFIG_HOME/tuicr/config.toml(typically~/.config/tuicr/config.toml) - Windows:
%APPDATA%\tuicr\config.toml
Create or edit the file to include:
theme = "catppuccin_mocha"
If no theme is specified via CLI or config, Tuicr falls back to Theme::default(), which currently returns Theme::dark(). The configuration is parsed in src/config/mod.rs, which exposes both the theme key and the themes_dir helper function.
Creating and Loading Custom Themes
Tuicr supports user-provided syntax-highlighting themes through the themes directory mechanism, implemented via crate::config::themes_dir (see src/theme/mod.rs line 16).
Preparing Your Custom Theme File
Create a custom palette using the TextMate theme format (.tmTheme). These XML-based files define color scopes for syntax highlighting and UI elements. Tuicr loads these using syntect::parsing::ThemeSet::load_from_reader, ensuring compatibility with existing editor themes.
Installing Custom Themes
Place your .tmTheme file in the appropriate directory for your platform:
- Unix:
$XDG_CONFIG_HOME/tuicr/themes/(usually~/.config/tuicr/themes/) - Windows:
%APPDATA%\tuicr\themes\
The filename (without the .tmTheme extension) becomes the theme identifier. For example, my-custom.tmTheme is referenced as my-custom.
Activating Custom Themes
Reference your custom theme using the same methods as built-ins:
tuicr --theme my-custom
Or in config.toml:
theme = "my-custom"
How Theme Colors Are Applied at Runtime
When Tuicr initializes, the App struct stores the selected theme in a theme: Theme field. The application uses helper functions in src/ui/styles.rs to translate Theme fields into ratatui::style::Style objects consumed by the rendering engine.
Key style functions include:
- Diff addition styling:
styles::diff_add_style(&theme)(seesrc/ui/styles.rsline 13) - Status bar background:
styles::status_bar_style(&theme)(seesrc/ui/styles.rsline 65)
UI modules such as src/ui/app_layout.rs, src/ui/status_bar.rs, and src/ui/submit_modals.rs obtain the current theme from the App instance and apply these style helpers. This ensures a single source of truth for colors throughout the interface, whether you are viewing diffs, reading comments, or navigating the submission modal.
Summary
- Theme definitions live in
src/theme/mod.rs, with built-in presets covering popular palettes like Solarized, Catppuccin, and Nord. - Configuration accepts the
--themeCLI flag or thethemekey inconfig.tomllocated in the XDG config directory. - Custom themes use standard
.tmThemefiles placed intuicr/themes/under your config directory, loaded via syntect. - Runtime application occurs through the
Appstruct andsrc/ui/styles.rshelpers, ensuring consistent coloring across all UI components.
Frequently Asked Questions
Where does Tuicr look for custom theme files?
Tuicr searches for .tmTheme files in the themes subdirectory of your configuration folder: $XDG_CONFIG_HOME/tuicr/themes/ on Unix systems or %APPDATA%\tuicr\themes\ on Windows. The loader uses the themes_dir helper from src/config/mod.rs to resolve this path dynamically based on platform conventions.
Can I use my existing VS Code or Sublime Text themes?
Yes, provided they are in the TextMate .tmTheme format. Tuicr uses syntect’s ThemeSet::load_from_reader to parse these files, so any standard TextMate theme compatible with syntect will work. Simply copy the .tmTheme file into your Tuicr themes directory and reference it by filename.
Why does my theme change not apply immediately?
Theme selection happens at application startup in src/app/init.rs (or src/app/mod.rs). The App struct initializes with a specific Theme instance, and there is currently no runtime hot-reloading mechanism. You must restart Tuicr after changing the theme value in config.toml or switching custom theme files.
What is the default theme if I don't specify one?
If no theme is provided via --theme or configuration, Tuicr calls Theme::default(), which currently returns Theme::dark(). This fallback is defined in src/theme/mod.rs and provides a dark palette optimized for terminal readability until you configure a specific preference.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →