IntelliJ Platform Plugin SDK Help

Notable Changes in IntelliJ Platform and Plugins API 2026.*

Early Access Program (EAP) releases of upcoming versions are available here.

2026.3

IntelliJ Platform 2026.3

Plugin management with user consent

The experimental PluginPermissionService lets a plugin ask the user to allow an operation on other plugins. The plugin passes a request and an action to withPermission(). The IDE shows the request message in a permission dialog, and runs the action only if the user allows the request. If the user denies the request, withPermission() returns a failure with PluginPermissionNotGrantedException. PluginManagementPermissions.kt defines these requests:

  • EnablePluginRequest, DisablePluginRequest, and InstallPluginRequest give the action a PluginManagementAction, and its apply() starts the operation.

  • AccessPluginClassLoadersRequest gives the action a ReadPluginDescriptorsAction, which returns the descriptors of all installed plugins and their class loaders.

Each permission works for one call only, so the plugin must send a new request to repeat the operation. Call withPermission() directly from the plugin code, because the service identifies the requesting plugin by the calling class. Java code can use PluginPermissionJavaShim.withPermission(), which returns a CompletableFuture.

val result = PluginPermissionService.getInstance().withPermission( DisablePluginRequest( pluginId, MyBundle.message("disable.conflicting.plugin.reason") ) ) { action -> action.apply() }

This API replaces the PluginManagerCore methods that enable and disable plugins, which are now internal. See Plugin Management 2026.2.

The Old Search Everywhere API is deprecated

The old Search Everywhere API in the com.intellij.ide.actions.searcheverywhere package is deprecated in favor of the new Search Everywhere API in com.intellij.platform.searchEverywhere, which is enabled by default since 2026.2.
Migrate to the following replacements:

The com.intellij.ide.actions.searcheverywhere.remote classes are obsolete without replacement, because the new API supports remote development by design. The new API is marked as @ApiStatus.Experimental. In 2027.1, the deprecated API will be disabled by default via a registry key. In 2027.2, it will be removed.
Report missing functionality on the JetBrains Platform Forum.

2026.2

IntelliJ Platform 2026.2

Asynchronous VirtualFile content saving

VirtualFile content updates via getOutputStream() or setBinaryContent() can now be postponed – the actual file on disk may be modified with some delay. See When are VirtualFile changes persisted on disk and loaded from disk to VFS? for more details.

2026.1

IntelliJ Platform 2026.1

Background-capable VFS listeners

New APIs allow VFS listener callbacks to run off the Event Dispatch Thread (EDT), reducing UI freezes during heavy file operations. Bulk listeners can implement the BulkFileListenerBackgroundable marker interface and subscribe to the VirtualFileManager.VFS_CHANGES_BG message topic (instead of VFS_CHANGES). Async listeners can be registered via addAsyncFileListenerBackgroundable() or the com.intellij.vfs.asyncListenerBackgroundable extension point. Migrate thread-safe listeners without UI dependencies from VFS_CHANGES/addAsyncFileListener().

New LSP API features

Language Server Protocol support gains Range Formatting (textDocument/rangeFormatting), Code Lens (textDocument/codeLens), and Optimize Imports (textDocument/codeAction with source.organizeImports). ``Also includes a major rewrite of LSP highlighting for improved performance. See Language Server Protocol (LSP).

OSProcessHandler.waitFor() on EDT or under read lock logs error

Waiting for an external process via OSProcessHandler.waitFor() on the Event Dispatch Thread or while holding a read lock is now prohibited for all users and logs a LOG.error. This check has been previously enabled in internal mode since 2019. Move process waiting off the EDT and outside of read actions, e.g., into a background thread or a coroutine.

Non-cancellable read action APIs deprecated

ReadAction.compute(), ReadAction.run(), and runReadAction() are deprecated because long-running non-cancellable read actions on background threads can block write actions and cause UI freezes. Migrate to cancellable coroutine-based APIs: readAction {} or smartReadAction {} in Kotlin, or ReadAction.nonBlocking().submit()/.executeSynchronously() in Java. As a last resort, ReadAction.computeBlocking() and runReadActionBlocking() are available but should only be used under modal progress.

AnActionEvent.coroutineScope added

AnActionEvent now exposes a coroutineScope property providing convenient access to a CoroutineScope within actionPerformed, while maintaining synchronous EDT execution contracts.

Terminal Plugin 2026.1

TerminalUtil.hasRunningCommands() must not be called on EDT

TerminalUtil.hasRunningCommands() now asserts it is not called on the Event Dispatch Thread via ThreadingAssertions.assertBackgroundThread, and logs a LOG.error if violated. Calling this method on the EDT can cause UI freezes because it queries external process state. Move calls to a background thread or a coroutine.

20 October 2026