Theme System

Customize Floww's appearance with CSS custom properties.

Floww's entire visual layer is driven by CSS custom properties (variables). A theme is simply a set of variable overrides packaged with metadata. Themes can change colors, spacing, border radii, font sizes, and more — without touching any source code.

How Themes Work

Floww ships with a base stylesheet that defines every visual property as a CSS custom property on the :root element. When a theme is activated, Floww injects the theme's CSS overrides after the base styles, replacing the default values.

The layering order is:

  1. Base styles — Floww's default theme (dark mode). Defines all variables with sensible defaults.
  2. Theme overrides — your theme's CSS, which reassigns any variables you want to change.
  3. User overrides — individual tweaks from the user's settings (if any).

Because themes only change variable values, they are always forward-compatible. When Floww adds new UI components, those components use the existing variables and automatically adopt the active theme.

Dark and light
Floww's base theme is dark. If you create a light theme, override the full set of background and text variables. Partial overrides on a dark base can produce unreadable contrast ratios.

Available CSS Variables

The following table lists all theme-able CSS custom properties. Override any of these in your theme file to change the appearance.

Backgrounds

VariableDefaultDescription
--floww-bg-primary#0e0e10Main application background
--floww-bg-secondary#1a1a1fSidebar, panel backgrounds
--floww-bg-tertiary#24242bCards, dropdowns, tooltips
--floww-bg-canvas#111115Canvas background (behind the grid)
--floww-bg-node#1e1e24Node body background
--floww-bg-node-header#282830Node header bar
--floww-bg-input#16161bText inputs, text areas
--floww-bg-hoverrgba(255,255,255,0.05)Hover state overlay
--floww-bg-selectedrgba(99,102,241,0.12)Selected item highlight

Text

VariableDefaultDescription
--floww-text-primary#e4e4e7Primary body text
--floww-text-secondary#a1a1aaSecondary / muted text
--floww-text-tertiary#71717aPlaceholder text, disabled labels
--floww-text-link#818cf8Hyperlinks
--floww-text-code#c084fcInline code

Accent & Status

VariableDefaultDescription
--floww-accent#6366f1Primary accent (buttons, active states)
--floww-accent-hover#4f46e5Accent hover state
--floww-success#22c55eSuccess / complete indicators
--floww-warning#f59e0bWarning indicators
--floww-error#ef4444Error indicators

Borders & Radius

VariableDefaultDescription
--floww-border-color#2e2e36Default border color
--floww-border-radius-sm4pxSmall elements (badges, tags)
--floww-border-radius-md8pxCards, panels
--floww-border-radius-lg12pxModals, large containers
--floww-border-radius-node10pxNode corners

Typography

VariableDefaultDescription
--floww-font-family'Inter', sans-serifUI font stack
--floww-font-mono'JetBrains Mono', monospaceCode / monospace font
--floww-font-size-sm12pxSmall labels
--floww-font-size-md14pxDefault body text
--floww-font-size-lg16pxHeadings, emphasis

Creating a Theme File

A theme is defined in a theme.json file that contains metadata and CSS variable overrides:

{
  "name": "Solarized Light",
  "version": "1.0.0",
  "author": "Your Name",
  "description": "A warm light theme based on Solarized.",
  "base": "light",
  "variables": {
    "--floww-bg-primary": "#fdf6e3",
    "--floww-bg-secondary": "#eee8d5",
    "--floww-bg-tertiary": "#e0dbc6",
    "--floww-bg-canvas": "#fdf6e3",
    "--floww-bg-node": "#eee8d5",
    "--floww-bg-node-header": "#ddd6c1",
    "--floww-bg-input": "#fdf6e3",
    "--floww-text-primary": "#073642",
    "--floww-text-secondary": "#586e75",
    "--floww-text-tertiary": "#93a1a1",
    "--floww-text-link": "#268bd2",
    "--floww-accent": "#2aa198",
    "--floww-accent-hover": "#1a8a82",
    "--floww-border-color": "#c5bfa7",
    "--floww-success": "#859900",
    "--floww-warning": "#b58900",
    "--floww-error": "#dc322f"
  }
}

Theme metadata fields

FieldRequiredDescription
nameYesDisplay name shown in the theme picker
versionYesSemver version string
authorNoAuthor name or handle
descriptionNoBrief description
baseNo"dark" or "light" — hints to Floww which scroll bar and system chrome to use
variablesYesObject mapping CSS variable names to values
You don't need to override everything
Only include the variables you want to change. Unspecified variables inherit from the base theme. A minimal theme might only override 5-10 color variables.

Preview & Hot Reload

Floww includes a developer mode for theme creation that makes the process fast and iterative:

  1. Open Floww and go to Settings → Appearance → Themes.
  2. Click Open Theme Editor to enter dev mode.
  3. Load your theme.json file or start from a blank template.
  4. Every time you save the file, Floww reloads the theme instantly — no restart required.

You can also toggle between your in-progress theme and the default theme with the keyboard shortcut Ctrl+Shift+T (or Cmd+Shift+T on macOS) to compare.

Contrast checker
The theme editor includes a built-in contrast ratio checker that flags any text/background combinations that fail WCAG AA. Aim for at least 4.5:1 for body text.

Sharing Themes

Once your theme is ready, you can share it with others:

Export

From the theme editor, click Export Theme. This packages your theme.json into a .floww-theme file that others can import.

Import

Users install themes by opening a .floww-theme file or placing the theme.json directly in ~/.floww/themes/.

Submit your theme to the Floww community gallery for wider visibility. The submission process is similar to plugins:

  1. Ensure your theme includes a name, version, author, and description.
  2. Test on both large and small workflows to check for readability issues.
  3. Submit via the floww publish --theme CLI command.
  4. A reviewer checks for contrast and accessibility compliance before listing.