How to Use Placeholders in Omarchy Theme Templates
Omarchy theme templates use {{ variable }} placeholder syntax that maps to keys defined in a theme's colors.toml file, which are then rendered into final configuration files via the omarchy-refresh-config command.
Learning how to use placeholders in Omarchy theme templates allows you to maintain consistent theming across multiple applications without manually editing configuration files. The basecamp/omarchy repository provides a lightweight templating engine that reads .tpl files and substitutes variables with values from your active theme's TOML definitions.
Understanding the Placeholder Syntax
Omarchy employs a deliberately simple substitution engine. Placeholders follow the format {{ key }} where the key must exactly match a field name in your theme's color definition file.
The templating system processes files in three stages:
- Template Definition – Files ending in
.tplcontain raw configuration syntax interspersed with{{ variable }}markers. - Value Resolution – The engine reads the active theme's
colors.tomland builds a lookup table of available values. - File Generation – Running
omarchy-refresh-configwrites the rendered output to the appropriate location in~/.config/.
This mechanism supports any text-based configuration format, including Lua, TOML, YAML, JSON, and CSS, without requiring additional escaping.
Creating Template Files
Template files reside in the default/themed/ directory and serve as blueprints for application-specific configurations. You can reference any key defined in your theme's color palette using the double-brace syntax.
Hyprland Configuration Templates
In default/themed/hyprland.lua.tpl, placeholders adapt Hyprland's window manager settings to the current color scheme:
monitor = {
default_workspace = "1",
DPI = 96,
background = "{{ background }}",
accent = "{{ accent }}",
}
When rendered, the {{ background }} and {{ accent }} tokens are replaced with the hex values defined in the active theme's colors.toml.
Terminal Emulator Templates
Terminal configurations demonstrate the system's flexibility across different file formats. The default/themed/alacritty.toml.tpl file uses placeholders within a YAML structure:
colors:
primary:
background: "{{ background }}"
foreground: "{{ foreground }}"
normal:
black: "{{ black }}"
red: "{{ red }}"
green: "{{ green }}"
yellow: "{{ yellow }}"
blue: "{{ blue }}"
magenta: "{{ magenta }}"
cyan: "{{ cyan }}"
white: "{{ white }}"
Similarly, default/themed/kitty.conf.tpl integrates placeholders into Kitty's configuration syntax.
Defining Theme Values in colors.toml
Each theme folder contains a colors.toml file that maps keys to concrete values. The engine requires exact key matching between the TOML fields and the template placeholders.
background = "#1e1e2e"
foreground = "#cdd6f4"
accent = "#ff6f61"
black = "#45475a"
red = "#f38ba8"
green = "#a6e3a1"
The file supports standard hex color notation and plain text values. As documented in docs/theming.md, the build process loads this file into memory before processing any template substitutions.
Rendering Templates with omarchy-refresh-config
The omarchy-refresh-config command triggers the substitution pipeline. Specify the base filename (without the .tpl extension) to generate the final configuration.
omarchy-refresh-config hyprland.lua
This command performs the following actions:
- Locates
default/themed/hyprland.lua.tpl - Parses the active theme's
colors.toml - Substitutes all
{{ key }}occurrences with corresponding values - Writes the result to
~/.config/hypr/hyprland.lua
For Alacritty, running omarchy-refresh-config alacritty.toml produces ~/.config/alacritty/alacritty.toml with resolved color values.
Fallback Behavior and Debugging
If a placeholder references a key absent from the active theme's colors.toml, the engine preserves the raw {{ key }} string in the output. This behavior, implemented in the theming pipeline documented in default/agents/skills/omarchy/theming.md, helps identify missing definitions during development by making unresolved placeholders visible in the generated files.
Summary
- Placeholder syntax uses
{{ variable }}format matching keys incolors.toml. - Template files use the
.tplextension and live indefault/themed/(e.g.,hyprland.lua.tpl,kitty.conf.tpl,alacritty.toml.tpl). - Rendering command is
omarchy-refresh-config <basename>, which writes processed files to~/.config/. - Missing keys remain as raw placeholder text, aiding debugging.
- Documentation in
docs/theming.mdanddefault/agents/skills/omarchy/theming.mdprovides implementation details.
Frequently Asked Questions
What file extension should template files use?
Template files must use the .tpl extension appended to the target filename (for example, hyprland.lua.tpl or alacritty.toml.tpl). The omarchy-refresh-config command automatically strips this extension when writing the final file to your configuration directory.
Can I use placeholders in JSON or CSS files?
Yes, the templating engine treats all .tpl files as plain text. You can embed {{ variable }} syntax inside JSON, CSS, Lua, or any other configuration format without additional escaping, as the substitution occurs before the target application parses the file.
What happens if a placeholder key is missing from colors.toml?
If a placeholder references a key that does not exist in the active theme's colors.toml, the raw {{ key }} string is written to the output file unchanged. This allows you to spot missing theme definitions immediately when viewing the generated configuration.
Where are the official template examples located?
Official examples are located in the default/themed/ directory of the basecamp/omarchy repository. Key reference files include default/themed/hyprland.lua.tpl, default/themed/kitty.conf.tpl, and default/themed/alacritty.toml.tpl. Comprehensive documentation resides in docs/theming.md and default/agents/skills/omarchy/theming.md.
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 →