Skip to content

Appearance & Themes ​

Dinotty's visual style follows a VSCode-dark muted theme (neutral gray #8a8a8a). The built-in theme manager lets you switch themes, adjust fonts, and customize colors.

Theme Manager ​

Open Settings -> Appearance; the theme manager is at the top:

  • Theme list: built-in, installed, and your own custom themes
  • Current theme: highlighted
  • New theme: clone from current
  • Import: add a theme file to your own library
  • Install to server: upload a theme file for every device on this server to use
  • Export: save the current theme as a .conf file
  • Theme store: install a theme listed by the configured registry (see below)

Built-in Themes ​

ThemeStyle
One Dark Pro MutedDefault, low-saturation muted dark
GitHub DarkCool blue-gray
Monokai ProWarm, classic editor palette
Solarized DarkBlue-green base, soft on the eyes
DraculaPurple, high contrast

The palette is uniformly muted, avoiding high-saturation candy colors (e.g., #FF5D5D).

Font Settings ​

SettingRangeDefault
Font size8-32 px14
Font familySystem fonts + common monospace fontsSF Mono / Cascadia Code / Consolas
Line height1.0-2.01.4
Letter spacing-2 to 50

The font dropdown shows a preview of each font (each item rendered in its own font).

Recommended monospace fonts

  • macOS: SF Mono, JetBrains Mono
  • Windows: Cascadia Code, Consolas
  • Linux: Fira Code, JetBrains Mono

Theme Editor ​

Click "Edit" in the theme manager to open the theme editor:

  • Color token editing: one row per token, color picker to modify
  • Live preview: right-side sample terminal reflects changes in real time
  • Save / Save as: overwrite the current theme or save as new

Color Tokens ​

A theme is defined by a set of tokens:

TokenUse
--bg-*Background layers (base / panel / hover / active)
--fg-*Foreground layers (base / muted / subtle)
--color-*Accents (accent / success / warning / error)
--border-*Border layers

New colors should be registered as tokens in frontend/src/styles/base.css first, then referenced via var(--color-*) in components; avoid hardcoding hex in components. See Visual Style.

Workspace Colors ​

Workspace badge colors are independent of theme:

  • Auto-assigned on workspace creation
  • Picked from the One Dark Pro muted palette
  • Right-click a workspace -> Change color

See Workspace Management -> Workspace Color.

Theme Sources ​

There are three, and they are not interchangeable:

SourceStored inSeen byEditable
Built-in (12)Compiled into the appEveryoneNo, but can be hidden
Installedthemes/ on the serverEvery device on that serverNo — remove and reinstall
Customsettings.json on the serverEvery device on that serverYes, up to 15

Installed themes are deliberately kept out of the 15-theme custom library: they arrive as shared files rather than as your own work, and would otherwise be truncated by the cap.

The current theme is per device. It is stored locally, so your phone and your desktop can show different themes while sharing the same library of installed and custom themes.

Config Directory ​

Installed theme files are stored at:

PlatformPath
macOS / Linux~/.config/dinotty/themes/
Windows%APPDATA%\dinotty\themes\
Linux server/var/lib/dinotty/themes/

One file per theme, either <id>.json (what the app writes) or a Ghostty .conf (what Export produces) — both are picked up, so an exported theme can be dropped straight back in. Files are read as data and never executed. They can be edited or backed up by hand.

Your custom themes are not here: they live in settings.json, because they are editable settings rather than shared content.

Theme Store ​

Installing themes from a remote registry is off until the server is pointed at one:

sh
DINOTTY_THEMES_REGISTRY_URL=https://example.com/dinotty/themes/registry.json dinotty

The registry is a JSON document:

json
{
  "schema": 1,
  "themes": [
    {
      "id": "dracula-soft",
      "name": "Dracula Soft",
      "version": "1.0.0",
      "minAppVersion": "0.28.0",
      "url": "https://example.com/dinotty/themes/dracula-soft.json",
      "sha256": "<optional>"
    }
  ]
}

The server fetches both the registry and the theme, so a client can only name an id — it cannot ask the server to fetch an address of its choosing. When an entry carries a sha256, it is checked against the downloaded bytes and a mismatch refuses the install.

Next Steps ​

Released under the MIT license