<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog</title>
	<atom:link href="https://blog.jetbrains.com/idea/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.jetbrains.com</link>
	<description>Developer Tools for Professionals and Teams</description>
	<lastBuildDate>Wed, 07 Oct 2026 09:02:56 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.jetbrains.com/wp-content/uploads/2026/09/icon-512.webp</url>
	<title>IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog</title>
	<link>https://blog.jetbrains.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Your Next Action Is Two Dots Away</title>
		<link>https://blog.jetbrains.com/idea/2026/10/your-next-action-is-two-dots-away/</link>
		
		<dc:creator><![CDATA[Igor Kulakov]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 07:38:06 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/IJ-social-BlogFeatured-1280x720-1-1.png</featuredImage>		<category><![CDATA[idea]]></category>
		<category><![CDATA[product-updates]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=744602</guid>

					<description><![CDATA[What’s new for command completion in IntelliJ IDEA&#160; Modern IDEs are packed with power. The real challenge isn’t whether your IDE can do something – it’s remembering how to trigger it. Some features live behind shortcuts. Others are available through intention menus, Search Everywhere, postfix completion, live templates, or tool windows. Discoverability is a constant [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>What’s new for command completion in IntelliJ IDEA&nbsp;</strong></p>



<p>Modern IDEs are packed with power. The real challenge isn’t whether your IDE can do something – it’s remembering how to trigger it.</p>



<p>Some features live behind shortcuts. Others are available through intention menus, <em>Search Everywhere</em>, postfix completion, live templates, or tool windows. Discoverability is a constant tax on developer focus: As an IDE grows more capable, keeping every feature within reach gets harder.</p>



<p>That&#8217;s why we created <a href="https://foojay.io/today/command-completion-intellij-idea/" target="_blank" rel="noopener">command completion</a>, a context-aware entry point to useful functionality from the place where you spend most of your time – the editor.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/image.png" alt="" class="wp-image-744603"/></figure>



<p>Typing <kbd>..</kbd> anywhere in a file surfaces intelligent actions tailored to your current code and caret position. Whether you need to refactor, navigate, generate, document, explain, or fix code, you can act immediately without breaking your flow.</p>



<p>Rather than answering <em>&#8220;What can I type here?&#8221;</em>, command completion addresses a more useful question: <em>&#8220;What can I do here?&#8221;</em></p>



<p>This feature has already been around for a while. In IntelliJ IDEA 2026.3 EAP, it is taking another big step toward becoming your primary interface for everyday coding assistance.</p>



<p>Here&#8217;s what’s new and improved:</p>



<h2 class="wp-block-heading">Logpoints are easier to reach</h2>



<p>Debugging with temporary <kbd>println()</kbd> statements is a habit many of us struggle to break. You add print statements, re-run the app, read the console, and then manually clean up the code afterward.</p>



<p>Logpoints are a cleaner, non-intrusive alternative – and now they are accessible right through command completion:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Logpoints / Command Completion" src="https://www.youtube.com/embed/cu8DgW-W0ZE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Simply type <kbd>..</kbd> over an expression or block to drop a logpoint instantly, using the current expression or context as the logged value. Even better: IntelliJ IDEA will now suggest replacing existing print statements with logpoints, helping you move from messy code edits to clean, debugger-supported logging.</p>



<p>If you’re new to logpoints, take a look at the <a href="https://blog.jetbrains.com/idea/2026/09/logpoints-walkthrough/">logpoints tutorial</a>. It explains how to combine them with your AI agents in IntelliJ IDEA. If you missed our 2026.2 updates, logpoints got a revised UI, AI agent support, improved navigation, and faster evaluation, making them one of the most versatile debugging tools in your toolkit.</p>



<h2 class="wp-block-heading">In-context AI assistance</h2>



<p>You can now trigger AI actions using the same .. workflow. Need to explain a complex method, generate docstrings, or refactor a block? You no longer have to interrupt your flow, switch tools, or describe the exact location to the agent. Because the IDE already knows your active file, language, line number, and selected expression, it can give the agent this rich context.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="AIR in Command Completion" src="https://www.youtube.com/embed/Wbm3NaxNlxI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Note: If you have the <a href="https://plugins.jetbrains.com/plugin/33314-air" data-type="link" data-id="https://plugins.jetbrains.com/plugin/33314-air" target="_blank" rel="noopener">Air plugin</a> installed, your requests will be automatically routed through it.</p>



<p>For actions that affect a specific class, method, or declaration, IntelliJ IDEA now highlights the target so it is clearer what the selected command will apply to before you run it.</p>



<h2 class="wp-block-heading">Postfix completion and live templates</h2>



<p>As part of our effort to unify completion workflows, postfix completion, live templates, and command completion now share a consistent interface. You’ll notice clearer filtering, sharper preview panels, and more intuitive discoverability directly from the completion popup.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" fetchpriority="high" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/image.png" alt="" class="wp-image-744604"/></figure>



<h2 class="wp-block-heading">More contexts</h2>



<p>Command completion is also becoming useful in more contexts, including binary files and decompiled code.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Logpoints in libraries" src="https://www.youtube.com/embed/PaCDJqE7sdA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>We’ve also expanded support to structured and framework-specific environments. You can now use <kbd>..</kbd> inside properties files, Spring workflows, and other domain-specific formats, with support for build scripts coming soon.</p>



<h2 class="wp-block-heading">Why this matters</h2>



<p>Command completion isn’t just another flavor of autocompletion. It is a fundamental shift in how you discover IDE functionality.&nbsp;</p>



<p>Instead of searching through top-level menus or memorizing hotkeys, you can start from where you already are – the code. IntelliJ IDEA continuously analyzes your syntax tree, scope, inspection state, and available actions to present only what is relevant in the moment.</p>



<p>For high-frequency actions, shortcuts remain the fastest choice. For everything else, command completion gives you a discoverable path directly from your code.</p>



<h2 class="wp-block-heading">Try it out today</h2>



<p>Open any Java, Kotlin, or Scala file in IntelliJ IDEA 2026.2 or 2026.3 EAP and type <kbd>..</kbd> anywhere in the editor. Try it near a method, an expression, a regular expression, a declaration that needs documentation, or a place where you would normally open <em>Search Everywhere</em>. The completion popup will reflect what’s possible in that exact spot.</p>



<p>Command completion is continuously evolving, and we have big plans for future releases. Our core mission remains simple: one familiar entry point for whatever you want to do next in code.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Java and Kotlin by IntelliJ IDEA: The LSP-Based Extension Reaches Release Candidate</title>
		<link>https://blog.jetbrains.com/idea/2026/10/java-and-kotlin-by-intellij-idea-the-lsp-based-extension-reaches-release-candidate/</link>
		
		<dc:creator><![CDATA[Andrei Kogun]]></dc:creator>
		<pubDate>Tue, 06 Oct 2026 09:54:39 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/LSP_RC_blog.png</featuredImage>		<category><![CDATA[news]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=744673</guid>

					<description><![CDATA[Two months ago, we announced the preview of Java and Kotlin by IntelliJ IDEA – an LSP-based extension that brings IntelliJ IDEA’s Java and Kotlin intelligence to third-party editors, starting with VS Code and its forks, such as Cursor. This was our first step towards bringing IntelliJ IDEA’s Java and Kotlin intelligence beyond the IDE, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Two months ago, <a href="https://blog.jetbrains.com/idea/2026/08/intellij-idea-goes-lsp/">we announced the preview of Java and Kotlin by IntelliJ IDEA</a> – an LSP-based extension that brings IntelliJ IDEA’s Java and Kotlin intelligence to third-party editors, starting with VS Code and its forks, such as Cursor.</p>



<p>This was our first step towards bringing IntelliJ IDEA’s Java and Kotlin intelligence beyond the IDE, giving developers and their agents accurate, project-aware code understanding across their tools and workflows.</p>



<p>We’re moving fast on that commitment, and today marks another big step: Java and Kotlin by IntelliJ IDEA has reached the Release Candidate stage. The foundation for a stable 1.0 release is now in place, and the release itself will arrive very soon.</p>



<p>This RC is the final Early Access Program build and will remain available under the EAP terms for 30 days.</p>



<p>If you’ve been waiting for the right moment to try the extension on a real project, this is it.</p>



<p class="has-text-align-center"><strong><a href="https://marketplace.visualstudio.com/items?itemName=JetBrains.intellij-server" target="_blank" rel="noreferrer noopener">Install from Visual Studio Marketplace</a></strong></p>



<p class="has-text-align-center"><strong><a href="https://open-vsx.org/extension/JetBrains/intellij-server" target="_blank" rel="noreferrer noopener">Install from Open VSX registry</a></strong></p>



<figure class="wp-block-video"><video autoplay controls src="https://resources.jetbrains.com/storage/products/blog/wp-content/uploads/idea/LSP_RC_1_v3.mp4" playsinline></video></figure>



<h2 class="wp-block-heading">From preview to Release Candidate</h2>



<p>Since the first public preview, we’ve shipped several intermediate builds, improving performance, reliability, and the extension’s feature set along the way.</p>



<p>The extension has now been downloaded over 20,000 times across Visual Studio Marketplace and Open VSX Registry.</p>



<p>Early adopters helped us get here by reporting issues, sharing projects and logs, and telling us which capabilities they wanted to see next. We’ve also been dogfooding the extension ourselves, including on the large repository used to build IntelliJ-based IDEs.</p>



<p>The RC brings IntelliJ IDEA’s Java and Kotlin language technology to the whole development workflow. Alongside IntelliJ IDEA’s core coding assistance – including smart code completion, navigation, inspections, quick-fixes, and code analysis – the extension provides more advanced capabilities, such as project-wide refactorings, DAP-based debugging, Maven, Gradle, and Bazel project support, built-in test running, Spring tooling interoperability, and more.</p>



<p>It also makes this intelligence available to coding agents. When the extension is installed in Cursor, Cursor Agent can use the same language server for semantic code search, navigation, and code analysis, leading to faster and more deterministic results.</p>



<figure class="wp-block-video"><video autoplay controls src="https://resources.jetbrains.com/storage/products/blog/wp-content/uploads/idea/LSP_RC_2.mp4" playsinline></video></figure>



<p>We’re continuing to invest in this direction. The goal is not simply to reproduce IDE features in another editor. It is to make IntelliJ IDEA’s understanding of JVM code useful to developers and their tools wherever they choose to work.</p>



<p>Over the coming weeks, we’ll take a closer look at these capabilities and share more about where we’re taking the technology next, including fully agentic, terminal-based workflows.</p>



<h2 class="wp-block-heading">What the Release Candidate means for licensing</h2>



<p>The RC build is part of the Early Access Program and can be used for 30 days without a license.</p>



<p>Starting with the stable release, new users will receive a 30-day free trial. After the trial period, using the extension will require an IntelliJ IDEA Ultimate subscription.</p>



<h2 class="wp-block-heading">Try the Release Candidate</h2>



<p>Install Java and Kotlin by IntelliJ IDEA in VS Code, Cursor, or another compatible VS Code-based editor, open a real project, and tell us what you think.</p>



<p>You can leave a comment here or <a href="https://intellij-support.jetbrains.com/hc/en-us/requests/new?ticket_form_id=66731&amp;product=intellij_for_vs_code" target="_blank" rel="noopener">submit a request to us</a>.</p>



<p>Thank you!</p>



<p class="has-text-align-center"><strong><a href="https://marketplace.visualstudio.com/items?itemName=JetBrains.intellij-server" target="_blank" rel="noopener">Get <em>Java and Kotlin by IntelliJ IDEA</em> from Visual Studio Marketplace</a></strong></p>



<p class="has-text-align-center"><strong><a href="https://open-vsx.org/extension/JetBrains/intellij-server" target="_blank" rel="noopener">Get <em>Java and Kotlin by IntelliJ IDEA</em> from Open VSX Registry</a></strong></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Java Annotated Monthly – October 2026</title>
		<link>https://blog.jetbrains.com/idea/2026/10/java-annotated-monthly-october-2026/</link>
		
		<dc:creator><![CDATA[Irina Mariasova]]></dc:creator>
		<pubDate>Mon, 05 Oct 2026 13:05:48 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/IJ-social-BlogFeatured-1280x720-1.png</featuredImage>		<category><![CDATA[news]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java-annotated]]></category>
		<category><![CDATA[java-annotated-monthly]]></category>
		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[spring]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=744339</guid>

					<description><![CDATA[September gave us plenty to talk about, with major releases and thought-provoking reads. Java 27 arrived, and JetBrains opened a new chapter in agentic development with the announcement of JetBrains Air, a system of products for agentic software development, followed by the EAP of JetBrains Air in IDEs. Marit van Dijk kicks off this edition [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>September gave us plenty to talk about, with major releases and thought-provoking reads. Java 27 arrived, and JetBrains opened a new chapter in agentic development with the announcement of JetBrains Air, a system of products for agentic software development, followed by the EAP of JetBrains Air in IDEs. <a href="https://maritvandijk.com/" target="_blank" rel="noopener">Marit van Dijk</a> kicks off this edition with her favorite news of the month and a closer look at these highlights. Then comes our usual selection of news, tutorials, and community stories. Let’s dive in!</p>



<h2 class="wp-block-heading">Featured Content</h2>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/Screenshot-2026-10-05-at-13.16.56.png" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Marit van Dijk</h4>
                                                <p>Marit van Dijk is a Java Champion and Developer Advocate at JetBrains with over 20 years of software development experience. She’s passionate about building great software with great people, and making developers’ lives easier.</p>
                    </div>
                            </div>
        </div>
    </div>



<p><a href="https://openjdk.org/projects/jdk/27/" target="_blank" rel="noopener">Java 27</a> was released last month. Of course, we support it from day 1 in IntelliJ IDEA. You can read all about it in <a href="https://blog.jetbrains.com/idea/2026/09/java-27-in-intellij-idea/">Java 27 in IntelliJ IDEA</a> or watch the <a href="https://www.youtube.com/watch?v=4V2jooUo8O0" target="_blank" rel="noopener">release stream</a> if you missed it. <a href="https://softwaregarden.dev/en/" target="_blank" rel="noopener">Piotr Przybył</a> and I updated our talk <a href="https://maritvandijk.com/presentations/modern-java-playful/" target="_blank" rel="noopener">Learning modern Java the playful way</a> and <a href="https://gotocph.com/2026/sessions/4000/learning-modern-java-the-playful-way" target="_blank" rel="noopener">presented</a> it at <a href="https://gotocph.com/2026" target="_blank" rel="noopener">GOTO Copenhagen</a> last week, where I was also on stage for two other sessions. This week, Piotr and I will be doing a <a href="https://m.devoxx.com/events/dvbe26/talks/9752/learning-modern-java-the-playful-way" target="_blank" rel="noopener">Deep Dive</a> version at <a href="https://devoxx.be/" target="_blank" rel="noopener">Devoxx Belgium</a>. Later this month you can find us at <a href="https://jdd.org.pl/" target="_blank" rel="noopener">JDD</a> and <a href="https://www.hellostavanger.no/" target="_blank" rel="noopener">Hello Stavanger</a>.</p>



<p>In other news, <a href="https://www.jetbrains.com/air/" target="_blank" rel="noopener">JetBrains Air</a> was <a href="https://blog.jetbrains.com/blog/2026/09/22/introducing-jetbrains-air/">announced</a>; one system for building software with agents. Please try out <a href="https://blog.jetbrains.com/ai/2026/10/air-in-ides-eap/">Air in the IDE</a> and let us know what you think!&nbsp;</p>



<p><a href="https://www.linkedin.com/in/inspector-patronum/" target="_blank" rel="noopener">Igor Kulakov</a> wrote a <a href="https://blog.jetbrains.com/idea/2026/09/logpoints-walkthrough/">Logpoints Walkthrough</a> on how to use Logpoints; a new debugging feature in IntelliJ IDEA. <a href="https://www.linkedin.com/in/antonarhipov/" target="_blank" rel="noopener">Anton Arhipov</a> shows <a href="https://www.linkedin.com/posts/antonarhipov_automated-debugging-by-ai-agents-in-air-with-ugcPost-7511922897389510656-C_rl/" target="_blank" rel="noopener">how to tie that all together</a>. And <a href="https://www.linkedin.com/in/ksivaprasadreddy/" target="_blank" rel="noopener">Siva Prasad Reddy K</a> announced a course <a href="https://www.youtube.com/watch?v=tmMwM1c8PAc" target="_blank" rel="noopener">Building with AI Agents From Idea to Production</a> where he will teach you about agentic development with IntelliJ IDEA and Spring Boot.</p>



<p>Finally, we are starting to release the videos from IntelliJ IDEA Conf 2026 on the <a href="https://www.youtube.com/intellijidea" target="_blank" rel="noopener">IntelliJ IDEA YouTube channel</a>, or catch up on <a href="https://www.youtube.com/watch?v=ILn2GX8s1FM&amp;list=PLBolw4tavnAY" target="_blank" rel="noopener">IntelliJ IDEA Tech Talks episodes</a>.</p>



<h2 class="wp-block-heading">Java News</h2>



<p>Here’s what’s new in the Java world:&nbsp;</p>



<ul class="wp-block-list">
<li>Java News Roundup <a href="https://www.infoq.com/news/2026/09/java-news-roundup-aug31-2026/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">1</a>, <a href="https://www.infoq.com/news/2026/09/java-news-roundup-sep07-2026/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">2</a>, <a href="https://www.infoq.com/news/2026/09/java-news-roundup-sep14-2026/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global%D1%8A" target="_blank" rel="noopener">3</a>, <a href="https://www.infoq.com/news/2026/09/java-news-roundup-sep21-2026/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">4</a></li>



<li><a href="https://inside.java/2026/09/15/jdk-27-available/" target="_blank" rel="noopener">The Arrival of Java 27!</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/09/java-27-in-intellij-idea/">Java 27 in IntelliJ IDEA</a></li>



<li><a href="https://inside.java/2026/09/16/jdk27-security-enhancements/" target="_blank" rel="noopener">JDK 27 Security Enhancements</a></li>



<li><a href="https://inside.java/2026/09/28/performance-update-jdk27/" target="_blank" rel="noopener">Performance Improvements in JDK 27</a></li>



<li><a href="https://inside.java/2026/09/12/jdk-27-runtime-updates/" target="_blank" rel="noopener">JDK 27 Runtime Updates Release Notes</a></li>



<li><a href="https://inside.java/2026/09/13/jdk-27-in-2-min/" target="_blank" rel="noopener">Java 27 Technically Within 2 Minutes</a></li>



<li><a href="https://spring.io/blog/2026/09/16/spring-office-hours-podcast-S5E23" target="_blank" rel="noopener">Spring Office Hours Podcast: S5E23 &#8211; Java 27 Release Party with Billy Korando</a></li>



<li><a href="https://nipafx.dev/talk-java-next" target="_blank" rel="noopener">Java Next</a></li>



<li><a href="https://inside.java/2026/09/21/jit-for-java-performance/" target="_blank" rel="noopener">Just-In-Time Compilation for Java Performance: Recent and Ongoing Improvements</a></li>



<li><a href="https://inside.java/2026/09/23/quality-heads-up/" target="_blank" rel="noopener">Quality Outreach Heads-up &#8211; JDK 28: Rich JavaDoc Notes</a></li>



<li><a href="https://inside.java/2026/09/26/jep539-target-jdk28/" target="_blank" rel="noopener">JEP targeted to JDK 28: 539: Strict Field Initialization in the JVM (Preview)</a></li>



<li><a href="https://inside.java/2026/09/29/jep541-target-jdk28/" target="_blank" rel="noopener">JEP targeted to JDK 28: 541: Deprecate the macOS/x64 Port for Removal</a></li>
</ul>



<h2 class="wp-block-heading">Java Tutorials and Tips</h2>



<p>Give your next coding session a head start with these practical guides:</p>



<ul class="wp-block-list">
<li><a href="https://foojay.io/today/from-spec-driven-development-to-living-specifications-in-java-projects/" target="_blank" rel="noopener">From Spec-Driven Development to Living Specifications in Java Projects</a></li>



<li><a href="https://inside.java/2026/09/04/memory-management-principles-java/" target="_blank" rel="noopener">Principles of Memory Management in Java</a></li>
</ul>



<ul class="wp-block-list">
<li>IntelliJ IDEA Tech Talks:
<ul class="wp-block-list">
<li><a href="https://www.youtube.com/watch?v=2L7zLdHeyY0" target="_blank" rel="noopener">Beyond Virtual Threads: Structured Concurrency &#8211; Balkrishna Rawool&nbsp;</a></li>



<li><a href="https://www.youtube.com/watch?v=9yiRYrQAPv0" target="_blank" rel="noopener">Agent Client Protocol for Java Developers &#8211; Mark Pollack</a></li>



<li><a href="https://www.youtube.com/watch?v=ILn2GX8s1FM" target="_blank" rel="noopener">Agentic Patterns and Tool Calling with Spring AI &#8211; Christian Tzolov</a></li>
</ul>
</li>



<li><a href="https://www.youtube.com/watch?v=LNcr40P0viw" target="_blank" rel="noopener">Native Calls in IntelliJ Platform Plugins: JNA vs FFM</a></li>



<li><a href="https://foojay.io/today/masking-a-jvm-thread-dump-without-breaking-the-analysis/" target="_blank" rel="noopener">Masking a JVM thread dump without breaking the analysis</a></li>



<li><a href="https://donraab.medium.com/my-ten-year-quest-to-evolve-java-collections-beyond-java-stream-310f0c287be0" target="_blank" rel="noopener">My Ten Year Quest to Evolve Java Collections Beyond Java Stream</a>&nbsp;</li>



<li><a href="https://www.infoq.com/articles/when-spec-driven-development-pays-off/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">When Spec-Driven Development Pays Off</a></li>



<li><a href="https://inside.java/2026/08/27/podcast-068/" target="_blank" rel="noopener">Episode 68 “Operator Overloading with Type Classes” [AtA]</a>&nbsp;</li>



<li><a href="https://foojay.io/today/come-for-java-get-a-whole-lot-more/" target="_blank" rel="noopener">Come for Java. Get a Whole Lot More.</a></li>



<li><a href="https://foojay.io/today/the-java-21-doomsday-clock-countdown/" target="_blank" rel="noopener">The Java 21 Doomsday Clock Countdown</a></li>



<li><a href="https://vimeo.com/1223300523" target="_blank" rel="noopener">Async is the New `goto`- Rethinking Structured Concurrency &#8211; Wout Werkman</a></li>



<li><a href="https://vimeo.com/1223642327" target="_blank" rel="noopener">Getting more out of Maven &#8211; Marit van Dijk and Andres Almiray</a></li>



<li><a href="https://www.javaspecialists.eu/archive/Issue337-Module-Imports.html" target="_blank" rel="noopener">Module Imports</a></li>
</ul>



<h2 class="wp-block-heading">Kotlin Corner</h2>



<p>A little Kotlin inspiration? Right this way:&nbsp;</p>



<ul class="wp-block-list">
<li><a href="https://surveys.jetbrains.com/s3/kotlin-developer-survey-2026" target="_blank" rel="noopener">Kotlin Developer Survey is ongoing</a>&nbsp;</li>



<li><a href="https://kotlinconf.com/" target="_blank" rel="noopener">KotlinConf 2027 is coming to Krakow</a></li>



<li><a href="https://blog.jetbrains.com/kotlin/2026/09/state-of-kotlin-2026-report/">The State of Kotlin in 2026 Report&nbsp;</a></li>



<li><a href="https://blog.jetbrains.com/kotlin/2026/09/the-companions-to-come/">Companions to come</a></li>
</ul>



<h2 class="wp-block-heading">AI&nbsp;</h2>



<p>Beyond the AI buzz, there’s plenty to explore:</p>



<ul class="wp-block-list">
<li><a href="https://www.infoq.com/presentations/context-engineering-redis-llm-architecture/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Beyond Prompting: Context Engineering for Production-Grade AI</a></li>



<li><a href="https://www.infoq.com/news/2026/09/human-reviews-AI-era/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Rigorous Yet Sustainable Human Reviews in the AI Era</a></li>



<li><a href="https://foojay.io/today/did-your-ai-agent-run-the-debugger-one-jvm-bug-two-agent-runs/" target="_blank" rel="noopener">Did Your AI Agent Run the Debugger? One JVM Bug, Two Agent Runs</a></li>



<li><a href="https://foojay.io/today/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/" target="_blank" rel="noopener">Building an Agentic Warehouse Management System — Part 1: Where AI Agents Add Value</a></li>



<li><a href="https://foojay.io/today/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/" target="_blank" rel="noopener">Building an Agentic Warehouse Management System — Part 2: Java and Spring AI</a></li>



<li><a href="https://foojay.io/today/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/" target="_blank" rel="noopener">Building an Agentic Warehouse Management System — Part 3: Tools, Decisions, and Actions</a></li>



<li><a href="https://www.infoq.com/news/2026/09/figma-security-agents/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">How Figma Uses AI Agents for Security</a></li>



<li><a href="https://martinfowler.com/articles/making-data-ready-for-agentic-ai.html" target="_blank" rel="noopener">Making Your Data Ready for Agentic AI</a></li>



<li><a href="https://www.infoq.com/presentations/ai-platform-engineering-roundtable/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Platform Engineering in the Age of AI</a></li>



<li><a href="https://foojay.io/today/debugging-is-invariant-discovery-what-one-kafka-session-taught-us-about-ai-agents/" target="_blank" rel="noopener">Debugging Is Invariant Discovery: What One Kafka Session Taught Us About AI Agents</a></li>



<li><a href="https://netflixtechblog.medium.com/the-lifecycle-of-llm-as-a-judge-building-aligning-and-monitoring-at-scale-c95bd8283508" target="_blank" rel="noopener">The Lifecycle of LLM-as-a-Judge: Building, Aligning, and Monitoring at Scale</a>&nbsp;</li>



<li><a href="https://www.infoq.com/news/2026/09/metr-hugging-face-hack-report/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Independent Investigation of Hugging Face Incident Reveals How Agents Collaborated and Behaved</a></li>



<li><a href="https://foojay.io/today/did-your-ai-agent-run-the-debugger-one-jvm-bug-two-agent-runs/" target="_blank" rel="noopener">Did Your AI Agent Ever Run a Debugger? One JVM Bug, Two Agent Runs</a>&nbsp;</li>



<li><a href="https://foojay.io/today/how-i-built-an-ai-assistant-for-my-career-with-java-spring-ai-and-mongodb/" target="_blank" rel="noopener">How I Built an AI Assistant for My Career with Java, Spring AI, and MongoDB</a></li>



<li><a href="https://foojay.io/today/can-you-explain-the-diff-your-ai-agent-just-wrote/" target="_blank" rel="noopener">Can You Explain the Diff Your AI Agent Just Wrote?</a></li>



<li><a href="https://kpavlov.me/blog/tachyon-mcp-1.0/" target="_blank" rel="noopener">Tachyon MCP 1.0 is here!</a></li>
</ul>



<h2 class="wp-block-heading">Languages, Frameworks, Libraries, and Technologies</h2>



<p>Your next useful discovery might be outside your usual stack:</p>



<ul class="wp-block-list">
<li>This Week in Spring – <a href="https://spring.io/blog/2026/09/01/this-week-in-spring-september-1-2026" target="_blank" rel="noopener">1</a>, <a href="https://spring.io/blog/2026/09/08/this-week-in-spring-september-8th-2026" target="_blank" rel="noopener">2</a>, <a href="https://spring.io/blog/2026/09/15/this-week-in-spring-september-15th-2026" target="_blank" rel="noopener">3</a>, <a href="https://spring.io/blog/2026/09/22/this-week-in-spring-september-22-2026" target="_blank" rel="noopener">4</a>, <a href="https://spring.io/blog/2026/09/29/this-week-in-spring-september-29th-2026" target="_blank" rel="noopener">5</a></li>



<li><a href="https://spring.io/blog/2026/08/31/spring-office-hours-podcast-S5E21" target="_blank" rel="noopener">Spring Office Hours Podcast: S5E21 &#8211; Pro Spring Boot 4 with Felipe Gutierrez</a></li>



<li><a href="https://spring.io/blog/2026/08/31/spring-office-hours-podcast-S5E21" target="_blank" rel="noopener">Spring Office Hours Podcast: S5E21 – Pro Spring Boot 4 with Felipe Gutierrez</a>&nbsp;</li>



<li><a href="https://quarkus.io/blog/quarkus-insights-258-quarkus-feature-flags/" target="_blank" rel="noopener">Quarkus Insights #258: Quarkus Feature Flags</a>&nbsp;</li>



<li><a href="https://foojay.io/today/aggregation-optimization-in-mongodb-sorting-with-indexes-part-5/" target="_blank" rel="noopener">Aggregation Optimization in MongoDB: Sorting With Indexes (Part 5)</a></li>



<li><a href="https://www.infoq.com/news/2026/09/kubernetes-kyaml-manifests/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Kubernetes Promotes KYAML as a Safer, More Consistent Way to Work with Manifests</a></li>



<li><a href="https://spring.io/blog/2026/09/10/a-bootiful-podcast-paul-bakker" target="_blank" rel="noopener">A Bootiful Podcast: Netflix&#8217;s Paul Bakker</a></li>



<li><a href="https://www.infoq.com/news/2026/09/andrew-kelley-zig-no-ai/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Andrew Kelley Interview: Why He Built Zig, Banned AI Contributions, and Moved Zig off GitHub</a></li>



<li><a href="https://www.infoq.com/presentations/context-as-code-devops-agents/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Context Is the New Code</a></li>
</ul>



<h2 class="wp-block-heading">Conferences and Events</h2>



<p>Clear some space on your calendar for these conferences:&nbsp;</p>



<ul class="wp-block-list">
<li><a href="https://devoxx.be" target="_blank" rel="noopener">Devoxx Belgium</a> – Antwerp, Belgium, October 5-9; Come meet JetBrains people and learn the recent news at our booth.&nbsp;</li>



<li><a href="https://2026.javacro.hr/eng" target="_blank" rel="noopener">JavaCro</a> – Rovinj, Croatia, October 11-14</li>



<li><a href="https://www.dev2next.com" target="_blank" rel="noopener">Dev2Next</a> – Lone Tree, USA, October 12-15</li>



<li><a href="https://baselone.org/" target="_blank" rel="noopener">BaselOne</a> – Basel, Switzerland, October 14-15</li>



<li><a href="https://jdd.org.pl" target="_blank" rel="noopener">{j}DD</a> – Kraków, Poland, October 20-21; Join the session by <a href="mailto:marit.van.dijk@jetbrains.com">Marit van Dijk</a>.&nbsp;</li>



<li><a href="https://2026.usa.jcon.one" target="_blank" rel="noopener">JCon USA</a> – Atlanta, USA, October 26-29</li>



<li><a href="https://www.jonthebeach.com" target="_blank" rel="noopener">J On the Beach</a> – Malaga, Spain, October 29-30</li>
</ul>



<h2 class="wp-block-heading">Culture and Community</h2>



<p>Great software starts with people, and people have stories to tell:</p>



<ul class="wp-block-list">
<li><a href="https://www.infoq.com/podcasts/personality-over-skillset/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Personality Over Skillset: How Adam Wachtel Builds Engineering Teams</a></li>



<li><a href="https://blog.codinghorror.com/you-cant-vibe-code-love/" target="_blank" rel="noopener">You Can’t “Vibe Code” Love</a></li>



<li><a href="https://martinfowler.com/articles/2026-dont-like-llms.html" target="_blank" rel="noopener">I don’t like LLMs</a></li>



<li><a href="https://ai.baeldung.com/build-your-agentic-ai-harness-course/" target="_blank" rel="noopener">Build your Agentic Harness is Out</a></li>
</ul>



<h2 class="wp-block-heading">And Finally…</h2>



<p>One last detour before you go:&nbsp;</p>



<ul class="wp-block-list">
<li><a href="https://blog.jetbrains.com/idea/2026/08/project-loom-in-intellij-idea-virtual-threads-scoped-values-and-structured-concurrency/">Project Loom in IntelliJ IDEA: Virtual Threads, Scoped Values, and Structured Concurrency</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/09/the-grails-plugin-has-a-new-home-apache-grails/">The Grails Plugin Has a New Home: Apache Grails</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/09/debug-past-an-http-403-without-breaking-spring-security/">Debug Past an HTTP 403 Without Breaking Spring Security</a></li>



<li><a href="https://blog.jetbrains.com/platform/2026/09/the-evolution-of-wsl-support-in-jetbrains-ides/">The Evolution of WSL Support in JetBrains IDEs</a></li>
</ul>



<p>That’s it for today! We’re always collecting ideas for the next Java Annotated Monthly – send us your suggestions via <a href="https://mail.google.com/mail/u/0/?fs=1&amp;tf=cm&amp;source=mailto&amp;to=JAM@jetbrains.com" target="_blank" rel="noopener">email</a> or <a href="https://x.com/intellijidea?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor">X</a> by October 20. Don’t forget to check out our archive of <a href="https://www.jetbrains.com/lp/jam/" target="_blank" rel="noopener">past JAM issues</a> for any articles you might have missed!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A New Agentic Experience: JetBrains Air in IDEs – EAP Now Open</title>
		<link>https://blog.jetbrains.com/ai/2026/10/air-in-ides-eap/</link>
		
		<dc:creator><![CDATA[Dominique Rolink]]></dc:creator>
		<pubDate>Thu, 01 Oct 2026 12:42:32 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/AIR-releases-BlogFeatured-1280x720-1-5.png</featuredImage>		<product ><![CDATA[air]]></product>
		<product ><![CDATA[idea]]></product>
		<category><![CDATA[agentic-ai]]></category>
		<category><![CDATA[ai]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ai&#038;p=740340</guid>

					<description><![CDATA[Last week, we shared our point of view on where we think agentic development is headed and introduced JetBrains&#8217; answer to it: JetBrains Air, an open system of products for agentic development. Today, we&#8217;re launching the Early Access Program for Air in JetBrains IDEs. It&#8217;s available now as a plugin on JetBrains Marketplace or natively [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>Last week, we shared our point of view on where we think agentic development is headed and introduced JetBrains&#8217; answer to it: <a href="https://www.jetbrains.com/air/" data-type="link" data-id="https://www.jetbrains.com/air/" target="_blank" rel="noopener">JetBrains Air</a>, an open system of products for agentic development.</p>



<p>Today, we&#8217;re launching the Early Access Program for Air in JetBrains IDEs. It&#8217;s available now as a <a href="https://plugins.jetbrains.com/plugin/33314-air-alpha" target="_blank" rel="noopener">plugin on JetBrains Marketplace</a> or natively in the 2026.3 EAP builds of JetBrains IDEs. <a href="#offer">Try Air with free Junie Lite</a> runs, our efficient coding agent for everyday tasks.</p>



<p>The Air plugin for JetBrains IDEs is a conduit for agents and subscriptions you already use. It is not an AI provider, and it ships with no agents installed.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://plugins.jetbrains.com/plugin/33314-air-alpha" class="btn " target="" rel="noopener">Try Air in Your IDE</a>
                                    </div>
    </div>







<p><br></p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-27-1.png" alt="" class="wp-image-743234"/></figure>



<h2 class="wp-block-heading">Why a new experience?</h2>



<p>AI in the IDE has traditionally centered around AI chat. Agentic development, however, changes the established interaction model: You delegate larger tasks and allow agents to work in parallel. This means you need to be able to see what they&#8217;re doing and steer them along the way. We tried to integrate that function into our existing AI Assistant solution by adding more agents to the AI chat. But as these workflows evolved, one thing became clear: Orchestrating several tasks concurrently is fundamentally different from having a conversation with AI.&nbsp;</p>



<p>Air is designed around that difference.</p>



<p>Behind this lies a bigger paradigm shift, and we won’t mince our words: Agentic development is becoming the norm, and an IDE that keeps agents at arm&#8217;s length will struggle to stay relevant.&nbsp;</p>



<p>That makes the IDE more important, not less: As agents do more of the work, verifying and owning the result becomes the hard part, and that is what the IDE is for. The center of gravity in JetBrains IDEs is shifting towards agentic development, and Air is how we get there.</p>



<h2 class="wp-block-heading">Introducing JetBrains Air in IDEs</h2>



<p>Air brings agentic development into the IDE without locking you into a particular agent or changing the way you already work. It&#8217;s built around three principles – the first two you&#8217;ve heard from us before. What&#8217;s new is a product designed around them from the start.</p>



<ol class="wp-block-list">
<li>Bring your existing agents into the IDE</li>
</ol>



<p>Air works with the agents you already use, such as Codex, GitHub Copilot, Junie, Cursor, and other ACP-compatible agents. It detects agents already installed on your machine and makes it easy to bring them directly into the IDE. With JetBrains Air in IDEs you can also use your Claude subscription in Air&#8217;s terminal and full-screen tab.&nbsp;</p>



<p><strong>You don’t need a JetBrains AI subscription to use your agents with Air.</strong> Use your existing AI provider subscriptions or JetBrains AI if you already have it.&nbsp;</p>



<ol start="2" class="wp-block-list">
<li>IDE intelligence for you and your agents</li>
</ol>



<p>Development doesn’t end when code is generated – it still needs to be run, reviewed, and validated. That’s exactly what an IDE is built for. It gives you the tools to understand and review the agent’s work – from diffs and navigation to inspections and more.</p>



<p><strong>And agents benefit from the IDE, too.</strong> Built-in IDE skills and tools give supported agents access to specialized JetBrains expertise and workflows for tasks like debugging, performance profiling, database exploration, and semantic code search. This can help agents produce better results and, for some tasks, use fewer tokens.</p>



<ol start="3" class="wp-block-list">
<li>An agentic-first UX</li>
</ol>



<p>Air is designed for working with <strong>multiple agents in parallel</strong>, not just interacting with one at a time. Agent work is organized into sessions, with all your sessions visible in one place, so you can track progress, see what needs your attention, steer agents, and review their work across projects.</p>



<h2 class="wp-block-heading">Working with Air</h2>



<p>Here’s what that looks like in practice:</p>



<p><strong>Stay on top of parallel agent work. </strong>View sessions across projects in one place, with activity, unread updates, changed files, and outgoing commits at a glance. See what each session costs as you work, so spend stays visible across agents and tasks. This makes it easy to track progress and quickly see what has changed and what requires your attention.<br></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-28-1.png" alt="" class="wp-image-743270" style="width:648px;height:auto; width:100% !important; height:auto !important; max-width:100% !important;"/></figure></div>


<p><strong>Delegate a task in one keystroke.</strong> Double-tap Ctrl from anywhere in the IDE to open a prompt window and start a new agent session, with your current context already attached.</p>



<p><strong>Choose the preferred UI for an agent session</strong>. Sessions themselves open right in the editor as tabs, giving agent work a real screen space alongside your code. If you prefer the terminal UI, you can keep using it directly in the IDE. Or choose a graphical chat when that works better for the task.&nbsp;</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-29-1.png" alt="" class="wp-image-743285" style="width:611px;height:auto; width:100% !important; height:auto !important; max-width:100% !important;"/></figure></div>


<p><strong>Run agents locally or in the cloud. </strong>For tasks that are complex, long-running or can be done in the background, run agents in the cloud, and close your machine. Follow along on mobile (coming soon) to steer the agent. Currently available to orgs with AI seats.</p>



<p><br><strong>Keep parallel agent work isolated with temporary worktrees.</strong> Start a session from any branch, either on a new branch or in a detached way. Track changes and commits from the chat, then cherry-pick the result back into your main project when it’s ready.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-30-1.png" alt="" class="wp-image-743319" style="width:686px;height:auto; width:100% !important; height:auto !important; max-width:100% !important;"/></figure></div>


<h2 class="wp-block-heading">You stay in control</h2>



<p>AI Assistant remains available while you try Air in your IDE. Over time, we expect Air to become the primary experience for agentic workflows in JetBrains IDEs.</p>



<p>As Air becomes a bigger part of JetBrains IDEs, the first question from many of you will be about control: Can I keep this off, and where does my code go?&nbsp;</p>



<p><strong>No agents? Nothing leaves your machine. </strong>Air is a tool window, not an AI provider, and it ships with no agents installed. It detects agents already on your machine, the way the IDE detects your terminal, but nothing runs, and no data leaves your machine until you sign in to an agent or a JetBrains AI plan. If your organization doesn&#8217;t allow agents, there&#8217;s nothing for Air to run and nothing to send.</p>



<p><strong>Your data goes to your provider, not to JetBrains. </strong>With a third-party subscription, data goes directly to that provider under the agreement you already have with them. It doesn&#8217;t pass through JetBrains. If you use JetBrains AI, the JetBrains AI Terms of Service apply, as is already the case with AI Assistant. Air adds no new data processing terms.</p>



<p><strong>You can turn it off. </strong>Disable the Air plugin, and nothing else changes.</p>



<h2 class="wp-block-heading" id="offer">Try it — with Free Junie Lite</h2>



<p>We believe we should provide some version of free AI in our IDEs, so we’re offering Junie Lite for free*. This is our coding agent with a cost efficient model for everyday tasks so you can experience Air without paying for anything.&nbsp;</p>



<p>Give Air a real task: Run agent sessions across multiple projects and tell us how it fits into your workflow. Share your feedback <a href="https://youtrack.jetbrains.com/newIssue?project=IJAI" target="_blank" rel="noopener">via YouTrack</a> so it lands in our teams’ backlog, or drop your thoughts in the comments below.<br><br>Install Air from <a href="https://plugins.jetbrains.com/plugin/33314-air-alpha" target="_blank" rel="noopener">JetBrains Marketplace</a>, via the notification in AI Assistant, or as part of the 2026.3 EAP builds of JetBrains IDEs, then connect the agents you already use, or use the ones available through JetBrains AI. If you install Air from the notification in AI Assistant, AI Assistant will be disabled to prevent both from running side by side. You can re-enable it at any time in <em>Settings | Plugins</em>, or reinstall it from Marketplace.</p>



<p><strong>*Applies to Junie Lite configuration, after signing in with your JetBrains Account. Terms and available models may change.</strong></p>



<h2 class="wp-block-heading">Frequently Asked Questions:&nbsp;</h2>



<p><strong>What is going to happen to AI Assistant?<br></strong>We believe Air is the future of agentic development in JetBrains IDEs, but AI Assistant will remain available and supported as a separate plugin you can install from the marketplace. <br><br><strong>Which agents and models are supported?<br></strong>Air supports Codex, Gemini, GitHub Copilot, Claude Agent, and Junie out of the box, and many others can be connected via ACP. You can use your own third-party subscriptions where possible, or use JetBrains AI.<br><br><strong>Can I use my Claude subscription? <br></strong>Yes, You can use your Claude subscription in Air&#8217;s terminal surface which opens as a full-screen IDE tab. <br><br><strong>Do I need a JetBrains AI subscription?<br></strong>You can use your JetBrains AI subscription, but it’s not mandatory. However, a JetBrains AI subscription is currently required for cloud runs and a JetBrains Account is required to access Junie Lite runs. </p>



<p></p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://plugins.jetbrains.com/plugin/33314-air-alpha" class="btn " target="" rel="noopener">Try Air in Your IDE</a>
                                    </div>
    </div>







<p></p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[pt-br]]></code>
                        <url>https://blog.jetbrains.com/pt-br/ai/2026/10/air-in-ides-eap/</url>
                    </language>
                                    <language>
                        <code><![CDATA[ko]]></code>
                        <url>https://blog.jetbrains.com/ko/ai/2026/10/air-in-ides-eap/</url>
                    </language>
                                    <language>
                        <code><![CDATA[ja]]></code>
                        <url>https://blog.jetbrains.com/ja/ai/2026/10/air-in-ides-eap/</url>
                    </language>
                                    <language>
                        <code><![CDATA[fr]]></code>
                        <url>https://blog.jetbrains.com/fr/ai/2026/10/air-in-ides-eap/</url>
                    </language>
                                    <language>
                        <code><![CDATA[es]]></code>
                        <url>https://blog.jetbrains.com/es/ai/2026/10/air-in-ides-eap/</url>
                    </language>
                                    <language>
                        <code><![CDATA[de]]></code>
                        <url>https://blog.jetbrains.com/de/ai/2026/10/air-in-ides-eap/</url>
                    </language>
                	</item>
		<item>
		<title>JetBrains Air: Building a System of Products for Agentic Software Development</title>
		<link>https://blog.jetbrains.com/blog/2026/09/22/introducing-jetbrains-air/</link>
		
		<dc:creator><![CDATA[Kirill Skrygan]]></dc:creator>
		<pubDate>Tue, 22 Sep 2026 09:00:34 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/social-media-preview-1.png</featuredImage>		<product ><![CDATA[idea]]></product>
		<category><![CDATA[agentic-ai]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[jetbrains]]></category>
		<category><![CDATA[new-products]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[releases]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=blog&#038;p=739812</guid>

					<description><![CDATA[AI can produce code. Organizations still have to produce software. Agentic development is changing how software gets made, but it hasn’t changed what it costs to be wrong. Six months ago, we began publicly experimenting with agentic development environments. Around the same time, we introduced JetBrains Central as an open control and execution system for [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong><strong><strong>AI can produce code. Organizations still have to produce software. Agentic development is changing how software gets made, but it hasn’t changed what it costs to be wrong.</strong></strong></strong></p>



<p>Six months ago, we began publicly experimenting with agentic development environments. Around the same time, we introduced <a href="https://blog.jetbrains.com/blog/2026/03/24/introducing-jetbrains-central-an-open-system-for-agentic-software-development/">JetBrains Central</a> as an open control and execution system for agent-driven development. We subsequently began rolling out <a href="https://blog.jetbrains.com/blog/2026/07/07/jetbrains-ai-for-teams-and-organizations-from-fragmented-ai-usage-to-coordinated-software-development/">JetBrains Central CLI</a>, shared context, cloud agents, automations, governance, and AI cost controls for teams and organizations.</p>



<p>Today, we are bringing this work together as JetBrains Air: an open, coherent system of products for developers, teams, and organizations, inside and beyond JetBrains IDEs. It is multi-surface and multi-service. Each product solves a distinct problem, but the products work better together.</p>



<p>JetBrains Air marks a significant expansion in what JetBrains is building for. For 26 years, we have focused primarily on the individual developer workbench. Now, we are building for the wider system through which agentic work is initiated, executed, coordinated, reviewed, and governed.</p>



<p>The IDE remains important to JetBrains’ future. The era in which the whole software development system can be contained in one window is ending. As part of our continued investment, we are now bringing the foundational agentic experience into JetBrains IDEs, giving professional developers an environment where they can work effectively with agents while understanding, changing, and verifying the resulting code. JetBrains Air connects the wider system developing around it.</p>



<p>That system is based on a core belief that the future of agentic development will be multi-vendor. No single model, agent, or service will be right for every developer, team, or task.</p>



<h2 class="wp-block-heading"><strong><strong><strong>From one product to an open system of products</strong></strong></strong></h2>



<p>This strategic shift has a practical consequence: JetBrains Air cannot be just another agent or development environment. It must connect products for individual work, team coordination, organizational control, context, and process automation – and remain open to the tools and agents developers choose, including those JetBrains does not build.</p>



<p>JetBrains Air includes products that are available today alongside others that will be introduced as the system develops:</p>



<ul class="wp-block-list">
<li><strong>Air in JetBrains IDEs</strong> – a complete agentic development experience for directing and orchestrating agents and verifying their work inside JetBrains IDEs.&nbsp;</li>



<li><strong>Air Teams</strong> – a new way to coordinate and automate software-delivery workflows involving developers and autonomous agents.&nbsp;</li>



<li><strong>Air Governance</strong> (formerly JetBrains Central) – organizational policy, visibility, auditability, cost management, and accountability for AI-assisted and agent-driven development.&nbsp;</li>
</ul>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/jetbrains_air_system.png" alt="" class="wp-image-741632"/></figure>



<p><strong>Junie</strong> is JetBrains’ coding agent for professional software development. It will be supported across all Air surfaces.</p>



<p>Air in JetBrains IDEs gives developers the environment to direct agents and verify their output using JetBrains’ code intelligence. Air Teams turns individual agent activity into coordinated team workflows. Air Governance makes that activity visible, governable, and accountable across the organization.</p>



<p>But an open system cannot stop at JetBrains’ own products. The Agent Client Protocol (<a href="https://www.jetbrains.com/acp/" target="_blank" rel="noopener">ACP</a>) standardizes the connection between an IDE and an agent’s full harness, including its planning, logic, tools, model routing, and observability. Through the ACP Registry, developers can discover and run a growing range of compatible agents while continuing to work inside JetBrains IDEs.</p>



<p>Air Governance is designed to extend visibility and cost governance across providers and the different tools through which agentic work takes place. This means developers can choose the agent, model, or service suited to the task without forcing the organization to give up context, visibility, or control.</p>



<p>Together, the Air products allow work to move between developers, agents, tools, and environments without losing the context and controls surrounding it.</p>



<h2 class="wp-block-heading"><strong><strong><strong>Individual adoption has moved faster than organizational infrastructure</strong></strong></strong></h2>



<p>Since March, our products have progressed significantly, but so has our understanding of what agentic development requires.</p>



<p>Developers have been adopting agents faster than organizations can build the infrastructure around them. Agent capabilities have advanced, and different models and agents have proven useful for different tasks. However, the context, coordination, governance, and cost management surrounding them have not kept pace.</p>



<p>For many developers, agents are already delivering practical value. At the organizational level, the economics are much harder to prove. The costs surface elsewhere – in review, rework, security, infrastructure, and spend.&nbsp;</p>



<p>Which agents can access company code? Where can data go? Which output requires human review? What happened while an agent was working remotely? Who approved the resulting change, and how was it verified?</p>



<p>Fragmentation at this level isn’t just irritating. It makes software development harder to understand, measure, and govern at exactly the point when more of the work is being delegated.</p>



<h2 class="wp-block-heading"><strong><strong><strong>The bottleneck is shifting with the work</strong></strong></strong></h2>



<p>Code that’s obviously wrong gets caught quickly. That part of the system still works. The harder problem is code that’s almost right: plausible, capable of passing a superficial check, but quietly carrying a bad assumption or architectural inconsistency that won’t surface until it’s expensive.</p>



<p>As agents take on more of the execution, the bottleneck shifts from producing change to understanding, verifying, and owning it. Code becomes cheaper to generate but more expensive to verify. Agent activity becomes easier to start but harder to coordinate, audit, and explain.</p>



<p>And while the work can be delegated, accountability cannot. An agent will not get the call at 3:00 am when something breaks. The responsibility for what ships still belongs to the people and organizations that ship it.&nbsp;</p>



<p>This is why control becomes harder, not easier, as AI improves. A more capable model may produce better output. It does not establish organizational policy, preserve provenance, provide cost visibility, or decide who accepts responsibility for the resulting change.</p>



<h2 class="wp-block-heading"><strong><strong><strong>The future is multi-vendor</strong></strong></strong></h2>



<p>Multi-vendor support is a foundational design principle of JetBrains Air, shaping how the system is being built from the outset.&nbsp;&nbsp;</p>



<p>We don&#8217;t believe this market will consolidate any time soon. Models vary in what they&#8217;re good at, and rankings change every few months. Teams inside the same company already make different choices, and they are often right to do so. Standardizing on one AI vendor today means making a multi-year commitment in a market that won&#8217;t look the same next quarter.</p>



<p>Keeping the options open is the reasonable thing to do. The problem is what openness currently costs. Every new model, agent, or service an organization adds takes away a little more visibility into its own development work. Context doesn&#8217;t carry over between tools. Spend can&#8217;t be attributed. Policies have to be rebuilt for each service.&nbsp;</p>



<p>Organizations should not have to choose between using the best available tools and understanding what is happening inside their own engineering. That trade-off exists because nothing in the current stack was built to sit above several vendors at once.</p>



<p>This is the work JetBrains has taken on. We build our own agent, and we intend to make it excellent. But JetBrains Air does not require customers to use ours, and our strategy does not depend on which model provider leads the rankings this quarter. We have no reason to make the ecosystem smaller than it is.</p>



<p>What we can offer instead is one place to run, see, govern, and account for agentic development across every model, agent, and service – for the developer, the team, and the organization.</p>



<p>Supporting multiple models and agents is the floor, not the ceiling. The part that matters is what sits above them: shared context, one set of policies, a single cost view, and a record of what happened, regardless of which vendor produced the change.</p>



<h2 class="wp-block-heading"><strong><strong>Why JetBrains?</strong></strong></h2>



<p>Multi-vendor choice solves only part of the problem. Agents also need reliable software intelligence.</p>



<p>JetBrains brings 26 years of engineering intelligence to the problem, helping developers understand the structure and behavior of complex software, not simply generate more of it. That deterministic code intelligence provides a foundation for making agentic work more reliable, efficient, and understandable across different models and agents. We are seeing promising results from giving AI agents access to deterministic code intelligence.&nbsp;</p>



<p>This is an economic advantage as well as a technical one. Agents spend time and money rediscovering information the codebase already contains. An agent that can retrieve that knowledge is cheaper and more accurate than one that has to reconstruct it. Because intelligence does not belong to one model, the benefit can extend across supported agents and services.&nbsp;</p>



<p>We are also going through the same transition as the organizations we build for, adopting agents internally, redesigning workflows, and learning where individual productivity gains translate into better software delivery and where they simply move work elsewhere.</p>



<h2 class="wp-block-heading"><strong>What comes next</strong></h2>



<p>JetBrains Air will develop through a rolling series of releases. We will be explicit about what customers can use now, what is entering preview, and what remains part of our longer-term direction.</p>



<p>Over time, JetBrains Air will extend further into mobile and remote experiences, allowing people to initiate, monitor, review, and continue agentic work as it moves between environments. The goal is not to reproduce the IDE on every surface. We are making the right context and controls available wherever decisions need to be made.&nbsp;</p>



<p>We will also bring JetBrains’ intelligence into more agentic workflows. This includes richer context drawn from code, architecture, repositories, runtime behavior, and organizational knowledge, as well as better ways to route work between developers, models, agents, and services.</p>



<p>More work will be triggered by repository events, schedules, and delivery processes rather than by a developer opening an editor and issuing a prompt. JetBrains Air will provide the intelligence, oversight, and human control these workflows require across surfaces and services.</p>



<p>We will not name future products before their scope and availability are ready to be confirmed. With each release, we will explain what works, how it connects, and what’s still in progress.</p>



<h2 class="wp-block-heading"><strong><strong><strong>Where JetBrains Air is going</strong></strong></strong></h2>



<p>The companies that succeed in adopting AI will not necessarily be those that generate the most code or deploy the most agents. They will be those that can expand experimentation without losing quality, context, cost discipline, or human understanding.</p>



<p>JetBrains Air is our commitment to building for that reality. It expands JetBrains from the developer workbench into a system of products connecting developers, agents, teams, and organizations.</p>



<p>The goal is not more code. It is software that developers, teams, and organizations can understand, verify, and stand behind.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/air/?utm_source=blog&#038;utm_medium=social&#038;utm_campaign=air_launch_202609" class="btn " target="" rel="noopener">Explore JetBrains Air</a>
                                    </div>
    </div>




]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[zh-hans]]></code>
                        <url>https://blog.jetbrains.com/zh-hans/blog/2026/09/22/introducing-jetbrains-air/</url>
                    </language>
                                    <language>
                        <code><![CDATA[pt-br]]></code>
                        <url>https://blog.jetbrains.com/pt-br/blog/2026/09/22/introducing-jetbrains-air/</url>
                    </language>
                                    <language>
                        <code><![CDATA[ko]]></code>
                        <url>https://blog.jetbrains.com/ko/blog/2026/09/22/introducing-jetbrains-air/</url>
                    </language>
                                    <language>
                        <code><![CDATA[ja]]></code>
                        <url>https://blog.jetbrains.com/ja/blog/2026/09/22/introducing-jetbrains-air/</url>
                    </language>
                                    <language>
                        <code><![CDATA[fr]]></code>
                        <url>https://blog.jetbrains.com/fr/blog/2026/09/22/introducing-jetbrains-air/</url>
                    </language>
                                    <language>
                        <code><![CDATA[es]]></code>
                        <url>https://blog.jetbrains.com/es/blog/2026/09/22/introducing-jetbrains-air/</url>
                    </language>
                                    <language>
                        <code><![CDATA[de]]></code>
                        <url>https://blog.jetbrains.com/de/blog/2026/09/22/introducing-jetbrains-air/</url>
                    </language>
                	</item>
		<item>
		<title>Logpoints Walkthrough</title>
		<link>https://blog.jetbrains.com/idea/2026/09/logpoints-walkthrough/</link>
		
		<dc:creator><![CDATA[Igor Kulakov]]></dc:creator>
		<pubDate>Wed, 16 Sep 2026 14:14:04 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/IJ-social-BlogFeatured-1280x720-1-1.png</featuredImage>		<category><![CDATA[idea]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[logpoints]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=739428</guid>

					<description><![CDATA[Modern development tools, especially IntelliJ IDEA, have such comprehensive debugging support that for virtually any niche use case, there is a specialized tool for the job. This can make it hard to know where to begin. If you are new to debugging tools and want the biggest return on your learning investment, the best feature [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Modern development tools, especially IntelliJ IDEA, have such comprehensive debugging support that for virtually any niche use case, there is a specialized tool for the job. This can make it hard to know where to begin. If you are new to debugging tools and want the biggest return on your learning investment, the best feature to start with is logpoints.</p>



<p>Even though working with them is as simple as debugging with plain println statements (and arguably simpler), they <em>vastly</em> broaden the range of issues that you can debug. For some issues, logpoints are the only practical approach. And for the rest, logpoints provide a convenience that saves a lot of time and effort.</p>



<p>Also, in IntelliJ IDEA 2026.2, logpoints got some <a href="https://blog.jetbrains.com/idea/2026/08/println-debugging-done-right/">very cool improvements</a>, so it’s a perfect time to explore them.</p>



<h2 class="wp-block-heading"><strong>Our example problem</strong></h2>



<p>Here’s a <a href="https://github.com/flounder4130/grpc-timeout" target="_blank" rel="noopener">mini client and server</a> that use <a href="https://grpc.io/" target="_blank" rel="noopener">gRPC</a> for communication. The server has a bug that makes it return incorrect discount values for some tenants.</p>



<p>So we’ll follow the usual debugging flow. We’ll reproduce the problem, set up visibility into the inner workings of the server, send a problematic request, and observe exactly how it produces the wrong result.</p>



<h2 class="wp-block-heading"><strong>Reproducing the bug</strong></h2>



<p>To simulate running in another environment, the project bundles a Dockerfile with the listening and debug ports exposed. You can launch it using the supplied <kbd>GrpcQuoteServerContainer</kbd> run configuration or directly from the command line:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">docker build -t grpc-timeout .

docker run --rm -p 50051:50051 -p 5005:5005 grpc-timeout</pre>



<p>Then for a problematic request, use the <kbd>GrpcQuoteClientLoop</kbd> run configuration, which will periodically query the server. This lets us forget about sending requests manually and focus more on what happens on the server.</p>



<p>When both the server and the client loop are running, the console shows the following:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tenant='JetBrains' region='EMEA' status=OK symbol=IDEA price=100.00 USD source=live detail=region=emea, discount_bps=0</pre>



<p>But we would expect to see:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tenant='JetBrains' region='EMEA' status=OK symbol=IDEA price=80.00 USD source=live detail=region=emea, discount_bps=2000</pre>



<h2 class="wp-block-heading"><strong>Attaching to the server</strong></h2>



<p>The server is not launched from a local IntelliJ IDEA debug session, but it listens for debugger connections, so we can still attach to it using the provided <kbd>GrpcQuoteServer</kbd> attach run configuration.</p>



<p>It’s worth noting that, for the debugger, there is no difference whether the process runs locally, in a separate environment, or on a remote host. In all three cases, the communication happens over a socket, so our exercise is valid for debugging any Java process regardless of locality.</p>



<h2 class="wp-block-heading"><strong>Logpoints</strong></h2>



<p>Logpoints are similar to <kbd>println</kbd> statements in that they don’t suspend the program but only log the necessary details to the console. Unlike <kbd>println</kbd> statements, however, they can be changed without rebuilding or redeploying the application.</p>



<p>You might already know how to set a logpoint, but IntelliJ IDEA 2026.2 introduced a faster way. Click in the gutter in between any two executable lines and enter the expression you want to log. As the starting point, we can use the beginning of the query handling method ( <kbd>QuoteEndpoint:12 </kbd>):</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-40.png" alt="" class="wp-image-739550"/></figure>


                    <div class="alert alert-warning">
            <p><strong>Warning:</strong> Beware of heavy computations in hot paths. They are executed in the same VM and are not magically free. As of version 2026.2, IntelliJ IDEA removes the debugger-introduced overhead through instrumentation, but heavy logging expressions may still take time to execute.</p>
        </div>
    






<p>For every incoming request, the console now prints:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">EMEA JetBrains</pre>



<p>Now, with the request loop running, we can progressively change and add logpoints until the output points to the bug. Just add more logpoints or update the existing ones and watch for new messages in the console as new requests come in.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Logpoints demo" src="https://www.youtube.com/embed/lUZW71adS3A?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>After following the call chain, which allows us to rule out any initial suspicions we might have had, we arrive at the <kbd>discountBpsFor()</kbd> method:</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-41.png" alt="" class="wp-image-739597" style="width:758px;height:auto; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>



<p>The console points at the tenant name not being properly normalized:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tenant = JetBrains expected: jetbrains</pre>



<p>Also, the absence of discount applied tells us that the block with the correct discount is never entered. Normalizing the tenant name should fix the bug:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">private static int discountBpsFor(String tenant) {
    if ("jetbrains".equalsIgnoreCase(tenant)) {
        return 2_000;
    }
    return 0;
}</pre>



<p><strong>Pro tip</strong>: When in doubt about what produced specific console output, click the line in the console, and IntelliJ IDEA will take you to the relevant logpoint or piece of code:</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-42.png" alt="" class="wp-image-739608" style="width:644px;height:auto; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>



<p>Even if you are using <kbd>println</kbd> statements for logging, the navigation will work for you as long as you are running the process with IntelliJ IDEA’s debugger.</p>



<h2 class="wp-block-heading"><strong>Testing the fix</strong></h2>



<p>Let’s test the fix while we’re here. Logpoints are meant for logging, not for modifying the program, but nothing really prevents us from testing how a particular fix would behave:</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-43.png" alt="" class="wp-image-739619" style="width:720px;height:auto; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>



<p>The prototype works as expected:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">EMEA JetBrains

jetbrains

discount applied</pre>



<p>Now that we&#8217;ve tested the fix, we can change the actual server code.</p>



<h2 class="wp-block-heading"><strong>Why not use </strong><strong>println</strong><strong> statements?</strong></h2>



<p>You’re probably thinking logpoints look like nicer println statements. And they do, in a sense, because the core mechanic is the same. In both cases, you <strong>add probes in a simple way that doesn’t affect how the program runs</strong>.</p>



<p>Despite their similarities, there are several reasons why logpoints can be a better choice:</p>



<ul class="wp-block-list">
<li>They don’t clutter the code, meaning you won’t spend effort on cleaning up (and won’t commit a stray one to production).</li>



<li>They are flexible about what they log and when. For example, if you only want to sample frequent events, this is <a href="https://flounder.dev/posts/logpoints-tricks/#logging-frequent-events" target="_blank" rel="noopener">how you configure it</a>.</li>



<li>They allow you to insert logging inside your dependencies (we’ll do that shortly).</li>



<li>Most importantly for this scenario, they can save you costly redeploys. Rerunning a local Docker container just to add logging in a toy project might be acceptable, but in large real-world projects it often is not.</li>
</ul>



<p>These advantages set logpoints apart from println statements and make them feel more like the professional debugging tool they are.</p>



<h2 class="wp-block-heading"><strong>Why not use regular breakpoints?</strong></h2>



<p>When using the debugger, most developers will reach for breakpoints. But in the particular scenario we’ve been looking at, logpoints are a better fit, and this is not just a matter of preference.</p>



<p>Let’s see what happens if we use regular breakpoints. After attaching to the server, set a line breakpoint at <kbd>GrpcQuoteServer.java:55</kbd> . The next request from the loop suspends the server:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-44.png" alt="" class="wp-image-739630"/></figure>



<p>But after looking at the program state and stepping a couple of times, we find ourselves in the cancellation path:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-39.png" alt="" class="wp-image-739458"/></figure>



<p>Once we’re there, there is no useful information, because it&#8217;s not where requests normally end up. This happens because the deadline that the client has set is expired and the server discards further work on the request. You can see that IntelliJ IDEA greyed out parts of the code that are not going to be executed. To bring the problematic state back, we have to send requests one after another and do our debugging work within the timeout window.</p>



<p>This happens because our client sets a deadline for the remote call. Unlike a typical HTTP/REST client timeout, where the timeout only signals failure on the client, gRPC can propagate the client’s deadline to the server. As a result, the client can actually cancel the server-side work, not just stop waiting for a response.</p>



<p>On the other hand, logpoints give us the same information we would get in the debugger UI, except that we observe it in the console. Importantly, using them doesn’t suspend the server, so we can extract the information we need without triggering the timeout.</p>



<h2 class="wp-block-heading"><strong>Bonus: Removing the timeout</strong></h2>



<p>If you’d prefer an alternative approach to this scenario, here’s another way to debug it. For our gRPC example, the problematic bit was the timeout, and we can remove it at runtime using… logpoints!</p>



<p>As you’ve just seen, logpoint expressions can modify the running program through side effects. Here, we can use this technique to adjust the incoming request.</p>



<p>First, find the library method that sets the timeout. There are several methods we can use. One of them is <kbd>io.grpc.internal.ServerImpl.createContext</kbd> :</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-45.png" alt="" class="wp-image-739641" style="width:751px;height:auto; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>



<p>In that method, we can rewrite the value of the <kbd>timeoutNanos</kbd> local variable right after it has been assigned:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-46.png" alt="" class="wp-image-739652"/></figure>



<p>With this logpoint in place, every time the gRPC timeout value is read from the request headers, it is immediately replaced with a five-minute deadline. This means we can suspend the server again.</p>



<p>If you want to only extend the timeout for the reproducer requests and keep the server functioning as usual – for example, if it runs on a shared staging instance – you can use multiline logic inside a logpoint:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-48.png" alt="" class="wp-image-739674"/></figure>



<p>Here’s the code to copy to the logpoint:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Metadata.Key&lt;String> DEBUG_HEADER = Metadata.Key.of("Debug", Metadata.ASCII_STRING_MARSHALLER);
String debugHeader = headers.get(DEBUG_HEADER);
if ("Debug".equals(debugHeader)) {
    timeoutNanos = java.util.concurrent.TimeUnit.MINUTES.toNanos(5L);
    return "Timeout reset";
}</pre>



<p>The multiline expression parses the request headers and extends the timeout only for requests with the <kbd>Debug</kbd> header (which our test clients add). Other requests keep the normal deadline. The if branch returns &#8220;Timeout reset&#8221;, confirming when the branch was visited.</p>



<p><strong>Pro tip:</strong> By combining logpoints with the Mark Object feature, you can access arbitrary objects in the logpoint expression field. <a href="https://flounder.dev/posts/debugger-god-mode/" target="_blank" rel="noopener">This article</a> covers the technique in more detail.</p>



<h2 class="wp-block-heading">The ij-debugger AI agent skill</h2>



<p>Of course, the method above requires familiarity with the library or time to explore it. If you have neither and just want to change the runtime behavior quickly, you can delegate the task to an AI agent using the bundled <kbd>ij-debugger</kbd> <a href="https://www.jetbrains.com/help/idea/logpoints.html#ai_agent_skill" target="_blank" rel="noopener">AI agent skill</a>:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-49.png" alt="" class="wp-image-739685"/></figure>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-50.png" alt="" class="wp-image-739696"/></figure>



<p>The AI agent follows the same path we followed manually, finding where the deadline is read and producing a logpoint expression that changes only the requests we care about. So even without knowing the gRPC internals upfront, we can still get to a targeted workaround and continue debugging.</p>



<h2 class="wp-block-heading"><strong>Conclusion</strong></h2>



<p>In this article, we looked at a use case where logpoints offer a simpler and more elegant alternative to breakpoints or println logging. We:</p>



<ul class="wp-block-list">
<li>Attached to a remote process</li>



<li>Added diagnostics at runtime using logpoints</li>



<li>Adjusted logging on the fly</li>



<li>Tested the fix without changing the application code</li>



<li>Changed the timeout for a running server</li>



<li>Used the <kbd>ij-debugger</kbd> AI agent skill</li>
</ul>



<p>I hope you learned something new and now have a better option for the next time println statements or breakpoints get in the way. In the next post of the series, we’ll look at debugger instrumentation, the underlying mechanism that makes the new logpoints so fast.</p>



<p>Happy debugging!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>IntelliJ IDEA 2026.2.3 Is Out!</title>
		<link>https://blog.jetbrains.com/idea/2026/09/intellij-idea-2026-2-3/</link>
		
		<dc:creator><![CDATA[Maria Kosukhina]]></dc:creator>
		<pubDate>Wed, 16 Sep 2026 10:53:53 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/IJ-IDEA-2026.2.3.png</featuredImage>		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=740052</guid>

					<description><![CDATA[We’ve just released IntelliJ IDEA 2026.2.3. You can update to this version from inside the IDE, using the Toolbox App, or using snaps if you are a Ubuntu user. You can also download it from our website. The latest update brings the following improvements: For a comprehensive overview of the fixes, see the release notes. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>We’ve just released IntelliJ IDEA 2026.2.3. You can update to this version from inside the IDE, using the <a href="https://www.jetbrains.com/toolbox-app/" target="_blank" rel="noreferrer noopener">Toolbox App</a>, or using snaps if you are a Ubuntu user. You can also download it from our <a href="https://www.jetbrains.com/idea/download/" target="_blank" rel="noreferrer noopener">website</a>.</p>



<p>The latest update brings the following improvements:</p>



<ul class="wp-block-list">
<li>When opening a recent project, the <em>Maven</em> tool window is now populated with the corresponding data. [<a href="https://youtrack.jetbrains.com/issue/IDEA-391792/Maven-Tool-Windows-content-is-not-always-populated-when-opening-a-recent-project." target="_blank" rel="noopener">IDEA-391792</a>]</li>



<li>Several causes of IDE freezes have been resolved. [<a href="https://youtrack.jetbrains.com/issue/IDEA-390006/IntelliJ-IDEA-2026.1.2-completely-freezes-on-com.intellij.codeInsight.daemon.impl.HighlightInfoUpdaterImpl.addEvictedInfos" target="_blank" rel="noopener">IJPL-235455</a>], [<a href="https://youtrack.jetbrains.com/issue/IJPL-252292/Dev-Containers-h2-toomanyresets-kills-IJent-orphaned-FS-calls-hang-the-EDT" target="_blank" rel="noopener">IJPL-252292</a>]</li>



<li>The vertical scrollbar is once again displayed correctly in the <em>Markdown</em> preview pane. [<a href="https://youtrack.jetbrains.com/issue/IJPL-251259/2026.2-Markdown-Preview-Missing-vertical-scrollbar-JCEF-rendering-failure" target="_blank" rel="noopener">IJPL-251259</a>]</li>



<li>The PlantUML extension has been updated to version 1.2026.6, enabling support for its latest features. [<a href="https://youtrack.jetbrains.com/issue/IJPL-253366/The-PlantUML-Markdown-Extension-is-too-old" target="_blank" rel="noopener">IJPL-253366</a>]</li>



<li>Applications running in <em>Debug</em> mode with WSL2 mirrored networking no longer become unresponsive and can be stopped as expected. [<a href="https://youtrack.jetbrains.com/issue/IDEA-355585/When-using-debug-to-debug-code-in-WSL2s-mirrored-network-mode-the-application-will-be-blocked-and-cannot-be-stopped." target="_blank" rel="noopener">IDEA-355585</a>]</li>
</ul>



<p></p>



<p>For a comprehensive overview of the fixes, see the <a href="https://youtrack.jetbrains.com/articles/IDEA-A-2100662741" target="_blank" rel="noopener">release notes</a>. If you spot any issues, let us know via the <a href="https://youtrack.jetbrains.com/issues/IDEA" target="_blank" rel="noreferrer noopener">issue tracker</a>.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Java 27 in IntelliJ IDEA</title>
		<link>https://blog.jetbrains.com/idea/2026/09/java-27-in-intellij-idea/</link>
		
		<dc:creator><![CDATA[Marit van Dijk]]></dc:creator>
		<pubDate>Tue, 15 Sep 2026 14:49:02 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/IJ-social-BlogFeatured-1280x720-1-3.png</featuredImage>		<category><![CDATA[java]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[intellij-idea]]></category>
		<category><![CDATA[java-27]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=739827</guid>

					<description><![CDATA[In line with the six-month release cadence, Java 27 was released on September 15, 2026. In this blog post, we will look at what’s included in this release, how IntelliJ IDEA continues to support the latest Java versions, and even how IntelliJ IDEA is benefiting from some of the changes to the JDK. Java 27 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>In line with the six-month release cadence, Java 27 was released on September 15, 2026. In this blog post, we will look at what’s included in this release, how IntelliJ IDEA continues to support the latest Java versions, and even how IntelliJ IDEA is benefiting from some of the changes to the JDK.</p>



<p>Java 27 delivers nine JEPs, four of which are final. In addition, four preview features continue to mature and one JEP continues as an incubator feature.</p>



<p>Even if you’re not using IntelliJ IDEA, you can still get its intelligence elsewhere: <a href="https://blog.jetbrains.com/idea/2026/08/intellij-idea-goes-lsp/"><em>IntelliJ IDEA Goes LSP: Java and Kotlin Intelligence Comes to VS Code, Cursor, and Agentic Flows</em></a>. This provides the same level of support for the latest Java versions and features, including early access versions and preview features.</p>



<p>For this blog post, let’s start by setting up IntelliJ IDEA to use the latest Java version.</p>



<h1 class="wp-block-heading">Using Java 27 in IntelliJ IDEA (setup)&nbsp;</h1>



<p>First, you will need to download JDK 27. There are several ways to do so; you can download it from inside IntelliJ IDEA, using tools like <a href="https://sdkman.io/" target="_blank" rel="noopener">SDKMAN!</a> or <a href="https://asdf-vm.com/" target="_blank" rel="noopener">asdf</a>, or install it yourself.</p>



<h2 class="wp-block-heading">Downloading the JDK</h2>



<p>To download JDK 27 from IntelliJ IDEA, open the <em>Project Structure, </em>go to the tab <em>Project Settings | Project</em>, open the drop-down menu in the <em>SDK </em>field, and select <em>Download JDK</em>. In the <em>Download JDK</em> popup that opens, set <em>Version</em> to <em>27</em>,<em> </em>and in the <em>Vendor</em> field, select the vendor you want to use.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-54.png" alt="" class="wp-image-739938"/><figcaption class="wp-element-caption"><em>Download JDK</em></figcaption></figure>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Download-JDK-Select-vendor.png" alt="" class="wp-image-740140"/><figcaption class="wp-element-caption"><em>Download JDK – Select vendor</em></figcaption></figure>



<p>If you have already installed the JDK, you can point IntelliJ IDEA to your installation. Instead, select <em>Add JDK from Disk</em> from the drop-down menu.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-56.png" alt="" class="wp-image-739961"/><figcaption class="wp-element-caption"><em>Add JDK from disk</em></figcaption></figure>



<p>The JDK version will be automatically propagated from your project settings to the terminal, which means that both you and your agent can use the right JDK for your project on the terminal in IntelliJ IDEA. A demo of this feature was shown in the <a href="https://youtu.be/1wzW-gM9OZE?si=6xpVuzD2xdXifvef&amp;t=555" target="_blank" rel="noopener">What&#8217;s New in IntelliJ IDEA 2026.2</a> video.</p>



<p>If you use<a href="https://sdkman.io/" target="_blank" rel="noopener"> SDKMAN!</a> or <a href="https://asdf-vm.com/" target="_blank" rel="noopener">asdf</a> to manage your JDKs, IntelliJ IDEA can read the <code>.sdkmanrc</code> or <code>.tool-versions</code> file in your project and can configure the JDK automatically if you already have it installed.</p>



<p>If you’re using SDKMAN! and the JDK version specified in the <code>.sdkmanrc</code> file is not yet installed, an inlay hint will appear in the file, allowing you to download it directly from the IDE by running the relevant SDKMAN! command. This even works if you don’t have SDKMAN! installed, which means this functionality is also available for Windows users.</p>



<p>For more information on how to set up the JDK, see the <a href="https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk" target="_blank" rel="noopener">documentation</a>.</p>



<h2 class="wp-block-heading">Setting the language level</h2>



<p>IntelliJ IDEA supports Java 27 from day one. In the <em>Project Structure</em>, set the <em>Language level</em> to <em>27 &#8211; No new language features</em>.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-58.png" alt="" class="wp-image-739983"/><figcaption class="wp-element-caption"><em>27 &#8211; No new language features</em></figcaption></figure>



<p>If you’re using preview features, set it to <em>27 (Preview) &#8211; Primitive types in patterns, instanceof, and switch (5th preview).</em> Note that IntelliJ IDEA will highlight the usage of preview features in the editor, so that you are aware of exactly where you’re using preview features.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-59.png" alt="" class="wp-image-739994"/><figcaption class="wp-element-caption"><em>27 (Preview) &#8211; Primitive types in patterns, instanceof, and switch (5th preview)</em></figcaption></figure>



<h1 class="wp-block-heading">New stable features in Java 27</h1>



<p>Java 27 introduced 4 new stable features. Let’s take a quick look.</p>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/523" target="_blank" rel="noopener">JEP 523: Make G1 the default garbage collector in all environments</a></h2>



<p>The Garbage-First (G1) garbage collector has been the default garbage collector since Java 9, with one exception: Machines with only one CPU or less than 1,792 MB of RAM fell back to Serial GC. This JEP makes G1 the default garbage collector for the HotSpot JVM in all environments, not just server environments, replacing the Serial collector.</p>



<p>Improvements were made to the G1 garbage collector (including <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/#jep-522-g1-gc-improve-throughput-by-reducing-synchronization">JEP 522: G1 GC: Improve Throughput by Reducing Synchronization in Java 26</a>) so that its performance is now sufficient to replace Serial. For applications in constrained environments that perform better with Serial, it can be explicitly enabled with the option `-XX:+UseSerialGC`.</p>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/527" target="_blank" rel="noopener">JEP 527: Post-quantum hybrid key exchange for TLS 1.3</a></h2>



<p>This JEP enhances the security of Java applications that require secure network communication by implementing hybrid key exchange algorithms for TLS 1.3. This helps guard against &#8220;harvest now, decrypt later&#8221; attacks, where an adversary records encrypted traffic today with the intention of decrypting it once quantum computers are powerful enough.</p>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/534" target="_blank" rel="noopener">JEP 534: Compact object headers by default</a></h2>



<p>This JEP makes compact object headers the default object header layout in the HotSpot JVM.</p>



<p>By reducing object headers from 96 bits to 64 bits on 64-bit architectures, compact object headers reduce heap size, improve deployment density, and increase data locality.</p>



<p>Compact object headers were introduced as an experimental feature in Java 24 and became opt-in in Java 25. Since compact object headers are now the default, you no longer need to enable them using a command line option, like with JDK 25.&nbsp;</p>



<p>Applications with large numbers of objects will benefit from this change, as using compact object headers reduces the JVM memory footprint. JetBrains IDEs are using this feature and have observed consistent memory savings with it enabled. <a href="https://youtrack.jetbrains.com/issue/IJPL-212987" target="_blank" rel="noopener">Learn more</a>.</p>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/536" target="_blank" rel="noopener">JEP 536: JFR in-process data redaction</a></h2>



<p>This JEP enhances the JDK Flight Recorder (JFR) by redacting command-line arguments and the initial values of environment variables and system properties in recordings before it leaves the process, so sensitive information does not leak.</p>



<h1 class="wp-block-heading">Preview features in Java 27</h1>



<p>Preview features give developers a chance to try new features and provide feedback before they become final. Preview features might go through multiple rounds, either with or without changes, before they are finalized and become a standard part of the language.</p>



<p>IntelliJ IDEA strives to support preview features, so you can experiment with them before they become standard. Because these features are always subject to change, IntelliJ IDEA only supports preview features for the current JDK. To enable preview features, set <em>Language l</em><em>evel</em> to <em>27 (Preview) – Primitive types in patterns, instanceof, and switch (5th preview).</em></p>



<p>Java 27 contains four preview features and one incubator feature. The features themselves are the same as in Java 26, but some of them have been revised in Java 27.&nbsp;</p>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/531" target="_blank" rel="noopener">JEP 531: Lazy constants (third preview)</a></h2>



<p>Lazy constants are objects that hold immutable data. As the name suggests, they are evaluated lazily. This offers advantages over final fields, which are evaluated eagerly. With lazy constants, fields are evaluated only when needed, which can improve startup time.</p>



<p>For a slightly more detailed explanation, see the section on <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/#jep-526-lazy-constants-second-preview"><em>Lazy Constants in Java 26 in IntelliJ IDEA</em></a>.</p>



<p>Lazy constants were first introduced in Java 25 (as <a href="https://openjdk.org/jeps/502" target="_blank" rel="noopener">stable values</a>) and underwent significant&nbsp; changes in Java 26. The API has been revised further in Java 27.&nbsp;&nbsp;</p>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/532" target="_blank" rel="noopener">JEP 532: Primitive types in patterns, instanceof, and switch (fifth preview)</a></h2>



<p>As <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/#jep-530-primitive-types-in-patterns-instanceof-and-switch-fourth-preview">described</a> in <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/"><em>Java 26 in IntelliJ IDEA</em></a>, this feature enhances pattern matching to support all primitive types in pattern contexts, including <code>instanceof</code> and <code>switch</code>. The feature removes some of the existing limitations of pattern matching, making it possible to match, test, and safely convert primitive values in these constructs. Removing the need for unsafe manual casts (which might cause subtle bugs) and range checks leads to improved code safety and readability. This feature is still in preview in Java 27, with no changes from the Java 26 version.</p>



<h3 class="wp-block-heading">A quick example</h3>



<p>Let’s look at a quick example of using primitive types in switch expressions with guard patterns.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">int itemDiscountPercentage(int items) {
   return switch (items) {
       case 2 -> 5;
       case 3, 4 -> 10;
       case int i when i >= 5 -> 20;
       default -> 0;
   };
}</pre>



<p>We can add Javadoc to this method to explain how it works. As of Java 23 (<a href="https://openjdk.org/jeps/467" target="_blank" rel="noopener">JEP 467</a>), Javadoc can be written in Markdown. If your project uses JDK 23 or later, IntelliJ IDEA will insert Markdown documentation comments by default when you use the context action <em>Add Javadoc</em>.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Java27_AddJavaDoc.mp4"></video><figcaption class="wp-element-caption"><em>Add JavaDoc</em></figcaption></figure>



<p>Sidenote: If you prefer to use traditional comments instead of Markdown, open <em>Settings</em>, go to <em>Editor | Code Style | Java | Code Generation | Comment Code</em>, and deselect the <em>Prefer documentation line comments</em> option.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-53.png" alt="" class="wp-image-739857"/><figcaption class="wp-element-caption"><em>Prefer documentation line comments</em></figcaption></figure>



<p>IntelliJ IDEA can convert existing Javadoc to markdown using the context action <em>Convert to Markdown documentation comment</em>.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Java27_Convert-to-Markdown.mp4"></video><figcaption class="wp-element-caption"><em>Convert to Markdown documentation comment</em></figcaption></figure>



<p>You can find a more detailed explanation of this feature in <a href="https://blog.jetbrains.com/idea/2024/09/java-23-and-intellij-idea/#primitive-types-in-patterns-instanceof-and-switch-preview-feature">this section</a> of <a href="https://blog.jetbrains.com/idea/2024/09/java-23-and-intellij-idea/"><em>Java 23 and IntelliJ IDEA</em></a>.</p>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/533" target="_blank" rel="noopener">JEP 533: Structured concurrency (seventh preview)</a></h2>



<p>As <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/#jep-525-structured-concurrency-sixth-preview">described</a> in <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/"><em>Java 26 in IntelliJ IDEA</em></a>, structured concurrency gives us better “idioms” for multithreaded code, which means the code more closely matches the user’s mental model.&nbsp;</p>



<p>Structured concurrency treats groups of related tasks running in different threads as single units of work. This improves readability and observability, making concurrent code easier to understand and reason about. It also helps eliminate thread leaks and cancellation delays.&nbsp;</p>



<p>For more details on structured concurrency and how it works together with other features from project Loom, please see my previous blog post, <a href="https://blog.jetbrains.com/idea/2026/08/project-loom-in-intellij-idea-virtual-threads-scoped-values-and-structured-concurrency/"><em>Project Loom in IntelliJ IDEA: Virtual Threads, Scoped Values, and Structured Concurrency</em></a>.</p>



<p>As mentioned in that blog post, there is a live template for quickly scaffolding a <code>StructuredTaskScope</code>. You can pull up a list of available <a href="https://www.jetbrains.com/help/idea/using-live-templates.html" target="_blank" rel="noopener">live templates</a> in IntelliJ IDEA using the shortcut (<em>⌘J</em> on macOS / <em>Ctrl+J</em> on Windows and Linux). Alternatively, you can use <a href="https://www.jetbrains.com/help/idea/command-completion.html" target="_blank" rel="noopener">command completion</a>: Type .. – and a list of all commands relevant to your current context will appear. You can even type part of the name of the command (for example “live” for Show live templates), and the relevant command will show up as part of regular completion.&nbsp;</p>



<p>The list of live templates is searchable, both by name and description. If we search for “structured”, we will find the live template <code>sts</code>.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Java27_Show-live-templates.mp4"></video><figcaption class="wp-element-caption"><em>Use command completion to Show live templates</em></figcaption></figure>



<p>For more information on command completion, see my previous blog post, <a href="https://blog.jetbrains.com/idea/2025/11/universal-entry-point-a-single-entry-point-for-context-aware-coding-assistance/"><em>Universal Entry Point: A Single Entry Point for Context-Aware Coding Assistance</em></a>.</p>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/538" target="_blank" rel="noopener">JEP 538: PEM encodings of cryptographic objects (third preview)</a></h2>



<p>As <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/#jep-524-pem-encodings-of-cryptographic-objects-second-preview">described</a> in <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/"><em>Java 26 in IntelliJ IDEA</em></a>, this JEP provides a preview API for encoding and decoding cryptographic objects (keys, certificates, and certificate revocation lists) to and from the Privacy-Enhanced Mail (PEM) format.</p>



<p>The API has undergone further changes in Java 27 compared to the previous version.</p>



<h1 class="wp-block-heading">Incubator features in Java 27</h1>



<p><a href="https://openjdk.org/jeps/11" target="_blank" rel="noopener">Incubator modules</a> are experimental APIs. They are explicitly non-final APIs and tools, made available for developers to try out. Unlike preview features, incubator features may change significantly, or even be removed in future releases. They are not intended for production use.</p>



<p>To use an incubator feature, you’ll need to explicitly add the module while you run the code, by adding the <code>--add-modules</code> command-line option for that specific module.</p>



<p>If you are running the code from IntelliJ IDEA, you can add command line options to the run configurations for your application. Select the run configuration for your program and click the three dots for <em>More Actions</em>. Select <em>Edit</em> to open the <em>Run/Debug Configurations</em>. Click the link <em>Modify Options</em>, and in the <em>Add Run Options</em> popup, select <em>Add VM Options</em>. A new field will appear with the hint VM Options. Add the command line option to that field.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Java27_Add-VM-Options.mp4"></video><figcaption class="wp-element-caption"><em>Add VM Options</em></figcaption></figure>



<h2 class="wp-block-heading"><a href="https://openjdk.org/jeps/537" target="_blank" rel="noopener">JEP 537: Vector API (twelfth incubator)</a></h2>



<p>As <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/#jep-529-vector-api-eleventh-incubator">described</a> in <a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/"><em>Java 26 in IntelliJ IDEA</em></a>, this JEP introduces an API that allows developers to express vector computations that reliably compile to optimal vector instructions on supported CPUs. Vector operations enable more work to be performed in a single CPU cycle, which can result in significant performance gains.</p>



<p>As this is an incubator module, you’ll have to provide a command line option to add the module explicitly, as described above. To use the Vector API, add the following command line option: <code>--add-modules jdk.incubator.vector</code>.</p>



<p>There are no changes to the Vector API in Java 27, compared to Java 26. This feature will continue to incubate until the required features of <a href="https://openjdk.org/projects/valhalla/" target="_blank" rel="noopener">Project Valhalla</a> become available as preview features.</p>



<h1 class="wp-block-heading">Other changes: Debugger improvements</h1>



<p>Other than JEPs, JDK 27 contains bug fixes, like <a href="https://bugs.openjdk.org/browse/JDK-6960970" target="_blank" rel="noopener">JDK-6960970</a>. The debugger was very slow during stepping. This has been fixed in JDK 27, which means that stepping through the debugger is faster now. Our engineers have <a href="https://youtrack.jetbrains.com/issue/JBR-10441" target="_blank" rel="noopener">backported this fix to JetBrains Runtime (JBR) 25</a>, so they can use it when stepping during debugging the code for IntelliJ IDEA itself. This shows that it is possible to backport this change to Java 25 and that the change works correctly. If you want to take advantage of this change, you can use JBR 25 or ask your vendor to backport this change.</p>



<h1 class="wp-block-heading">Looking ahead</h1>



<p>Features from Project Valhalla have started making their way into Java. Both <a href="https://openjdk.org/jeps/401" target="_blank" rel="noopener">value objects (JEP 401)</a> and <a href="https://openjdk.org/jeps/539" target="_blank" rel="noopener">strict field initialization in the JVM (JEP 539)</a> have been targeted to <a href="https://openjdk.org/projects/jdk/28/" target="_blank" rel="noopener">JDK 28</a> as preview features. This means that if you want to try out these features, you no longer have to download a special Valhalla distribution. You can download the JDK 28 EA (Early Access) version. This version is available for download from inside IntelliJ IDEA.</p>



<p>If you have already downloaded JDK 28 EA, you can point IntelliJ IDEA to your installation as well.</p>



<h1 class="wp-block-heading">Conclusion</h1>



<p>While not an LTS release, Java 27 brings security and performance improvements and continues to evolve several important preview features. IntelliJ IDEA supports Java 27 from day one and will continue to support the latest Java features. Please let us know if you have any feedback.</p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[fr]]></code>
                        <url>https://blog.jetbrains.com/fr/idea/2026/09/java-27-in-intellij-idea/</url>
                    </language>
                	</item>
		<item>
		<title>The Evolution of WSL Support in JetBrains IDEs</title>
		<link>https://blog.jetbrains.com/platform/2026/09/the-evolution-of-wsl-support-in-jetbrains-ides/</link>
		
		<dc:creator><![CDATA[Kristina Pchelintseva]]></dc:creator>
		<pubDate>Wed, 09 Sep 2026 10:39:49 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/JB-social-BlogFeatured-1280x720-1.png</featuredImage>		<product ><![CDATA[idea]]></product>
		<product ><![CDATA[phpstorm]]></product>
		<product ><![CDATA[webstorm]]></product>
		<category><![CDATA[ecosystem]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[intellij-platform]]></category>
		<category><![CDATA[remote-development]]></category>
		<category><![CDATA[webstorm]]></category>
		<category><![CDATA[intellij-idea]]></category>
		<category><![CDATA[phpstorm]]></category>
		<category><![CDATA[wsl]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=platform&#038;p=738427</guid>

					<description><![CDATA[JetBrains IDEs have worked with WSL for many years, and over time, several ways of using it have emerged across our products. Depending on the entry point, the IDE could rely on a different underlying architecture, leading to a different experience. Starting with the 2026.2 release, there is one recommended entry point. In IntelliJ IDEA, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>JetBrains IDEs have worked with WSL for many years, and over time, several ways of using it have emerged across our products. Depending on the entry point, the IDE could rely on a different underlying architecture, leading to a different experience.</p>



<p>Starting with the 2026.2 release, there is one recommended entry point. In IntelliJ IDEA, WebStorm, and PhpStorm, opening a project that lives in WSL runs the IDE in what we call <em>Native</em> mode. The IDE stays a Windows application, while a small agent inside WSL handles files and processes on its behalf.</p>



<p>Below is how <em>Native</em> mode works, how our approach to WSL integration evolved to get here, and – since we tried three other approaches first – why we&#8217;re confident it&#8217;s the right foundation for your work.</p>



<h2 class="wp-block-heading">What it takes to support WSL in an IDE</h2>



<p>We’ll start with an idealized picture in which the IDE functions seamlessly inside WSL while being operated from Windows. In practical terms, “seamlessly” means you should be able to use any of the IDE&#8217;s capabilities – terminal, run and debug configurations, profiling, etc. – against a project that resides in a Linux environment. Not only that, but this must incur as little latency as possible for the coding experience to feel quick and natural, as if the project files and the IDE itself resided in a single operating-system environment.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image3.jpg" alt="" class="wp-image-738429"/></figure>



<p>We’ll trace how this challenge has been addressed, beginning with the earliest implementation, in which the IDE interacted with WSL through the 9P transport protocol. We will then cover Remote Development and WSLg before examining <em>Native</em> mode – the currently preferred mode for how IDEs work with WSL.</p>



<h2 class="wp-block-heading">Toward native IDE execution in WSL </h2>



<h3 class="wp-block-heading">9P filesystem access and GeneralCommandLine</h3>



<p>For the IDE to function, it needs access to the basics of a project, which are plain files. This is where the 9P filesystem protocol comes in. It provides the mechanism that allows Windows-side processes access files inside WSL. In practice, project-related file I/O performed by the IDE – scanning, indexing, archive access, and similar operations – is routed through the 9P-based filesystem layer to the Linux virtual machine.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image5.jpg" alt="" class="wp-image-738440"/></figure>



<p>Once file access is accounted for, the next challenge is process execution. While running on Windows, the IDE must be able to invoke tools inside WSL with the correct Linux paths, working directories, executables, environment variables, and arguments. The IDE-internal <a href="https://github.com/17712484466/intellij-community/blob/master/platform/platform-api/src/com/intellij/execution/configurations/GeneralCommandLine.java" target="_blank" rel="noopener"><code>GeneralCommandLine</code></a> class manages this by normalizing command execution in the WSL environment.</p>



<p>While this architecture enables the IDE to operate against WSL, it introduces significant trade-offs in both file access and process execution.</p>



<p>The 9P protocol is known to be problematic for several reasons:</p>



<ul class="wp-block-list">
<li>Limited symlink handling – 9P does not properly expose Linux symbolic links to Windows through <code>\\wsl$</code>. As a result, the IDE may detect an entry but be unable to resolve or index the linked directory tree. This affects pnpm workspaces, Python virtual environments, PHP Composer path repositories, and other environments that rely on symlinks.</li>



<li>Microsoft Defender scans – on-access scanning over 9P can stretch WSL file reads by tens of seconds.</li>



<li>Latency and degraded throughput – 9P-backed filesystem access adds latency, and throughput can degrade significantly, especially in workflows involving many small files. Core IDE operations such as indexing follow this pattern, generating numerous separate requests that cross the Windows/WSL VM boundary through 9P.</li>
</ul>



<p>The situation was no less challenging on the <code>GeneralCommandLine</code> side. The pipeline added a maintenance burden, as developers had to account for WSL-specific execution semantics across the codebase.</p>



<p>As a consequence, the approach became increasingly difficult to scale and maintain, and it surfaced persistent issues with symlink handling and performance.</p>



<h3 class="wp-block-heading">Running the IDE inside WSL with WSLg</h3>



<p>What if, instead, the IDE itself resided inside WSL, close to the project it works with? This is where WSLg comes in. It provides a way to run Linux GUI applications whose visual output is integrated directly into the Windows desktop.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image4.jpg" alt="" class="wp-image-738451"/></figure>



<p>Here’s why we do not recommend the WSLg approach:</p>



<ul class="wp-block-list">
<li>From a product perspective, if the IDE is displayed on Windows, it is preferable for it to behave as a Windows-native application rather than as a Linux GUI application projected into the Windows desktop. This preserves greater control over the IDE experience and avoids dependence on an additional GUI-remoting layer.</li>



<li>In a WSLg setup, the IDE may run on the native Wayland path, where JetBrains Runtime uses WLToolkit against WSLg&#8217;s Wayland compositor. This path carries known limitations in rendering, popups, window management, input methods, and desktop integration.</li>
</ul>



<p>No first-class product experience was ever built around this setup. Although running the IDE through WSLg is technically viable, it has never been considered the preferred direction, and no dedicated out-of-the-box installation or onboarding flow was provided. It remains an ad hoc workaround rather than a supported IDE workflow.</p>



<h3 class="wp-block-heading">The Remote Development approach</h3>



<p>Another approach was Remote Development, which addressed the same fundamental challenges of file access and process execution from a different angle. Rather than extending the Windows-based IDE across the WSL boundary, it moved the IDE backend into WSL and kept only the client on Windows. This architecture solved the underlying integration problems more directly, but introduced a different set of trade-offs.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image6.jpg" alt="" class="wp-image-738462"/></figure>



<p>The main technical challenge of this configuration is establishing and maintaining communication between them while ensuring that the UI accurately reflects user actions and the IDE continues to function as a coherent whole. At the same time, placing the backend inside WSL provides the clear advantage of direct access to Linux files and processes.</p>



<p>In this setup, the two IDE parts communicate over the JetBrains RD protocol. The protocol is a structured, bidirectional stream of IDE models and events that keeps the thin client and the backend IDE logically in sync, while all heavy work, such as indexing, analysis, builds, debugging, VCS operations, and so on, happens on the backend.</p>



<p>The client, in its turn:</p>



<ul class="wp-block-list">
<li>Renders all windows and editors, and handles user input.</li>



<li>Mirrors the project and editor state it receives from the backend over the RD protocol, and sends back edits, caret moves, refactoring commands, debug actions, and so on.</li>



<li>Loads UI-level plugins.</li>
</ul>



<p>The elephant in the room, however, is the cost of this split architecture. The IDE backend is a heavyweight component in its own right, requiring roughly 2 GB of additional disk space and time to download and install inside WSL. The split also introduces an inherent performance penalty, as UI-event state, user input, and other interaction data must travel continuously between the local client and the backend.</p>



<p>It also adds development overhead, as the code has to be split into client and server parts. Leaving specific modules undivided can cause delays and freezes in highly dynamic UIs. The associated engineering effort therefore becomes a constant and unavoidable cost.</p>



<h3 class="wp-block-heading"><em>Native</em> mode and the IJent agent</h3>



<p>The current design – now integrated into most of our IDEs – represents the culmination of this work and addresses many of the shortcomings of earlier approaches to WSL.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/WSL-Native-Mode.jpg" alt="" class="wp-image-738562"/></figure>



<p>To provide access to the Linux filesystem, processes, and other environment resources without relying on 9P, <code>GeneralCommandLine</code>, or other second-class communication mechanisms, we developed a small agent named IJent. Because it is designed specifically for IDE scenarios, we can shape its behavior, protocol, and capabilities according to our requirements.</p>



<p>Together, the IDE and IJent form a client–server pair. This may resemble the Remote Development model, but the server component is much thinner and, at the same time, more versatile. Installing IJent into a WSL environment is merely one of several possible configurations; the same model can also apply to Docker and Dev Containers.</p>



<p>By choosing this particular technology stack, we address a broad set of concerns:</p>



<ul class="wp-block-list">
<li>Rust implementation – Rust keeps the executable slim. By avoiding Java/Kotlin for the agent, we eliminate additional runtime dependencies inside containers or WSL.</li>



<li>Transport layer – Stdio gives us a portable, firewall-friendly transport across all environments. Hyper-V sockets on WSL offer a faster path, which is especially beneficial for large or numerous filesystem transfers.</li>



<li>Correct filesystem semantics – IJent executes filesystem operations on behalf of the IDE inside the target environment. As a result, path resolution, including symbolic links, follows correct Linux semantics rather than being mediated through 9P. Third-party plugins also benefit from this model, since their file operations are routed through IJent.</li>
</ul>



<p></p>



<h4 class="wp-block-heading">EelApi: one interface for any environment</h4>



<p>For the IDE to fully benefit from IJent, changes on the IDE side are also required. Enter EelAPI.</p>



<p>EelApi is an API designed to abstract away the distinction between local and remote environments for everyone writing IDE-related code – plugin authors and platform contributors alike. With EelApi, the underlying environment against which the IDE operates should no longer matter, removing the need to account for these concerns explicitly in code. In this sense, EelApi is platform-agnostic, and the IDE can remain unaware of whether it is working locally, in WSL, in Docker, or in a Dev Container.</p>



<p>In general, IJent implements the EelApi interface, providing the actual functionality that EelApi exposes to the IDE and plugins.</p>



<p>If you’re interested in a more detailed explanation of EelApi, together with a practical introduction to the topic, head over to the article <a href="https://blog.jetbrains.com/platform/2026/06/the-dev-containers-story-introducing-eelapi-for-plugin-authors">The Dev Containers Story: Introducing EelApi for Plugin Authors</a>.</p>



<h2 class="wp-block-heading">What this means in practice</h2>



<p>There are two ways to open a WSL project today:</p>



<ul class="wp-block-list">
<li>Opening the project directly gives you <em>Native</em> mode in IntelliJ IDEA, WebStorm, and PhpStorm, and more IDEs are adopting the IJent and EelApi architecture as we speak.</li>



<li>The Remote Development entry point on the Welcome screen still works, but it is no longer the recommended way to open a WSL project.</li>
</ul>



<p>We conducted performance tests in order to compare 9P mode and <em>Native</em> mode. The results show a clear performance gain in favor of the new approach:</p>



<section class="jb-wsl-perf-widget" data-jb-wsl-perf-widget aria-labelledby="jb-wsl-perf-title">
  <style>
    .jb-wsl-perf-widget {
      --jb-wsl-perf-text: #19191c;
      --jb-wsl-perf-muted: #5f5f66;
      --jb-wsl-perf-line: #d9d9e3;
      --jb-wsl-perf-soft: #f4f4f7;
      --jb-wsl-perf-track: #e9e9ee;
      --jb-wsl-perf-legacy: #7b7b84;
      --jb-wsl-perf-accent: #6b57ff;
      color: var(--jb-wsl-perf-text);
      font: inherit;
      margin: 32px 0;
    }
    .jb-wsl-perf-widget * { box-sizing: border-box; }
    .jb-wsl-perf-panel {
      background: #fff;
      border: 1px solid var(--jb-wsl-perf-line);
      border-radius: 8px;
      overflow: hidden;
    }
    .jb-wsl-perf-header {
      display: grid;
      gap: 18px;
      grid-template-columns: minmax(0, 1fr);
      padding: 26px 28px 24px;
    }
    .jb-wsl-perf-eyebrow {
      color: var(--jb-wsl-perf-accent);
      font-size: 12px;
      font-weight: 700;
      letter-spacing: .08em;
      line-height: 1.3;
      margin: 0 0 8px;
      text-transform: uppercase;
    }
    .jb-wsl-perf-title {
      color: var(--jb-wsl-perf-text);
      font-size: clamp(24px, 4vw, 34px);
      font-weight: 700;
      letter-spacing: -.02em;
      line-height: 1.15;
      margin: 0;
      max-width: 680px;
    }
    .jb-wsl-perf-chart {
      border-top: 1px solid var(--jb-wsl-perf-line);
      padding: 24px 28px 26px;
    }
    .jb-wsl-perf-legend {
      display: flex;
      flex-wrap: wrap;
      gap: 10px 20px;
      margin: 0 0 20px;
    }
    .jb-wsl-perf-legend-item {
      align-items: center;
      color: var(--jb-wsl-perf-muted);
      display: inline-flex;
      font-size: 13px;
      gap: 7px;
      line-height: 1.3;
    }
    .jb-wsl-perf-swatch {
      background: var(--jb-wsl-perf-legacy);
      border-radius: 2px;
      display: inline-block;
      height: 10px;
      width: 10px;
    }
    .jb-wsl-perf-swatch-ijent { background: var(--jb-wsl-perf-accent); }
    .jb-wsl-perf-rows { display: grid; gap: 22px; }
    .jb-wsl-perf-row {
      display: grid;
      gap: 12px;
      grid-template-columns: minmax(130px, .7fr) minmax(220px, 2fr);
      min-width: 0;
    }
    .jb-wsl-perf-metric {
      align-self: center;
      color: var(--jb-wsl-perf-text);
      font-size: 15px;
      font-weight: 700;
      line-height: 1.35;
    }
    .jb-wsl-perf-bars { display: grid; gap: 7px; min-width: 0; }
    .jb-wsl-perf-barline {
      align-items: center;
      display: grid;
      gap: 10px;
      grid-template-columns: minmax(0, 1fr) 52px;
    }
    .jb-wsl-perf-track {
      background: var(--jb-wsl-perf-track);
      border-radius: 3px;
      height: 13px;
      overflow: hidden;
    }
    .jb-wsl-perf-fill {
      background: var(--jb-wsl-perf-legacy);
      border-radius: 3px;
      display: block;
      height: 100%;
    }
    .jb-wsl-perf-fill-ijent { background: var(--jb-wsl-perf-accent); }
    .jb-wsl-perf-number {
      color: var(--jb-wsl-perf-muted);
      font-size: 13px;
      font-variant-numeric: tabular-nums;
      line-height: 1;
      white-space: nowrap;
    }
    .jb-wsl-perf-delta {
      color: #3a327d;
      font-size: 12px;
      font-weight: 700;
      line-height: 1.3;
      margin: 3px 0 0;
    }
    .jb-wsl-perf-notes {
      background: var(--jb-wsl-perf-soft);
      border-top: 1px solid var(--jb-wsl-perf-line);
      display: grid;
      gap: 10px;
      grid-template-columns: repeat(2, minmax(0, 1fr));
      padding: 18px 28px 20px;
    }
    .jb-wsl-perf-note {
      color: var(--jb-wsl-perf-muted);
      font-size: 13px;
      line-height: 1.5;
      margin: 0;
    }
    .jb-wsl-perf-note strong { color: var(--jb-wsl-perf-text); }
    @media (max-width: 640px) {
      .jb-wsl-perf-header { grid-template-columns: 1fr; padding: 22px 18px 20px; }
      .jb-wsl-perf-chart { padding: 21px 18px 23px; }
      .jb-wsl-perf-row { gap: 8px; grid-template-columns: 1fr; }
      .jb-wsl-perf-notes { grid-template-columns: 1fr; padding: 17px 18px 19px; }
    }
    @media (prefers-color-scheme: dark) {
      .jb-wsl-perf-widget {
        --jb-wsl-perf-text: #f4f4f7;
        --jb-wsl-perf-muted: #b7b7bf;
        --jb-wsl-perf-line: #45454d;
        --jb-wsl-perf-soft: #29292e;
        --jb-wsl-perf-track: #414148;
        --jb-wsl-perf-legacy: #a4a4ac;
        --jb-wsl-perf-accent: #9d8cff;
      }
      .jb-wsl-perf-panel { background: #202024; }
      .jb-wsl-perf-delta { color: #c7bdff; }
    }
  </style>

  <div class="jb-wsl-perf-panel">
    <div class="jb-wsl-perf-header">
      <div>
        <p class="jb-wsl-perf-eyebrow">Cold-open benchmark</p>
        <p class="jb-wsl-perf-title" id="jb-wsl-perf-title">IJent cuts 38% off the wait for a large WSL project</p>
      </div>
    </div>

    <div class="jb-wsl-perf-chart" aria-label="Median duration in seconds: 9P compared with IJent">
      <div class="jb-wsl-perf-legend" aria-label="Chart legend">
        <span class="jb-wsl-perf-legend-item"><span class="jb-wsl-perf-swatch" aria-hidden="true"></span>9P</span>
        <span class="jb-wsl-perf-legend-item"><span class="jb-wsl-perf-swatch jb-wsl-perf-swatch-ijent" aria-hidden="true"></span>IJent</span>
      </div>
      <div class="jb-wsl-perf-rows">
        <div class="jb-wsl-perf-row">
          <div class="jb-wsl-perf-metric">Ready to work</div>
          <div class="jb-wsl-perf-bars">
            <div class="jb-wsl-perf-barline"><span class="jb-wsl-perf-track"><span class="jb-wsl-perf-fill" style="width:100%"></span></span><span class="jb-wsl-perf-number">18.5 s</span></div>
            <div class="jb-wsl-perf-barline"><span class="jb-wsl-perf-track"><span class="jb-wsl-perf-fill jb-wsl-perf-fill-ijent" style="width:62.2%"></span></span><span class="jb-wsl-perf-number">11.5 s</span></div>
            <p class="jb-wsl-perf-delta">38% less</p>
          </div>
        </div>
        <div class="jb-wsl-perf-row">
          <div class="jb-wsl-perf-metric">Scan project tree</div>
          <div class="jb-wsl-perf-bars">
            <div class="jb-wsl-perf-barline"><span class="jb-wsl-perf-track"><span class="jb-wsl-perf-fill" style="width:43.8%"></span></span><span class="jb-wsl-perf-number">8.1 s</span></div>
            <div class="jb-wsl-perf-barline"><span class="jb-wsl-perf-track"><span class="jb-wsl-perf-fill jb-wsl-perf-fill-ijent" style="width:20%"></span></span><span class="jb-wsl-perf-number">3.7 s</span></div>
            <p class="jb-wsl-perf-delta">54% less</p>
          </div>
        </div>
        <div class="jb-wsl-perf-row">
          <div class="jb-wsl-perf-metric">Index files</div>
          <div class="jb-wsl-perf-bars">
            <div class="jb-wsl-perf-barline"><span class="jb-wsl-perf-track"><span class="jb-wsl-perf-fill" style="width:58.4%"></span></span><span class="jb-wsl-perf-number">10.8 s</span></div>
            <div class="jb-wsl-perf-barline"><span class="jb-wsl-perf-track"><span class="jb-wsl-perf-fill jb-wsl-perf-fill-ijent" style="width:45.4%"></span></span><span class="jb-wsl-perf-number">8.4 s</span></div>
            <p class="jb-wsl-perf-delta">22% less</p>
          </div>
        </div>
        <div class="jb-wsl-perf-row">
          <div class="jb-wsl-perf-metric">Read file content</div>
          <div class="jb-wsl-perf-bars">
            <div class="jb-wsl-perf-barline"><span class="jb-wsl-perf-track"><span class="jb-wsl-perf-fill" style="width:65.9%"></span></span><span class="jb-wsl-perf-number">12.2 s</span></div>
            <div class="jb-wsl-perf-barline"><span class="jb-wsl-perf-track"><span class="jb-wsl-perf-fill jb-wsl-perf-fill-ijent" style="width:30.8%"></span></span><span class="jb-wsl-perf-number">5.7 s</span></div>
            <p class="jb-wsl-perf-delta">53% less</p>
          </div>
        </div>
      </div>
    </div>

    <div class="jb-wsl-perf-notes">
      <p class="jb-wsl-perf-note"><strong>Where this applies:</strong> A cold first open of <code>spring-framework</code>, with 23 subprojects and 8,191 source files. A small project with few source files showed no measurable difference.</p>
      <p class="jb-wsl-perf-note"><strong>Test setup:</strong> Median of five measured runs on Windows 11 with WSL 2, Ubuntu 24.04, and IntelliJ IDEA Ultimate 263.SNAPSHOT.</p>
    </div>
  </div>
</section>



<p>Beyond performance, this architecture places development in WSL within the broader context of development in non-local environments, allowing them to be approached through the same underlying model. The same IJent agent already backs our work on Docker and Dev Containers.</p>



<p>Thank you for reading and for all the feedback that helped us reach this point. Tell us how <em>Native</em> mode holds up against your projects in the comments below.</p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[zh-hans]]></code>
                        <url>https://blog.jetbrains.com/zh-hans/platform/2026/09/the-evolution-of-wsl-support-in-jetbrains-ides/</url>
                    </language>
                                    <language>
                        <code><![CDATA[fr]]></code>
                        <url>https://blog.jetbrains.com/fr/platform/2026/09/the-evolution-of-wsl-support-in-jetbrains-ides/</url>
                    </language>
                	</item>
		<item>
		<title>Debug Past an HTTP 403 Without Breaking Spring Security</title>
		<link>https://blog.jetbrains.com/idea/2026/09/debug-past-an-http-403-without-breaking-spring-security/</link>
		
		<dc:creator><![CDATA[Andrey Belyaev]]></dc:creator>
		<pubDate>Tue, 08 Sep 2026 12:34:18 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/IJ-social-BlogFeatured-1280x720-1-9.png</featuredImage>		<category><![CDATA[features]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-debugger]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=730371</guid>

					<description><![CDATA[You set a breakpoint inside a Spring MVC controller, or a service, send the request to an HTTP endpoint, and nothing happens. The response is back &#8211; and it is a 403 (or 401, or a redirect to a login page). At that point, the bug you were trying to catch is no longer the [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>You set a breakpoint inside a Spring MVC controller, or a service, send the request to an HTTP endpoint, and nothing happens. The response is back &#8211; and it is a 403 (or 401, or a redirect to a login page).</p>



<p>At that point, the bug you were trying to catch is no longer the only problem. Now, you need to answer different questions:</p>



<ul class="wp-block-list">
<li>Which roles or authorities does the endpoint require?</li>



<li>Should I just disable the security temporarily to debug the logic behind it, maybe?</li>
</ul>



<p>Security inlays in IntelliJ IDEA are designed for that moment. Instead of updating <code>SecurityConfig</code> temporarily and restarting the app, or fiddling with the authentication in the HTTP test tool, you can inspect and adjust the runtime security right inside the IDE.</p>



<h2 class="wp-block-heading">See What the Endpoint Requires</h2>



<p>When a secured endpoint blocks a request, the first question is &#8220;which roles does the running app require right now for this endpoint?&#8221;</p>



<p>The inlay displays the role-based requirement for an endpoint &#8211; the <code>hasRole</code> / <code>hasAuthority</code>-shaped matchers that most HTTP authorization is built from. However, not every security rule can be displayed with a roles list. For example, rules defined in code in a custom <code>AuthorizationManager</code> show up as unknown &#8211; a single lock icon, without roles.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-25.png" alt="" class="wp-image-737792"/></figure>



<p>Seeing the actual endpoint security state is important in real Spring applications. Authorization can depend on multiple <code>SecurityFilterChain</code> beans, matcher order, active profiles, and conditionally registered configurations. Reading <code>SecurityConfig</code> classes you can find is not always the same as knowing what the running application requires.</p>



<p>If the roles list isn&#8217;t what you expected to see, you still need to read <code>SecurityConfig</code> classes anyway. So, the inlay provides a config link to the real security configuration code behind the endpoint.</p>



<h2 class="wp-block-heading">Unlock the Endpoint for the Current Debug Session</h2>



<p>When you figure out which roles the endpoint requires, the next question is: &#8220;Should I skip endpoint authorization, or resend the request with a specific authority set?&#8221; Both options are available within the unlock action in the inlay popup.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-26.png" alt="" class="wp-image-737803"/></figure>



<p><strong>Read this before you click Unlock.</strong> Unlock acts on the running process itself, not just on requests sent from the IDE. Any client hitting that exact URI and method is affected: <code>curl</code>, Postman, a browser, etc. If the debugged app is reachable on your network, any request to that exact URI and method is treated as authenticated with the authorities you granted &#8211; for anyone. Unlock endpoints carefully, and re-lock or restart when you are done.</p>



<p>Since unlocking is a security-affecting action, it is worth mentioning what it opens and for how long:</p>



<ul class="wp-block-list">
<li><strong>Scope</strong> &#8211; applies to the exact request URI <em>and</em> HTTP method. The concrete URI comes from the request you&#8217;re working with when you unlock &#8211; the failing request in your <code data-enlighter-language="generic" class="EnlighterJSRAW">.http</code> file, browser, or curl command. Unlocking <code>GET /admin/users/42</code> in the IDEA HTTP Client leaves <code>POST /admin/users/42</code> and <code>GET /admin/users/99</code> blocked. Unlocking <code>@GetMapping("/admin/users/{id}")</code> in the controller code will unlock the endpoint for any <code>{id}</code> value.</li>



<li><strong>Layer</strong> &#8211; covers HTTP endpoint authorization only; method-level checks such as <code>@PreAuthorize</code> are evaluated separately (see &#8220;What Unlock Does Not Cover&#8221; below).</li>



<li><strong>Lifetime</strong> &#8211; lasts only for the running debug session, or until you lock the path again. Restarting the app clears every unlock. Both a full JVM restart and a Spring Boot DevTools in-process restart work. The unlocked paths and their authority sets live on the session and go with it.</li>



<li><strong>Persists</strong> &#8211; nothing in the app. The only thing kept is IDE-local: the username you last impersonated, per endpoint, to pre-fill on re-unlock.</li>
</ul>



<p>So, depending on your tasks, you can do the following using the security indicator inlay:</p>



<h3 class="wp-block-heading">Simple Unlock</h3>



<p>Sometimes security is not what you are testing. You already know the endpoint is protected, but you need to reach the logic behind it. Unlocking treats the request as authenticated with the full set of roles that the endpoint requires, for that URI and method. Spring Security just sees an identity that passes and you can continue the debugging task you were doing. This is the right mode when the real tasks are:</p>



<ul class="wp-block-list">
<li>validate request or mapping logic in the controller;</li>



<li>debug a service behind a protected route;</li>



<li>a smoke test that is blocked by a local authentication setup;</li>



<li>a bug reproduction you do not want to interrupt with config edits and restarts.</li>
</ul>



<p>If the IDE cannot evaluate the roles list for the endpoint, this functionality is not available. For this case, use&#8230;</p>



<h3 class="wp-block-heading">Unlock with custom authorities</h3>



<p>The inlay popup menu also allows you to specify a username and a custom role list. Treat this as a way to test a specific authority set. It lets you check authority-based behavior behind the endpoint without creating a real account, changing test data, or going through a full SSO or token flow.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-27.png" alt="" class="wp-image-737815"/></figure>



<p>For example, you can enter the username <code>admin</code> with <code>ROLE_ADMIN</code>, <code>ROLE_MANAGER</code> authorities in the popup. Resend the request, and answer questions like:</p>



<ul class="wp-block-list">
<li>Does the controller return the expected data when the request has specified authorities?</li>



<li>Is the problem in the controller logic, or in the authority set used for the request?</li>



<li>How does downstream code &#8211; branching, data filtering, authority checks &#8211; behave for this exact authority set?</li>



<li>Does the audit engine record a proper username &#8211; <code>admin</code>?</li>
</ul>



<p>When you perform either of these actions, the request runs with an artificial <code>Authentication</code> in the <code>SecurityContext</code>, created inside the running application by the debugger with the username and roles you chose. Code that reads the authority set &#8211; via <code>hasRole / hasAuthority</code> checks, <code>SecurityContextHolder.getContext().getAuthentication()</code>, or a <code>Principal / Authentication</code><em> </em>method parameter &#8211; sees the authorities provided by IntelliJ IDEA.</p>



<p>One thing to watch for: a controller parameter annotated with <code>@AuthenticationPrincipal</code> does not resolve for inlay-unlocked requests &#8211; it comes back null. This is a known bug, <a href="https://youtrack.jetbrains.com/issue/IDEA-389767" target="_blank" rel="noopener">IDEA-389767</a>, which is open and affects 2026.2 as of this writing &#8211; check it for the current status. (See &#8220;How Unlocking Works Under the Hood&#8221; below for why.)</p>



<p>Compared with the usual local workarounds &#8211; a <code>permitAll</code> dev profile, a mock authenticator, a commented-out filter &#8211; nothing rebuilds or restarts the app, and nothing stays in configuration code that could accidentally get into a production environment.</p>



<h2 class="wp-block-heading">How Unlocking Works Under the Hood</h2>



<p>Is unlocking a backdoor, or a CSRF bypass? Neither &#8211; unlock doesn&#8217;t disable or suspend anything. It treats the request as authenticated with the authorities you granted, for that exact URI and method, and lets Spring Security evaluate it from there.</p>



<p>If your app enforces CSRF tokens on state-changing requests, <code>CsrfFilter</code> runs earlier in the chain and still rejects a <code>POST / PUT / DELETE</code> with a missing or invalid token. So, you still need a valid token, or a CSRF-exempt setup, separately.</p>



<p>Unlocking is a debug-time feature. Please note that it&#8217;s an internal mechanism, not a public IDE API.</p>



<p>On application startup, the debugger places a hidden, non-suspending breakpoint at Spring Security&#8217;s own <code>AuthorizationFilter</code> &#8211; the exact spot where Spring decides whether a request is allowed. After Spring application context initialization, the IDE reads the effective HTTP authorization rules. Instead of parsing your source, the debugger reads the live <code>SecurityFilterChain</code> out of the running JVM to figure out what each endpoint requires. That is why the inlay shows the actual list of authorities at the HTTP layer. Clicking Unlock adds the URL, username, and roles to a set the IDE keeps for the debug session. The application code and security config are untouched.</p>



<p>The rest of the work happens per request, without pausing anything. When a request hits an &#8220;unlocked&#8221; URL, the execution flow passes the non-suspending breakpoint in the <code>AuthorizationFilter</code>. If the URL is in the &#8220;unlocked&#8221; list, the debugger adds a <code>TestingAuthenticationToken</code> instance to Spring&#8217;s <code>SecurityContext</code>. This auth object is already marked as authenticated, with the chosen username as principal and the &#8220;unlock&#8221; roles as granted authorities. Then the request goes on. Later the authorization engine reads the security context, sees the supplied authenticated principal, and evaluates it normally. For any URL you did not unlock, the breakpoint evaluation returns immediately and normal security applies.</p>



<p>The principal used in the auth object is the plain username <code>String</code>, not your app&#8217;s <code>UserDetails</code> or other custom principal type. That&#8217;s why a controller parameter annotated with <code>@AuthenticationPrincipal</code> (or any custom principal class) does not resolve for inlay-unlocked requests, as mentioned in the &#8220;Unlock the Endpoint for the Current Debug Session&#8221; chapter.</p>



<p>You can inject the auth object as a controller method parameter, since the artificial auth object is available through the <code>SecurityContextHolder</code>. So the following code should work fine:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@GetMapping("/active")

    ResponseEntity&lt;List&lt;Member>> getAllActive(Principal principal) {

        log.info("Auth Principal Name: {}", principal.getName());

        //...

    }</pre>



<p>Please note that those parameters need to be declared as the base type for <code>TestingAuthenticationToken</code>: <code>Principal</code> or <code>Authentication</code>, not a concrete subtype. A parameter typed as <code>JwtAuthenticationToken</code>, for instance, throws an <code>IllegalStateException</code> at request time instead of resolving, because Spring MVC checks that the real principal &#8211; the injected <code>TestingAuthenticationToken</code> &#8211; is actually an instance of the declared type. That&#8217;s a more visible failure than <code>@AuthenticationPrincipal</code>&#8216;s silent null, though the root cause is the same type mismatch. Code that depends on a concrete principal object type, token subtype, claims, credentials, or session-backed identity may still behave differently or even fail for unlocked endpoints.</p>



<p>Unlock hooks <code>AuthorizationFilter</code>, the filter behind authorizeHttpRequests and the AuthorizationManager API. This API is available since Spring Security 5.x and the non-deprecated path in 6.x. If your configuration still uses the older <code>authorizeRequests / FilterSecurityInterceptor</code>, that filter never runs, so unlock does not apply.</p>



<p>Security inlays are turned on by default, and only work while the Spring Debugger is active. You can turn them off with the <code>spring.debugger.security.enabled</code> flag in IntelliJ&#8217;s Registry (open it with Find Action → <em>Registry…</em>). Security inlays also work with a remote JVM, including a shared or staging environment. Please note that there is no log message and no actuator indicator if someone has unlocked an endpoint on the remote application. The only way to check is to look at the inlay in the editor of the attached IDE.</p>



<h2 class="wp-block-heading">What Unlock Does Not Cover</h2>



<p>Unlock works with HTTP endpoint security: rules like <code>SecurityFilterChain</code> URL matching, and <code>requestMatchers()</code> method calls. It only works on the Servlet stack, where the breakpoint is added to Spring Security&#8217;s <code>AuthorizationFilter</code>. It means Spring WebFlux is not supported. It uses a different class instead, <code>AuthorizationWebFilter</code>, which unlock does not hook (yet).</p>



<p>Right now, there is also no support for method-security annotations, such as:</p>



<ul class="wp-block-list">
<li><code>@PreAuthorize</code>;</li>



<li><code>@PostAuthorize</code>;</li>



<li><code>@Secured</code>.</li>
</ul>



<p>There is no inlay for them, no way to see what they require, and no unlock action that targets them directly.</p>



<p>However, the same injected <code>Authentication</code> is what a method security interceptor reads too. If a service method is guarded by <code>@PreAuthorize</code> and the authorities you injected on an unlocked endpoint satisfy it, that check passes.</p>



<p>Let&#8217;s have a look at the small example:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@RestController
class UserController {

    @GetMapping("/admin/users/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findUser(id);
    }
}

@Service
class UserService {

    @PreAuthorize("hasRole('ADMIN')")
    public User findUser(Long id) {
        // ...
    }
}

@Configuration
@EnableMethodSecurity
class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated());
        return http.build();
    }
}
</pre>



<p>When you unlock <code>GET /admin/users/{id}</code> as <code>ROLE_ADMIN</code>, the call from <code>UserController</code> into <code>UserService.findUser </code>also passes the <code>@PreAuthorize</code> check – not because unlock targets it directly, but because the method-security interceptor reads the same <code>SecurityContext</code> the breakpoint already populated.</p>



<h2 class="wp-block-heading">One Unlock, Several Clients</h2>



<p>A request can come from several places: an IntelliJ IDEA <code>.http</code> file, a <code>curl</code> script, a Postman collection, or a test suite hitting your locally debugged app. If the request is rejected, don&#8217;t spend time switching to another HTTP testing tool.<br></p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-28.png" alt="" class="wp-image-737853"/></figure>



<p>For requests sent from the built-in IntelliJ IDEA HTTP Client, the security inlay sits right near the request URL in an <code>.http</code> file, so you don&#8217;t even need to switch to the controller code. For external clients, you&#8217;ll need to open the controller code, unlock the endpoint, and re-run the same <code>curl</code> or Postman request.</p>



<h2 class="wp-block-heading">A Note for Automated and AI Workflows</h2>



<p>In IntelliJ IDEA 2026.2, unlock is available in the inlay in the editor or in the <code>.http</code> file &#8211; it is a manual, in-IDE action. There is no programmatic switch yet, so an external script or an AI agent cannot use it on its own. We&#8217;re planning an MCP tool and a related skill that would let an agent get the roles list and perform lock/unlock actions for a selected endpoint directly, without a human in the loop. That&#8217;s aimed at the next release, 2026.3.</p>



<p>Until then, unlock the endpoint once from the IDE to let an agent test it. It stays unlocked for the rest of the debug session, so the agent can keep replaying <code>curl</code>, <code>.http</code>, or test requests with no further clicks. The manual step is a one-time setup, so an agent iterating on downstream controller or service logic can run unattended after it.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Security inlays are designed to simplify your (developer&#8217;s) life. They show the real security rules for an endpoint, and let you pass them so you can debug more easily. You can see what the endpoint requires and unlock it if needed. The request is then treated as authenticated with the authorities you choose for the debug session. All of this happens without editing <code>SecurityConfig</code> or restarting the app.</p>



<p>By applying unlock, IDEA makes a temporary security change in the running app. It opens the exact URI and method you unlocked to every client that reaches it. If you unlocked a path pattern in the controller code, it opens all paths that match the pattern.</p>



<p>The path stays open until you lock it again or the debug session ends. Please use it carefully, especially on an app with network access.</p>



<p>A few limitations are worth mentioning:</p>



<ul class="wp-block-list">
<li><strong>Servlet only</strong> &#8211; Inlays and unlock hook Spring Security&#8217;s <code>AuthorizationFilter</code>. That filter only exists on the Servlet stack, so WebFlux isn&#8217;t supported yet.</li>



<li><strong>Debug mode only</strong> &#8211; This feature requires an active debugger session, local or on a remote JVM.</li>



<li><strong><code>Principal / Authentication</code>, not a concrete subtype</strong> &#8211; Declare a controller method parameter as <code>Principal </code>or <code>Authentication</code>. A parameter annotated with <code>@AuthenticationPrincipal</code> comes back <code>null</code>. A parameter typed as a concrete subtype, like <code>JwtAuthenticationToken</code>, throws an error instead, because Spring MVC checks that the injected object matches the declared type.</li>
</ul>



<p>The inlays are part of the <a href="https://plugins.jetbrains.com/plugin/25302-spring-debugger" target="_blank" rel="noopener">Spring Debugger</a> plugin for IntelliJ IDEA Ultimate, available since the 2026.2 release.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Java Annotated Monthly – September 2026 </title>
		<link>https://blog.jetbrains.com/idea/2026/09/java-annotated-monthly-september-2026/</link>
		
		<dc:creator><![CDATA[Irina Mariasova]]></dc:creator>
		<pubDate>Mon, 07 Sep 2026 11:27:14 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/IJ-social-BlogFeatured-1280x720-1.png</featuredImage>		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=737583</guid>

					<description><![CDATA[This month’s Java Annotated Monthly brings you the latest Java news, a generous dose of AI-focused articles, Kotlin updates, and highlights from a variety of technologies and frameworks, plus plenty more worth adding to your reading list. Our featured writer, Aicha Laafia, takes a closer look at upcoming JEPs and shares her key findings on [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>This month’s Java Annotated Monthly brings you the latest Java news, a generous dose of AI-focused articles, Kotlin updates, and highlights from a variety of technologies and frameworks, plus plenty more worth adding to your reading list.</p>



<p>Our featured writer, <a href="https://www.linkedin.com/in/aicha-laafia-0266a6126/?locale=fr" target="_blank" rel="noopener">Aicha Laafia</a>, takes a closer look at upcoming JEPs and shares her key findings on what may be next for Java. Let’s dive in!</p>



<h2 class="wp-block-heading">Featured Content&nbsp;</h2>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/da3a-400o400o2-NhiB1dzTu4T26r3Fsu2sLt.jpg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Aicha Laafia</h4>
                                                <p>Aicha Laafia is a Java software engineer at SQLI with a love for coding, an interest in sustainability, and a commitment to empowering women in tech. She is a Women Techmakers ambassador, an Oracle ACE Associate, and part of the JetBrains Community Contributors program. When she is not coding, she enjoys exploring delicious food, phone photography, and watching Formula 1.</p>
                    </div>
                            </div>
        </div>
    </div>



<p>September is here, and so is <a href="https://openjdk.org/projects/jdk/27/" target="_blank" rel="noopener">JDK 27</a>. Nine JEPs if you count the previews, and nothing to rewrite unless you are using preview features. Honestly? That’s my favorite kind of release. You upgrade the version, and your app gets faster.</p>



<h3 class="wp-block-heading">The features that change your numbers</h3>



<p>Compact object headers are on by default (<a href="https://openjdk.org/jeps/534" target="_blank" rel="noopener">JEP 534</a>). Headers shrink from 96 bits to 64, cutting heap usage by 10% – 20% and pushing throughput up by 5% – 10%. G1 also becomes the default garbage collector everywhere (<a href="https://openjdk.org/jeps/523" target="_blank" rel="noopener">JEP 523</a>), even on the small machines that used to get Serial GC instead, so check your smallest containers before you upgrade. For the full tour, <a href="https://www.linkedin.com/in/sven-woltmann" target="_blank" rel="noopener">Sven Woltmann</a> wrote a solid <a href="https://www.happycoders.eu/java/java-27-features/" target="_blank" rel="noopener">Java 27 breakdown</a>, and if video is more your thing, <a href="https://www.linkedin.com/in/cat-edelveis/" target="_blank" rel="noopener">Catherine Edelveis</a> covers the whole release <a href="https://www.youtube.com/watch?v=VxN-jrjF_GA" target="_blank" rel="noopener">here</a>.</p>



<h3 class="wp-block-heading">Two security wins that protect you by default</h3>



<p>JFR recordings collect environment variables and system properties, which is exactly where your tokens and passwords live, so Java 27 hides them for you (<a href="https://openjdk.org/jeps/536" target="_blank" rel="noreferrer noopener">JEP 536</a>). And TLS 1.3 now gets post-quantum key exchange (<a href="https://openjdk.org/jeps/527" target="_blank" rel="noreferrer noopener">JEP 527</a>), because attackers already save encrypted traffic, waiting for quantum computers to break it later. Java 27 makes sure they can’t!</p>



<h3 class="wp-block-heading">Still on Java 8 or 11?</h3>



<p>Don’t jump, hop. Start now, LTS by LTS, and read my article <a href="https://foojay.io/today/jurassic-jdk-migrate-or-extinct/" target="_blank" rel="noopener">Jurassic JDK: Migrate or Extinct</a> first. I covered everything I wish someone had told me before my first migration.</p>



<p>Enjoy this month’s Java Annotated Monthly!</p>



<h2 class="wp-block-heading">Java News</h2>



<p>See what’s new, changing, and coming next in the world of Java:</p>



<ul class="wp-block-list">
<li>Java News Roundup <a href="https://www.infoq.com/news/2026/08/java-news-roundup-aug03-2026/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">1</a>, <a href="https://www.infoq.com/news/2026/08/java-news-roundup-aug10-2026/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">2</a>, <a href="https://www.infoq.com/news/2026/08/java-news-roundup-aug17-2026/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">3</a>, <a href="https://www.infoq.com/news/2026/08/java-news-roundup-aug24-2026/" target="_blank" rel="noopener">4</a>&nbsp;</li>



<li><a href="https://www.infoq.com/news/2026/08/jep401-value-objects-preview/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Project Valhalla&#8217;s First Preview: JEP 401 Redefines == for Java Objects</a></li>



<li><a href="https://www.infoq.com/news/2026/08/java-native-json-api/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">JEP 540 Proposed to Target JDK 28 with a Simple JSON API</a></li>



<li><a href="https://nipafx.dev/inside-java-newscast-114" target="_blank" rel="noopener">JSON API, Valhalla Progress, LTS ❤️ PQC &#8211; Inside Java Newscast #114</a></li>



<li>Inside Java <a href="https://inside.java/2026/08/20/podcast-067/" target="_blank" rel="noopener">Episode 67 “Keeping Up With the Java Release Train” [I/O]</a></li>



<li><a href="https://www.infoq.com/news/2026/08/java-27-so-far/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">JDK 27 and JDK 28: What We Know So Far</a></li>



<li><a href="https://inside.java/2026/08/25/jipher-cryptography-for-java/" target="_blank" rel="noopener">Announcing Oracle Jipher 10.37: FIPS 140-3 Cryptography for Java</a></li>



<li><a href="https://inside.java/2026/08/12/java-mcp-migration/" target="_blank" rel="noopener">Evolving a Java MCP Server During MCP Specification Upgrades</a>&nbsp;</li>
</ul>



<h2 class="wp-block-heading">Java Tutorials and Tips</h2>



<p>Sharpen your Java skills with practical tutorials, clever techniques, and tips worth trying:&nbsp;</p>



<ul class="wp-block-list">
<li><a href="https://www.youtube.com/watch?v=1Jci3yQzKyk" target="_blank" rel="noopener">Persistence Workflows with IntelliJ IDEA – Andrey Belyaev | IntelliJ IDEA Tech Talks</a></li>



<li><a href="https://blog.gradle.org/resilient-sync" target="_blank" rel="noopener">Resilient Sync: Your IDE Keeps Helping even when your Build is Broken</a></li>



<li>Inside Java <a href="https://inside.java/2026/08/06/podcast-065/" target="_blank" rel="noopener">Episode 65 “Embracing Virtual Threads with Helidon” [I/O]</a></li>



<li><a href="https://foojay.io/today/introduction-to-retrieval-augmented-generation-with-java-and-mongodb/" target="_blank" rel="noopener">Introduction to Retrieval-Augmented Generation with Java and MongoDB</a></li>



<li><a href="https://inside.java/2026/08/11/efficient-java-apps-profiling-troubleshooting/" target="_blank" rel="noopener">The Power of JDK Flight Recorder: Efficient Profiling and Troubleshooting for Java Applications</a></li>



<li><a href="https://blog.frankel.ch/security-baked-into-jvm/4/" target="_blank" rel="noopener">Security Baked Into the JVM: sixteen Subjects on the wire</a>&nbsp;</li>



<li><a href="https://inside.java/2026/08/24/value-classes-compiler-sympathy/" target="_blank" rel="noopener">Value Classes Still Need Compiler Sympathy</a></li>



<li>Inside Java <a href="https://inside.java/2026/08/27/podcast-068/" target="_blank" rel="noopener">Episode 68 “Operator Overloading with Type Classes” [AtA]</a></li>



<li><a href="https://krzysztofslusarski.github.io/2026/08/19/g1barrier.html" target="_blank" rel="noopener">Why is Arrays.fill 265 times slower on G1GC?</a></li>



<li><a href="https://www.youtube.com/watch?v=2L7zLdHeyY0" target="_blank" rel="noopener">Beyond Virtual Threads: Structured Concurrency &#8211; Balkrishna Rawool | IntelliJ IDEA Tech Talks</a></li>
</ul>



<h2 class="wp-block-heading">Kotlin Corner</h2>



<p>Step into Kotlin Corner for fresh updates:</p>



<ul class="wp-block-list">
<li><a href="https://blog.jetbrains.com/research/2026/08/programming-language-migration/">When Escape Routes Become Toll Roads: Mapping How Developers Move Between Programming Languages</a>&nbsp;</li>



<li><a href="https://blog.jetbrains.com/research/2026/07/kotlinllm-open-source/">KotlinLLM is Going Open Source&nbsp;</a></li>



<li><a href="https://blog.jetbrains.com/kotlin/2026/07/introducing-the-kotlin-benchmark-evaluate-ai-coding-agents-on-real-world-kotlin-tasks/">Introducing the Kotlin Benchmark for AI Coding Agents&nbsp;</a></li>
</ul>



<h2 class="wp-block-heading">AI&nbsp;</h2>



<p>Catch up on the AI ideas, tools, and experiments shaping how developers build software:</p>



<ul class="wp-block-list">
<li><a href="https://blog.jetbrains.com/idea/2026/08/intellij-idea-goes-lsp/">IntelliJ IDEA Goes LSP: Java and Kotlin Intelligence Comes to VS Code, Cursor, and Agentic Flows</a></li>



<li><a href="https://www.infoq.com/news/2026/08/jetbrains-ai-spend/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">JetBrains Details its First Steps to Bring Rapidly Growing AI Spend under Control</a></li>



<li><a href="https://foojay.io/today/jakarta-agentic-ai-hits-its-first-milestone/" target="_blank" rel="noopener">Jakarta Agentic AI Hits Its First Milestone</a></li>



<li><a href="https://www.infoq.com/news/2026/08/mcp-stateless-gateway/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">MCP Goes Stateless, and Developers Ask Whether That Just Makes it an API Again</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/08/top-5-ai-features-in-intellij-idea/">Top 5 AI Features in IntelliJ IDEA</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/08/agent-skills-in-intellij-idea/">Agent Skills in IntelliJ IDEA</a></li>



<li><a href="https://henrikwarne.com/2026/08/15/lessons-learned-from-fixing-flaky-tests-with-claude/" target="_blank" rel="noopener">Lessons Learned from Fixing Flaky Tests with Claude</a>&nbsp;</li>



<li><a href="https://redoubleai.substack.com/p/the-reality-of-ai-in-the-enterprise" target="_blank" rel="noopener">The reality of AI in the enterprise</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/08/how-to-use-ai-agents-in-intellij-idea-with-acp/">How to Use AI Agents in IntelliJ IDEA With ACP</a></li>



<li><a href="https://dzone.com/articles/java-enterprise-is-already-ready-for-the-ai-era" target="_blank" rel="noopener">Java Enterprise Is Already Ready for the AI Era</a></li>



<li><a href="https://spring.io/blog/2026/08/17/spring-office-hours-podcast-S5E20" target="_blank" rel="noopener">Spring Office Hours Podcast: S5E20 – The Developer’s Guide to AI with Danny Thompson</a></li>



<li><a href="https://blog.scottlogic.com/2026/08/06/how-to-accelerate-agentic-adoption.html" target="_blank" rel="noopener">How to accelerate agentic adoption</a>&nbsp;</li>
</ul>



<h2 class="wp-block-heading">Languages, Frameworks, Libraries, and Technologies</h2>



<p>Explore what’s moving and shaking across languages, frameworks, libraries, and the wider tech landscape:</p>



<ul class="wp-block-list">
<li>This Week in Spring <a href="https://spring.io/blog/2026/08/04/this-week-in-spring-august-4-2026" target="_blank" rel="noopener">1</a>, <a href="https://spring.io/blog/2026/08/11/this-week-in-spring-august-11-2026" target="_blank" rel="noopener">2</a>, <a href="https://spring.io/blog/2026/08/18/this-week-in-spring-august-18-2026" target="_blank" rel="noopener">3</a>, <a href="https://spring.io/blog/2026/08/25/this-week-in-spring-august-25" target="_blank" rel="noopener">4</a></li>



<li><a href="https://www.infoq.com/news/2026/08/pod-deployment-unit-ai-agents/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Pods as Workers, Not Agents: Rethinking the Deployment Unit for AI Agents on Kubernetes</a></li>



<li><a href="https://blog.gradle.org/gradle-is-going-agentic" target="_blank" rel="noopener">Gradle Is Going Agentic</a></li>



<li><a href="https://in.relation.to/2026/08/19/hibernate-immutable-2lc-9x-speedup/" target="_blank" rel="noopener">When @Immutable Made All the Difference: A 3.2x Speedup with Hibernate Second-Level Cache</a>&nbsp;</li>



<li><a href="https://foojay.io/today/vibe-coding-maven-and-the-dependencies-you-didnt-choose/" target="_blank" rel="noopener">Vibe Coding, Maven, and the Dependencies You Didn’t Choose</a></li>
</ul>



<h2 class="wp-block-heading">Conferences and Events</h2>



<p>Mark your calendar with the conferences, meetups, and events worth showing up for:</p>



<ul class="wp-block-list">
<li><a href="https://www.kcdc.info" target="_blank" rel="noopener">Kansas City Developer Conference</a> – Kansas City, USA, September 9–12</li>



<li><a href="https://jcconf.tw/2026/" target="_blank" rel="noopener">JCConfTaiwan</a> – Taipei, Taiwan, September 11</li>



<li><a href="https://javaforumnord.de/2026/" target="_blank" rel="noopener">Java Forum Nord</a> – Hannover, Germany, September 22</li>



<li><a href="https://jugsaxony.org/day/" target="_blank" rel="noopener">JUG Saxony Day</a> – Radebeul, Germany, September 25</li>



<li><a href="https://2026.confitura.pl" target="_blank" rel="noopener">Confitura</a> – Warsaw, Poland, September 25–26</li>



<li><a href="https://gotocph.com/2026" target="_blank" rel="noopener">GOTO Copenhagen</a> – Copenhagen, Denmark, September 28 – October 2</li>
</ul>



<figure class="wp-block-image size-full"><a href="https://lp.jetbrains.com/intellij-idea-conf-2026/?utm_source=newsletter&amp;utm_medium=jam&amp;utm_campaign=intellijideaconf" target="_blank" rel="noopener"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image-24.png" alt="" class="wp-image-737606"/></a></figure>



<h2 class="wp-block-heading">Culture and Community</h2>



<p>Check out these stories about what makes the developer community tick.</p>



<ul class="wp-block-list">
<li><a href="https://www.infoq.com/presentations/ai-sdlc-maturity-framework-bottlenecks/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">The Five Stages of AI Maturity in Engineering Organizations &#8211; Where and Why Teams Get Stuck</a></li>



<li></li>



<li><a href="https://www.infoq.com/news/2026/08/platform-products-people-use/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">From Projects to Products: Turning Platforms into Products People Use</a></li>



<li><a href="https://blog.jetbrains.com/research/2026/08/programming-language-migration/">When Escape Routes Become Toll Roads: Mapping How Developers Move Between Programming Languages</a></li>



<li><a href="https://www.infoq.com/podcasts/infoq-culture-trends-2026/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">Culture &amp; Methods Trends 2026: The Human Side of AI Engineering</a></li>



<li><a href="https://www.infoq.com/news/2026/08/incidents-reliability-metrics/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">More Incidents Don&#8217;t Necessarily Mean Less Reliability</a></li>



<li><a href="https://lucumr.pocoo.org/2026/8/19/what-is-reasoning/" target="_blank" rel="noopener">What Is Reasoning</a></li>



<li><a href="https://www.infoq.com/news/2026/08/code-AI-write-only-disposable/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">How Code in the Age of Artificial Intelligence Becomes Write-Only and Disposable</a></li>



<li><a href="https://www.infoq.com/podcasts/brownfield-codebases-mob-programming/?utm_campaign=infoq_content&amp;utm_source=infoq&amp;utm_medium=feed&amp;utm_term=global" target="_blank" rel="noopener">The Human Edge: Why Brownfield Codebases Need Mob Programming, Not Just AI Vibes</a></li>



<li><a href="https://lucumr.pocoo.org/2026/8/22/fast-hard-code/" target="_blank" rel="noopener">Fast and Hard Code</a></li>
</ul>



<h2 class="wp-block-heading">And Finally…</h2>



<p>Check out the latest articles by the IntelliJ IDEA team:</p>



<ul class="wp-block-list">
<li><a href="https://blog.jetbrains.com/idea/2026/09/the-grails-plugin-has-a-new-home-apache-grails/">The Grails Plugin Has a New Home: Apache Grails</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/08/println-debugging-done-right/">Println Debugging Done Right</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/08/spring-boot-configuration-management-best-practices/">Spring Boot Configuration Management Best Practices</a></li>



<li><a href="https://blog.jetbrains.com/idea/2026/08/project-loom-in-intellij-idea-virtual-threads-scoped-values-and-structured-concurrency/">Project Loom in IntelliJ IDEA: Virtual Threads, Scoped Values, and Structured Concurrency</a></li>
</ul>



<p>That’s it for today! We’re always collecting ideas for the next Java Annotated Monthly – send us your suggestions via <a href="https://mail.google.com/mail/u/0/?fs=1&amp;tf=cm&amp;source=mailto&amp;to=JAM@jetbrains.com" target="_blank" rel="noopener">email</a> or <a href="https://x.com/intellijidea?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor">X</a> by September 20. Remember to check out our archive of <a href="https://www.jetbrains.com/lp/jam/" target="_blank" rel="noopener">past JAM issues</a> for any articles you might have missed!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>IntelliJ IDEA 2026.2.2 Is Out!</title>
		<link>https://blog.jetbrains.com/idea/2026/09/intellij-idea-2026-2-2/</link>
		
		<dc:creator><![CDATA[Maria Kosukhina]]></dc:creator>
		<pubDate>Wed, 02 Sep 2026 19:22:08 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/IntelliJ-IDEA-2026.2.2.png</featuredImage>		<category><![CDATA[releases]]></category>
		<category><![CDATA[bug-fix-update]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&#038;p=736048</guid>

					<description><![CDATA[IntelliJ IDEA 2026.2.2 is now available. You can update to this version from inside the IDE, using the&#160;Toolbox App, or by using snaps if you are a Ubuntu user. You can also download it from our&#160;website. IntelliJ IDEA 2026.2.2 brings the following refinements: To see the full list of issues addressed in this version, please [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>IntelliJ IDEA 2026.2.2 is now available.</p>



<p>You can update to this version from inside the IDE, using the&nbsp;<a href="https://www.jetbrains.com/toolbox-app/" target="_blank" rel="noreferrer noopener">Toolbox App</a>, or by using snaps if you are a Ubuntu user. You can also download it from our&nbsp;<a href="https://www.jetbrains.com/idea/download/" target="_blank" rel="noreferrer noopener">website</a>.</p>



<p>IntelliJ IDEA 2026.2.2 brings the following refinements:</p>



<ul class="wp-block-list">
<li>Loading a remote OpenAPI specification no longer fails. [<a href="https://youtrack.jetbrains.com/issue/IJPL-63202/" target="_blank" rel="noopener">IJPL-63202</a>]</li>



<li>The order of terminal tabs is now preserved after reopening a project. <a href="https://youtrack.jetbrains.com/issue/IJPL-212254/Terminal-tabs-order-is-not-saved-in-IntelliJ" target="_blank" rel="noopener">[IJPL-212254</a>]</li>



<li>Checkboxes in Markdown now have improved contrast for better visibility. [<a href="https://youtrack.jetbrains.com/issue/IJPL-93391/Low-contrast-of-checkboxes-in-markdown" target="_blank" rel="noopener">IJPL-93391</a>]</li>



<li>The vertical scrollbar is once again displayed correctly in the Markdown preview pane. [<a href="https://youtrack.jetbrains.com/issue/IJPL-251259/2026.2-Markdown-Preview-Missing-vertical-scrollbar-JCEF-rendering-failure" target="_blank" rel="noopener">IJPL-251259</a>]</li>



<li>Opening directories containing a large number of .md files no longer causes the IDE to freeze. [<a href="https://youtrack.jetbrains.com/issue/IJPL-93385/InteilliJ-IDE-Keeps-freezing-when-opening-a-directory-with-large-number-of-files" target="_blank" rel="noopener">IJPL-93385</a>]</li>



<li>Spring Modulith no longer incorrectly reports accessibility violations for types exposed through <code>@NamedInterface</code> in nested modules. [<a href="https://youtrack.jetbrains.com/issue/IDEA-376940/Spring-Modulith-IntelliJ-incorrectly-flags-Spring-Modulith-NamedInterface-exposed-types-from-nested-modules-as-accessibility" target="_blank" rel="noopener">IDEA-376940</a>]</li>
</ul>



<p>To see the full list of issues addressed in this version, please refer to the <a href="https://youtrack.jetbrains.com/articles/IDEA-A-2100662739/IntelliJ-IDEA-2026.2.2-262.10315.125-build-Release-Notes" data-type="link" data-id="https://youtrack.jetbrains.com/articles/IDEA-A-2100662739/IntelliJ-IDEA-2026.2.2-262.10315.125-build-Release-Notes" target="_blank" rel="noopener">release notes</a>. </p>



<p>If you encounter any bugs, please report them using our&nbsp;<a href="https://youtrack.jetbrains.com/issues/IDEA" target="_blank" rel="noreferrer noopener">issue tracker</a>.&nbsp;</p>



<p>Happy developing!</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
