Nucleus
Concepts

Modules

How Nucleus splits its runtime into independently versioned Gradle modules and how to add the ones you need.

Nucleus is a set of independently versioned Gradle modules. One umbrella module brings the runtime essentials, and every other capability is a separate module you add when you need it, so your build carries only what your app uses.

The umbrella module

Add nucleus-application to pull in the runtime essentials:

build.gradle.kts
dependencies {
    implementation("dev.nucleusframework:nucleus.nucleus-application:2.0.7")
}

This pulls in three runtime modules:

  • core-runtime — platform detection, native-library loading, the deep-link handler, the single-instance lock, and app metadata.
  • aot-runtime — AOT cache mode detection.
  • graalvm-runtime — the SVM substitutions and the initializer called from nucleusApplication { }.

It also brings the shared Compose window code in decorated-window-core, so you add only a window backend on top. Everything else is opt-in.

Window modules

Every app uses exactly one window backend, plus an optional style adapter.

ModuleRole
decorated-window-coreShared Compose styling, themes, and icon sets. Pulled in by the others.
decorated-window-taoRust-native backend (Tao). Default for new projects.
decorated-window-jbr / decorated-window-jni / decorated-window-awtAWT backend. Deprecated, will be removed in a future Nucleus release.
decorated-window-jewelStyle adapter — IntelliJ Platform look.
decorated-window-material2Style adapter — Material 2.
decorated-window-material3Style adapter — Material 3.

Pick exactly one backend (-tao, or one of the deprecated AWT modules), and zero or one style adapter.

OS integration modules

CapabilityModule
Notifications (cross-platform DSL)notification-common
Notifications (macOS)notification-macos
Notifications (Windows Toast)notification-windows
Notifications (Linux DBus)notification-linux
Dock menu (macOS)launcher-macos
Jump lists, taskbar buttons (Windows)launcher-windows
Unity quicklist (Linux)launcher-linux
Native menu bar (macOS)menu-macos
Taskbar progresstaskbar-progress, taskbar-progress-tao
Dark-mode detectiondarkmode-detector
System accent colorsystem-color
Global hotkeysglobal-hotkey
Media controls (Now Playing / SMTC / MPRIS)media-control
System info (CPU, RAM, GPU, batteries)system-info
Energy / efficiency modeenergy-manager
Auto-launch at loginautolaunch
Scheduler (cron / periodic / boot)scheduler
Scheduler testing (virtual clock)scheduler-testing
File-system watcherfs-watcher
macOS service managementservice-management-macos
Linux HiDPI scale detectionlinux-hidpi
SF Symbols cataloguesf-symbols
FreeDesktop icon namesfreedesktop-icons

Performance and networking modules

CapabilityModule
Native trust manager (OS keychain CAs)native-ssl
java.net.http.HttpClient with native trustnative-http
OkHttp with native trustnative-http-okhttp
Ktor with native trustnative-http-ktor
Auto-updateupdater-runtime

Add a module

Declare the umbrella, one window backend, and any capability modules you need:

build.gradle.kts
val nucleusVersion = "<version>"

dependencies {
    implementation("dev.nucleusframework:nucleus.nucleus-application:$nucleusVersion")
    implementation("dev.nucleusframework:nucleus.decorated-window-tao:$nucleusVersion")

    // Add the capabilities you need
    implementation("dev.nucleusframework:nucleus.notification-common:$nucleusVersion")
    implementation("dev.nucleusframework:nucleus.global-hotkey:$nucleusVersion")
    implementation("dev.nucleusframework:nucleus.system-info:$nucleusVersion")
}

Pin every nucleus.* artifact to the same version. The modules release together.

How modules compose

Most modules depend on core-runtime for platform detection and app metadata. A few standalone catalogues, such as sf-symbols and freedesktop-icons, carry no runtime dependency. Some modules depend on each other: notification-common orchestrates the per-OS notification modules, and taskbar-progress-tao depends on nucleus-application to add extension functions on NucleusWindow.

The Gradle plugin injects nucleus-app.properties into the classpath at build time, so any module reads your app's identity through NucleusApp.appId, NucleusApp.version, NucleusApp.aumid, and the other properties without extra wiring.

When the GraalVM build runs, each module's reachability metadata is bundled in automatically, so there is no reflection config to maintain by hand.

What's next