Appearance

Everything under theme: changes how labdash looks, not what it shows. Which rows appear comes from browsing, filtering and pinning inside the application.

settings.yml
theme:
  name: ember           # ember | ember-light | contrast | ansi | mono
  icons: auto           # auto | unicode | ascii
  density: compact      # compact | comfortable
  separators: false
  dateFormat: relative  # relative | absolute
  reducedMotion: false
  spinner: braille      # braille | line | dot
  logo: splash          # splash | compact | off

log:
  level: warn           # error | warn | info | debug

updateCheck: true

Built-in themes

NameBasisFor
emberWarm amber on cool slateThe default. Dark
ember-lightThe same tokens, light valuesLight terminals
contrastAAA, 7:1 body textA re-derived palette rather than ember with more saturation
ansiIndices 0–15 onlyYour terminal's own colour scheme wins entirely
monoNo colour at allScreenshots, printing, serial consoles

ansi deserves a note. At that tier your terminal theme supplies the actual hues, so the application looks like it belongs in your terminal. If you have a colour scheme you love, this is the setting you want.

The tokens

Components name a role, never a hex value. Colour literals live in the theme package and nowhere else, so one token change reaches every screen.

Surfaces and borders

bg.base#0F1117
bg.surface#161922
bg.overlay#1E222D
bg.selected#232838
border.faint#262B38
border.default#39404F
border.focus#E8A33D · 8.75:1

Text

text.primary#E6E9EF · 12.06:1
text.secondary#A8B0C0 · 6.73:1
text.muted#8A94A7 · 4.80:1

Meaning

accent.primary#E8A33D · 6.80:1
accent.secondary#7AA2F7 · 5.82:1
status.success#7BD88F · 8.42:1
status.warning#E8C55D · 8.78:1
status.error#F07178 · 5.12:1
status.running#5FD7E0 · 8.58:1
status.pending#C4A7F5 · 7.12:1
status.neutral#8A94A7 · 4.80:1

Every value clears WCAG AA against its own background, and the ratios are computed on every commit. The lowest is text.muted at 5.09:1.

The light values are on the design page.

Your own theme

Override a token by name, in hex or as an ANSI index from 0 to 255. Anything you leave out keeps its value from name, so a two-line theme is a complete theme.

settings.yml
theme:
  name: ember
  colors:
    accent.primary: "#d98a3d"
    status.error: 203

A token that does not exist, a malformed hex value, or an index outside 0 to 255 is reported at load with the file, the line, and the accepted values. A theme that drops a pair below WCAG AA still loads, and labdash theme preview shows you the ratio it produced.

To keep a theme in its own file, point at it:

theme:
  file: ~/.config/labdash/themes/solarized.yml

That file holds the same colors map. The path is read from disk; labdash does not fetch a theme over the network.

Colour-profile detection

labdash reads your terminal's capability once at startup and renders to the tier it finds.

TierDetected byWhat happens
MonochromeNO_COLOR, or TERM=dumbNo colour. Hierarchy from glyphs, weight and layout
16 ANSITERM without 256colorIndices 0–15. Your terminal's theme supplies the hues
256TERM contains 256colorNearest match into the 256-colour cube
True colourCOLORTERM is truecolor or 24bitThe palette above, exactly
Info

NO_COLOR is not negotiable It is honoured unconditionally and no setting overrides it. --no-color does the same for one run.

Icons

theme:
  icons: auto        # auto | unicode | ascii

No patched font is required. labdash draws status with ordinary Unicode glyphs that a terminal font has carried for years.

Every glyph is one cell and every ASCII fallback is one character, so a screen rendered in either mode has identical column boundaries. In ascii mode no byte above 0x7F reaches the screen, which is what makes labdash usable on a serial console or inside a CI log.

auto reads your locale rather than probing your font. Three glyphs — running, created, canceling — are classed as East Asian Ambiguous, meaning one cell in most terminals and two in a terminal configured for CJK text. On a CJK locale auto chooses ascii, because a glyph drawn two cells wide where one was measured shifts every column after it.

Set icons: unicode to keep the glyphs anyway, or icons: ascii to drop them everywhere.

Density and separators

theme:
  density: comfortable   # two-line rows
  separators: true       # a rule between rows

Both are global rather than per tab. Mixing row heights between tabs costs the spatial memory that makes a terminal interface fast.

Dates

theme:
  dateFormat: relative           # "2h ago"
  # or
  dateFormat: absolute
  datePattern: "2006-01-02 15:04"
  timezone: America/Lima

Tables show relative time and the preview shows absolute time, because the two are read differently. datePattern uses Go's reference-time layout. timezone takes an IANA name and defaults to the system zone.

Motion

theme:
  spinner: braille       # braille | line | dot
  reducedMotion: false

The spinner runs at 10 frames per second on work that is actually running. braille is ⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏; ASCII mode uses |/-\ whatever the setting says.

reducedMotion: true replaces the spinner with a static marker and drops the splash gradient. State is still communicated: the task line still names what is running.

Accessibility switches

SettingEffect
NO_COLOR environment variableHonoured unconditionally, and no setting overrides it
--no-colorThe same, for one run
theme: { name: mono }No colour. Hierarchy from glyphs, weight and layout
theme: { name: contrast }A shipped 7:1 theme
theme: { icons: ascii }No byte above 0x7F anywhere
theme: { reducedMotion: true }A static marker instead of a spinner, and no gradients
theme:
  logo: splash      # splash | compact | off

splash shows the full wordmark, compact shows the two-row mark, off shows neither. The splash appears for at most 900 ms while Home loads, is skipped by any key, and never renders when output is not a terminal, when NO_COLOR is set, or below 60 columns. It never appears in the dashboard header.

Operational switches

KeyValuesWhat it does
log.levelerror, warn, info, debugHow much labdash writes to its log file
updateChecktrue, falseWhether labdash checks for a newer release at startup
confirmQuittrue, falseWhether q asks before it exits. Off by default. Worth turning on if you reach for q in other applications and lose a half-typed comment to it
settings.yml
confirmQuit: true

Theme preview

labdash theme preview

Renders every token, every status glyph and every state in your terminal, at your colour depth, with your font, which is the only place the question can be answered.