Skip to main content
The formae CLI is themeable. A theme controls the colors, glyphs, spinner, progress bar, and a few behavioral touches used across every interactive screen (the apply/destroy preview, the live status view, and formae inventory). Themes ship as TOML files: formae has built-in themes compiled into the binary, and you can drop your own into a directory to add or override one.

Selecting a theme

Set cli.theme in your profile (see Configuration):
The value is the name of a built-in theme, or the filename (without .toml) of a theme in ~/.config/formae/themes/. An unknown name prints a warning that lists every available theme (the built-ins plus any of your own in ~/.config/formae/themes/) and falls back to quiet.

Available themes

formae ships with the following themes: The nord, gruvbox, tokyo-night, rose-pine, and catppuccin-latte themes reuse quiet’s restrained behavior and change only the palette, so glyphs and layout stay neutral while each operation is tinted from the scheme.
theme = "formae" is accepted as an alias for quiet so existing configurations keep working.
Every theme is self-contained, so you can extends any of them from your own theme (see Inheritance) to start from its palette and change glyphs or behavior.
The palettes of the color-scheme themes are derived from the corresponding Omarchy themes and, in turn, the upstream color schemes: Nord, Gruvbox, Tokyo Night, Rosé Pine, and Catppuccin. All credit for the color work belongs to their authors.

Light and dark appearance

Every theme color has both a light and a dark variant. cli.appearance chooses which side is used, independently of the theme:
  • auto (default) detects the terminal background.
  • light / dark force the corresponding variant. Use this when auto-detection is unreliable — for example inside tmux, over SSH, or in a terminal that does not report its background color.
The appearance is resolved with the following precedence, highest first:
  1. The FORMAE_APPEARANCE environment variable (light or dark) — a one-off override that beats the config.
  2. cli.appearance in the profile, when it is not auto.
  3. Auto-detection of the terminal background.

Omarchy

On an Omarchy desktop, cli.theme = "omarchy" makes the CLI follow your active desktop theme instead of using a fixed palette.
Where the colors come from. formae reads your active Omarchy theme’s colors.toml (at ~/.config/omarchy/current/theme/colors.toml) and maps its values onto formae’s semantic palette — accent becomes the primary accent and the logo wordmark, the 16 ANSI colors (color0color15) fill the per-operation and state colors, background/foreground set surfaces and text, and so on. Sparse themes fall back per key, so every color slot stays populated. If no Omarchy theme is present (or its colors.toml can’t be read), formae warns once and falls back to the quiet theme. Light and dark. With appearance = "auto", an Omarchy theme’s own light/dark declaration is preferred over terminal auto-detection, so a light Omarchy theme renders formae’s light variant and a dark one its dark variant. Setting appearance to light or dark explicitly still overrides this. Live-follow. Switching your desktop theme while a long-running view is open — formae inventory or the status watch — recolors it in place, without restarting the command. formae watches the Omarchy current/theme symlink and re-resolves the theme when your desktop swaps it (the atomic switch that omarchy-theme-set performs), as well as an in-place edit to colors.toml. One-shot commands aren’t watched; they pick up the current theme each time they run.

Authoring a theme

A custom theme is a TOML file in ~/.config/formae/themes/. The filename is the theme name: ~/.config/formae/themes/midnight.toml is selected with cli.theme = "midnight". A theme in that directory whose name matches a built-in shadows the built-in. The quickest way to start is to copy a built-in theme’s structure and change what you need. A theme has a set of appearance planes ([palette], [glyphs], [progress], [spinner]) and a few behavior toggles ([confirmation_bar], [header], [rows]).

Colors

Every [palette] value is either a single hex string used for both appearances, or a table with explicit light and dark variants:
cli.appearance selects which side of the two-variant colors is used at render time.

Inheritance

A theme may declare extends = "<base>" to start from another theme and override only the keys that differ. Inheritance is one level deep — a base that itself declares extends is an error. The built-in themes are self-contained (they do not use extends); inheritance is a convenience for your own themes.
A user theme that is missing keys the base does not supply is reported and falls back to quiet, so a theme always renders something complete.

Palette keys

Glyphs

The [glyphs] plane maps each semantic symbol to a character. Decorative separators and panel borders are fixed chrome and are not themeable.
Keep glyphs to single-width characters. Some symbols (such as , , ) are East-Asian-ambiguous and render double-width in certain terminals, which can misalign side-by-side panels.

Progress and spinner

Behavior toggles

Minimal example

Save this as ~/.config/formae/themes/midnight.toml, then select it: