TIL: Recolor the JetBrains IDE chrome with a no-code plugin
JetBrains IDEs let you set an exact background color for the editor, but not for everything around it. The chrome — tool windows, tabs, toolbars, the project tree — just follows the overall theme; there’s no color picker for it. I wanted my IDE background at a specific #181b22, and the only lever for that is a custom UI theme. The catch: a UI theme can only load from a plugin. The TIL is that the plugin has no code — it’s three declarative files you zip up and install from disk.
The manifest, META-INF/plugin.xml. It only points at the theme JSON. There’s no Java or Kotlin, and nothing to compile:
<idea-plugin>
<id>ai.connectly.theme.dark181b22</id>
<name>Dark 181b22</name>
<version>1.0.4</version>
<vendor>Oliver</vendor>
<description><![CDATA[
Dark UI theme based on the default Dark theme, with the IDE chrome
background recolored to #181b22. Editor inherits the stock Darcula scheme.
]]></description>
<!-- Broad compatibility; declarative theme plugins need no code. -->
<idea-version since-build="203"/>
<depends>com.intellij.modules.platform</depends>
<extensions defaultExtensionNs="com.intellij">
<themeProvider id="3d2c98ce-5d61-4076-8f56-2cfa50649ad2"
path="/Dark181b22.theme.json"/>
</extensions>
</idea-plugin>
The theme, Dark181b22.theme.json. "dark": true inherits the dark look-and-feel, then you override only what you want. Colors are named once and reused. The "*" wildcard sets background/foreground on every component — but it only matches those exact property names, so selectionBackground, Button.startBackground and friends keep their own values, which is why selections and buttons stay readable:
{
"name": "Dark 181b22",
"dark": true,
"author": "Oliver",
"editorScheme": "/Dark181b22.xml",
"colors": {
"bg": "#181b22",
"bar": "#13161c",
"input": "#1e222b",
"accent": "#3574F0",
"fg": "#E6E8EE",
"tabActive": "#000000",
"selInactive": "#363f52",
"header": "#14171e"
},
"ui": {
"*": {
"background": "bg",
"foreground": "fg"
},
"Tree.background": "bg",
"List.background": "bg",
"Table.background": "bg",
"Viewport.background": "bg",
"Panel.background": "bg",
"ToolWindow.background": "bg",
"Tree.selectionForeground": "fg",
"Tree.selectionInactiveForeground": "fg",
"Tree.selectionInactiveBackground": "selInactive",
"List.selectionForeground": "fg",
"List.selectionInactiveForeground": "fg",
"List.selectionInactiveBackground": "selInactive",
"EditorTabs.background": "bar",
"EditorTabs.underlinedTabBackground": "tabActive",
"DefaultTabs.background": "bar",
"DefaultTabs.underlinedTabBackground": "tabActive",
"MainToolbar.background": "bar",
"NavBar.background": "bar",
"StatusBar.background": "bar",
"MenuBar.background": "bar",
"ToolWindow.Header.background": "header",
"ToolWindow.Header.inactiveBackground": "header",
"ToolWindow.HeaderTab.background": "header",
"TextField.background": "input",
"TextArea.background": "input",
"ComboBox.background": "input",
"SearchEverywhere.SearchField.background": "input",
"Popup.background": "input",
"Button.default.startBackground": "accent",
"Button.default.endBackground": "accent",
"Button.default.foreground": "#FFFFFF",
"Button.default.focusedBorderColor": "accent",
"Button.default.focusColor": "#3574F055"
}
}
The rest is targeted keys: a darker bar for the structural bars, near-black tabActive for the active tab, a slightly-darker-than-background header for tool-window headers, lighter text plus a brighter fill for the inactive tree selection, and the New UI accent blue for the default button.
The editor scheme, Dark181b22.xml. A theme JSON requires an editorScheme, but I don’t want to touch the editor. Making it an empty child of Darcula leaves the editor exactly as stock:
<scheme name="Dark181b22" version="142" parent_scheme="Darcula">
</scheme>
Build it. The “plugin” is just a zip with a .jar extension:
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
OUT="Dark181b22-theme.jar"
SRC=(META-INF Dark181b22.theme.json Dark181b22.xml)
rm -f "$OUT"
zip -rq "$OUT" "${SRC[@]}"
Install via Settings → Plugins → ⚙ → Install Plugin from Disk, pick the jar, restart, then choose Dark 181b22 under Appearance & Behavior → Appearance → Theme.
One gotcha: bump <version> in plugin.xml on every rebuild. Reinstall the same version and the IDE decides nothing changed and keeps the old one.
Download Dark181b22-theme.jar — built from the files above; install from disk.
This only touches the chrome. Per-file tints (like the green on _test.go files) come from a separate File Colors setting, not the theme. The full key reference is in the JetBrains theme docs.
Let's stay connected!
Author
I'm Oliver Nguyen. A software maker working mostly in Go and JavaScript. I enjoy learning and seeing a better version of myself each day. Occasionally spin off new open source projects. Share knowledge and thoughts during my journey.