Hi everyone,
I’ve been building Ayu Islands — a theme plugin for IntelliJ-based IDEs that started as a color scheme port of Ayu and grew into something more like an IDE customization engine. Currently at v2.5.3, built with Kotlin, ~250 commits over the past two months.
I wanted to share some of the more interesting implementation details and get feedback from people who know the platform well.
Accent color propagation
The core idea: a single accent color that flows through the entire UI — not just editor colors, but scrollbars, bracket matches, inlay hints, progress bars, and even third-party plugins (CodeGlance Pro, Indent Rainbow).
On top of that, users can pin accent colors to specific projects or programming languages. The plugin reads the project’s file breakdown via FileTypeManager and language statistics to detect the dominant language and apply the matching pin. Priority chain: project override → language override → global accent.
This required patching UIManager defaults, rewriting color scheme attributes on the fly, and notifying third-party plugins about accent changes through the message bus.
What’s next: chrome tinting
I’m currently working on accent-aware chrome tinting — similar to what Peacock does in VS Code, but integrated into the accent propagation pipeline. The idea: tint the StatusBar, Main Toolbar, Tool Window stripes, NavBar, and panel borders with the active accent color so that each project window has a visually distinct chrome. Combined with per-project overrides, your work project gets lavender chrome, your side project gets gold, etc.
The blending is done in HSB space — the accent’s hue replaces the stock surface hue while preserving most of the original luminance hierarchy, controlled by an intensity slider (0–50%). Stock colors are cached before tinting (ChromeBaseColors) to prevent saturation compounding on repeated applies. There’s also a cross-platform probe (ChromeDecorationsProbe) that detects whether the IDE is using native OS title bars or JBR custom decorations — Main Toolbar tinting is disabled when the plugin can’t reach that surface, same limitation Peacock hits on macOS.
This is on a feature branch and not shipped yet — would be curious to hear whether this is something people actually want in a JetBrains theme, since I’ve already gotten some feedback on that field.
Glow engine
Neon glow borders on Islands UI panels — rendered as a layered JPanel overlay via GlowGlassPane attached to tool window components. Three styles (Soft, Sharp Neon, Gradient) and three animation modes (Pulse, Breathe, Reactive) driven by GlowAnimator with javax.swing.Timer.
The tricky part was getting the overlay to track tool window geometry correctly — ComponentHierarchyUtils walks the Swing tree to find the right parent containers and EditorTabGeometry calculates exact border positions including tab strip offsets. Overlay repaints are throttled to avoid flicker during resize.
The glow color syncs with the active accent, including project overrides.
Color scheme depth
The color scheme defines 31 Kotlin-specific and 45 Java-specific tokens beyond platform defaults. Things like KOTLIN_MUTABLE_VARIABLE (underline effect), KOTLIN_SMART_CAST_VALUE / KOTLIN_SMART_CAST_RECEIVER (background tint), KOTLIN_NAMED_ARGUMENT (distinct foreground), and separate styling for labels, built-in annotations, and backing fields.
35+ language sections total, including Rust, Python, Go, PHP, Ruby, Terraform/HCL, and others — all hand-tuned rather than falling through to DEFAULT_* attributes.
In-IDE font management
Four curated coding font presets (Victor Mono, Maple Mono, Monaspace Neon, Monaspace Xenon) that download and install via FontInstaller. The installer extracts font files from GitHub release archives, registers them through java.awt.GraphicsEnvironment.registerFont(), and persists them to a known path. A consent dialog shows the exact install location before writing anything to disk. Delete unregisters and removes the files, reverting to JetBrains Mono.
Live preview renders a Kotlin snippet in FontPreviewComponent with the selected font/size/weight before applying.
Workspace controls
Auto-fit width for Project View, Commit panel, and Git panel using ToolWindowEx.stretchWidth() with configurable min/max bounds. A ComponentAdapter on the parent container triggers resize calculations. The Git panel internal splitter ratio (branches tree vs. file changes) is controlled via Splitter.setProportion().
Editor scrollbar visibility is toggled through EditorSettings on all open editors plus a FileEditorManagerListener for new ones.
Some numbers
-
5,000+ downloads, 6 theme variants (Mirage/Dark/Light × Classic/Islands UI)
-
BSL-1.1 licensed (converts to Apache 2.0 in 2030)
-
Freemium: complete theme is free, customization engine is premium with a 30-day trial
-
The original Ayu author (dempfi) endorsed the project
Would love feedback — especially on the accent propagation approach (is there a better way than patching UIManager defaults at runtime?) and the glow overlay strategy. Also curious if anyone has run into similar challenges with tool window geometry tracking.

