EEL (Execution Environment Layer) API for local, WSL, and Docker environments. Use when working with process execution (ProcessBuilder, GeneralCommandLine), file paths (java.io.File, nio.Path across environments), OS/platform detection (SystemInfo), or environment variables in code that must support WSL or Docker.
EEL is a unified API that makes IntelliJ code work transparently across local, WSL, and Docker environments. It replaces scattered WSL checks, java.io.File, System.getenv, ProcessBuilder, and SystemInfo with a single abstraction.
Full documentation: community/platform/eel/docs/ (start with README.md)
nio.Path, not java.io.File. nio.Path integrates with EEL under the hood — NIO file operations are transparently routed through EEL file system providers, so Files.readString(path), Files.walk(path), etc. work correctly in remote environments (WSL, Docker) without any extra code. java.io.File has JBR compatibility patches but nio.Path is the proper API.EelApi.exec for process execution, not . This ensures processes run in the correct environment.ProcessBuilderEelPlatform for OS detection, not SystemInfo. SystemInfo reflects the IDE host machine, not the target environment.localEel is a singleton that always represents the IDE host machine (where the IDE process runs). Use it only when you specifically need the local environment. For project-relative work, get the descriptor from the project or path instead.// From a project (most common)
val descriptor = project.getEelDescriptor()
// From a path
val descriptor = Path.of("\\\\wsl.localhost\\Ubuntu\\home\\user").getEelDescriptor()
// Local environment singleton
val localApi: LocalEelApi = localEel
val eelApi = descriptor.toEelApi()
val process = eelApi.exec.spawnProcess("git")
.args("--version")
.eelIt()
val exitCode = process.exitCode.await()
val output = process.stdout.readAllBytes().toString(Charsets.UTF_8)
// NIO Path → EelPath
val eelPath = nioPath.asEelPath()
// EelPath → NIO Path
val nioPath = eelPath.asNioPath()
// Use asEelPath() for environment-aware conversion (instead of EelPath.parse())
val eelPath = descriptor.asEelPath(project.basePath)
val eelApi = descriptor.toEelApi()
when {
eelApi.platform.isPosix -> // Linux, macOS, FreeBSD
eelApi.platform.isWindows -> // Windows
eelApi.platform.isMac -> // macOS specifically
}
\\wsl$\Ubuntu and \\wsl.localhost\Ubuntu).interface EelApi {
val exec: EelExecApi // Process execution
val tunnels: EelTunnelsApi // Network operations
val archive: EelArchiveApi // Archive/tar operations
val platform: EelPlatformApi // Platform detection
val userInfo: EelUserInfoApi // User information
}
LocalEelDescriptor; use EEL API uniformlytoEelApi() over toEelApiBlocking() — use the suspending version to avoid blocking threadsasEelPath() helpers — avoid manual WSL path conversionEelMachine when managing shared resources across descriptorscommunity/platform/eel/docs/README.mdcommunity/platform/eel/docs/EelApi_Tutorial.mdcommunity/platform/eel/docs/EelApi_NIO_Integration.mdcommunity/platform/eel/docs/EelApi_Path_Conversion.mdcommunity/platform/eel/docs/EelApi_Real_World_Examples.md