Eight palettes.
One click away.

DSH ships light, dark and follow-system. Theme Studio adds a Themes row to Settings → General with eight built-in palettes — hover to preview, click to apply, Default to give every color back.

  • Every theme ships light and dark values
  • Preview is transient; nothing persists until you click
  • Preinstalled in Rivetdeck
Rivetdeck Settings dialog showing the Theme Studio theme cards: Default, Claude, Codex, Claude Cream, Graphite, OLED, Nordic, Paper and Warm.
The Themes row and its eight cards in Settings → General.

Eight built-in palettes

Every theme ships both modes

Claude, Codex, Claude Cream, Graphite, OLED, Nordic, Paper and Warm — each carries light and dark token values that follow the official Appearance resolution. Try them here; the values come straight from the plugin’s presets.

Preview appearance

Nordic — Cool blue-gray with a cyan-blue accent. Rendered from the palette values in Theme Studio 0.1.3. Illustrative layout, not a screenshot.

The four-color mosaic in the selector always shows the light sample — it is a palette swatch, not a mode indicator.

The Themes row

Between Appearance and Font size

The row lands in Settings → General styled like the official Language row: a dropdown selector carrying the applied theme’s four-color mosaic and name.

  • The menu lists Default plus the eight built-in palettes, each with its swatch
  • The row and its menu follow the interface language
  • With no theme chosen, the settings page is item-for-item identical to an uninstalled harness
  • AppearanceSystem
  • ThemesNordic
  • Font size13

Preview, then apply

Hover is temporary. Click is persisted.

Hovering a menu item applies its colors temporarily; closing the menu — pointer leave, outside click, Esc or toggling the selector — restores the previous state. Only a click or Enter asks the Host to save, and the choice survives restarts and new sessions.

  • Preview never writes: hovering mutates no setting
  • Default clears every overlay and saves activeThemeId=null
  • When the Host refuses to save, the row reports it and restores the last accepted choice

Theme menu states

  • Graphiteapplied & saved
  • Nordichover — previewing
  • Defaultclears every overlay

Boundaries

The official Appearance stays in charge

Theme Studio is deliberately narrow: it widens the palette, not the settings model.

  1. 1

    Mode stays upstream

    Light, dark and follow-system remain the official Appearance’s job; every palette ships both variants so mode resolution is unchanged.

  2. 2

    Fonts stay upstream

    Font family and size are official settings — previewing, applying, cancelling and Default never rewrite them.

  3. 3

    Tokens only

    The plugin emits overrideTokens; the accepted snapshot and the DOM rendering belong to ctx.theme.

  4. 4

    Portable by construction

    Declared platform:web — no Electron imports, no Node client capabilities, no Desktop provider, no model tools or prompt content.

What this does not claim

  • Only the eight built-ins: custom .dsh-theme.json import/export and a theme editor are roadmap items, not features.
  • The contrast check is a diagnostic, not a gate — some palettes fall below threshold and are neither repaired nor blocked.
  • Preview is hover-driven: keyboard focus does not preview; press Enter to apply.
  • The read-only catalog ctx.themeStudio.catalog exists only on the Client — no dynamic registration and no Host RPC.

Getting started

Two commands, then pick a color.

The plugin installs through the DSH plugin manager from four sources — and in Rivetdeck it is already preinstalled, so there is nothing to do.

  1. 1

    Install the package

    Run this with a supported DSH runtime. Replace the profile for Electron desktop.

    Recommended. Pre-built artifact; no package code runs at install time.

    install · npm
    $ dsh plugin --profile web add @dsh-electron/dsh-theme-studio$ dsh --profile web
  2. 2

    Approve the GitHub build step

    Only a github: install builds on your machine — the package’s own prepare. When pnpm stops with ERR_PNPM_IGNORED_BUILDS, add the package itself to that profile’s pnpm-workspace.yaml, then run the add again; pin a tag so a later push cannot change what runs.

    pnpm-workspace.yaml
     allowBuilds:   '@dsh-electron/dsh-theme-studio': true
  3. 3

    Open Settings → General

    The Themes row sits between the official Appearance and Font size rows.

    Click the selector, hover to preview, click to apply — or pick Default to give every overlay back.

Notes

  • Rivetdeck preinstalls Theme Studio; the bundled version can lag the npm release. Install into the profile to run a newer one.
  • Commands above use the web profile. For Electron desktop, replace --profile web with --profile desktop.
  • Running DSH from a source checkout? Use pnpm dsh instead of dsh.

Compatibility

An exact list, not a range.

Settings services and menu icons change shape across pre-stable releases, so the allowlist in the plugin is the only support claim — every row below ships in the published v0.1.4 package.

DSH releases supported by plugin version 0.1.4
DSH releaseStatusAdded inNotes
0.1.5-rc.2Verifiedv0.1.0Baseline of the allowlist.
0.1.5-rc.3Verifiedv0.1.0Manifest-only re-release; same settings shapes as rc.2.
0.1.6-alpha.1Verifiedv0.1.0Legacy settings register path.
0.1.6-alpha.2Verifiedv0.1.0Same settings shapes as alpha.1 for this plugin.
0.1.7-alpha.1Verifiedv0.1.0Config / configure / configForms replace register / settingsScope.
0.1.7-alpha.2Verifiedv0.1.0Same shapes as alpha.1.
0.1.7-rc.1Verifiedv0.1.1Install starts enforcing the exact peerDependencies list.
0.1.7-rc.2Verifiedv0.1.1Same shapes as rc.1.
0.2.0-rc.1Verifiedv0.1.3DSH 0.2 release candidate; eight new semantic tokens audited.
0.2.0-rc.2Verifiedv0.1.3Same shapes as rc.1 for this plugin.
0.2.1-alpha.1Verifiedv0.1.4Font families and sizes stay host-owned alongside overlays.
0.2.1-alpha.2Verifiedv0.1.4Development pin of the plugin.
Any other releaseUnsupported—Unverified rather than refused: the plugin does not gate at runtime; install-time peer ranges may still reject it.

The plugin does not gate itself at runtime: an unlisted release is simply unverified, and a mixed install can still start. Peer admission at install time may refuse some mismatches. Evidence and adaptation seams live in the compatibility matrix (opens in a new tab).

Give the window your palette.

One command to install — and in Rivetdeck it is already there. Pick Default and every overlay is gone.