Themes
INTERSECT loads custom .intersectstyle theme files from a per-user themes folder. On first launch it writes default dark.intersectstyle and light.intersectstyle files there so you always have a working example to copy.
Where themes live
| OS | Themes folder |
|---|---|
| Windows | %APPDATA%\Roaming\INTERSECT\themes\ |
| macOS | ~/Library/Application Support/INTERSECT/themes/ |
| Linux | ~/.config/INTERSECT/themes/ |
INTERSECT creates this folder automatically on first launch. Themes you save here appear in SET → Themes in the header bar.
Quick start
- Open the themes folder for your OS.
- Copy
dark.intersectstyle(or any other file in the folder) and rename it, for examplemytheme.intersectstyle. - Open it in a text editor, change the
name:value, and edit the colour values. - Restart the plugin. Themes are read once at startup.
- Pick your theme from SET → Themes.
File format
The theme file is a plain-text, line-oriented format. Each line is either blank, a comment, or a key: value pair.
# This is a comment line
name: mytheme
surface0: 060608 # inline comment after two spaces + '#'
Rules:
- One setting per line:
key: value. - Colours are written as 6-digit hexadecimal RGB:
RRGGBB. No leading#, no alpha channel. - Lines starting with
#are ignored. - Inline comments must be preceded by a space +
#(# like this). - Empty lines are ignored.
- Values may optionally be quoted; quotes are stripped.
If a key is missing, INTERSECT uses the value from the default dark theme. You only need to define the keys you want to override — but the bundled themes always include every key so you can see the full picture.
Colour key reference
The theme file exposes 32 colour keys plus the name: field, grouped into five categories.
Surfaces (6)
Surfaces form the background hierarchy. In dark themes they progress from darkest to lightest; reverse the direction for light themes.
| Key | Where you see it |
|---|---|
surface0 | Waveform pit (the area behind the rendered waveform) |
surface1 | Base application background |
surface2 | Raised panels: popup menus, overlays, dropdowns |
surface3 | Borders and separators |
surface4 | Recessed controls: parameter cells, unpressed buttons |
surface5 | Hover state, separator highlight |
Text (3)
Text colours form a contrast ladder from muted to primary.
| Key | Where you see it |
|---|---|
text0 | Muted/inactive text: disabled buttons, hints, dim labels |
text1 | Body text: parameter values, secondary labels |
text2 | Primary text: main labels, active text |
Waveform & accent (2)
| Key | Where you see it |
|---|---|
waveform | Audio peak rendering colour |
accent | Selection overlay, active tabs, highlighted menu items, draw-slice preview |
Module colours (5)
Each signal-chain module gets its own header tint. color5 doubles as the unified alert/lock colour.
| Key | Where you see it |
|---|---|
color1 | Time/Pitch (and Playback) module header |
color2 | Filter module header |
color3 | Amp module header |
color4 | Output module header |
color5 | Alert/warning state, lock indicator, override marker, preview cursor |
Slice palette (16)
slice1 through slice16 colour individual slice regions in the waveform and slice lane. Slices cycle through the palette in creation order. Pick 16 visually distinct values so adjacent slices don’t blur together.
Sample template
A fully-commented starting file:
# INTERSECT Custom Theme — minimal template
#
# Themes folder:
# Windows: %APPDATA%\Roaming\INTERSECT\themes\
# macOS: ~/Library/Application Support/INTERSECT/themes/
# Linux: ~/.config/INTERSECT/themes/
#
# Colours are 6-digit hex (RRGGBB). Restart the plugin to apply changes.
name: mytheme
# Surface hierarchy (6 levels, darkest → lightest in dark themes)
surface0: 060608 # waveform pit
surface1: 0a0a0e # base background
surface2: 0e0e13 # raised panels
surface3: 181c24 # borders
surface4: 23232d # recessed controls
surface5: 2a3040 # hover / separator
# Text hierarchy (3 levels, muted → primary)
text0: 506070
text1: 7888a0
text2: ccd0d8
# Waveform + accent
waveform: b2c6d8
accent: 3fd8d8
# Module headers (color5 also drives alert/lock indicators)
color1: 4a7098 # time/pitch + playback
color2: 98783a # filter
color3: 4a7858 # amp
color4: 685090 # output
color5: cc4444 # alert / warning / lock
# Slice palette (16 distinct values — cycled per slice)
slice1: 4d8c99
slice2: 8c4747
slice3: 4d8059
slice4: 8c7340
slice5: 664d8c
slice6: 80804d
slice7: 40808c
slice8: 804d6b
slice9: 597a47
slice10: 80594d
slice11: 52598c
slice12: 737359
slice13: 6b4773
slice14: 477a6b
slice15: 7a5973
slice16: 617a66
Bundled themes
Eight themes ship with INTERSECT in themes/ — copy any of them as a starting point.
| File | Style |
|---|---|
dark.intersectstyle | The default dark theme |
light.intersectstyle | The default light theme |
bitwig-default.intersectstyle | Mimics Bitwig Studio’s track/clip palette |
callisto.intersectstyle | Monochrome teal-accented dark |
koda.intersectstyle | Vivid dark, based on koda.nvim |
oc.intersectstyle | Bright high-contrast, based on Open Color |
rose-pine.intersectstyle | Muted purples/golds in the Rose Pine spirit |
studio98.intersectstyle | Retro light theme with a Windows 98 flavour |
Legacy keys
Earlier versions of INTERSECT used a longer list of purpose-named keys (background:, foreground:, lockActive:, module_name_filter:, etc.). Those keys still load — themes written for older builds continue to work — but new themes should use the modern keys above.
If both the modern and legacy form appear in the same file, the modern key wins.
Legacy → modern key mapping
| Legacy key(s) | Modern key |
|---|---|
waveformBg | surface0 |
background, context_bar_bg, signal_chain_bg | surface1 |
darkBar, header | surface2 |
module_border, param_value_off, set_bpm_border | surface3 |
gridLine, button | surface4 |
separator, buttonHover | surface5 |
lockInactive, param_label, context_text, context_dim_text, tab_inactive | text0 |
param_value, override_value | text1 |
foreground | text2 |
selectionOverlay, set_bpm_text, param_value_on, tab_global_active, tab_slice_active | accent |
module_name_playback | color1 |
module_name_filter, filter_toggle_on | color2 |
module_name_amp | color3 |
module_name_output | color4 |
lockActive, override_bar, override_bar_hover, override_label, override_count, lazy_chop_overlay, preview_cursor | color5 |
Authoring tips
- Restart to apply. Theme files are parsed at plugin startup. After editing, close and reopen the plugin (or restart the standalone) to see your changes.
- Test against a busy session. Load a sample with 10+ slices so you exercise the full slice palette, then exercise menus, hover states, and an active filter so you cover every surface and module colour.
- Watch contrast.
text0should be readable againstsurface4;text2againstsurface1andsurface2. The bundled themes are calibrated, so use them as a reference if your custom theme feels muddy. - Share a theme. Open a pull request adding your file to
themes/, or attach it to a GitHub issue.
Related
- Settings file — where the active theme name is persisted alongside other user preferences.
- Troubleshooting → Themes — common theme-loading issues.