RSS Feeds

Air Governance: Manage AI Agents, Access, and Spend Throughout Your Organization
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-22 14:09:21 | Created: 2026-10-22 14:53:57

Today, JetBrains Air Governance becomes generally available. Formerly known as JetBrains Central, this is the organization layer of JetBrains Air, a system of products for agentic development. Air Governance gives you one place to manage which AI agents, models, and providers your teams use, set spending limits, and see what that usage costs and delivers. It works with Claude Agent, Codex, Gemini CLI, Junie, and other ACP-compatible agents, across various developer surfaces, including IDEs, the CLI, web browsers, and mobile.

Air Governance is now available to all JetBrains organizational customers, with both free and paid plans available to meet the needs of diverse teams.

Why we built Air Governance

Most engineering teams now use several AI tools from different providers at the same time. They work with AI agents via an IDE, CLI, or web interface, and they switch between Claude Code, Codex, Gemini, Junie, and others. Because each tool comes with its own contract, dashboard, and admin settings, it’s hard to get the full picture of who uses which agents and models, how much AI is costing the company, and whether it is actually helping.

We had the same problem at JetBrains. Our AI spend grew roughly tenfold in the first half of 2026, and our first cross-vendor usage report took four days to compile by hand. We built a suite of tools to address this problem, and those tools became Air Governance, which now helps manage the agentic usage of roughly 2,300 people at JetBrains every month. 

Air Governance allows admins to manage AI usage through one console. It works across vendors, which means developers can use the agents and models that fit their tasks. When a new agent or model comes out, you can simply add it to the same policies. There is no new contract or separate admin setup.

Managing AI throughout your organization

In the console, you can:

  • Set AI credit limits for individual users, teams, and service accounts, so budgets are enforced rather than just reported.

  • Manage AI providers and set up centralized BYOK: Use JetBrains AI, or connect your own OpenAI, Anthropic, Amazon Bedrock, or Google Vertex AI accounts.

  • Define which AI agents are approved for use throughout the organization.

  • Configure MCP servers at the company level, so everyone works with the same approved external tools.

  • Create AI policies that combine approved providers, models, agents, and credit limits for different groups of users. 

Track your costs and what they deliver

Spending more on AI is easy. Explaining to leadership what that spend delivers is much harder. Air Governance allows you to track both cost and impact across all your agents:

  • AI costs by user: See where your budget goes, down to each developer. 

  • AI costs by agent: Compare spend across Junie, Claude Agent, Codex, Gemini CLI, and other agents.
  • AI costs by model and provider: Understand which models drive your bill. 

  • AI outcome metrics: See how AI is changing how your developers work. Metrics include the split between human-authored and AI-generated code, as well as how much code is AI-generated or AI-modified.

For details on how each metric is calculated, see the AI analytics documentation.  

What’s next

Air will evolve through a series of releases, and Air Governance will follow the same approach. Here are some of the capabilities we’re working on:

  • MCP server propagation to third-party CLIs, so company-approved tools reach every agent, not just JetBrains ones.
  • GitHub Copilot support through Air Gateway, our connector for third-party CLIs.
  • Connections to cloud agents through Air Gateway.
  • Advanced AI analytics.
  • Credit limits and custom pricing for BYOK models.
  • The ability to manage skills across teams.

Get started with Air Governance

Air Governance is now available for all organizations as part of the Business plan, which costs USD 20 per month for each developer with AI access. Developers don’t need individual AI licenses, and they draw on a shared pool of AI credits, which your organization buys separately and which cover AI usage across JetBrains products and connected agents.

Existing JetBrains customers can explore Air Governance directly in the console (admin access required).

Join the webinar: see Air Governance in action on November 18, 4:00–5:00 PM CET. Our product team will walk you through access and usage policies, spending limits, costs and usage analytics, and answer your questions live.

show more
JetBrains Plugin Developer Conf 2026: AI, New APIs, and More
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-20 21:49:55 | Created: 2026-10-20 22:52:58

What does the rise of AI agents mean for plugin development? And what new tools and APIs can help you build better plugins for JetBrains IDEs?

These are some of the topics we’ll explore at JetBrains Plugin Developer Conf 2026, taking place online on November 10 at 1:00 pm UTC. Join us for a free day of technical talks, real-world examples, and live Q&A sessions with JetBrains experts and fellow plugin developers.

What’s on the agenda?

This year’s program covers AI-assisted plugin development, language support with LSP, new IntelliJ Platform tools and APIs, and practical lessons from building and maintaining plugins.

Here’s the full lineup:

  • Opening Keynote by Ivan Chirkov, Yuriy Artamonov, Jakub Chrzanowski, and Róbert Novotný
  • Dependency Assistant: An IntelliJ Plugin That Started With a Prompt by Mark Paluch
  • Building Language Plugins With the Native LSP API by Vladimir Logachev
  • Integrating a Web-Based Profiler Into IntelliJ IDEA by Johannes Bechberger
  • Your Plugin’s Second Service: Architecture for Integrations That Grow by Evgeny Kudelevsky
  • EelApi: Developing Plugins for Every Project Environment by Alexander Koshevoy

From exploring where AI helps (and where it doesn’t) to building language plugins, integrating web-based tools, and supporting different development environments, the sessions offer practical insights you can apply to your own projects.

You can attend the entire conference or tune in for individual talks.

The sessions will be streamed live on YouTube and available to watch afterward, so you can catch up on anything you missed. Bring your questions for the live Q&A sessions!

show more
Small Talk with Ulises Olave, CTO and Co-Founder of Fitia
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-20 15:06:36 | Created: 2026-10-20 16:53:59

What is Small Talk?

Small Talk is our short Q&A with founders from the JetBrains Startup Program. They answer a handful of questions in their own words about what they’re building, why they started, and what they’ve figured out along the way. No pitch, no polish – just a two-minute read to meet the person behind the product.

This time, we’re talking to Ulises Olave, CTO and Co-Founder of Fitia, a nutrition app that has grown to 10 million+ users in Latin America and beyond. He shares how his team brought four kinds of databases together in one place, why the rapid advancement of AI made JetBrains the first company his team went to for help, and how a small engineering team achieved a pace of one major feature per month.

Ulises Olave, CTO and Co-Founder of Fitia

Fitia is an AI-powered meal planning and calorie tracking app. Founded in Peru in 2019 by Piero Linares and Ulises Olave and backed by Y Combinator (Summer 2021), it’s the top nutrition app in Latin America and is now scaling in the US. Fitia joined the JetBrains Startup Program to help their lean team ship even faster by bringing DataGrip and GoLand into their workflow.

TL;DR

  • Fitia’s AI coach processes more than 30 million food logs a month, alongside data on weight, sleep, steps, and water. As the product has evolved, this data has been spread across different database types and providers.
  • DataGrip has given Fitia’s team one central place to work with all their databases, including PostgreSQL, BigQuery, Azure, and Redis. Its built-in AI features have also helped the team cut query times from hours down to mere seconds.
  • GoLand has helped Fitia roughly double their development speed on its Go microservices. They now ship three times faster than before, at a rate of one major feature per month.

What is Fitia, for someone who’s never used it?

Fitia is a meal-planning and calorie-tracking app. You tell it your goal – whether that’s losing weight or gaining muscle – and it builds a personalized plan that adapts to your data, your progress, and the foods you actually like to eat. The engine behind this is our own AI coach. We’re the top nutrition app in Latin America, and this year the goal is to become a leading health and fitness app in the US, too.

What was the biggest challenge you faced as Fitia grew?

Data. We store food records for all our users. This means more than 30 million items logged every month, plus data on weight, sleep, steps, and water intake. As our data grew, it ended up spread across several different database types and providers, and keeping integrity across all of them became a challenge. Even a simple query became a real headache in that kind of fragmented setup.

How did you deal with that?

We centralized everything in one place. We pulled our PostgreSQL, BigQuery, Azure, and Redis databases into DataGrip, so instead of jumping between providers, we could work with all our data in a single tool. And after centralizing it, we’ve been able to leverage DataGrip’s built-in AI as well. The query suggestions cut work that used to take hours down to seconds, especially against those complex multi-provider setups.

Why JetBrains?

We’d been using JetBrains tools from early on, so when AI started advancing at an almost absurd pace, JetBrains was the first company we turned to. Every month one of the big providers would release a better model, which meant we could suddenly deliver more features, and faster. We needed every developer to be fast enough to ship powerful features every month without expanding the team, and we needed one tool that covered the whole path, from writing the code to deploying it. We applied to the Startup Program, got accepted in a few days, and within a week the team was using DataGrip and GoLand daily.

Was there anything that surprised you?

How well integrated the AI is. At first, we were just focused on getting more efficient with solid IDEs. We didn’t expect the AI to be built in so natively. The context-aware chat lets you ask questions right inside the IDE, using your own code as context, and that changed how we worked more than we thought it would.

What specific impact has GoLand had?

With GoLand, we roughly doubled our development speed for our Go microservices. The code suggestions and optimization tooling let us build and deploy faster, which means our mobile team can rely on clean, reliable backend services and ship features much faster. The product goal is one major feature every month. That used to take us about three times as long. This year we’ve been holding that pace consistently.

Where does Fitia go from here?

AI has opened up possibilities in nutrition that were almost unimaginable before, from identifying food in a photo to reading a user’s data and giving personalized recommendations. Our strategy isn’t to compete with the big model providers – it’s to build on top of them, using their capabilities while training on our own community data, so we can create features that actually mean something to our users. Beyond that, we’ll just keep focusing on developer efficiency, because that’s what lets a small team move like a big one.

Read the full case study here.


JetBrains Startup Program FAQ

Q: Do I qualify?
A: You qualify if your company is privately owned, established within the last five years, and has a website or other discoverable online presence.

Q: Where do I apply?
A: You can apply here.

Q: What is the timeline for the JetBrains Startup Program application process?
A: After you apply, our team will review your application within 48 hours. If you meet the criteria, you will receive an acceptance email, followed by a quote for the products. If you’re not accepted, our team will get in touch and share our reasoning. An application may be unsuccessful either due to missing information (e.g., a document or website) or because you do not meet our eligibility requirements (e.g., your business is more than five years old).

Q: What products are included in the terms “IDE subscription” and “team or learning tool subscription”?
A: A variety of products are available through IDE subscriptions, including IDEs as well as .NET and Visual Studio tools. “Team tool subscription” refers to team tools, including TeamCity, YouTrack, Datalore, Qodana, and our learning tool (JetBrains Academy).

show more
Why We Still Need an IDE
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-20 09:31:35 | Created: 2026-10-20 10:41:59

I’ve been mulling this over for about a year now. The developer landscape has shifted to the point where you can’t scroll past the news without seeing someone declare “I never open my IDE anymore” or “I do everything in the terminal.” And those workflows genuinely work for some people. But not for everyone. I honestly believe IDEs embody why we love what we do. The question then becomes: how do we move forward as the world changes?

The workflow has changed. The environment needs to match it.

Coding agents are no longer an experiment; for many of us, they’re already an everyday part of building software. We aren’t just tab-completing anymore. We’re handing agents substantive tasks that touch multiple files, explore dependencies, and refactor across packages. The day-to-day rhythm of engineering is evolving: it’s less about typing line by line and more about steering intent.

JetBrains Rider looks more like a cockpit for agentic development these days: agent sessions, their status, and the full project context in one view.

Think of this shift like the move from hand-flying to using a modern aircraft’s flight computer. The computer can handle complex execution, but it is capable because it is connected to the plane’s instruments: navigation, altitude, speed, and engine data. The pilot doesn’t need to move every control at every moment, but still needs a cockpit where they can see the whole flight, understand what is happening, and intervene when the route changes.

Agentic software development works the same way. An agent can plan and carry out a substantial change, but it needs a rich environment around it, and so does the engineer directing it. Code analysis, navigation, dependency information, type checking, tests, and access to the systems around the code provide the context that a terminal or isolated session may not expose clearly. An agent may run a compiler or test; the IDE makes the result part of a connected picture of the project, so you can understand not just whether something failed, but what it affects and why.

The pilot also owns the flight, even when the computer is doing much of the work. The engineer owns what ships, even when the agent wrote most of the code. That means reviewing the change in context, understanding its consequences, and being able to explain and defend the result later.

And then there is judgment: deciding whether the proposed route is the right one, not merely whether the plane can reach its destination. An agent can produce a working implementation; the engineer still decides whether it fits the architecture, the users, and the problem worth solving.

This is where the role of the IDE becomes particularly interesting. It is the cockpit where agents and developers can see the same project, use the same instruments, and work together on the decisions that determine what gets shipped. A prompt can start the work. An IDE is where you steer, verify, and take responsibility for the result.

From “typing syntax” to “directing intent” 

This is the context problem. An agent can reason across your codebase, but if you can’t see what it’s seeing, you’re not actually steering it – you’re just hoping it got it right.

Agentic tools aren’t a passing fad. They’re a core part of how a lot of us build now, and that’s not going away. Being a good developer was never really about how fast you could type. Typing was just the mechanical part. The actual work was figuring out what required a change and deciding what to do about it. Typing took up so much of the day that it was easy to confuse it with the job itself.

Now that typing isn’t the bottleneck, the day looks different. You’re reading the agent’s plan before it runs. You’re catching the one edge case it missed. You’re asking whether the change it proposed is actually the right change, not just a working one. Less time producing code, more time deciding that the code is correct.

I built something recently in a stack I had basically no real experience with. I wanted to build a browser extension, but after reading the docs, I wasn’t clear how bootstrapping and configuring the project were done. 

Instead of learning every detail before I could begin, I pointed an agent at the problem. It handled much of the mechanical work, from creating the project to configuring it and getting the first pieces in place, all while I focused on what I wanted to build. I didn’t have to know the exact syntax or setup process to express the intent. The agent didn’t replace the learning. It gave me a working project I could explore, question, and improve instead of a blank file or empty workspace. Once I opened the IDE, I could see how the pieces fit together, trace unfamiliar code, and steer the next step from something real.

A few years ago, that project didn’t happen, or it happened much more slowly, because the barrier was always “I don’t know this well enough to get moving”. The agent lowered that barrier. It took care of some of the mechanical work so I could concentrate on the problem, the direction, and the decisions that mattered. 

It also pulls you into the bigger picture, even on small tasks. If an agent touches a dozen files for something that used to be a two-line fix, you’re the one who has to know whether that was the right dozen files. That means more of your day lives at the architectural level than it used to, with more thinking about how services depend on each other, what a change actually impacts downstream, and whether the agent’s plan fits how the system is supposed to work. A ticket/issue used to mean “I need to edit this function to solve this”. Now it means “I need to define the right shape of the entire change, then point the agent at the right things to edit”. That’s hard to do from a chat window. You’re watching an agent make real decisions about your codebase through an interface that shows you one message at a time. If these tools can reason across your whole project, you need to be able to see it across your whole project too, and how they are affecting it; otherwise, you’re just clicking approve. 

This is also where the IDE’s own tooling comes in, not just for you, but for the agent.

Verification and understanding are where ownership lives

This is the ownership problem. Code being correct and code being yours are two different things, and only one of them survives the postmortem.

Generating more code is easy now. An agent can write you a working function in seconds, and in a lot of cases, it will be fine on the first try. That’s not really the hard part anymore, and treating it like the hard part is how you end up shipping things nobody on your team actually understands.

The bottleneck moved to verification. Questions like: “Is this correct?”, “Does it handle the case your users actually hit?”, and “Does it match how the rest of the system is supposed to behave, not just how this one function behaves in isolation?” are what we worry about now. An agent can generate the code faster than you can read it, which means reading it, really reading it, not skimming diffs, is now the slow part of the job. That’s fine, because that was always supposed to be the slow part.

This matters because you can’t own code you don’t understand. If a bug shows up in something an agent wrote and your merge commit says “the agent wrote it”, good luck on that triage call or postmortem. Your name is on the commit, so you need to understand the change well enough to defend, debug, and explain it to someone else. That is what makes it actually yours, and that doesn’t happen by reading a chat summary of what the agent did. It happens by sitting with the actual change, in context, long enough to be sure. The agent isn’t the one who gets paged at 2:00 am, isn’t the one in the postmortem, and isn’t the one whose name is on the performance review. You are. Accountability doesn’t transfer just because the authorship did, and no team is going to accept “the agent did it” as a substitute for “I understood what I shipped”. 

This is also just what IDEs were already built for. Long before agents existed, the IDE’s main function was to let you verify the solution to a problem, allow you to jump to a definition, see where a function is called, catch a type error before it ships, and trace a variable back to where it came from. None of that functionality needs to be reinvented for agentic work; it just needs to be pointed at agent output instead of your own. The tool for understanding code has existed the entire time. The only new part is that you’re not only using your own code?  

Take pride in what you build

This is a judgment problem, and it was never really about agents at all.

This isn’t really a conversation about tools. It’s a conversation about what the discipline of software engineering is actually built on, and whether that survives the shift to agentic work or gets lost in it.

It’s easy to think, “I am typing almost none of the code myself,” and see it as being removed from the process. It isn’t, as long as the thinking behind it is still yours in every way that matters. You can type nothing and still be the one who devised the architecture, the one who knew why a particular approach was right, when the rest of your team thought otherwise, or the one who caught the thing the agent got subtly wrong before it shipped. That’s not a smaller job than writing every line by hand. It’s the same job it always was, with the typing taken out. 

The thing worth remembering is that engineers were never actually in the business of producing code. Engineers solve problems. Code was always just the medium that happened to require a lot of manual labor to produce, so the labor got mistaken for the craft. An agent that writes code faster than you can type isn’t replacing the craft; it’s removing the part of the job that was never really the point.

So take pride in the thing that was always the actual work: the judgment, the architecture, the final decision over what should exist and why. If an agent helps you get there faster, that’s not a smaller version of engineering. It’s the same standard, held just as seriously, moving at the speed the tools finally allow.

Every captain flying on autopilot still needs a cockpit to control the flight path. The instruments don’t replace the pilot; they’re what make the pilot capable of flying such a complicated machine safely. Think of the IDE as your coding cockpit. It’s not a “nice-to-have” around the agent. It’s the thing that makes directing one, instead of just talking to one, actually possible.

IDE tools for developers AND agents

IDEs are uniquely equipped to answer the problems stated above, just like the flight computer. We should look to give agents access to the same instruments and controls that the pilot has, as well as tools for validation and review. A rich IDE also gives you the opportunity to exercise your judgment, helping you understand and own the code, by providing everything you need to do the job.

LLMs are probabilistic. They’re guessing, well-informed guessing, but guessing nonetheless. Software engineering isn’t. A type system doesn’t have an opinion about whether the code compiles; it either does or doesn’t. That gap between how the agent thinks and how the system actually behaves is where most of the real bugs live. 

Right now, most of that gap gets closed after the fact. Some agents already run compilers, linters, and tests mid-task, which is genuinely useful because it catches errors that would have otherwise been shipped. But running a check and actually seeing the system the way a developer does aren’t the same thing. The agent gets a compiler or runtime error, possibly a stack trace. A human using an IDE gets the type checker, the linter, and the test suite integrated into actual navigation and context, not just a pass/fail, but the reason why. From there, you can trace its source and understand how it connects to the larger picture. The tooling isn’t missing from the agent’s loop anymore. What is missing is the depth that it is connected to, and the ability to select the right tool at the right time. 

The fix isn’t to make the agent better at guessing. It’s to help it make a more informed decision. The same deterministic intelligence the IDE gives you, like type resolution, linting, and real-time error checking, needs to be available to the agent while it is working, not just to the human reviewing it afterward. An agent that can check its own types mid-task, see a lint error the moment it writes that line, and run the test it just broke before it moves on, isn’t operating on the probability anymore. It’s operating with the same grounded truth your tools always have.

That’s the shift that is taking place. Not smarter agents, but the same deterministic tools we built for developers, finally pointed at the thing writing the code, instead of only at the person checking it afterward. 

Once agents can work with the same tools developers rely on, the next question is: who gets to choose those agents and tools? Developers should be able to use the best tool for the task without rebuilding their workflow or navigating a maze of configuration. The IDE should be the stable layer, connecting agents to rich development tools, but it is only useful if developers aren’t locked into one provider’s version of that workflow.

We can’t have AI walled gardens

Betting your entire workflow on one model provider is a real risk, not a hypothetical one. Providers can change pricing, get acquired, deprecate models, have outages, and end up falling behind the field for a few months. If switching providers requires changing your tools, workflows and configuration, then the cost of switching becomes a reason to stay, even when a better option is available. The goal isn’t to make developers manage a complicated collection of integrations. It’s the opposite: give them one dependable environment where they can use the agents and models THEY WANT, with the project context and development tools they need, without unnecessary friction.

This is where the Agent Client Protocol (ACP) can help. ACP gives IDEs and coding agents a shared way to communicate, reducing the need for a separate, custom integration every time a new agent is added.  That can make an agent feel native to the IDE without making the IDE dependent on a single provider. ACP takes away repetitive integration work; it doesn’t have to take away the developer’s choice. 

With Air, you can seamlessly add the agents you already use to your IDE with little effort, allowing you to use the tools you love without extra overhead.

This doesn’t even consider the fact that with every new model that comes out, the overall messaging is that it should be the primary model going forward. If your whole development pipeline is wired to a single provider’s API, every one of those events becomes your problem too. That’s not a tooling decision; it’s a dependency you’ve taken on without really deciding to. And we all know what happens when we take a dependency, it will eventually give us a headache when a change occurs. 

The fix isn’t picking the right provider. There isn’t a right one; whoever’s best today won’t necessarily be best in a month, and at the pace this field is moving, locking in early is how you end up stuck defending the choice you made for reasons that stopped being true. And when that new model eventually comes out, it has to go through the gauntlet of your software development needs before you feel comfortable “trusting” it. 

That means the IDE itself cannot be opinionated about which model is doing the work. Switching providers, running different models for different tasks, trying a new one the week it ships, none of that should require reconfiguring your whole setup. If changing models is a project, you won’t do it, and you’ll end up stuck with whatever you picked first by default rather than by choice. 

That’s really what Bring Your Own Keys (BYOK) comes down to in practice. You bring the credentials for the models and providers you choose, which is typically an API key or sometimes an account or subscription, and connect them to the IDE. The IDE remains the place where project context, code intelligence, tools, and review live. The provider supplies the model, while you retain control over usage, limits, and cost. Switching means selecting another configured provider or model, not rebuilding your workflow.

ACP and BYOK address different parts of the same problem. ACP helps an IDE connect to different agents through a common interface. BYOK lets developers choose the provider credentials behind that experience. One provides interoperability; the other preserves control. A native agent experience should make choice easier, not remove it. 

It’s not a nice-to-have for people who want to tinker with settings. It’s a way to keep the leverage on your side instead of the providers. You use what’s actually good right now, you drop what isn’t, and you’re never negotiating from a position where switching costs more than staying put.

Use the tools that solve the problem

The question we really have facing us is: Why not use agents and IDEs together? It is how. The goal of the software engineering discipline is to ultimately solve problems of the business using software. Over the years, the “software” has changed quite a bit, from walking up hills both ways in the snow to compile your punch cards to now just typing what you want and manifesting it into existence. I use agents in my IDE today, and the combination of the intelligence that the IDE provides with the reasoning and speed of an agent is a delightful experience. But this truly is the first step in transforming how we use these new sets of tools to do what we always did: solve a problem.

That’s our take on where IDEs and agents are headed. We’re curious to hear yours. 

show more
Coding-Agent Benchmarks Should Match Their Users’ Task Flows
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-20 10:27:16 | Created: 2026-10-20 10:41:59

Left: SWE-Bench Pro, where each task is a single user message, almost always a new feature or a bug fix. Right: the first five developer messages in sessions of software engineers working in JetBrains IDEs, counting only sessions with at least three messages. Each column is a message position, colored Cblocks are request types, and band widths show how often one type follows another.

This post summarizes our paper Opinion: Coding-Agent Benchmarks Should Match Their Users’ Task Flows, accepted to the Evaluation of Interactive Agents workshop at NeurIPS 2026.

At JetBrains Research, we recently analyzed 4,782 agent sessions of software engineers working in JetBrains IDEs and compared them with three public collections of agent conversations. In the developer sessions we looked at, fixing bugs and adding features account for less than half of what developers ask a coding agent to do. The rest contains questions about the codebase, planning, code review, refactoring, and command execution. In SWE-Bench Pro, on the other hand, 93.8% of tasks are features and bug fixes, and every task arrives as one complete message. That’s quite a difference.

That gap is the subject of this post. Our conclusion from the analysis is that there is no universal realistic coding-agent benchmark: a benchmark should be calibrated to measurements of a specific user population. SWE-TaskFlow is our contribution for doing this with any issue-derived benchmark; in this post, we apply it to SWE-Bench Pro.

What an issue-based benchmark measures

SWE-bench and its successors (SWE-Bench Pro, SWE-rebench, DeepSWE) build tasks from GitHub issues. The agent gets a repository checkout and the issue text, explores the code, edits it, and submits a patch. Tests decide whether the patch resolves the issue; the share of resolved issues is the resolve rate.

The infrastructure behind these tasks is expensive to build: i.e. a repository at the right commit, an environment where the code runs, and tests that verify the change. The interaction layer on top of it is fixed, however. The full specification arrives in one polished message, and one final patch is scored. 

Despite the fixed nature of the interaction layer, developers in an IDE work like that only some of the time. That is, half of the sessions we saw are a single message. In the rest, requirements come in pieces: Between one change request and the next, the developer asks the agent to explain how some part of the project works, to plan the next change, or to review what was done, while the earlier requirements still have to be carried along.

How developers actually use the agent

Each of the 4,782 sessions, which we call Production Sessions, is one conversation between a developer and the coding agent inside the IDE; together, they contain about 14,000 developer messages. We looked only at the developer’s side, and the figure below shows the distribution of messages across the Production Sessions.

The 4,782 sessions by number of developer messages (the chart calls them prompts). One developer message can trigger many agent actions.

Half of the sessions (50.9%) are a single message; about 15% run past five. Since our subject is interactive agents, the rest of the analysis is on the 33% of sessions with at least three developer messages, the long sessions, as follows.

An open-weight LLM (Gemma 4-31B) labeled every message with one of 16 request types, or intents: bug fix, new feature, explain, planning, code review, execute, and so on (all 16 are defined in the paper). The same classifier, with the same prompt, labeled the public collections and the SWE-Bench Pro issues, so every distribution in this post is measured on the same footing.

Across all sessions, bug fixes make up 26% of the labeled messages and new features 19%. In the long sessions, explanations of the project’s own code account for 6% of messages, and general programming questions for another 10%; planning, code review, refactoring, debugging, and execution make up most of the rest. SWE-Bench Pro, labeled the same way, comprises 55% new features, 39% bug fixes, 6% refactoring, and nothing else.

Session length and intent mix are two of the three components of a Task Flow; the third is the order in which intents follow one another. A session that opens with a feature request often continues with a question about existing behavior, a planning step, and a review request. 

How public collections compare

Our Production Sessions are for one user population. To see how much the picture depends on the population, we ran the classifier on 1,000 sessions from each of the public collections below and kept the long ones. Below, we include Sankey diagrams for each. The Sankey diagrams in this post are Task Flows, where each column is a message position, and the bands between columns are these transitions.

SpecStory consists of public IDE session exports, the data analyzed in Programming by Chat. 521 of its 1,000 sessions are long. Of the three, it sits closest to our sessions, with a larger share of planning.

SpecStory task flow

DataClaw collects coding-agent sessions shared by the community. 585 of 1,000 are long. It is dominated by execution requests and short operational messages.

DataClaw task flow

SWE-chat is a collection of coding-agent conversations from real users, gathered in a chat setting. 698 of 1,000 are long. Execution and planning are its largest intents.

SWE-chat task flow

These three corpora come from different products, different users, and different collection methods, so we do not compare them quantitatively. Still, a benchmark calibrated to any one of them would have a different mix of tasks and transitions than one calibrated to another. None of them is ground truth, and neither are our Production Sessions; the target has to be chosen and stated.

For our pilot, the target is the long Production Sessions. Calibrating to frequencies has a side effect: anything rare in the target gets pushed toward zero. Rare but consequential behaviors, such as a destructive shell command or a security-relevant review, should instead be evaluated in separate stress-test slices with their own task counts.

How SWE-TaskFlow adapts existing tasks

Building a new interactive benchmark for every target would throw away what issue-based benchmarks already have. Instead, we propose SWE-TaskFlow, which transforms an existing benchmark: it keeps the repository, the environment, the tests, and the original requirements, while regenerating only the user messages.

Splitting the issue into several requests

An LLM rewrites each issue as three ordered requests; we call them issue requests, since everything in them comes from the original issue. The agent works on the first before it sees the second. The split has to preserve every original requirement and add none; identifiers and code snippets are kept verbatim; each request has to be actionable in the repository state that the previous one left behind. A second model pass checks the result for completeness. 31 of the 731 public SWE-Bench Pro issues did not pass these splitting and evaluation checks and were left out, leaving 700 tasks.

Here is what it looks like for a qutebrowser issue titled “LinkedIn Fails Due to Missing Array.prototype.at Support in Older QtWebEngine”. The original issue is one message of about 1,000 characters. Split, it becomes:

  1. Please fix the LinkedIn compatibility problem in qutebrowser on macOS with QtWebEngine 5.15.2. LinkedIn’s frontend JavaScript uses Array.prototype.at, which is missing from that older engine, so JavaScript execution fails and LinkedIn pages remain stuck or unresponsive. Add the qutebrowser JavaScript compatibility support needed so LinkedIn can load and function normally, using a polyfill to resolve the issue transparently.
  2. The compatibility support should provide Array.prototype.at on QtWebEngine versions prior to 6.3 when it is not available natively, and it must be active and functional on LinkedIn domain pages and qutebrowser test domains. For array instances, positive integer indices should return the element at the specified index, while negative indices count backward from the end, with -1 referring to the last element.
  3. Complete the behavior so indices outside the array bounds return undefined for both positive and negative indices. The polyfill must only be injected when the native Array.prototype.at method is not already available in the JavaScript environment.

The first request is enough to start working; the edge cases arrive later.

Adding questions about the repository

Explanations of the project’s own code are common in Production Sessions and absent from issue benchmarks, so we generate them. A model reads the repository together with the trajectory of an agent that previously solved the issue and proposes one to three questions. Each question must be answerable from the repository alone, stay valid both before and after the fix, and not give away the solution.

Every question ships with a reference answer and an executable proof script that collects evidence for the answer from the repository. At dataset creation, we run the script in a clean checkout and keep the question only if it passes, produces the evidence, and leaves the repository unchanged. This rules out, by construction, questions whose answers are not observable in the code (“why was it designed this way?”). At evaluation time, the agent answers in text, and a separate LLM judges the answer against the hidden reference and its evidence.

In the released configuration, the qutebrowser task above gets one question, placed between the first and second issue requests:

Concise answer: Trace how a relevant stylesheet configuration change updates both future QtWebEngine documents and the already loaded document, including CSS assembly, script replacement, execution world, subframe behavior, and the no-op path for unrelated options.

The reference answer names the two config options that trigger this path and walks through five files. The proof script performs a stylesheet config change against the real code, checks the resulting script registration and the call into the live page, and confirms that an unrelated option does nothing. The question is unrelated to Array.prototype.at: it comes from code the solving agent read along the way, not from the fix itself.

Picking sequences that match the target

Questions can go before, between, or after the issue requests, so each task has several candidate sequences. We pick one per task so that the benchmark as a whole resembles the long Production Sessions, as measured by the TaskFlow Alignment Score (TFAS). TFAS compares the three distributions (session lengths, intents, transitions) between target and benchmark with the Jensen-Shannon divergence and combines them into a 0–100 score. Pure splitting scores 59.6 against our target. Adding questions at fixed positions raises it to 75.6–77.1; letting an optimizer choose how many questions each task keeps and where they are placed raises it to 77.8. The result is 454 questions across 255 of the 700 tasks (113 tasks with one question, 85 with two, 57 with three), with 67 tasks carrying their questions only before the issue requests, 86 only after, and 102 interleaved. The other 445 tasks keep their three issue requests.

Task Flow of SWE-Bench Pro (left) and of the TFAS-optimized selection with TFAS 77.8 (right). One user prompt per issue becomes up to six sequential prompts of different types. Repositories, requested changes, and the final tests are unchanged.

In the right panel, the issue requests carry the task types that were already in the issues: bug fix, new feature, and some refactoring, the same three that make up all of SWE-Bench Pro on the left. Smaller intents also surface once an issue is split: debug, transformation, tests, planning, and a few others. These are not additions but parts of the original issue that the classifier folded into the dominant intent when it saw the issue as one message (a bug-fix issue that also asks for a regression test, for example) and that became visible as separate messages after the split. The only intent that comes from outside the issue is explain, carried by the repository questions.

Pilot results: four models, three setups

To evaluate SWE-TaskFlow, we ran GPT-5.6 Luna, GPT-5.6 Terra, GPT-5.4 Mini, and Gemini 3.7 Flash through mini-swe-agent on the same 700 tasks, three runs per setup:

  • Single: The original issue in one message.
  • Split: The three requests, delivered one after another in a single conversation.
  • Split+QA: The TFAS-selected sequences with repository questions.

Means of three runs; whiskers are observed min–max. Colors are models, shapes are setups.

Splitting the issue into three messages made every model 2.0–2.6× more expensive per task. Since the repository, the tests, and the requirements did not change, the extra cost measures how much more effort an agent spends when the requirements arrive in pieces. Resolve rates moved less: GPT-5.6 Terra stayed flat, the other three dropped by 4–5 points on average, which is comparable to the spread between individual runs of the same setup. With three runs per setup, these results do not rank the models; they show that progressive disclosure reliably changes the effort and only weakly changes the outcome.

The LLM rewrite itself, rather than the sequencing, could also have made the tasks harder. A control condition, Concat, delivers the same three rewritten parts pasted into one message. For the three GPT models, with one run each, it lands next to Single on both cost and resolve rate, so the extra cost of Split comes from the sequential delivery, not from the rewording.

Adding the repository questions costs another 4%–24% on top of Split, depending on the model. On the 255 tasks that carry questions, the share of answers the judge marks correct (answer accuracy) ranges from 69.8% (GPT-5.4 Mini) to 83.0% (GPT-5.6 Terra).

Filled circles: answer accuracy. Hollow circles: resolve rate on the same 255 tasks, which is why these resolve values differ from the plot above.

A split trajectory also admits intermediate verification. After each issue request, we can snapshot the repository and rerun the tests, scoring only against the requirements revealed so far. In a 64-task ablation, both the resolve rate and test-pass rate grow with each issue turn, and the position of the questions does not move the curves. One task yields several verified checkpoints instead of a single final score. That is useful for diagnosis and potentially for training; we have not tried the latter.

What SWE-TaskFlow does not yet cover

SWE-TaskFlow currently generates two kinds of messages: issue requests and repository questions. Everything else in the Task Flow of real sessions (general programming questions, planning, code review, refactoring beyond what the issues already contain, execution, debugging without a fix) still needs its own generator and its own verifier, and for most of these, it is unclear how to check the response automatically. The measured Task Flow at least tells us which augmentations are missing and in what proportion.

All messages are also fixed before the run. That gives exact replayability and paired comparisons, and it measures progressive disclosure, memory, and adaptation, but not how the agent handles feedback: the “user” cannot react to what the agent did. Reactive benchmarks with simulated users cover that at the price of trajectory variance; a full evaluation suite would combine a calibrated static core with targeted reactive slices. Beyond that, the classifier has no human-labeled accuracy set; some issues cannot be split, question difficulty depends on the model that writes them, and the pilot has three runs per setup.

The SWE-TaskFlow-SWE-Bench-Pro dataset on Hugging Face has 12 configurations as separate splits: the original prompts, the split prompts, the Split+QA variants, and QA-only sessions. Every question comes with its reference answer and proof script. Repositories, gold patches, and tests stay with the original SWE-Bench Pro release.

show more
Dynamics of Sentiment and Attitudes Toward AI Among Developers
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-19 11:57:55 | Created: 2026-10-19 12:48:58

For the last three years, we’ve been measuring developer sentiment and attitudes toward the role of AI across the software development lifecycle via our Developer Ecosystem surveys and AI Pulse surveys.

The leap happening this year is striking. You can feel it in the air – especially in JetBrains Air – and see it in the numbers, too.

Earlier, we shared interesting insights into:

Readiness to delegate development activities to AI

Agents are empowering developers and enabling use cases that, just a year ago, were unimaginable to the vast majority of engineers.

In April–June 2025, only 18% of developers were ready to delegate writing application logic code to AI. One year later, that number has jumped to 50% – nearly a threefold increase.

Test writing has also seen similar momentum, with the proportion of developers ready to delegate it to AI rising from 50% in April–June 2025 to 75% in May–July 2026.

Delegation or refactoring tasks is another example, having grown from 38% to 60% over the same period.

There are, however, a couple of core activities that the majority of developers are not yet ready to delegate to AI: 

  • Code review – only 43% are ready to fully delegate code review to AI. This posture is also softening, though, up from 33% a year ago.
  • Debugging –  the majority (54%) are not yet ready to delegate debugging to AI. Still, the trend line is clear – down from 76% holding out last year – suggesting this preference may shift soon as agentic debugging improves.

Sentiment toward AI

Developer sentiment is also shifting rapidly. The vast majority (79%) believe employers will expect developers to be proficient with AI dev tools – up from 59% in June–July 2024.

A similar trend holds for expectations that AI tools will radically transform the software development job market.

Anxieties around the future of software jobs are growing, though they have not yet become the dominant view. Currently, 37% of developers believe that the adoption of AI coding will decrease demand for professional developers (compared with 28% in 2024). Nearly a quarter believe AI will eventually take over coding entirely and fully replace human developers – a sharp rise from just 8% in 2024.

Interestingly, though perhaps as expected, this outlook is more prevalent among heavy users of AI coding agents, where 37% agree that full replacement is possible. Those who rarely or never use agents remain much more skeptical.

We plan to share more insights on agentic development from the Developer Ecosystem Survey 2026 with the community soon. 

Stay tuned and subscribe to JetBrains Research updates below!

Methodology notes

In this report, “developers” refers to respondents who reported being involved in coding or programming in any of the following job roles:

  • Developer / Programmer / Software Engineer
  • AI / ML Engineer
  • DevOps Engineer / Infrastructure Developer
  • Architect
  • Data Scientist / Data Engineer / Data Analyst
  • QA Engineer

Roughly 90% of the total sample falls into the Developer / Programmer / Software Engineer job category.

The Developer Ecosystem surveys are localized into eight languages: English, Spanish, Chinese, Japanese, Korean, German, French, and Brazilian Portuguese. To ensure accurate global representation, we apply regional response quotas based on developer population estimates from our Data Science team (details are available here).

The Developer Ecosystem Survey has been statistically reweighted to better represent the global developer population by region, employment status, programming language, and familiarity with JetBrains products. Read more about our weighting methodology here.

show more
JetBrains .NET Day Online 2026: Watch the Recordings
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-19 08:00:00 | Created: 2026-10-19 08:39:57

Every session from October 7 is now on YouTube.

.NET Day Online 2026 took place on October 7. Thanks to everyone who watched the livestream and asked questions in the chat! If you missed a session, or want to watch one again, all of them are now online.

Watch the full playlist

Here’s a quick overview of each session to help you decide what to watch.

Keynote: JetBrains .NET Tools in the Age of Agents

Anastasia Kazakova, Matt Ellis, Matthias Koch, and Mehul Harry

Anastasia opened the day by exploring how agents are changing what developers need from their tools and introducing JetBrains Air. Matt followed with a demo of Air in Rider. He gave Codex a task in a sample app, checked the result with Rider’s tests, navigation, and debugger, and left a review note that sent the agent back for another pass. He also showed how Rider shares its own tools with agents, through bundled skills for debugging and refactoring, and hooks that inspect and reformat the code an agent writes.

Matthias gave an agent the dottrace-analyze skill to investigate a slow app. The skill lets the agent read real profiling data and trace the hot paths back to the code, and in our evaluation, it raised the agent’s average accuracy from 4.7 to 8.1 out of 10. See the details in this blog post.

Mehul wrapped things up by discussing options for .NET developers to use ReSharper in VS Code and Cursor for those who work outside Rider.

Air is available as a plugin for Rider 2026.2 and is bundled with Rider starting with the 2026.3 EAP. You can also try Junie Lite, a free version of Junie, right from the Air model picker. Learn more at jetbrains.com/air.

Watch the keynote

Messaging Patterns for Modern Software Solutions

Irina Dominte

Irina walked through the Outbox, Inbox, and Saga patterns for distributed .NET systems, covering where each one helps and what it costs you to run.

Watch

C# Interceptors: Native AOT and Performance for Free

Stefan Pölz

Stefan showed how C# interceptors and incremental source generators can replace reflection-based call sites. The payoff is code that trims better and works with Native AOT.

Watch

Refinement-First Processes for AI Development

Stacy Cashmore

Stacy shared the process her team uses for AI development. They go from the problem to user stories before anyone writes code, then hand the build to specialized agents. She also took on lines of code as a measure of AI productivity and argued that the point is to solve user problems better.

Watch

Building a Supply Chain Attack With .NET and NuGet

Maarten Balliauw

npm keeps facing supply chain attacks, and Maarten showed that .NET already has similar vulnerabilities. He demonstrated several ways to inject code through .NET, NuGet, and MSBuild, then covered how to reduce the risk.

Watch

Modular Monoliths: The Goldilocks Architecture?

Steve Smith and Eric Fleming

Monoliths can turn into a big ball of mud, and microservices can turn into a distributed monolith. Steve and Eric made the case for a middle path, the modular monolith. It keeps deployment and hosting simple and still leaves room for several teams to work in one codebase.

Watch

Interoperability of .NET

Sam Basu and Andres Pineda

Sam and Andres showed how far one .NET codebase can reach across mobile, desktop, web, and devices. They also built MCP servers with the C# MCP SDK.

Watch

Introducing the SQL MCP Server

Jerry Nixon

Jerry introduced SQL MCP Server, Microsoft’s open-source MCP server for SQL Server, Azure SQL, PostgreSQL, Cosmos DB, and MySQL. He showed how it works alongside Data API builder, so language models can work with company data while permissions and policies control what they can access.

Watch

Escape the Monolith: Scaling Blazor With .NET Aspire and Azure Container Apps

Michael Washington

Michael walked through Blazor Data Orchestrator, an open-source tool he created with a friend to schedule and run jobs in containers. Built with .NET Aspire and Blazor, it adds what they kept missing: a dashboard, centralized logs, and a way to package jobs and move them between environments. He also talked about how AI helped the two people build it on weekends.

Watch

Tell us what you thought

Share your feedback in our short survey, which is open until November 8. We read every response, and it shapes what we’ll do next year.

Take the survey

Thank you

A big thank you to all ten speakers for their time and talks. Thanks also to our hosts Matt Ellis, Rachel Appel, Matthias Koch, Michael Hawker, and Isaac Levin, and to everyone behind the scenes who kept the livestream running. This event is supported by the .NET Foundation.

show more
Can you bake Maven into a neural network?
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-18 16:36:08 | Created: 2026-10-18 18:54:57

We tried, and it builds. We compiled the decision-making part of a Maven-style build tool into a fixed weight matrix and used it to build a real Java library. The output matches Apache Maven's byte for byte. A clean build with tests took 1.49× as long as the same logic written in Python (95% interval 1.4× to 1.54×, 30 paired runs).

The network’s weight table, one bar per row. Bar height is how often a row ran during one ZXing build; the bright point replays real stretches of that build, one step at a time.

Every Java developer has watched Maven think. It resolves, compiles, tests and packages. Most of that time belongs to javac and JUnit, but threaded through it is a small, fussy piece of logic that decides what happens next. Which version of a library wins when two modules disagree. Which files go to the compiler, and with which flags. Whether a failing test stops the build.

We wanted to know if that piece could live inside a neural network. Not a model trained to guess what Maven usually does next: that kind of model is right most of the time, and a build tool that is right most of the time is broken. We wanted the decision logic itself, compiled into weights, so the network gets the answer exactly right or refuses to answer.

The video at the top of this post is that network. Each of its 26,626 bars is one row of its weight table (model nmvn-exact-v2, explained in the section on making it cheaper), bar height is how often that row ran during one ZXing build, and the bright point replays real stretches of that build, one step at a time. Everything that decides how the build goes is in there.

From a program to a weight table

The trick comes from Handwired: you can write a program and then set a network’s weights so the network is that program. We wrote a small Maven-compatible build controller in a restricted subset of Python and compiled it into a table of 29,625 × 7 numbers, plus 7,382 cells of constants (that’s the first version, v1; a later section shrinks the table to the 26,626 rows you see above). No training, no gradient descent: zero optimizer steps.

Running it is a loop. Each step, the network looks up one row of its table with two matrix multiplications, does the arithmetic that row encodes on a small register file, and writes the result back to memory. The network can’t open files or start javac. When it needs to, it writes a request into a fixed slot in its memory, and a thin bridge carries the request out and writes back the raw answer. The bridge never decides anything. Every choice comes out of the weights.

pom.xml bytes+ results so far Fixed weight tableone row per step,two matmuls to fetch it,no training A request“read this file”“run javac with…” Bridgedisk, javac, JUnit,bnd, zip raw result written back into the network’s memory, and the loop continues

The test subject was ZXing 3.5.3, the barcode library: its parent project and the core and javase modules, built with clean package and the tests on.

Does it actually build?

Yes. The JARs it produced match Apache Maven’s byte for byte, built inside a sandbox where Maven can’t run, the network is off, and neither the Python version of the logic nor Maven’s own outputs can be read. All 549 upstream tests ran and passed, and the freshly built JARs encoded and decoded QR codes correctly in 27 of 27 checks.

519hand-written build cases passed, each checked against real Maven
10,000generated project cases passed
33other small projects built correctly with the same weights
4,796,191network steps for one full ZXing build

Two checks convinced us the work really happens in the weights. The CPU and GPU versions of the network made exactly the same 1,731 requests, in the same order, for a full build. And when we deleted or corrupted the weight file, no build happened at all.

QR code produced and decoded using the newly built ZXing JARs
A QR code written by the freshly built ZXing JARs and read back by them.

Watch it build

Left: the controller as ordinary Python. Right: the same controller as a neural network. Both build ZXing for real, one after the other on the same Mac, played back at real speed.

One recorded build on each side, played back in real time. Grey on the timelines is time spent in javac, JUnit, bnd and zip.

The bill

It’s slower, in every scenario we measured. Python runs the controller’s logic directly; the network spends a full round of matrix arithmetic on every tiny instruction, and one ZXing build costs it 4,796,191 of them.

What was timedClassic PythonNeural, CPUNeural, GPU (Metal)Apache Maven 3.9.11Neural CPU / Python
Decisions only (no Java work)146.54 ms4.15 s27.97 s–28.3×
Cold start to first decisions385.94 ms4.80 s28.25 s–12.4×
Clean build with tests15.52 s23.12 s70.11 s15.29 s1.49×
Build that stops at a compile error1.74 s4.41 s22.19 s2.81 s2.53×
Median wall time (lower is better). Last column: neural CPU time divided by Python time.
Bar = median; whisker = p25 to p75.Classic Python15.52 s (n=30)Neural, CPU23.12 s (n=30)Neural, GPU (Metal)70.11 s (n=30)Apache Maven 3.9.1115.29 s (n=30)
Clean build with tests, median seconds. Bar = median; whisker = p25 to p75.

On decisions alone the network is far behind. In a whole build the gap shrinks to about one and a half times, because most of the time goes to javac and JUnit and both versions use the same ones. Running the network on the GPU made things worse, not better. A program that executes one instruction after another gives a GPU nothing to do in parallel.

So this is not a faster build tool. It’s a build tool you can hold as a tensor.

Making it cheaper without touching the network

The time is roughly steps × cost per step, so we counted where the steps go. We replayed a full ZXing build in an instruction-level simulator and tallied every instruction it executed. Of v1’s 4,796,191 steps, 652,773 (14%) just copied a value from one register to another, and 553,333 more (12%) loaded a constant or jumped back to the top of a loop. That’s compiler glue, not build logic.

So we left the network alone and fixed the compiler. Results now land directly in the register that needs them, constants ride inside the instruction that uses them, conditions compile straight to branches, and loops test at the bottom instead of jumping back to the top. The machine, its step graph and the GPU kernel are unchanged. Only the table of numbers is different, and smaller.

23%fewer network steps for a full ZXing build (4,796,191 → 3,676,728)
10%fewer rows in the weight table (29,625 → 26,626)
identicaldecisions: fed v1’s recorded inputs, v2 makes the same 1,731 requests in the same order, on CPU and GPU
2 of 2correctness gates re-passed by v2 (same suites, sandboxed build, byte-identical JARs)
For the same full ZXing build: v1 ran 4,796,191 steps, v2 ran 3,676,728.v1: 4,796,191 stepsv2: 3,676,728 stepsregister copies0.65M → 0.09M -86%constant loads0.34M → 0.18M -46%unconditional jumps0.22M → 0.04M -81%branches0.70M → 0.66M -6%arithmetic and compares1.42M → 1.24M -13%memory loads and stores1.22M → 1.22M +0%calls and returns0.18M → 0.18M +0%vector ops and I/O0.06M → 0.06M +0%
Every step of one full ZXing build, by instruction class (instruction-set simulator replaying the recorded build; the action sequence is identical for both models).
What was timedNeural CPU, v1Neural CPU, v2Python (v2 run)v1 / Pythonv2 / Python (95% CI)
Decisions only (no Java work)4.15 s3.40 s140.81 ms28.3×24.2× (23.6× to 25.2×)
Cold start to first decisions4.80 s4.14 s402.38 ms12.4×10.3× (10.1× to 10.7×)
Clean build with tests23.12 s21.09 s14.83 s1.49×1.42× (1.40× to 1.43×)
Build that stops at a compile error4.41 s3.70 s1.78 s2.53×2.08× (2.05× to 2.11×)
Neural CPU, v1 vs v2 (median wall time). Ratios are neural time / Python time from paired runs in the same session; v1 from nmvn-bench-v0, v2 from the follow-up protocol.

The GPU gains more, because it pays almost purely per step: decisions only took 27.97 s with v1 and 21.61 s with v2 (23% less), close to the cut in steps. It is still the slowest engine.

We re-ran the whole correctness chain on the new weights: every test suite, the sandboxed build that has to produce byte-identical JARs, the negative controls and the CPU/GPU replay. The cut is real but modest where it counts. Java tooling still owns most of a full build, so trimming the network’s share moves the end-to-end number less than the step count suggests.

It isn’t only Maven

To check the compiler isn’t secretly tuned to one program, we gave it something unrelated: a maze solver (breadth-first search, programs/maze/maze_nml.py). It compiled to 279 rows of weights. A small app starts the classic and the neural version at the same moment, as separate processes, and draws each cell as soon as that program reports it.

Recording of the app window, which saves its own frames as it runs;, neural side on CPU. The GPU version takes longer.

On 3 different 171×121 mazes, plain Python, the Python debug shim, the neural CPU run and the neural GPU run produced identical event sequences: every visited cell, in the same order, with the same distances. The first maze took 2,572,288 network steps. Neural on CPU took 161× to 168× as long as plain Python, and on GPU 791× to 812× (each program’s own timer, one run per maze, so treat these as rough).

So it’s slower. Is it even useful?

Fair question. We asked it too. If you want a faster build, no: keep using Maven. And a bigger GPU won’t rescue it, because the network runs one instruction at a time and nothing in a build controller can be spread across thousands of cores.

Speed was never the interesting part, though. What we ended up with is a neural network where every weight has a known meaning, and that is rare. Here’s where we think it’s worth something, most convinced first.

An answer key for people who take networks apart

Interpretability research tries to work out what a network does from its weights alone. The hard part is grading the answer, because for a trained model nobody knows the truth. This network ships with the truth. Apart from a seven-row start-up stub, every one of its 26,626 rows belongs to a known function among the controller’s 249, and we know what each of those functions does. So we can point at the rows of do_surefire, the part that runs the tests and decides whether a failure stops the build. If a tool claims to have found “the dependency-resolution circuit”, you can check it. Hand-built test networks tend to be small toys. This one does a real job on a real codebase, and we think that’s its best use.

Exact parts inside models that guess

A model that picks the right library version 99% of the time is wrong once every hundred builds. Compiled weights are a way to put an exact subroutine in the same form as a learned model: same tensors, same runtime, same hardware. To be clear, we haven’t joined one to a trained model. That’s the next experiment, not a result. It’s the direction we find most exciting all the same.

Decision logic you can hash

The whole policy is one file of numbers. Move it from CPU to GPU and it makes the same 1,731 decisions in the same order; feed it a recorded build and it replays it exactly. That’s how we compared v1 and v2 decision by decision in the section on making it cheaper. You can diff it, sign it, and show that a given build came from it. In fairness, ordinary code with a lockfile gets you most of the way. What the tensor version adds is that the thing running the policy is the same fixed loop of lookups and arithmetic for any program you compile into it, and a smaller runtime is a smaller thing to trust.

One more thing in its favour: the cost shrinks when the decisions are a thin layer over heavy tools. In a full ZXing build, javac and JUnit do most of the work, which is why the network costs about one and a half times the Python time there instead of twenty-odd times. Glue logic around expensive steps pays that same modest price.

Wrong tool for

  • Faster builds, or anything where milliseconds matter
  • Throwing more GPU at the problem
  • Replacing Maven

Worth a look for

  • Testing interpretability tools against a network with a known answer
  • Exact subroutines living next to learned models
  • Decision logic you can hash, replay and compare

What we’re not claiming

  • This isn’t all of Maven. It handles one build (clean package) of one real project, with Enforcer, Checkstyle, Javadoc and source JARs skipped. Signing, deployment and everything that only runs in verify are out of scope. The plugins aren’t neural: javac, JUnit, bnd and zip run as ordinary programs.
  • This isn’t machine learning. The weights were compiled from a program, not learned. We didn’t try a trained version, and we’d expect one to fail on projects it hadn’t seen.

Check our work

The weights, the runtime and the full results are on Hugging Face at shirman/neural-maven: the method, all eleven scenarios, memory use, the environment and evidence hashes, plus the raw measurements, both protocols, the analysis code and checksums. That’s enough to recompute every number in this post.

show more
Junie Local Comes to the NVIDIA RTX Spark
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-16 13:53:12 | Created: 2026-10-16 16:55:57

Junie Local is supported on the NVIDIA RTX Spark from day one, and Windows support moves from experimental to stable.

Junie Local runs alongside LLM training on the same RTX Spark laptop

NVIDIA’s RTX Spark platform pairs a Blackwell RTX GPU with a Grace CPU to run larger local AI models in slim laptops and compact desktops. Junie Local leverages this hardware to bring local AI coding to your everyday workflows.

Install Junie and run /local, and you have a full coding agent on your RTX Spark. It reads your code, edits files, and runs your tests. No token charges, no quotas, and your code never leaves the machine.

We thank NVIDIA for giving us early access to the RTX Spark and for working with us to get Junie Local ready for launch.

What the RTX Spark changes for Junie Local

In our testing on the RTX Spark, Junie Local reached generation speeds of up to 55 tokens per second. This is our initial performance baseline for the platform, with further inference optimizations already in development.

Bringing Junie Local to the RTX Spark meant adapting both setup and inference to the hardware. Junie Local automatically sizes the context window to fit the memory available to the GPU in your configuration. With more memory available, it can retain more code, tool outputs, and conversation history in its running context.

For inference, Junie Local uses Blackwell’s Tensor Cores for efficient FP8 computation, helping it process that context faster. It also uses speculative decoding to accelerate generation by drafting several tokens ahead and verifying them together.

Junie Local is now stable on Windows

When we launched Junie Local in August, it needed an M5 Mac with 64 GB of memory. We said then that lowering that bar was what we were focusing our efforts on, and that we were looking at making it runnable on 24 GB cards.

In September, we shipped experimental Windows support for NVIDIA RTX cards with 24 GB of VRAM. Today, that support is stable. If you have an Ampere or newer 24 GB RTX card, such as an RTX 3090, 4090 or 32 GB 5090 – you can run Junie Local.

Since the September preview, we’ve rebuilt the installer and the local engine. Junie Local is now ready for everyday use on:

  • NVIDIA RTX Spark PCs, running natively on Windows on Arm.
  • Windows PCs with NVIDIA RTX graphics and at least 24 GB of VRAM, running x64 Windows.

What changed:

  • Simple setup. The installer recognizes your PC, checks your GPU and driver, and installs an optimized inference engine, the model, and the Junie integration.
  • Context sized for your GPU. Junie Local picks the largest context window your GPU memory can hold.
  • Your choice of model. Choose Qwen3.6-27B or Qwen3.8-3.6-27B-blend, our merged model. The latter retains much of Qwen3.8’s coding ability and Qwen3.6’s shorter reasoning. Support for additional models is coming.
  • More reliable everyday use. The local engine starts, stops, and updates without fuss, and long coding sessions hold up better.

Requirements

PCWhat you need
NVIDIA RTX SparkWindows 11 on Arm, with at least 24 GB of memory available to the GPU
Windows PC with NVIDIA RTX graphicsWindows 11 on x64 and an NVIDIA RTX GPU with at least 24 GB of VRAM

You’ll also need NVIDIA driver 581 or newer and about 20 GB of free disk space to support the model.

Get started

In PowerShell, run:

powershell -NoProfile -ExecutionPolicy Bypass -Command "[Environment]::SetEnvironmentVariable('JUNIE_LOCAL_MODEL', '1', 'Process'); iex (irm 'https://junie.jetbrains.com/install.ps1')"

Then start Junie, run /model, and pick a model. Junie will download what it needs, start the local engine, and switch your session over.

What’s next

We’re working to give you more choice in local models and make them better suited to coding with Junie. That includes improving coding performance while reducing the time and memory needed to complete a task.

For the RTX Spark, we’re exploring more efficient model formats and improving speculative decoding to make better use of the GPU’s compute capacity. We’ll share benchmarks and what we learn as these improvements reach Junie Local.

Try it

Junie Local is free. No registration, no subscription, no credits, no card. Try it on supported hardware and tell us what worked, what didn’t, and what you’d like to see next.

Try Junie Local →

show more
Google Summer of Code 2026 With the Kotlin Foundation: Recap
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-15 15:03:05 | Created: 2026-10-15 17:01:58

Google Summer of Code 2026 has wrapped up! This was the Kotlin Foundation’s fourth year participating in GSoC, bringing new contributors into the Kotlin open-source ecosystem through hands-on projects and mentorship.

This year, two projects successfully reached completion, tackling two areas of the ecosystem: improving recursion support in the Kotlin/Wasm backend and building a global picture of where Kotlin is taught.

Congratulations to Ayako Hayasaka and Mark Seif Khalil, and a huge thank-you to our mentors for supporting them throughout the program!

Here’s more on what they accomplished.

Tail call support in the Kotlin/Wasm backend

Contributor: Ayako Hayasaka
Mentor: Charlie Zhang (JetBrains)

Ayako’s project added support for WebAssembly tail-call instructions to the Kotlin/Wasm backend. The compiler can now detect calls in tail position and emit return_call or return_call_ref, helping recursive Kotlin/Wasm programs avoid increasing the call stack.

In Ayako’s benchmarks, several recursive patterns became 1.7–4.3x faster at a recursion depth of 10,000. At a depth of one million, the same programs crashed without tail calls and completed successfully with them.

Testing the change on real-world projects also revealed an unexpected performance regression in V8. Ayako traced it to a missing optimization for return_call, submitted a fix, and had the patch merged into V8.

“What surprised me the most was that Ayako, after implementing the new WebAssembly instructions and using them in the Kotlin backend, actually found a bug in the Google V8 engine. Not only did she report the bug, she fixed it as well.”

Charlie Zhang

Ayako has continued working on follow-up optimizations and other approaches to supporting recursive code beyond the original GSoC project.

For Ayako, GSoC 2026 was also a chance to work much more closely on language and runtime internals than in her everyday work.

“In my day job, I rarely get to touch the internals of a language, so I simply had a lot of fun with this opportunity. While investigating the slowdown, I had to read not only the compiler but also V8, and I realized how much there is to learn beyond the code I usually work on.”

Ayako Hayasaka GSoC 2026
Ayako Hayasaka

Read Ayako’s full story → Final project report

Mapping the global Kotlin education landscape

Contributor: Mark Seif Khalil
Mentors: Ksenia Shneyveys (JetBrains) and Elizaveta Artser (JetBrains)

Mark’s project set out to create a structured overview of where and in what context Kotlin is being taught, considering that the information is spread across websites, course curricula, repositories, learning platforms, and other sources. The project brought that fragmented information together and created a structured and automated way to gather this data.

Over the course of GSoC 2026, Mark explored different sources and approaches to collecting this information, built a database, and developed a process for parsing and structuring data from multiple sources. 

“The biggest thing I learned is when to stop pushing on something that is not working and change my approach. This is a lesson I will keep with me in every project.”

Mark Seif Khalil GSoC 2026
Mark Seif Khalil

The resulting project gives us a reusable foundation for monitoring Kotlin’s presence in education and identifying trends and gaps.

“What impressed us both the most about Mark was his ability to take an initially exploratory idea and bring his own vision for the research while continuously incorporating our feedback. Mark turned this scattered information into a resource we can actually use to understand Kotlin education worldwide.”

Ksenia Shneyveys, Elizaveta Artser

Read Mark’s full story → Kotlin Education Landscape
Watch Mark’s GSoC reflection


Interested in contributing to Kotlin through a future Google Summer of Code – or mentoring a project yourself?

Join the #gsoc channel in the Kotlin Slack to meet the community, ask questions, and follow future GSoC announcements.

show more
IntelliJ IDEA’s Java and Kotlin for Cursor and VS Code Hits 1.0
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-15 13:06:31 | Created: 2026-10-15 14:51:57

Ten weeks ago, we opened up a preview of an LSP-powered extension that brings IntelliJ IDEA’s smartness for Java and Kotlin into VS Code and Cursor. As mentioned in that blog post, this is part of a bigger initiative: moving our JVM intelligence to wherever our users are, no matter what editor or agent they are using.

Today, we’re proud to announce 1.0, the first stable release of Java and Kotlin by IntelliJ IDEA.

And we’re not shipping it alone. This release is also the result of a close collaboration with the team at Cursor, who have worked alongside us to make Java and Kotlin a first-class experience in their development environment. 

Get Java and Kotlin by IntelliJ IDEA from Visual Studio Marketplace

Get Java and Kotlin by IntelliJ IDEA from Open VSX Registry

Why this matters

Agentic development is changing how software gets built. As agents take on more implementation work, developers spend less time manually editing code – and when they do edit, they often need only a focused set of features: navigating to declarations, finding references, code completion, and renames.

These capabilities are exactly what the Language Server Protocol was built for: implementing language support once, and reusing it in any LSP-capable editor. And it’s not only humans who benefit. Agents can call into an LSP directly, producing faster, more deterministic results – and, importantly, consuming fewer tokens.

These are the workflows we want to accommodate with our extension and the underlying IntelliJ IDEA’s Language Server and Debug Adapter.

Cursor collaboration

When we set out to bring IntelliJ IDEA’s language intelligence beyond our own IDE, Cursor was a natural first partner. 

Their team collaborated closely with us throughout the development of the extension, battle-testing it and making sure Java and Kotlin developers get a seamless experience inside Cursor from the moment they open a project. 

We’re glad to work with JetBrains to bring Java and Kotlin language intelligence to Cursor. With Java and Kotlin by IntelliJ IDEA, developers get IntelliJ IDEA’s code analysis, navigation, and refactoring while they work with Cursor’s agents.

— Rohan Shah, Product, SpaceX AI

What’s in 1.0

Java and Kotlin by IntelliJ IDEA is powered by the same Java and Kotlin language technology as the IntelliJ IDEA desktop IDE. 1.0 brings a focused set of capabilities to VS Code and Cursor, including:

  • Java, Kotlin, and mixed-language project support
  • Smart code completion, navigation, and code analysis
  • Refactorings and editor assistance
  • Maven, Gradle, and Bazel build tool support
  • Fast, reliable performance even on large projects and monorepos
  • Support for test runners right now for JUnit
  • Powerful debugging capabilities, including emulated breakpoints and async stack traces

The full feature list is in our documentation.

For Cursor, there is dedicated support for the Agents Window. It may use its own instance of the Language Server to provide analysis capabilities based on IntelliJ IDEA’s inspections. This includes nullability support with JSpecify and for Spring Framework’s specifics.

Getting started

Install Java and Kotlin by IntelliJ IDEA from the Visual Studio Marketplace or the Open VSX registry.

Install in Cursor

  1. Open Cursor.
  2. Switch to IDE mode (IDE↗).
  3. Copy the installation command .ext install JetBrains.intellij-server
  4. Press Ctrl/Cmd+P, paste the command, and press Enter

Or get in from Open VSX Registry

Install in VS Code

  1. Open VS Code or another compatible editor.
  2. Copy the installation command .ext install JetBrains.intellij-server
  3. Press Ctrl/Cmd+P, paste the command, and press Enter.

Or get it from Visual Studio Marketplace

Once installed, open your Java or Kotlin project in VS Code or Cursor. The extension analyzes your project, imports it based on any Maven, Gradle, or Bazel build files it finds, and enables Java and Kotlin language features in the editor.

Compatibility notice

Java and Kotlin by IntelliJ IDEA includes code analysis and quick-fixes that overlap with Red Hat’s and Oracle’s Java extensions. To avoid duplicated or conflicting behavior, we recommend disabling those extensions while using ours.

We have, however, made sure that our extension works well with others, like Spring Tools from the Spring Team.

Licensing

With version 1.0, the extension moves out of its free preview phase. Using it now requires an IntelliJ IDEA Ultimate subscription after a 30-day trial period during which you can try out its full feature set for free.

The same license covers IntelliJ IDEA’s Java and Kotlin capabilities everywhere you work – the IntelliJ IDEA desktop IDE, VS Code-based editors like Cursor, and other supported environments. You can review pricing here.

Note: The license is explicitly designed for human use; we’ll release an update regarding licensing models for purely agentic use soon.

Coming next: Agentic and terminal-based workflows

Java and Kotlin by IntelliJ IDEA 1.0 in the editor is just one milestone. 

In one of the next releases, agents that you orchestrate in the Agents view in Cursor or VS Code will also be able to call the LSP directly when writing code, leading to faster, better, or cheaper results.

In parallel, we’ve been running experiments applying the same LSP- and DAP-backed intelligence to fully agentic, terminal-based workflows – think Claude Code or Codex calling directly into IntelliJ IDEA’s Java and Kotlin understanding. News on this will also be announced soon.

Feedback and support

We’re still listening – Java and Kotlin by IntelliJ IDEA 1.0 is a milestone, not the finish line. Tell us what works, what doesn’t, and what you want next. Leave a comment here, open a ticket in our issue tracker, or submit a support request using this form.

Thank you to everyone who tested the preview, and to the Cursor team for launching this with us.

show more
What Makes a Great KotlinConf Proposal?
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-15 09:11:39 | Created: 2026-10-15 10:29:58

The KotlinConf 2027 Call for Papers is now open! We invite developers from across the Kotlin community to bring their ideas, experiences, and expertise to the stage in Kraków.

Do you have a Kotlin lesson or discovery that could help other developers? Perhaps you solved a difficult technical problem, introduced Kotlin into an existing codebase, built something unexpected, or learned valuable lessons from an approach that did not go according to plan.

That experience could become a KotlinConf talk.

Submit your proposal

However, turning an idea into a convincing conference proposal can be challenging, especially if you’ve never submitted one before. How do you know whether your experience is worth sharing? What do reviewers notice first? How detailed should your abstract be? And how can you make a familiar topic stand out?

To help you prepare your submission, we asked Kotlin developers, developer advocates, experienced speakers, and KotlinConf program committee members what makes a strong proposal. Alongside practical advice for shaping your title, abstract, and takeaways, we have added a new section answering an especially important question: What do reviewers notice first when they open a proposal?

First-time speaker? Submit your idea anyway!

It’s easy to assume that a KotlinConf talk must begin with a groundbreaking discovery, a major production system, or years of speaking experience. In reality, a valuable talk can begin with a simple idea or a lesson learned while solving an everyday development problem.

You don’t need to know everything about Kotlin – you need something useful to share and a clear idea of who it could help.

Pamela Hill-Galloway. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker

X, BlueSky, LinkedIn

Submit your idea anyway! There have been some wildly successful talks at KotlinConf that started out as just a simple idea.

If you’re unsure whether your topic would interest anyone, discuss it with the people around you. Explain the idea to colleagues, friends, members of a user group, or people in the Kotlin community. Their questions and reactions can help you understand which parts are most valuable.

Marcin Mycek. Product Manager, Kotlin Build Tools

LinkedIn

If you can find one interested person, there are probably more! If you can find at least two people around you who find the topic interesting and can listen for more than five minutes, it is already a decent candidate.

Previous conference experience is not required. A clear, authentic proposal based on something you understand and care about can be more compelling than a polished proposal with little substance behind it.

Start with the story you want to tell

Before writing the title or opening the submission form, identify the central story behind your talk.

“A talk about coroutines” or “a session about Kotlin Multiplatform” describes a subject, but it doesn’t explain what makes the session valuable.

Ask yourself:

  • What problem, question, or opportunity did you encounter?
  • Why was it important or difficult?
  • What did you try?
  • What surprised you?
  • What succeeded and what did not?
  • What did you learn that other developers could apply?

Your story doesn’t need to come from a large company or a system used by millions of people. A focused lesson from a small project can be just as useful if it offers an original insight or explains a difficult subject clearly.

Try summarizing the idea in one sentence, for example:

This talk will show [audience] how we [solved or explored something], what we learned, and how they can apply those lessons.

If you can’t complete that sentence clearly, the idea may need a little more development before you start writing the proposal.

What do reviewers notice first?

The title may be the first line reviewers read, but the overall level of care quickly becomes visible.

Reviewers consider not only whether the topic is interesting, but also whether the speaker can explain it clearly. A thoughtful title, focused description, concrete takeaways, and careful formatting show that you have spent time developing your idea.

Pamela Hill-Galloway. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker

X, BlueSky, LinkedIn

I can sum it up by saying that the care you take in writing the proposal is probably more obvious than people think. If I can see that you took the time to come up with a catchy or descriptive title that works well with the content, I am more comfortable giving you a thumbs-up to speak at KotlinConf. If your description is so short or so long, or so clearly AI-generated, that you cannot express your idea clearly and neatly, I will probably not vote positively for your talk.

This doesn’t mean you need to use complicated language or create a perfect marketing pitch. It means giving reviewers enough information to understand your idea and showing that the proposal represents your own experience and voice.

Marcin Moskała’s Taming Asynchronous Beasts: Debugging and Performance Tuning in a Coroutine World provides a good example of a precise promise: “You’ll learn how to effectively use built-in tools, recognize problematic patterns, and implement proven optimization strategies.”

Write a clear and informative title

A strong title should give reviewers, and eventually attendees, an accurate idea of what the talk will cover.

Creativity can make a title memorable, but clarity should come first. Avoid titles that rely entirely on a joke, reference, or metaphor without explaining the subject.

Pamela Hill-Galloway. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker

X, BlueSky, LinkedIn

A carefully-selected title can make all the difference! Audience members often lack the time or attention span to read more than the title when deciding whether to attend a talk. Prefer clarity over a catchy or fun title that doesn’t give a good idea of what the talk is about in a nutshell.

Compare the following title examples:

Too broad:
Our Multiplatform Journey

More informative:
What We Learned Migrating Our Mobile App to Kotlin Multiplatform


Too vague:
Coroutines Gone Wild

More informative:
Debugging Coroutine Performance Problems in Production


Too general:
Building Better APIs

More informative:
Designing Type-Safe Kotlin APIs That Are Difficult to Misuse

A good title usually communicates at least two of the following:

  • The main topic
  • The problem or question
  • The context in which it was explored
  • The practical benefit for attendees
  • The expected experience level

You can still use humor or wordplay, but make sure the title does not hide what the session is actually about.

Build your abstract around a clear journey

Your abstract doesn’t need to contain your entire presentation. However, it should provide enough detail for reviewers to understand the problem, the direction of the talk, and its value.

Two or three focused paragraphs will usually communicate more than either a single vague sentence or a very long description covering every detail.

Sebastian Sellmair. Software Developer and KotlinConf speaker

X, BlueSky, YouTube 

Talking at KotlinConf is a great experience and a huge achievement for any Kotlin developer. While choosing a great title, having highly polished animations, and curating high-quality memes might enhance your talk, the most important thing is having a story worth telling. Do you have something novel and technically interesting to present? Can you break down a topic in a way that is engaging and truly fun? Can you inspire fellow developers?

 

Márton Braun. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker

X, BlueSky, LinkedIn 

While we don’t need a full script for your talk as the abstract, we’re also unlikely to accept a talk where the abstract is just a single sentence. Two or three paragraphs are usually enough to provide meaningful detail.

A simple structure can help:

The context

Introduce the situation and the audience likely to recognize it.

The challenge

Explain the problem, limitation, or question that motivated the work.

Jodie Burchell. Developer Advocate and Data Scientist

LinkedIn, Mastodon, BlueSky

Hook your audience by telling them the problem you’re going to be solving. People love mystery books for a reason, and that’s because they build up a bit of suspense before they jump into the solution. A great proposal will do the same thing.

 

The approach

Describe what you explored, implemented, compared, or discovered.

The outcome

Clarify what attendees will learn and how they can use it.

A strong takeaway can be as concrete as the one from Tadeas Kriz’s Dependencies and Kotlin/Native: “Learn how native dependencies interact, how they are loaded, and the unexpected complexities of the native world.”

Chantal Loncle. Software Developer, Exposed, JetBrains

LinkedIn

Avoid vague promises. Instead, use action verbs and specific outcomes to describe the exact capabilities and transformations the audience will gain. Will they leave your talk feeling that their time was well spent? If so, what practical knowledge, immediately applicable skills, or high-value tools will they take with them?

For example:

Maintaining separate Android and iOS implementations allowed our teams to move independently, but it also resulted in duplicated business logic and inconsistent behavior between the applications.

In this session, we’ll examine how we introduced Kotlin Multiplatform gradually, beginning with one shared feature rather than attempting a complete migration. We’ll discuss how we selected the first component, structured the shared code, tested it across platforms, and worked with the existing native applications.

You’ll leave with a practical framework for evaluating where to introduce shared code, which challenges to expect, and how to plan an incremental Kotlin Multiplatform adoption without rebuilding your entire application.

The example establishes the problem, explains what the session will cover, and gives the audience a reason to attend. It doesn’t reveal every detail, but it makes a concrete promise.

Think like an attendee

A strong proposal doesn’t focus only on what the speaker wants to present. It also explains what the audience will gain.

Ask yourself:

  • Who is this session for?
  • What knowledge should attendees already have?
  • What problem will the talk help them solve?
  • What will they understand or be able to do afterward?
  • Why should they choose this session over another talk happening at the same time?

Svetlana Isakova. Team Lead in Kotlin Developer Advocacy, KotlinConf Program Committee member, and KotlinConf speaker

X

When submitting a talk, think like an attendee. Would you want to sit through this? What’s in it for the audience? That’s why we ask about key takeaways. What do you want people to learn, try, do, or feel inspired by?

 

Avoid broad promises such as:

  • “You will learn best practices.”
  • “We will explore Kotlin Multiplatform.”
  • “This talk will cover coroutines.”

Instead, describe specific outcomes:

  • Attendees will learn how to identify and debug three common coroutine performance problems.
  • Attendees will understand how we structured shared code across Android and iOS.
  • Attendees will be able to evaluate whether the approach fits their own project.
  • Attendees will learn which parts of our migration worked, which did not, and what we would change today.

Specific takeaways make the proposal easier to evaluate. If the talk is selected, they also help attendees decide whether it is relevant to them.

Make a familiar topic feel fresh

Your subject doesn’t have to be completely new. Many valuable conference talks revisit established technologies from perspectives that have not been explored in the same way before.

If you are proposing a popular topic, identify what makes your version distinctive. This could be:

  • A real production case
  • An unusual scale or environment
  • A surprising result
  • A failed approach and what it taught you
  • A comparison between several possible solutions
  • A gradual migration rather than a greenfield implementation
  • An unconventional use of Kotlin
  • A personal experience that challenges a common assumption
  • A particularly clear way of explaining a difficult concept

For example, “Introduction to Kotlin Multiplatform” is broad and familiar. “What Broke When We Introduced Kotlin Multiplatform Into a Seven-Year-Old Mobile App” offers a specific context and creates curiosity.

Be honest about trade-offs. A talk doesn’t need to present a flawless success story. Explaining what failed, what changed, and what you would do differently can be especially useful to other developers.

Chantal Loncle. Software Developer, Exposed, JetBrains

LinkedIn

Bringing a real, practical narrative to a familiar topic can strengthen a proposal. Be honest about what broke, what made your team unhappy, or what you would do differently if you could turn back the clock. A familiar issue can feel fresh when you look at it from the perspective of someone who will encounter the same problem for the first time tomorrow.

Rather than providing another general overview, build the talk around one specific pain point or discovery and introduce broader themes only where they support that story. A takeaway that attendees can immediately apply to their work can also help distinguish the proposal from a basic tutorial.

Keep the proposal relevant to KotlinConf

KotlinConf welcomes talks about backend development, Android, multiplatform development, web, desktop, AI, language design, tooling, libraries, developer experience, and other parts of the Kotlin ecosystem.

Whatever your area, the role Kotlin plays in the story should be clear.

Márton Braun. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker

X, BlueSky, LinkedIn

Keep in mind that your talk should be related to Kotlin! For example, not every Android talk is necessarily a good fit for the KotlinConf audience. Or talks about Jetpack Compose often cover things that work the exact same way with Compose Multiplatform, and the latter is much more likely to be accepted at KotlinConf!

An Android topic, for example, is not automatically a KotlinConf topic. The proposal becomes more relevant when it explains how Kotlin influenced the solution, explores a Kotlin-specific technical decision, or provides lessons that Kotlin developers can apply.

Ask yourself:

  • Why is this a Kotlin story?
  • Which parts of the experience are especially relevant to Kotlin developers?
  • Would the proposal still be essentially the same if Kotlin were removed from it?

If the answer to the final question is yes, strengthen the connection to Kotlin before submitting.

Anshika Koul’s Kotlin Multiplatform’s Cross-Platform Brilliance at Norway’s 377-Year-Old National Postal Service offers a clear example of a Kotlin-centered takeaway: “We’ll learn how KMP provides a unified framework for code sharing and execution across various platforms to solve the challenge of different codebases targeting different runtimes.”

Sound confident, but stay true to yourself

Your proposal should show that you understand what you want to share and why it matters.

This doesn’t mean exaggerating your expertise or pretending that you have no doubts. It means presenting the idea as a clear statement rather than repeatedly questioning its value.

Marcin Mycek. Product Manager, Kotlin Build Tools

LinkedIn

Keep statements as statements and questions as questions. It is normal to doubt yourself; everybody does, but a common mistake is to let it show in the text, for example, by changing statements into questions. Read your submission, or even better, ask someone else to read it, and ask yourself: Does this person sound convinced about what they want to tell?

For example:

Uncertain:
Could Kotlin Multiplatform possibly help teams reduce duplicated business logic? In this talk, we might find out.

More confident:
In this talk, I’ll show how our team used Kotlin Multiplatform to reduce duplicated business logic, including where sharing code helped and where it did not.

Confidence should not erase your personality. The proposal should still sound like you.

Marcin Mycek. Product Manager, Kotlin Build Tools

LinkedIn

Stay true to yourself! It is important to make sure that your submission can be understood by others. A great practice is to give it to a few people you trust and ask what they understood from it and how it made them feel. However, keep your soul in it. A lot of great talks are quirky, do not follow every best practice, and people are there for it.

Advice and templates can help you organize your thoughts, but they shouldn’t make every proposal sound identical. Your perspective, language, humor, and enthusiasm are part of what makes the submission memorable.

Show reviewers how you communicate

Examples of previous talks help reviewers understand your presentation style and energy. If you have recordings from conferences, meetups, webinars, or livestreams, include the most relevant ones.

If you’re a first-time speaker and don’t have a formal recording, you can record yourself explaining part of the proposed talk. A simple laptop recording is enough. It doesn’t need professional lighting, editing, or production.

Svetlana Isakova. Team Lead in Kotlin Developer Advocacy, KotlinConf Program Committee member, and KotlinConf speaker

X

Examples of your talks help us make better choices. If you’re a first-time speaker and don’t have recordings, no worries! You can simply record yourself (even just part of your proposed talk) on your laptop and share the link. We would really appreciate it.

Depending on the topic, you can also include:

  • A technical article
  • An open-source project
  • Documentation you have written
  • A short technical demonstration
  • A podcast or meetup appearance
  • Other work connected to the proposed session

These materials support your proposal, but they don’t replace a clear title, abstract, and set of takeaways. Reviewers should still be able to understand the session from the submission itself.

Choose the format that fits the idea

Not every subject needs a full-length session.

A focused lesson, experiment, side project, or surprising discovery may work better as a lightning talk. A subject that involves significant technical context, several connected lessons, or a detailed demonstration may require a regular session.

Choose the format according to the amount of meaningful material you have. If you need to repeat yourself or add unnecessary content to fill a regular session, consider proposing a lightning talk instead.

Márton Braun. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker

X, BlueSky, LinkedIn

Don’t forget that we also accept lightning talks! If you feel like your content would have to be padded to fill a regular session, it might be more enjoyable as a lightning talk.

You can also submit more than one proposal if you have several distinct ideas. Each submission should have its own story, audience, and takeaways rather than being a minor variation of another proposal.

Pamela Hill-Galloway. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker

X, BlueSky, LinkedIn

Submit more than one talk! It gives you more chances to join in on the KotlinConf fun.

Review the proposal before submitting

Once you have completed your draft, step away from it and return later from the perspective of someone encountering the idea for the first time.

Check whether your proposal answers the following questions:

  • Can someone understand the subject from the title?
  • Is the connection to Kotlin clear?
  • Does the abstract identify a real problem, question, or story?
  • Is it clear who the session is for?
  • Are the takeaways concrete?
  • Does the proposal explain what makes your perspective different?
  • Is the scope realistic for the selected format?
  • Does the writing sound confident and authentic?
  • Have you checked the spelling, grammar, links, and formatting?
  • Does the proposal sound like the person who will deliver the talk?

Ask someone else to review it, too. Rather than simply asking whether they like it, ask them to describe what they think the talk will cover and what they expect to learn. Their answer will show whether the proposal communicates what you intended.

Chantal Loncle. Software Developer, Exposed, JetBrains

LinkedIn

Double-check that the intended audience level aligns with the description and expected takeaways. Review the proposal from the perspective of someone you hope will be in the audience. Does it make sense as it is, or is it missing context that may be obvious to you but not to the reviewer or the future audience they are keeping in mind?

AI tools may help you check grammar or organize your thoughts, but the final proposal should reflect your own experience, ideas, and voice. A polished abstract without specific or authentic insight won’t be as convincing as one that clearly represents the speaker behind it.

Márton Braun. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker

X, BlueSky, LinkedIn

Your submission should show that you’ve put some thought and energy into preparing it. Check your submission for formatting issues and typos, and please don’t submit abstracts that were generated by LLMs.

Your Kotlin story could take the stage

You don’t need to know everything about Kotlin or have years of conference experience to submit a proposal. You need a useful story, an understanding of who it can help, and a clear explanation of why it matters.

Not every strong proposal can be selected. Conference programs must balance subjects, formats, experience levels, and audience interests. If your submission is not accepted, continue refining the idea, sharing your knowledge, and looking for other opportunities to present it.

Your experience might be exactly what another Kotlin developer needs to hear.

The KotlinConf 2027 Call for Papers is open! Share your experience, ideas, and Kotlin expertise with the community in Kraków.

Submit your proposal

show more
MPS 2026.2 Release Candidate Available
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-15 09:29:06 | Created: 2026-10-15 10:29:58

MPS 2026.2 is almost ready! Today we’re making a release candidate build available so you can try out the upcoming release ahead of its official launch. Download MPS 2026.2 Release Candidate now:

DOWNLOAD MPS 2026.2 Release Candidate

Along with numerous bug fixes, the RC brings several key improvements to the previous 2026.2 EAP1 build.

Linux ARM64 support

MPS is now available for Linux on ARM64 (AArch64), with a matching bundled JetBrains Java Runtime.

You can also build standalone MPS-based applications (RCPs) for Linux ARM64. The Build Script Wizard now includes a Linux ARM64 distribution in its generated build scripts alongside the existing platform distributions.

TAR imports in Build Language

Build Language now supports importing archive contents directly into distribution layouts using the new import files from tar and files from tar entries.

You can import files from plain TAR archives or archives compressed with gzip or bzip2. The source can be an archive file or another TAR layout defined in the build script.

When importing into a TAR layout, symbolic links and file permissions are preserved. This is particularly useful when packaging platform-specific plugins and native libraries, as symbolic links remain links instead of becoming duplicate copies of their targets.

Archive packaging changes

MPS 2026.2 preserves symbolic links and file permissions when packaging platform-specific plugins. Previously, symbolic links were sometimes replaced with copies of their targets, causing large native libraries to be included more than once, particularly on macOS.

macOS archive distributions now use .tar.gz instead of .zip to preserve symbolic links. The Build Script Wizard generates the same archive format for standalone macOS applications.

Projectional Agent Toolkit enhancements

Projectional Agent Toolkit has received a major boost in performance and capabilities.

Performance

Your AI agents can now cut back on token usage on common tasks like DSL modeling or implementing language definitions. In our measurements using Claude Code + Opus 5 and 5.5, the savings exceeded 50%.

This improvement is the result of a substantial rework of the MPS MCP API:

  • Consistent parameter naming, null and default-value handling, and error reporting.
  • More precise descriptions in the skills and tool documentation.
  • Bulk operations where they provide the greatest benefit, with compact summaries instead of huge payloads.
  • Small read results included directly in responses, with large dumps written to files only when needed.
  • One-shot model validation to check full models without round-trip overhead.
  • Fast concept discovery using lightweight, structure-only metadata views instead of full AST dumps.
  • Fail-fast checks that reject invalid search scopes and mutation inputs instead of returning incomplete results.
  • Helper scripts included with the skills, so agents spend less time reinventing common MPS tasks.
  • Clearer project targeting when several MPS or IDE projects are open.

Typesystem MCP tool

The Typesystem MCP tool enables agents to:

  • Understand node types and typesystem messages.
  • Compare types and determine the expected type for a role.
  • Trace type calculations and debug typesystem rules.
  • Identify the typesystem rule responsible for a reported typesystem error.

Typesystem MCP tool screenshot

Other newly added MCP tools

In addition to the Typesystem MCP tool, we’ve added several more MCP tools to cover other core aspects of MPS development. The new tools enable agents to:

  • Invoke intentions and quick-fixes.
  • Automatically keep their skill database up to date with the MPS instance they connect to.
  • Read and filter the content of MPS logs.
  • Open, close, and create MPS projects.
  • Automatically correct SModel expressions in parsed Java statements, helping agents author concept functions and behavior methods.

Other newly added MCP tools screenshot

Import dialog reworked: Select models and languages to import

The Import dialog has undergone a major overhaul to fix functional issues and bring its appearance in line with the rest of the platform.

  • When pasting code between models, only the models and languages you actually select in the dialog are imported. Previously, the dialog ignored your selection.
  • If the dialog offers only one suggestion, you can now deselect it. Previously, the single suggestion could not be deselected.
  • Both the model and language lists now have checkboxes for individual entries and a header checkbox to select or deselect all entries. The header checkbox shows an indeterminate state when only some entries are selected.

Diff dialog and tab improvements

We’ve made quite a few minor changes to bring the Diff dialog’s look and feel in line with the rest of the platform.

  • The model viewer now has its own icon instead of sharing the side-by-side icon. The top bar is vertically centered, and the left and right panels match the splitter background.
  • Diffs of added or deleted models and of per-root persistence models now have aligned title bars, so separator lines no longer drift when one side is empty.
  • Change markers on the scrollbar now remain in the right position when the dialog or editor is resized. Previously, a marker would sometimes jump to an unrelated location. The fix was made in the shared editor gutter, so regular editor error and warning markers are covered, too.
  • Editor hints defined in your language now appear on the left (read-only) diff panel for file-per-root persistence and on the right panel for per-root persistence models.

You can review the complete list of fixed issues here.

Your JetBrains MPS team

show more
How Netflix Made AI Coding Agents More Efficient with JetBrains IDE Intelligence
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-15 09:29:14 | Created: 2026-10-15 10:29:57

Netflix plugged JetBrains’ headless code-intelligence engine – the same one behind IntelliJ IDEA – into Claude Code and Codex, then benchmarked it against a variety of scenarios. The details and numbers are available below.

At a glance

CompanyNetflix – Application Development Platform (ADP), GenAI Platform, and Agentic SDLC teams
ChallengeCoding agents were struggling to navigate Java/Kotlin code, especially across compiled library (JAR) boundaries
TechnologyJetBrains IDE code intelligence for Java, built on the same code-indexing engine that powers IntelliJ IDEA, run headlessly with no IDE open.
Netflix’s roleBuilt the daemon and CLI needed to make the LSP callable by an agent – infrastructure that JetBrains hadn’t shipped yet
ResultTypically 20–30% more efficient (fewer tokens, less time), and up to about 65% in the best case, on real programming tasks – the size of the gain depends on the model, the agent, and the task, generally larger for stronger models and higher effort settings
Evaluated onTwo real codebases – an internal production service and Netflix’s open-source DGS Framework – across several current coding agents and models, July–August 2026

The goal: Increase agent ROI

JetBrains and Netflix set out to give coding agents accurate, IntelliJ IDEA-grade code understanding in headless environments – with no IntelliJ IDEA instance running.

“Coding agents like Claude Code are slow and unreliable at navigating Java/Kotlin code, especially across library (JAR) boundaries. We integrated a headless JetBrains IDE’s code engine to give agents IntelliJ IDE-grade code intelligence in headless environments, with no IDE running. We created a benchmark with real programming tasks, which shows that with the JetBrains IDE’s code engine, agents are consistently more efficient – using fewer tokens and less time, with the exact gain depending on the model.”

— Paul Bakker, Staff Software Engineer, Netflix

The JAR problem Netflix is trying to solve that Paul describes above: JVM projects typically ship libraries as JAR files only, never as source. Agents have to unzip the JARs (guessing which ones matter), potentially decompile class files, then grep through that incomplete view.

The solution: JetBrains IDE intelligence

JetBrains has spent years building the code intelligence engine behind IntelliJ IDEA. It is based on a deterministic index of your project source files, including all libraries. This intelligence is now exposed via an LSP and available in VS Code-compatible editors. Netflix worked with a headless build of that engine.

The LSP alone isn’t enough for a coding agent to use directly: It’s just a server speaking a protocol, with no easy way for an agent to call it and no built-in process management to reuse a running instance between calls. Netflix closed that gap themselves using the daemon and CLI described in the next section.

Architecture in detail: Keeping the index warm

Building an index for a project takes real time, just as opening a large project in IntelliJ IDEA for the first time does. A coding agent calls the LSP in many small, fine-grained steps, and a realistic task needs several such calls. If each one spun up a fresh LSP server, every single call would incur a multi-second cold-start cost – even on a project whose index had already been built a minute earlier.

A daemon process is required to avoid the overhead of cold-starting the LSP server process on repeated calls. JetBrains is working on delivering a daemon, but no daemon was available by the time of evaluation, so Netflix has built one for their own needs:

  1. Each tool call was short-lived and stateless – it just shelled out to the CLI.
  2. The daemon is the part that stays up: Its session manager routes each call by project root to the matching server process, which holds that project’s index in memory.
  3. A second call against the same project skips indexing entirely and goes straight to a warm server over stdio.
  4. Both the daemon and CLI are developed in Java and distributed as a GraalVM executable, so there is no startup or runtime overhead from the JVM.

How Netflix measured the ROI of JetBrains IDE intelligence

To understand if (and to what extent) JetBrains IDE intelligence improves the performance of a coding agent, a benchmark suite was developed. Same model, same task, same codebase – the only variable was whether the agent could invoke the JetBrains IDE intelligence. Results are reported as the performance difference between runs with JetBrains IDE intelligence versus runs without it.

Evaluation environment and approach:

DatasetsTwo real codebases: An internal service (medium-size project) using Spring Boot 4 and Gradle.
Netflix’s own open-source DGS Framework – a public, mixed Kotlin/Java GraphQL framework.
TasksTwo task types:
Small/focused tasks where the agent attempts to understand specifics in the codebase, e.g. “where is this interface used in the project”, “what implementations exist of this interface”, “what is the structure of this class”.
Full end-to-end tasks, such as implementing a new feature, refactoring a class, or removing code.
ModelsClaude Code with Opus 5 (medium/high effort)
Claude Code with Sonnet 5 (medium/high effort)
Codex with GPT-5.6 Sol (medium/high effort)
ScoringWhile the most important metrics in the experiment were token consumption and time to completion, LLM as a judge was implemented for checking correctness. It works against a reference change set for end-to-end tasks and applies deterministic scoring metric for navigation tasks.
Outlier handlingA task that crashed, hit a budget cap, or thrashed in either arm was excluded from both, so one blow-up couldn’t skew the comparison.

The benchmarks were run multiple times to validate the results and see the effects of changes from new LSP releases.

Results

Across every model, agent, and task type tested, JetBrains IDE intelligence made coding agents more efficient overall – typically 20–30% more efficient, and up to about 65% in the best case, depending on the specific model, agent, and task. The stronger models, with higher effort, saw the largest gains. These models are more expensive, so efficiency improvements matter more, but these models are also better at using indexes effectively.

Efficiency gain per configuration, combining token and time savings. Each comparison runs the same task, model, and codebase twice – once with JetBrains IDE intelligence available, once without it.

~25%
Average gain
20–30%
Typical range
~65%
Best case
Configuration Code navigation End-to-end
Strongest model, high effort ~65% ~24%
Mid model, high effort ~29% ~30%
Mid model, medium effort ~24% ~22%
Lighter configuration, high effort ~17%* ~21%

Efficiency is the average of token and time savings for each configuration. Correctness held steady or improved in every run. *Tokens only: this configuration’s batched search calls made the code-navigation time comparison unrepresentative – see the article text. Figures are a snapshot and will shift with new model releases.

These numbers are a snapshot, not a fixed benchmark result. Every new model release changes how agents search, reason, and use tools, so the exact percentages will keep moving – which is why this write-up reports ranges rather than per-model results. What held up across Netflix’s runs is the general shape: every model and agent tested became more efficient, the largest gains came from the strongest model at a high-effort setting, and the size of the gain differed noticeably from one model to the next.

Code-navigation tasks: More efficient across the board, correctness held or improved

Every model and effort level tested used fewer tokens with JetBrains IDE intelligence – no exceptions there – with savings ranging from roughly 15% to 60%. The size of the gain depended mostly on the model: the strongest model saw by far the largest improvements, while lighter-weight configurations landed at the lower end of both ranges. Correctness held steady in most runs and improved in two – it never dropped.

For the code-navigation tasks specifically, one tool/model combination already batches multiple search calls into a single command, so both with and without JetBrains IDE intelligence, it only makes one tool call there. Calling into JetBrains IDE intelligence is a little slower for that one call than the batched search command – which is what produced the clear lack of time benefit for that combination, not a fair reflection of real-world use. That’s why the broader end-to-end task suite is the more reliable read on time instead, where JetBrains IDE intelligence was faster across every model and agent tested.

End-to-end tasks: Consistently more efficient, correctness unaffected

On the expanded end-to-end run, correctness held steady everywhere across every model and agent tested, so the benefit shows up entirely in efficiency, not in whether the task got done. Every model and agent combination was roughly 10–30% more efficient with JetBrains IDE intelligence, looking at time to completion and token spend. A lot of this is explained by requiring fewer tool calls to come to the same conclusions.

Other evaluated alternatives

Before committing to the described approach, Netflix ruled out two others. The first rejected was a homegrown internal CLI that connected to a running IntelliJ IDEA instance to get access to a project index. The process is similar to what this article describes, but it requires an IDE to be running. This approach didn’t fit headless agents for environments like Otto, Bitbot, distributed refactoring tooling, CI, etc.

Second, an existing Eclipse LSP, which is used for Java in VS Code, was considered. But for Netflix’s build system (Gradle-based), it just didn’t work.

What’s next

Where Netflix goes from here

After the test, Netflix concluded that “the benchmarks show that there is a benefit to having a deterministic intelligence layer alongside your agent”. Of course, it doesn’t cut every coding-agent task by a fixed percentage. But for this specific problem – resolving real structure across JAR boundaries – the benefit is large, holds across models, and doesn’t cost anything in correctness.

Netflix plans to run the same benchmark methodology against Python, TypeScript/JavaScript, and Go. Coding agents for those languages have similar problems. But of course, the ways libraries are downloaded in a project vary by language, so the mechanics of the issues and possible solutions differ. JetBrains plans to continue the collaboration and support this evaluation further.

JetBrains’ take: The LSP is just one step, not the destination

JetBrains IDE intelligence for Java has been tested by Netflix and is now shipped as part of the Java & Kotlin by IntelliJ IDEA extension. JetBrains also continues experiments with the LSP+CLI approach and will report the results once ready.

The LSP’s basic primitive is a position in a text document. The specification defines a position as “between two characters, like an insert cursor in an editor”. That’s a natural primitive for a human working at a keyboard. But agents don’t really think in terms of cursor locations. They ask questions about the program, like “Why is this call inside createUser() unresolved?” and “Which tests are covering this method?”, etc. It’s about understanding relationships between parts of the code rather than looking at cursor positions. And a text position is a fragile identity – inserting one character before any given position causes that position to move.

What an agent needs isn’t a sharper cursor, but a layer that provides answers formulated in the same way as the tasks themselves – i.e. in terms of symbols, diagnostics, test relations, runtime behavior – and returns enough context to reason about the answer, not just locations in a text document.

“That’s what I mean by a code engine: not another protocol that lets an agent imitate editor interaction, but a set of precise operations over program structure and execution – one that returns enough context to actually reason about the result. LSP is useful, but it shouldn’t define the final agent-facing abstraction. Build agent tooling as if the agent were a tiny human at an editor, and you force it to speak in cursor coordinates. Agents need a code engine, not a virtual editor.”

— Aleksey Stukalov, IDE Division Lead, JetBrains

The Netflix numbers prove code intelligence is worth paying for. Deciding what shape that intelligence takes is the challenge that lies ahead.

show more
How Cloud-Based Agent Sandboxing Works in Air
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-14 12:26:05 | Created: 2026-10-14 14:25:59

Recently, we released a preview of cloud agents in JetBrains Air. Cloud agents let you run AI agents remotely in a JetBrains-managed cloud environment, giving them an isolated place to work without relying on your local machine.

Here’s what that looks like in practice. In this video, I start a task in IntelliJ IDEA, follow it from the browser and my phone, and review the agent’s changes when it’s done.

Cloud agents are currently available to organizational users via Air in IDEs and Air Teams in the browser, with a broader release for individual users planned later. But they are also part of a bigger question: how to run AI agents safely when they can read files, execute code, use tools, and interact with external services.

In this article, I’ll explain what agent sandboxing means, why it matters, what execution options exist today, and how cloud-based execution fits into the broader sandboxing picture.

Why AI agents need sandboxing

Sandboxing an AI agent is the practice of running the agent inside an isolated and tightly controlled environment that restricts what resources it can access and what actions it is allowed to perform. Rather than granting unrestricted access to the host system, network, or sensitive data, a sandbox enforces predefined boundaries around files, APIs, and external services, while applying least-privilege permissions, resource limits, audit mechanisms, and tracing.

This approach is important because modern AI agents can execute code, use tools, and act autonomously, which introduces risks such as unintended system modifications, data leakage, and exploitation if the agent behaves unexpectedly or is compromised. By containing the agent within well-defined security boundaries, sandboxing limits the impact of failures or attacks and provides a safer and more reliable foundation for deploying AI agents in development, enterprise, and production environments.

Five ways to run AI agents — and their security trade-offs

We can identify five main scenarios for launching agents, which can be grouped into two broad categories: local and remote.

Five ways to run an agent

Local setups share your machine. Remote setups move the agent somewhere else and isolate it by default.

  • Your machine
  • A working copy
  • Created fresh for each task
  • The agent
Mode
Isolated from your machine by default
Who sets it up
Local
Local workspaceWorks in your own working copy
Isolated by defaultNo – it can leave the working directory
Who sets it upNothing to set up; the client must enforce any limits
Git worktreeWorks in a separate copy on your machine
Isolated by defaultPartly – its file changes stay apart from yours, but it can still leave the directory
Who sets it upThe client creates the worktree
Remote
SSHWorks on a machine you provide, over SSH
Isolated by defaultYes
Who sets it upYou, manually
DockerWorks in a new container for each task, locally or on a remote host. Docker Sandboxes use a microVM per agent.
Isolated by defaultYes
Who sets it upThe client, or org admins through Docker Sandboxes
CloudWorks in a new VM, microVM, or container for each task. Air uses a container inside a VM.
Isolated by defaultYes
Who sets it upAutomatic, from settings your team or org admin defines

By default, in local scenarios an agent can easily escape its current working directory either unintentionally or due to prompt injections. Their file system and network access can be limited via OS-level sandboxing tools (landrun on Linux, sandbox-exec on macOS, and Sandboxie on Windows). However, it is then up to the client (the program that the user uses to interact with an agent or CLI tool like Claude Code or Codex) to wrap the launched agent and enforce required policies.

Remote execution provides better guarantees by default: The agent’s environment is isolated from the developer’s. The agent’s access to resources can be restricted via filesystem and network controls, limiting the area of impact.

The main difference between the approaches lies primarily in the amount of manual configuration required. The SSH host requires a machine provided by the user and needs to be configured manually. Docker can be configured either by the client or by organization admins. Docker Sandboxes go a step further and run each agent in its own microVM. Cloud solutions should handle the configuration of the environments automatically based on the settings your team or organization admin defines.

How cloud agent sandboxing works in Air

The agentic core that powers cloud agents in Air follows the approach used by Docker Sandboxes. Each task starts a VM in the cloud (microVMs are coming soon), and the agent runs in a Docker container within that VM. The VM is considered untrusted: It is not reused between tasks and is allowed to access only limited internal resources. A proxy is set up in the VM, so all connections from the agent container are routed through it.

Each Air task runs in its own VM, with the agent in a container behind a network proxy.

By default, the proxy allows connections only to a preset list of trusted source control and package registry domains, such as npm. You can add domains for your toolchains, package managers, or internal services, allow all domains, or turn internet access off completely.

Secrets are stored encrypted and exposed to the task as environment variables. Teammates can use a shared secret without seeing its value, and personal secrets stay private. Each task also acts within the developer’s own repository permissions, so it never sees a repository the developer can’t already access.

Where an agent runs matters as much as what it can do

Agent sandboxing is becoming an important part of working with AI agents safely. As agents become more capable and autonomous, the question is no longer only what they can do, but also where they run, what they can access, and how much impact they can have if something goes wrong.

Cloud-based execution is one way to provide stronger isolation by default, reduce local setup requirements, and give organizations more control over network access, environment configuration, and task execution policies.

Developers working in organizations can already try cloud agents in Air in JetBrains IDEs and Air Teams in the browser.

Have a question or feedback? Tag us on X at @getsome_air – Dennis and the Air team read mentions and reply.

show more
Boost Your Pipeline: Top 6 CI/CD Integrations for Qodana
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-14 12:48:04 | Created: 2026-10-14 14:25:59
CI/CD integrations with Qodana

Your CI/CD pipeline builds fast, but does it build right? While your automated builds and deployments handle the mechanics of software delivery, catching code quality issues often falls to manual reviews, which, while hugely valuable, can sometimes miss more subtle problems.

That’s where Qodana changes the game by bringing the power of IntelliJ IDEA’s inspection engine directly into your workflow with CI/CD integrations.

Qodana seamlessly integrates with several major CI/CD platforms, extending the same intelligent code analysis you rely on in your IDE to every commit and pull request. You can automate quality gates that prevent problematic code from reaching production, no matter which platform your team prefers.

This compatibility means you can maintain coding standards without disrupting existing workflows or learning new tools.

Why integrate static code analysis with CI/CD pipelines?

Integrating CI/CD static code analysis transforms how your team approaches code quality. Instead of discovering issues after deployment (when they’re expensive to fix), you can spot problems immediately as part of your existing development workflow. This is the essence of a ‘shift-left’ approach, where you’re moving quality checks to earlier in the lifecycle, so developers get faster feedback and teams spend less time reworking code.

Automated quality enforcement ensures every team member follows the same coding standards, no matter their experience level or tool preferences. When Qodana runs on every commit, you get consistent feedback that helps maintain code quality across your entire codebase.

Your CI/CD pipeline becomes more than just a deployment tool. It acts as a quality guardian,  blocking problematic code before it can impact your users.

But what are the top CI/CD integrations for Qodana? We’ll take a look at a few of the best and discuss how and why you should integrate them into your workflows.

1. GitHub Actions

GitHub Actions provides cloud-based CI/CD automation that integrates directly with your GitHub repositories. It supports all major programming languages and operating systems, with an extensive marketplace of pre-built GitHub Actions. 

This platform also excels at pull request workflows and offers flexible runner options for both public and private repositories.

Integrating Qodana with GitHub Actions

Qodana integrates with GitHub Actions through the official marketplace Action, making setup straightforward with a simple workflow file. The current v2025.2 Action provides comprehensive analysis capabilities and integrates seamlessly with GitHub’s pull request system. 

You’ll need to configure your QODANA_TOKEN as a repository secret and create a workflow file in your .github/workflows directory. For detailed configuration options and advanced setups, check the GitHub Actions documentation.

ProsCons
Reusable workflows and tight pull request integration make code reviews efficient.YAML configuration becomes complex for advanced setups and custom quality gates.
Quick-fix automation can create automatic pull requests with suggested code improvements.Runner costs for private repositories can escalate with heavy usage patterns.

2. GitLab

GitLab offers a complete DevOps platform with integrated CI/CD capabilities, available in both cloud and on-premises deployments. It supports over 60 programming languages and provides comprehensive project management features alongside its CI/CD functionality. GitLab’s strength lies in its all-in-one approach to software development workflows.

Integrating Qodana with GitLab

GitLab integration has been revolutionized with the new native GitLab CI/CD component introduced in 2025.1, replacing the previous Docker-only approach. This native component integration eliminates complexity while providing enhanced functionality. The component integrates directly with GitLab’s merge request UI, showing code quality reports alongside your existing code review process.

ProsCons
The native CI/CD component eliminates Docker complexity and streamlines setup significantly.Community users may experience slower queues during periods of high platform demand.
Results feed directly into your merge request UI with comprehensive code quality reports.Component features require GitLab 16.0 or higher for full functionality access.

For more information about GitLab CI/CD capabilities, check out the GitLab CI documentation.

3. TeamCity

TeamCity is JetBrains’ enterprise-focused CI server, offering both on-premises and cloud options. It provides cross-platform support with advanced build management capabilities designed for scalability. As a JetBrains product, it offers deep integration opportunities with other JetBrains tools and development workflows.

Integrating Qodana with TeamCity

TeamCity offers the most streamlined Qodana integration through its native build runner, removing the need for Docker containers or complex YAML configurations. This native integration provides a GUI-based setup and built-in reporting capabilities. Your analysis results appear directly in TeamCity’s interface with comprehensive visualization and historical tracking. Find out more about how to integrate Qodana into TeamCity here. 

Integrate Qodana into TeamCity
ProsCons
Native build runner with GUI configuration eliminates YAML complexity entirely.Windows build agents are currently not supported for Qodana analysis workflows.
Built-in reporting in TeamCity UI provides visual analysis results and trend tracking.

Learn more about TeamCity capabilities, and read our detailed guide on integrating Qodana into TeamCity for step-by-step instructions.

4. Jenkins

Jenkins is the leading open-source automation server and features an extensive plugin ecosystem and self-hosted deployment model. It supports all major platforms and offers maximum customization flexibility through its pipeline scripting capabilities. Jenkins excels in complex enterprise environments where custom workflows are essential.

Check out the documentation.

Integrating Qodana with Jenkins

The Jenkins integration relies on Docker-based deployment through Jenkinsfile configuration, providing flexibility for complex pipeline requirements. It supports quality gates, baseline comparisons, and custom reporting workflows. You’ll configure Qodana as a Docker agent within your pipeline, allowing for sophisticated build orchestration.

ProsCons
Maximum customization through flexible pipeline scripting and an extensive plugin ecosystem.Requires Docker expertise for proper setup, maintenance, and troubleshooting.
An extensive plugin ecosystem enables custom quality gate workflows tailored to your needs.More complex configuration compared to native platform solutions available elsewhere.

For comprehensive Jenkins guidance, consult the Jenkins documentation.

5. Azure Pipelines

Azure Pipelines is Microsoft’s cloud CI/CD service offering Windows, Linux, and macOS support within the broader Azure DevOps ecosystem. It provides enterprise-grade features with strong integration across Microsoft’s development and cloud services. The platform excels in organizations already invested in Microsoft technologies. It was also one of the first pipelines Qodana could integrate into – this integration was introduced as early as 2022.

Integrating Qodana with Azure Pipelines

Azure Pipelines uses the QodanaScan@2025 task, enhanced with 2025.1 features that significantly improve the developer experience. The Azure Pipelines integration now displays results in the Extensions tab rather than cluttering build logs. This provides cleaner reporting and better visibility into code quality metrics.

ProsCons
Results appear in the Extensions tab instead of cluttering build logs, improving readability.Steeper learning curve for development teams not familiar with Microsoft tooling.
Seamless integration for teams already using Microsoft’s development ecosystem.Pipeline costs can escalate significantly with increased agent usage across large projects.

Find the Qodana extension in the Visual Studio Marketplace.

6. CircleCI

CircleCI is a cloud-native CI/CD platform with container-focused architecture and a credit-based pricing model. It excels at Docker workflows and provides predictable performance through its container-optimized infrastructure. The platform is particularly advantageous for teams prioritizing containerized development practices.

Integrating Qodana with CircleCI

The CircleCI integration provides container-optimized execution with excellent performance characteristics. Configuration involves declaring the orb in your .circleci/config.yml file.

ProsCons
Container-optimized execution delivers excellent performance for analysis workflows.Credit-based pricing can become expensive for large teams with frequent builds.
Established orb with regular updates and reliable maintenance since 2022.Less flexibility compared to self-hosted alternatives for custom enterprise requirements.

Explore the CircleCI Qodana orb at the CircleCI developer portal.

Make code quality part of your workflow with CI/CD static code analysis

These CI/CD integrations ensure consistent, automated code quality checks become part of your development process rather than an afterthought. By choosing the integration that fits your existing workflow, your team can enforce coding standards without disrupting productivity or requiring extensive retraining.

Qodana brings the same intelligent analysis that powers IntelliJ IDEA directly into your pipeline, no matter which platform your team prefers. Start with your preferred CI/CD tool today and make code quality an automated part of every commit your team makes.

Start a free trial and find out how Qodana can help you improve your codebase.

show more
KotlinConf Recap: Lessons from Verifone’s Architect on Kotlin in Mission-Critical Payments
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-14 11:03:00 | Created: 2026-10-14 12:22:59

This article was written by an external contributor.

Aniket Bhattacharyea

Aniket is a Mathematics postgraduate who has a passion for computers and software. He likes to explore various areas related to coding and works as a web developer using Ruby on Rails and Next.JS.

Website

Yuri Geronimus’s four-year-old son once asked him what his job was. Yuri told him he writes books: books that describe what he wants to change in the physical world. His son didn’t fully get it. 

Neither would most engineers: if you understand the words in your application code, you build good systems. If you don’t, you build bugs.

That’s the spine of Yuri Geronimus’s KotlinConf 2026 talk, “Kotlin as a Safety Net: Type-Driven Reliability in the Finance Industry”. Yuri is an architect at Verifone, where he works across payment terminals, gateways, and the systems that connect them to banks and regulators in the EMEA region. His method, in one line: write code in the exact words of the regulator or card network specs, and let the compiler enforce it. Enforce not by discipline, but by the compiler.

Watch the KotlinConf 2026 talk

Watch Yuri Geronimus’s KotlinConf 2026 talk to learn how Kotlin helps build reliable payment systems.

A Legacy Modernization Strategy and Business Case Playbook for Enterprise Kotlin Adoption

Read the Playbook

The world behind the terminal

Before the patterns, Yuri set the stakes. A “payment” isn’t one app. It’s a mobile sales app, a point-of-sale app, a payment terminal running on a locked-down OS, payment gateways, terminal management systems, merchant platforms, and, underneath it all, processors, banks, and regulators. Each country carries thousands of pages of specifications and roughly 1,000 scenarios that must be met before anything reaches production.

Some of those terminals have to keep working offline for up to 40 days, by regulation, because in the country they operate in, a payment terminal is critical infrastructure on the same level as a gas station or a pharmacy. Payment teams also have to satisfy contradictory rules from different regulators governing the same shared infrastructure: one country requires a behavior, another forbids it, and both must be enforced in the same codebase. That’s the environment the type system has to hold up in. Not a demo. Production, worldwide, for decades, not a year.

Six ways one word breaks a payment system

Yuri walked through real incident patterns from his 15 years in payments and banks, each one traced back to a single missing or misused word:

  • An incorrect field caused a reversal, and someone else’s money landed in the wrong account.
  • A mandatory field was made nullable “just in case”. When a firmware update stopped sending it, the code fell back to a default, and part of the terminal fleet stopped processing payments.
  • A card number ended up in a log line and a stack trace: a disclosure obligation, and a real compliance problem.
  • An authorization was approved while the fraud check timed out, and money was stolen.
  • A request timed out, but the authorization had succeeded upstream, and the customer paid twice.

Each of these traces back to the same root cause: somewhere, the code disagreed with the specification about what a word meant, and nothing forced that disagreement into the open before it reached production.

The method: write the spec, then let the compiler check your work

Yuri described this as a set of patterns, not a framework. Ten of them, all doing the same job: making illegal states impossible to construct, not just invalid ones you catch later.

1. Value classes for spec nouns

Fraud and risk models carry dozens of similarly shaped IDs: merchant ID, terminal ID, acquirer ID, and more, several of which are literally identical in format due to regulation. As plain strings, nothing stops a refactor or copy-paste from swapping two of them, and the transaction silently routes to the wrong acquirer, for example. Yuri’s fix is a value class per ID.

@JvmInline value class MerchantId(val value: String)
@JvmInline value class AcquirerId(val value: String)
@JvmInline value class AmountMinor(val value: String)

data class AuthRequest(val merchantId: MerchantId, val acquirerId: AcquirerId, val amount: AmountMinor)

fun demo(merchantId: MerchantId, acquirerId: AcquirerId, amount: AmountMinor) {
    AuthRequest(merchantId, acquirerId, amount)   // ✅ compiles
    // AuthRequest(acquirerId, merchantId, amount)   // ❌ type mismatch: swapped arguments do not compile
}

Swap the arguments now, and the code doesn’t compile. The mistake that used to reach production becomes a build error on the engineer’s own machine.

2. Validate factories

Every external field, whether it comes from a bank’s API or a terminal’s firmware, arrives as an untyped string that might not mean what the spec assumes. Yuri’s pattern parses it immediately into a sealed result at the boundary rather than trusting it downstream.

@JvmInline value class RawStan(val value: String)   // untrusted input
@JvmInline value class Stan(val value: String)      // validated, per spec

sealed interface ParsedStan {
    data class Valid(val stan: Stan) : ParsedStan
    sealed interface Invalid : ParsedStan {
        val rawStan: RawStan
        data class WrongLength(override val rawStan: RawStan) : Invalid
        data class NotNumeric(override val rawStan: RawStan) : Invalid
    }

    companion object {
        fun of(rawStan: RawStan): ParsedStan = when {
            rawStan.value.length != 6         -> Invalid.WrongLength(rawStan)
            !rawStan.value.all(Char::isDigit) -> Invalid.NotNumeric(rawStan)
            else                              -> Valid(Stan(rawStan.value))
        }
    }
}

fun authorize(rawStan: RawStan): AuthResponse =
    when (val parsed = ParsedStan.of(rawStan)) {
        is ParsedStan.Valid   -> gateway.authorize(parsed.stan)   // happy path
        is ParsedStan.Invalid -> reject(parsed)                   // structured rejection
    }   // no else, no try/catch, no Result<T> to unwrap – exhaustiveness is enforced

fun demo(raw: RawStan) {
    when (val parsed = ParsedStan.of(raw)) {   // bad input is a value, not an exception
        is ParsedStan.Valid               -> gateway.authorize(parsed.stan)
        is ParsedStan.Invalid.WrongLength -> reject(parsed)
        is ParsedStan.Invalid.NotNumeric  -> reject(parsed)
        // forget any of the cases → ❌ 'when' expression must be exhaustive
    }
}

This approach Yuri thinks is a very good practice: it doesn’t throw exceptions; it helps prevent the not-best approach with Result<T>, which hides the business domain, and prevents runCatching pitfalls in coroutines

3. Non-null types at the boundary

Many times, mandatory fields are marked nullable “just in case”, which requires juggling with silent fallbacks that often hide the real culprit. Yuri suggests leveraging Kotlin’s null-safety to fail loudly in one place:

data class KernelResult(val tvr: TerminalVerificationResults) // ← not Optional, not nullable

fun fromFirmware(raw: FirmwareResponse) = KernelResult(
    tvr = requireNotNull(raw.tvr) { "TVR null - firmware contract violated" }
)
// One loud failure at the boundary. Never a silent fallback downstream

fun demo(raw: FirmwareResponse) {
    // raw.tvr ?: TerminalVerificationResults()   // ❌ "just in case" fallback: silently hides the broken contract
    val result = fromFirmware(raw)   // one loud failure here, at the single parsing point where it is monitored
    val tvr: TerminalVerificationResults = result.tvr   // non-null: nothing downstream has to guard against it
}

This is the fix for the terminal-fleet outage: the field that was made nullable “just in case” never got a silent default again. It fails once, loudly, at the one predictable place it’s parsed, where it can be monitored, instead of failing quietly somewhere downstream where nobody is watching for it.

4. Mask sensitive data by default

Card numbers travel through logs and stack traces as plain strings, and that’s a disclosure obligation waiting to happen. Yuri wraps the value in a class with a private constructor and overrides toString(), so the safe behavior is the default.

// Illustration of the idea: in production this is hidden much deeper (PCI scope, key management, encryption)
@JvmInline
value class Pan private constructor(private val value: String) {
    override fun toString() = "PAN[****]"                         // ← always safe
    fun masked(): String = TODO("Pan.masked: masking according to spec")
    fun toNetwork() = value                                       // deliberate, grep-able

    companion object {
        fun of(raw: String): Pan? = TODO("Pan.of: the only way in – validate length, digits and Luhn, then construct")
    }
}

fun demo(card: Pan) {
    logger.info("Processing card $card")   // → "Processing card PAN[****]". Safe by default
    val onWire = card.toNetwork()          // the real value only through an explicit, grep-able call
}

An accidental log.info(“processing $pan”) now prints four masked digits. Getting the real value out, the one thing that’s genuinely needed to talk to the network, requires an explicit, auditable call. Nothing about that path is invisible anymore. Small note from Yuri: in real systems it hid much deeper.

5. Give every state its own class, not just its own name

A transaction that’s been refunded should never be able to call refund again, but a single mutable Transaction class with a status field relies on someone remembering to check that status everywhere. Yuri’s next-level version gives each state its own data class, so the method cannot change transaction state from the wrong data class; this ensures that a transition that shouldn’t happen (for example, refunding a reversed transaction) is blocked by the compiler.

import TransactionStatus.Captured
import TransactionStatus.FullyRefunded
import TransactionStatus.Reversed
import java.time.Instant

// One class per state: each state carries only the data that is valid in it
sealed interface TransactionStatus {
    data class Captured(val amount: AmountMinor)    : TransactionStatus
    data class FullyRefunded(val at: Instant)       : TransactionStatus
    data class Reversed(val reason: ReversalReason) : TransactionStatus
}

// Refund exists only on Captured: that is where the spec allows it
fun Captured.fullRefund(refundReason: RefundReason) = RefundAuthorization(amount, refundReason)

fun demo(captured: Captured, refunded: FullyRefunded, reversed: Reversed, reason: RefundReason) {
    captured.fullRefund(reason)   // ✅ compiles
    // refunded.fullRefund(reason)   // ❌ unresolved reference: a refunded transaction cannot be refunded again
    // reversed.fullRefund(reason)   // ❌ unresolved reference: a reversed transaction cannot be refunded
}

6. Immutability and named transitions

This continues the previous pattern. Make the class with your business data immutable and give every transition a name. The name is a verb from the spec. Any method that shouldn’t be callable simply doesn’t exist:

@ConsistentCopyVisibility  // Kotlin 2.0.20+: copy() is as private as the constructor
data class PurchasedAuthorization private constructor(
    val stan: Stan,
    val amount: AmountMinor,
) : Authorization {
    fun fullRefund(refundReason: RefundReason) = RefundAuthorization(stan, amount, refundReason)
    // no reverseAuthorization(): the spec does not allow it for a purchase
}

fun demo(purchaseAuthorization: PurchasedAuthorization, reason: RefundReason) {
    purchaseAuthorization.fullRefund(reason)         // ✅ compiles
    // purchaseAuthorization.reverseAuthorization()  // ❌ compile error: unresolved reference 'reverseAuthorization'
}

Yuri called this his favorite pattern because it affects how engineers read a spec. This changes how engineers think and speak about the business domain.

7. Delete the else branch

If a specification lists every case explicitly and never says “otherwise,” then an else in the code is inventing a case the spec doesn’t describe. His team had handled only full refunds. When partial refunds became a real scenario, the old else branch would have absorbed it silently: compiles fine, tests pass, and it’s wrong in production. Delete the else, and the same new case becomes a compile error that points to every place needing an update.

fun authorize(request: AuthorizationRequest): Authorization = when (request) {
    is PurchaseRequest   -> purchase(request)
    is FullRefundRequest -> fullRefund(request)
    // ← no else. Adding a new state BREAKS compilation here
}

fun demo(purchase: PurchaseRequest, refund: FullRefundRequest) {
    authorize(purchase)   // ✅ compiles
    authorize(refund)
    // spec adds: class PartialRefundRequest : AuthorizationRequest
    // → ❌ authorize() stops compiling: 'when' must be exhaustive
}

The business drifts constantly quarterly and monthly in payment in one country, and for the whole EMEA region – it becomes daily at Yuri’s scale. An exhaustive when turns every drift into a list of exactly what needs to change, rather than a bug report from a customer who was charged the wrong amount.

8. Choose the coroutine scope the spec implies

Yuri’s Black Friday example: authorization, risk management, and fraud checks used to run as three independent calls, each in its own try/catch. If fraud management ran slowly under load, the transaction could still be approved while the fraud check silently failed, and stolen cards could start getting approved. Kotlin gives two structured concurrency scopes that look similar and behave completely differently, and the spec, not convenience, should decide which one you use.

import kotlinx.coroutines.*
// coroutineScope = fail-fast.   ← partial success is an incident: one failure cancels the rest
// In production each call also gets its own timeout, and a timeout is an outcome, not a thrown exception
// (full version with tests: production/08_coroutine_scopes)
suspend fun authorize(req: Request) = coroutineScope {
    val auth  = async { acquirer.authorize(req) }
    val risk  = async { riskEngine.score(req) }
    val fraud = async { fraudService.check(req) }
    Outcome.from(auth.await(), risk.await(), fraud.await())
}
// supervisorScope = isolate.    ← partial success is the goal
// Note: runCatching also catches CancellationException. In production rethrow it
// (e.g. `catch (e: CancellationException) { throw e }`) so cancelling the parent still works.
suspend fun fanOut(event: Event) = supervisorScope {
    listOf(
        async { runCatching { sms(event) } },
        async { runCatching { analytics(event) } },
        async { runCatching { feed(event) } },
    ).awaitAll()   // never throws: each failure is a Result.failure in the list
}

Here, coroutineScope fails fast: if the fraud check fails, authorization and risk are canceled as well, and nothing is silently approved. A supervisorScope would let siblings keep running independently, which is the right call for something like fan-out notifications, where one failure shouldn’t cancel the rest. The question isn’t which scope is more idiomatic. It’s what the spec says should happen when one branch fails.

9. Model timeout as a domain outcome, not an exception

A gateway call that times out isn’t necessarily a failure. The acquirer may have already processed it; the client just didn’t hear back in time. Catching that as a generic exception and moving on erases the difference between “nothing happened” and “something happened, we’re just not sure what”. Yuri’s fix models a Timeout as a first-class outcome in the domain.

import AuthorizationOutcome.Approved
import AuthorizationOutcome.Declined
import AuthorizationOutcome.TimedOut

sealed interface AuthorizationOutcome {
    data class Approved(val authCode: AuthCode)    : AuthorizationOutcome
    data class Declined(val reason: DeclineReason) : AuthorizationOutcome
    data object TimedOut                           : AuthorizationOutcome // ← spec verb, named in domain
}

fun demo(req: Req) {
    when (val outcome = processAuth(req)) {
        is Approved -> settleTransaction(outcome.authCode)
        is Declined -> notifyCardHolder(outcome.reason)
        is TimedOut -> reconcile(req)  // not retry: it may have succeeded upstream
    }
}

TimedOut isn’t the absence of an answer. It’s a distinct state that routes to a reconciliation query rather than a retry, because a naive retry after a timeout that actually succeeded upstream is exactly how a customer ends up charged twice.

10. Make the tests something a regulator can read

Yuri’s least expected pattern targets certification tests, not application code. A typical certification suite runs a thousand tests at roughly 200 lines each, and, in his words, not even an architect can read that. The team rewrote the tests as Kotlin DSL. Written that way, a certification specialist who has never written Kotlin can read the test, follow the logic against the specification, and sign off on it directly. The test stops being an artifact only test engineers can verify and becomes a specification the business and certification specialists can review.

val purchaseOverFloorLimit = scenario("Purchase with tap card above floor limit must go online") {
    terminal { floorLimit = 50.EUR }
    posRequest  { purchase(amount = 75.EUR) }
    tap { card = TestCards.visaWithOnlinePIN }

    expect {
        terminalDecision  mustBe  GoOnline
        outcome           mustBe  Approved
    }
}

What actually moved

Yuri is specific about the outcomes: development ran 2.7 times faster, and certification passed with only one defect and on the first attempt, unusual enough that regulators asked what had changed. The resulting codebase was about 30% smaller. Code review shifted from hunting for missed state checks to comparing code against the specification sentence by sentence, because the compiler now catches the class of bug reviewers used to look for by hand. Onboarding a new engineer used to take two or three weeks before they understood enough of a 5,000-page specification and a legacy codebase to ship anything. Afterward, new hires opened a production pull request within days. Engineers could also move between device teams and backend teams, something a split codebase in two different languages had made difficult. The last effect Yuri called out was that engineers started speaking the business’s language well enough to talk directly with product managers, sales, and regulators, occasionally proposing changes to the regulations themselves.

Payments modernization without a rewrite

Yuri is direct about the mistake most teams make: treating migration as one project, a rewrite in Kotlin. His systems run 25-year-old Java and C++ code processing live transactions every second, with no acceptable downtime, so a rewrite was never on the table. Framed as a refactor-vs-rewrite decision, the answer for a live payments platform is almost always refactor. His alternative is four tracks that run in parallel, not in sequence.

  1. Optimize the existing codebase first, in Java or C++, without touching the language; modernize code structure now – shared layout, clean architecture, screaming architecture – even before any Kotlin lands.
  2. Shift to acceptance-test-driven development, not unit-test-driven. Nobody outside the engineering team cares what’s inside a function; everybody cares about the end-to-end behavior.
  3. Build fitness functions to check compliance, security, scalability, and other “-lities” that run alongside the migration rather than being assessed at the end.
  4. Migrate incrementally: new adapters first, then new domain models, then the legacy code that changes most often, working to reduce the number of “shared ports” to zero. Kotlin’s interop with Java is what makes this incremental path possible at all: a new adapter can sit alongside unmodified Java code without a dual-maintenance period.

Running all four at once, according to Yuri, is what makes a payments modernization effort safe and cost-effective in a regulated environment. Running them in sequence is what makes migrations stall.

Migration is an investment decision, not a language preference

Yuri pointed out who needs convincing in an enterprise: it isn’t the engineering team. He referenced a talk from Uber’s team the day before his, at the same event, making a similar point: even a company known for moving fast treats language migration as an investment decision once it’s operating at enterprise scale. A credible business case has to account for the costs of running old and new systems in parallel, the costs of decommissioning what’s being replaced, the learning curve for the team, and the risk of the transition itself. Getting the migration approved is not the same as its adoption. Without an operating model for how the migration actually runs day-to-day, Yuri was blunt: there’s no happy ending waiting at the end of it.

He pointed to a resource for that exact gap: a 22-page playbook on the Kotlin site, published two days before this talk, covering, in his words, “the part that everybody skips”.

What is Yuri Geronimus’s core method, in one sentence?

Write code in the literal words of the specification and let the compiler enforce them, rather than relying on discipline or documentation to catch gaps between the two.

Do you have to rewrite a legacy Java or C++ system to use these patterns?

No. Yuri explicitly argues against treating migration as a rewrite project. His four tracks run in parallel: optimizing the existing codebase, shifting to acceptance testing, more focus on fitness functions, and migrating incrementally, starting with adapters and the domain models, then going from the most-often-changed parts.

Why doesn’t discipline or code review catch these bugs instead?

At the scale Yuri operates, 20 teams worldwide, discipline doesn’t scale evenly. A compiler check applies identically everywhere, every time, regardless of who’s on call or how careful any one reviewer is that day.

Further reading

Yuri Geronimus writes more broadly on Kotlin in payments and fintech in his own posts on Medium. For the business case and operating model he referenced in the talk, the resource is JetBrains’ enterprise Kotlin adoption playbook, also written with Yuri Geronimus.

show more
Lauterbach and JetBrains Announce TRACE32 Integration in CLion IDE
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-14 09:40:12 | Created: 2026-10-14 10:41:58

Hoehenkirchen, Germany/Amsterdam, Netherlands — October 14, 2026 — Lauterbach and JetBrains have integrated TRACE32® debugging tools with CLion, JetBrains’ professional C and C++ tool. The integration enables embedded developers to debug applications on target hardware directly from CLion, bringing code editing, navigation, and hardware debugging into one development workflow.

Using the Debug Adapter Protocol (DAP), the integration connects CLion to TRACE32® through the TRACE32 Debug Adapter. Developers can control execution, step through code, and inspect variables in CLion while TRACE32® handles communication with the target hardware.

Two workflows are supported. Developers can launch a new TRACE32® PowerView session from CLion, using scripts to configure the connection and initialize the target, or attach to an existing TRACE32® instance. The integration requires CLion 2026.2.4 or later, TRACE32® PowerView 09.2026 (or build 195402), and TRACE32 Debug Adapter version 0.1.2 or later. Detailed configuration examples are documented in the Lauterbach knowledge base.

Lauterbach’s broader TRACE32® portfolio supports embedded development throughout the product life cycle, from pre-silicon development and prototyping to testing and in-field analysis. The tools combine PowerView debugging and tracing software with PowerDebug and PowerTrace hardware modules, helping engineers investigate system behavior, analyze performance, and measure code coverage across a wide range of processors and embedded targets.

CLion is the professional development environment where your C/C++ and embedded teams can run their agents, verify every change before it ships, and deliver to any target – desktop, server, or embedded hardware. It helps developers understand and maintain complex codebases, with support for embedded development workflows. The TRACE32® integration extends these workflows to debugging on target hardware from within the IDE.

“CLion helps developers write, refactor, debug, and test C and C++ code with smart navigation and cross-platform toolchains,” says Dr. Markus Herdin, Director of Marketing at Lauterbach GmbH. “With this TRACE32® integration, developers can use our debugging tools to investigate application behavior on target hardware directly from CLion.”

“For embedded developers, understanding the code is only part of the job. They also need to understand how it behaves on the target hardware,” says Artemy Pestretsov, Head of C/C++ Ecosystem at JetBrains. “Connecting TRACE32 with CLion brings those activities into the same workflow, helping developers investigate problems and verify changes in the environment where they write their code.”

Join a free webinar hosted by JetBrains and Lauterbach

on October 27, 2026, at 2:00 pm (CET) / 1:00 pm (UTC)

to see the integration in action.

Register for the Webinar

show more
What We Heard at AGNTCon Europe
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-13 19:59:39 | Created: 2026-10-13 20:36:59

The night before AGNTCon + MCPCon Europe, we hosted the Agentic AI Foundation community at the JetBrains office in Amsterdam. The event filled up fast and went to a waitlist, which is not what I expected for a Wednesday evening discussion about how open foundations work.

Ibrahim Malik opening the evening.

The panel asked what happens when companies, maintainers, and contributors want different things from the same project. In other words, who gets to decide? That’s the oldest question in open source, and agents haven’t made it any easier. Nick Veenhof from GitLab, Alessandro Vozza from VOLT Datacenters, Miguel Luna from JetBrains, and I each came at it differently. My favorite line of the night was Nick’s. Talking about the infrastructure the Drupal Association runs so anyone can download project code, he said: “Someone needs to pay for the roads”. Paying keeps a project alive. Two days at the conference convinced me it doesn’t determine who decides. That goes to whoever has earned the trust, and you can’t buy trust. You earn it by doing the work, consistently and in the open.

Left to right: Nick Veenhof (GitLab), Miguel Luna and Katherine Druckman (JetBrains), Alessandro Vozza (VOLT Datacenters), and Bauke Brenninkmeijer (Orq.ai).

Review is the bottleneck now

I spent part of the summer on program committees for several events, reading talk proposals. A lot of them were AI-generated, polished, and interchangeable. Maintainers in working groups across open source describe the same thing – long AI-generated proposals that relitigate decisions already made. Their work shifts from building to explaining what was settled six months ago. Mine shifted from just choosing talks to working out which ones had enough real human experience behind them.

Dexter Horthy of HumanLayer came at the same problem from the other direction in his keynote, State of the Software Factory. He argued that code from unattended agents gets worse over time, so for now, people need to plan before they build and keep reading the code. His diagram added agentic code review and regression testing to the production pipeline, and he pointed out that review can still be the bottleneck. None of that is new, but his emphasis was the message. The hard part now is everything that comes after the code gets written. Someone has to understand what an agent produced and answer for it. Out on the show floor, one startup had built its entire booth around bugs written by agents.

Dexter Horthy’s “Lights-Off Software Factory”, the setup without human review that he argued against, from his keynote, State of the Software Factory.

What went wrong

A talk I keep thinking about was Nick Veenhof’s. He walked through a system he built for himself, 13 specialist agents, and one orchestrator, and he was honest about what failed. Tests passed while the wiring underneath was broken. A background job stopped for 46 days with no alert. An agent produced 80 fabricated data points that looked exactly like what he had asked for, and it took him two hours to catch them. His point was that complete and wrong is worse than partial and honest. He has been writing the whole thing up publicly, failures included.

A slide from Nick Veenhof’s talk, From Personal Agent To Org Catalog.

A good reason to show up

The conventions for how agents connect to tools, get traced, and stay secure are being written right now, in working groups open to anyone who joins the call. Most of them could use more people. A lot of that work needs no code at all. Threat models and governance get written in documents and decided in meetings. If you want somewhere to start, pick one working group that matches your interests or role, join a call, and read the notes from previous meetings to get up to speed. Then show up consistently – that part can’t be generated.

That’s also why openness matters beyond community values. Agentic development is not going to run on a single model or a single vendor’s stack. Teams will mix them, and the systems around those agents have to support that choice without losing track of what the agents did or who is accountable for it. That’s the thinking behind JetBrains Air, which we announced the week after the conference.

JetBrains participates in the Agentic AI Foundation because our users will live with the standards worked out in these communities. I still learn more from maintainers in a hallway than anywhere else.

Thank you to Bauke Brenninkmeijer, Michaela Raukar-Herman, and Ruslan Kuleshov for making the meetup happen, to our panelists, to Alex Salkever, Ibrahim Malik, and Jake Pineda for their talks, and to everyone else who came out. We will see you at the next AGNTCon in San Jose. Come find us at our booth.

Meetup photos by Ivan Davletshin

show more
CI/CD Pipeline Observability Tools: How to Choose the Right Setup
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-13 11:28:49 | Created: 2026-10-13 12:21:59

When a CI/CD pipeline fails, its dashboard can usually show you what went wrong. Pipeline observability tools should help you understand why, whether the cause is a flaky test, an overloaded build agent, or a problem elsewhere in the delivery process.

This becomes harder as pipelines grow more complex. A pipeline touches a lot of separate systems: version control, build agents, containers, test frameworks, artifact repositories, security scanners, and deployment tools. Each one generates its own data, and pulling all of it together during an investigation isn’t easy.

The JetBrains Developer Ecosystem Survey 2026 shows how common these challenges are. When we asked 20,416 respondents about their top three challenges when working with cloud infrastructure, 44% selected debugging and troubleshooting issues in cloud environments.

Security and access control was selected by 36%, as was cost visibility and optimization. Observability was named by 16%, while 12% pointed to having too many separate tools, consoles, or dashboards.

JetBrains Developer Ecosystem Report 2026

This article explains what CI/CD pipeline observability means, which metrics are worth tracking, and how the most common observability tools compare. It also provides a framework for choosing the right CI/CD observability tools for your team.

What is CI/CD pipeline observability?

CI/CD pipeline observability is the ability to understand the state and behavior of a delivery pipeline from the data it produces, including build results, metrics, logs, events, and traces. 

In practical terms, an observable pipeline should help you answer questions such as:

  • Why are builds taking longer than they did last month? 
  • Why does one agent pool fail more frequently than another? 
  • Which pipeline stage introduced a regression? 
  • Did a code change cause the failure, or did something in the build environment change?

Monitoring and observability are closely related, but they are not identical. Pipeline monitoring tracks known conditions. You define a metric or event, display it on a dashboard, and perhaps create an alert when it crosses a threshold.

Observability helps when the cause of a problem is not immediately clear. It gives you enough connected data to investigate unexpected failures without first adding new tracking and waiting for the issue to occur again.

For example, monitoring can show that build duration has suddenly increased. Observability helps you trace that increase to a particular pipeline, stage, build agent, commit, test, or infrastructure issue.

TeamCity Performance Monitor

What should you observe in a CI/CD pipeline?

Pipeline observability covers both the work performed by the pipeline and the platform running it.

At the pipeline level, these metrics fall into two groups: In the first, we’ve got queue time, total duration, and stage duration, which tell you where developers are kept waiting. In the other group, there are success rates, retries, flaky tests, and cache performance, which tell you where the pipeline itself is becoming less reliable.

At the platform level, teams need visibility into agents or runners, CPU and memory consumption, disk and network activity, server health, and the availability of external dependencies. This context helps distinguish a code problem from an infrastructure problem.

The most useful metrics are those connected to a concrete investigation.

QuestionUseful signalsContext needed
Are developers waiting longer for feedback?Queue time, pipeline duration, stage duration, median and 95th-percentile build durationRepository, branch, pipeline, stage, and agent pool
Are pipelines becoming less reliable?Failure rate, retry rate, canceled runs, flaky-test rateFailure type, test, commit, and environment
Is the build infrastructure keeping up with demand?Agent utilization, available agents, CPU, memory, disk, queue lengthAgent, pool, operating system, and executor type
Is work being repeated unnecessarily?Cache hit rate, artifact reuse, repeated downloadsDependency, cache key, and build configuration
What is driving CI infrastructure cost?Compute time, runner type, concurrency, storage, artifact volumeTeam, project, workload, and cloud resource
Can a failure be tracked back to a change?Commit metadata, configuration changes, and dependency versionsRepository, pull request, and build run

Percentiles are usually more informative than averages for duration and queue-time metrics. A stable average can conceal a poor experience for the slowest 5% or 10% of builds.

Looking only at an overall success rate can hide problems. The number may appear healthy even if one branch, build-agent image, or test suite fails regularly. To find these patterns, teams need to be able to break metrics down by project, branch, pipeline stage, agent pool, environment, and failure type.

Your CI/CD system is normally the best source for run identity and pipeline structure. For example, TeamCity statistic charts connect build duration, queue time, success rates, tests, artifacts, and other statistics to the underlying build configuration.

This context becomes particularly valuable when CI data is exported to another observability system.

Build configuration statistics in TeamCity

How teams observe CI/CD pipelines in 2026

The State of Developer Ecosystem Survey 2026 asked 8,323 respondents which tools they use for CI/CD pipeline observability. Respondents could select more than one answer.

JetBrains Developer Ecosystem Report 2026

Built-in CI/CD dashboards are the most common option, used by 76% of respondents. They are already part of the CI/CD platform, require little setup, and show pipeline runs, stages, tests, and failures in their original context.

However, many teams use more than one observability tool. They might investigate a failed build in the CI/CD dashboard, use Prometheus and Grafana to monitor build infrastructure, and search logs in Elastic or OpenSearch. 

These tools are not direct alternatives: each provides a different type of information. Metrics show trends and changes over time, logs provide detailed records of what happened, and traces show how work moved through different parts of the pipeline.

OpenTelemetry helps collect and send this data, but it still needs a separate system to store and display it.

How to choose a CI/CD pipeline observability tool

Most observability tools promise the same basics: dashboards, alerts, and some integrations. What actually separates them is what data they collect, how well that data stays connected to your pipelines, and how much work it takes to set them up and keep them running.

The following five criteria can help you compare the options and choose the right fit for your team.

1. Investigation depth and CI/CD context

Think about the problems you want the tool to help you investigate. If a pipeline fails, can you quickly find the affected stage or test? Can you compare the failed run with earlier successful ones?

To answer these questions, the tool needs to keep each metric, log, or trace connected to the relevant pipeline run. It should be possible to see which repository, branch, commit, stage, and environment the data came from.

You may also need information about the pull request, build agent, test, or artifact involved.

TeamCity’s AI Assistant helps analyze failed builds

Built-in CI/CD dashboards are useful because they already have this context. When evaluating an external observability tool, check whether its integration keeps these connections or reduces the pipeline to a collection of unrelated metrics and logs.

2. Correlation across systems

A pipeline problem can come from many places, including a build runner, container, cloud service, artifact repository, external API, or deployment environment.

A good observability tool should connect data from these systems, so that developers do not have to compare timestamps and search through several dashboards to understand what happened. This is especially useful for organizations that work with multiple CI/CD platforms or environments.

According to the State of Developer Ecosystem Survey 2026, 22% of respondents find managing multiple environments challenging, while 12% struggle with having too many separate tools, consoles, or dashboards. An observability tool should bring this information together rather than add another disconnected dashboard.

3. Setup and usability

Different observability tools require different amounts of setup. A built-in CI/CD dashboard may work straight away, while external tools need to be connected to the pipeline and configured to collect, store, and display the right data. Distributed tracing may require additional changes to the pipeline itself.

A more complex setup can be worthwhile if it gives your team the information it needs. However, you should consider how much work the tool will take to introduce and maintain.

The tool should also be easy for developers to use. They are usually the first people to see a pipeline failure. If they cannot understand the data without help from the platform team, the tool will have limited value in everyday investigations.

4. Security and deployment model

The data collected from CI/CD pipelines may include repository and commit details, usernames, infrastructure addresses, and information about build environments. Build logs can also contain passwords, tokens, or other secrets if sensitive information is not properly hidden.

It’s not a small concern, either: Security, permissions, and access control ranked as a top cloud challenge for 36% of survey respondents.

Before choosing a tool, find out where it stores your data, how the data is protected when it is transferred, who can access it, and how long it is kept. Your organization may also need access controls, activity logs, encryption, a choice of data-storage region, or the ability to run the tool on its own infrastructure.

5. Cost, maintenance, and portability

The subscription or license price is only part of the total cost. Collecting large amounts of detailed metrics, logs, and traces can increase storage and processing costs. A self-hosted tool may reduce subscription fees, but your team will still need to provide the infrastructure, install updates, manage backups, and maintain the system.

You should also consider how easy it would be to move your data to another tool. 10% of survey respondents cited vendor lock-in and portability as challenges in using cloud services.

Open standards cannot make a migration effortless, but they can reduce the amount of data collection and pipeline configuration that must be rebuilt.

Open-source, managed, or a combination?

We often talk about open-source versus commercial platforms as though it’s a binary choice. But most teams have “a foot in both camps”, so to speak.

Prometheus, Grafana, OpenSearch, and OpenTelemetry give you full control over hosting, data, and retention. You decide where it lives and how long it stays. The trade-off is that you’re also the one running and securing it.

Commercial platforms take that job off your hands. You get useful data faster, but you’re paying through subscription and ingestion costs, and you’re trusting someone else with where your data is stored.

Most teams don’t actually pick a side. A typical setup uses OpenTelemetry to collect the data, Prometheus for infrastructure metrics, and a managed platform for storage and analysis on top of both. 

Decide based on what your team already knows how to run and what questions you actually need answered, not based on whether a given platform is open-source or commercial.

CI/CD pipeline observability tools compared

The State of Developer Ecosystem Survey 2026 grouped observability tools by type. This means that the results show how widely each approach is taken, but not the usage of individual products. 

For example, 14% use a commercial observability platform, but the survey does not show how this percentage is divided among Datadog, New Relic, and Dynatrace.

For this reason, the comparison below uses the same tool categories as the survey and evaluates each one against our selection framework.

Built-in CI/CD dashboards

Model: Included with a cloud or self-hosted CI/CD platform.
Signals and CI context: Pipeline runs, stages, build logs, tests, changes, queue times, and agent or runner information.
Configuration: Usually available by default, with additional charts, reports, APIs, or metric exports depending on the platform.

Built-in dashboards are generally the best first layer of pipeline observability. A failed test, slow staging, queued builds, and triggering commits are presented as related parts of the same run rather than as separate telemetry records.

  • Best for: Everyday investigations when most teams use the same CI/CD platform.
  • Standout capabilities: Strong native CI context, low setup effort, and direct access from the build result.
  • Limitation: Cross-system visibility is often limited. The dashboard may show that a stage became slower without explaining whether the cause was infrastructure, storage, networking, or an external service.

When evaluating a built-in dashboard, look for historical trends, test history, queue analysis, and agent workload rather than focusing only on the latest run.

TeamCity provides build and project statistics, test histories, logs, agent workload information, and pipeline visualizations. Our article on troubleshooting builds with TeamCity dashboards demonstrates how these sources can be combined during an investigation.

Prometheus and Grafana

Model: Open-source and usually self-managed, with managed Grafana services also available.
Signals and CI context: Time-series metrics, labels, dashboards, and alerts; CI context depends on the exported metrics.
Configuration: Prometheus scrape configuration and alerting rules, usually in YAML; Grafana dashboards and data sources.

A Grafana dashboard of the JetBrains IntelliJ infrastructure team

Prometheus collects and queries time-series data, while Grafana provides dashboards and visualization. Together, they are the most common metrics-based approach in the survey, selected by 29% of respondents.

  • Best for: Monitoring CI infrastructure, capacity, utilization, and performance trends.
  • Standout capabilities: Flexible queries and dashboards, strong infrastructure correlation, and control over data storage.
  • Limitation: Metrics can show where and when behavior changed, but may not contain enough detail to explain the exact cause. Teams must also operate the stack and control metric cardinality.

The quality of the result depends heavily on metric labels. Pipeline, stage, result, project, and agent-pool context make aggregation useful. Individual build IDs and commit hashes should be handled carefully to avoid unnecessarily high cardinality.

TeamCity exposes server metrics in Prometheus format. Our guide to monitoring TeamCity server health with Prometheus and Grafana covers build queues, agents, server load, JVM health, and database connections.

Elastic Stack and OpenSearch

Model: Open-source or open-core software with self-managed and managed deployment options.
Signals and CI context: Primarily logs and searchable events, with support for metrics and traces depending on the stack.
Configuration: Collectors, parsing and ingestion pipelines, schemas, indexes, dashboards, and retention policies

Elastic Stack and OpenSearch represent the log aggregation category, used by 18% of survey respondents. They are useful when an investigation depends on detailed output from pipeline stages, agents, infrastructure, or external services.

  • Best for: Organizations with log-heavy investigations or an existing centralized logging platform.
  • Standout capabilities: Search across large volumes of pipeline and infrastructure events.
  • Limitation: Centralizing logs does not automatically preserve pipeline structure. Ingestion and storage volumes can also become expensive.

Collecting more logs is not enough. Each log entry should show which pipeline run, stage, repository, and build agent it belongs to. Sensitive information in build outputs should also be hidden before the logs are stored.

Elastic documents an OpenTelemetry-based CI/CD observability architecture, while OpenSearch supports the exploration of logs, metrics, and traces. The depth of pipeline context still depends on how the CI/CD system is instrumented.

OpenTelemetry

Model: Open-source, vendor-neutral instrumentation standard; requires a separate backend.
Signals and CI context: Metrics, logs, and traces, with semantic conventions for CI/CD telemetry.
Configuration: Instrumentation or CI integrations, OTLP exporters, and usually an OpenTelemetry Collector.

OpenTelemetry is used by 17% of respondents. It is not a complete observability tool with its own storage and dashboards. Instead, it provides a standard way to collect pipeline data and send it to another observability system.

For example, OpenTelemetry can record a pipeline as a connected sequence of jobs, stages, tests, artifact transfers, and calls to external services. This data can then be stored and analyzed using either an open-source or commercial platform.

  • Best for: Complex pipelines spanning several tools or services, particularly when portability matters.
  • Standout capabilities: Cross-system tracing and vendor-neutral collection of metrics, logs, and traces.
  • Limitation: OpenTelemetry does not provide storage, dashboards, or a finished investigation experience. Instrumentation can require significant work.

The OpenTelemetry semantic conventions for CI/CD cover spans, metrics, and logs. The OpenTelemetry Collector can process and route those signals to one or more backends.

When evaluating this approach, check which parts of the pipeline are instrumented automatically. A trace containing only pipeline and job names may add little beyond the native CI/CD interface. Its value grows when it connects pipeline activity to processes, agents, network calls, or deployment systems.

Commercial observability platforms

Model: Primarily managed SaaS, with data-collection and hosting options varying by vendor.
Signals and CI context: Metrics, logs, traces, events, tests, and pipeline data, depending on the integration.
Configuration: Native integrations, agents, plugins, APIs, or OpenTelemetry collectors.

Commercial observability platforms were selected by 14% of respondents. The survey grouped Datadog, New Relic, and Dynatrace together, so this figure should not be interpreted as individual adoption data for any of them.

  • Best for: Organizations already using a commercial observability platform that want to add CI/CD data to the same environment.
  • Standout capabilities: Managed storage and analysis, cross-system correlation, vendor support, and ready-made integrations.
  • Limitation: Subscription, ingestion, and retention costs can grow with verbose logs and test data. CI/CD integration depth, portability, and data residency vary by vendor.

The evaluation should focus on the specific CI/CD integration rather than the platform’s general feature list. Test whether users can move from a pipeline regression to the relevant stage, test, log, agent metric, and commit without manually rebuilding that context.

For example, Datadog Pipeline Visibility provides pipeline-level data for supported CI providers, while New Relic can receive CI/CD information through integrations and change tracking. 

TeamCity users can also connect build data to Datadog CI Visibility when Datadog is already part of their observability stack.

Custom in-house observability

Model: Usually self-hosted and developed internally.
Signals and CI context: Defined by the organization, from normalized pipeline events to custom cost and infrastructure data.
Configuration: Custom collectors, APIs, schemas, storage, dashboards, and access controls.

Twelve percent of respondents use a custom solution. This approach is more common when an organization operates several CI/CD systems, proprietary infrastructure, unusual hardware, or delivery processes that general-purpose tools do not model well.

  • Best for: Large or specialized organizations whose requirements cannot be met through existing integrations.
  • Standout capabilities: Complete control over the data model, hosting, CI context, and organization-specific analysis.
  • Limitation: The organization owns the entire lifecycle, including instrumentation, security, upgrades, documentation, and user experience.

Teams usually do not need to build an entire observability system from scratch. They can use existing tools to collect and store pipeline data, then build only the custom reports and features their organization needs.

How to evaluate the options for pipeline observability

Most teams do not need a single tool to handle every part of pipeline observability.

Start with the dashboard built into your CI/CD platform. If you need more information about build queues, available agents, or server health, add a metrics tool. If you need to search detailed information from several systems, collect the relevant logs in one place. Tracing is most useful when you need to follow what happens inside complex pipelines and external services.

When comparing tools, test them using problems your team has actually faced, such as a slow build, a flaky test, or an overloaded build agent. Check how quickly a developer can find the affected pipeline run, understand where the problem occurred, and gather enough evidence to explain it.

Also consider the work needed to set up and maintain each tool, as well as the amount of data it will store. Estimate the cost using a typical month of pipeline activity rather than a small test project.

Choose a tool that helps your team understand and resolve pipeline problems quickly without adding unnecessary complexity.

Final thoughts

An effective pipeline observability setup keeps information from different parts of the delivery process connected. This allows teams to see which commit triggered a build, which agent ran a stage, and whether a slowdown was related to the available infrastructure.

Start with the questions your current setup cannot answer. Use the framework in this article to identify which capabilities are missing, then test potential tools using real pipeline problems and typical data volumes.

The right setup should help your team understand what happened and find the cause more quickly.

Cover photo: by David Billings on Unsplash

show more
Python vs Go: A Practical Comparison for Developers
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-13 09:02:11 | Created: 2026-10-13 10:22:02

Two things are true about Python: It’s the most popular programming language in the world, and it’s the most common companion language for Go developers. How do we know that? From the Developer Ecosystem 2026 survey by JetBrains.

But we also know a lot more about the developers who use these two languages – both from quantitative data from different surveys, as well as qualitative data from our interviews with professionals who switched from Python to Go.

In this article, we share findings from these sources, going well beyond the simple syntax comparisons you will usually find. We will look at how the two languages differ, what the surveys tell us about the people who use them, and what our interviews say about the trade-offs between Python and Go, so that if you’re considering making the leap, you don’t have to dive in blind.

TL;DR

  • The article compares Python and Go across language design, performance, tooling, developer profiles, and migration experiences.
  • Python favors expressive code and rapid iteration; Go favors explicit, standardized code that is easy to maintain across teams.
  • Go excels in raw performance and concurrency, and is widely used in cloud infrastructure. Python remains stronger for machine learning, data science, and scientific computing.
  • Go developers are typically more infrastructure-focused and more senior. Go is rarely someone’s first language, whereas Python is very beginner-friendly.
  • Python leads in building AI models, yet Go developers create AI integrations at nearly the same rate: 46% vs 44%.
  • Moving to Go rarely means abandoning Python. Most teams use both, with Go for services and infrastructure and Python for AI and data workloads.

A note about the data

Unless stated otherwise, all survey figures come from the JetBrains Developer Ecosystem Survey 2026 (28,945 responses, fielded May–July 2026). We compare two groups: developers who selected Go among their primary languages (1,836) and developers who selected Python (11,298). The groups overlap, with 619 respondents selecting both languages. Therefore, every gap below is a conservative estimate of the real difference. Some questions were shown to only a part of each group, so bases are provided for reference. The qualitative material comes from interviews with developers who moved production workloads from Python to Go. We conducted the interviews between April and May 2026 and included seven participants who began using Go within the past year.

Python vs Go – languages compared

Core philosophy

On paper, Python and Go sound like they’d get along. Python lays out the core principles in the Zen of Python: Simple is better than complex, readability counts, there should be one obvious way to do it, etc. Go, as per Effective Go, “focuses on simplicity, reliability, and efficiency”, and is “specifically designed to make it easy to build software at scale”.

In practice, Python often optimizes for the person writing the code, offering multiple ways to say the same thing. Go optimizes for the person (or, nowadays, possibly the agent) reading someone else’s code two years later, so it picks one way to say most things and makes you spell it out. The goal is for all Go code to look like other Go code.

We point this out right at the beginning, because however similar these two philosophies look, this difference in approach underlies almost all the other language design differences that follow.

Ease of use and learning curve

Python is arguably one of the easiest programming languages to learn among those widely used in production. The syntax resembles natural language, the core set of constructs is small, and beginners can focus on programming ideas instead of language mechanics, leading to less frustration and faster results. Surveys consistently show Python to be one of the most popular programming languages (if not the most popular). In 2026, 10% of Python developers have been coding for less than a year, 23% are students or working students, and 19% hold junior positions, showing the language has a strong early-stage user base.

Python’s popularity among early learners is almost self-perpetuating. Initially, the language was well-suited to introductory courses and learning materials largely because it lets beginners print “Hello, world” with little ceremony, bypassing much boring theory in favor of real outputs. It also has the added benefit of being a generalist language that can handle a variety of use cases. Later, the sheer number of introductory courses and learning materials made it a natural choice for anyone who wanted to pick up programming but didn’t know where to start.

It’s not the same case with Go. In fact, you would be hard-pressed to find courses that teach you programming through Go. There are two reasons for that. First, Go 1.0 was released in 2012, long after Python had already become firmly embedded in CS curricula. The other is that Go solves problems that beginners don’t have. Explicit error handling, static types, and interfaces, which we’ll discuss later, all pay off across a large codebase maintained by a team over years. Go also has a much narrower set of implementations than Python, which makes it even less appealing for beginners.

That said, Go was also designed to be easy to learn, but for a different reason: Any large team should be able to onboard a new engineer quickly. Many Go developers will say that if you already know general programming concepts, you can become productive in Go in a matter of days or weeks. Developers we talked to said that Go “feels as easy to write as Python” and that it “strikes a good balance between Python’s simplicity and Java’s explicit nature”.

Syntax and readability

When you read Python, you can often follow it even without programming experience, because it reads relatively close to English. Python is dynamically typed, so type declarations are optional, though in practice, many companies and large codebases now write Python with type hints throughout, checked by tools like mypy or Pyright. Most of the ecosystem follows the formatting conventions set out in PEP 8, but they are still optional, and so some teams diverge from them.

Go, by contrast, is explicit and deliberately limited, which contributes to the cross-team readability we mentioned. It is statically typed, which makes it noticeably more verbose than Python. That was the main syntactic complaint raised by the developers we interviewed. Formatting in Go is not a matter of preference: gofmt will shape your code into the canonical form, whether you like the conventions or not.

One syntactic difference that developers consistently pointed out as a big adjustment when moving from Python to Go was error handling. Python lets you push failure handling to the edges of a function with try / except. Experienced Go developers clutch their pearls at the sight of that.

# Python: handle failure where it is convenient
try:
    profile = get_user(user_id)
except UserNotFound:
    return render_404()
// Go: handle failure where it happens
profile, err := getUser(userID)
if err != nil {
    if errors.Is(err, ErrUserNotFound) {
        return render404(w)
    }
    return fmt.Errorf("get user %s: %w", userID, err)
}

The Go version is longer, and in a large handler, developers will find themselves writing the if err != nil boilerplate ad nauseam. In return, they get control flow with no invisible jumps: Every path a value can take is explicit. Both approaches come with trade-offs.

Type system

Python’s dynamic typing checks types at runtime. This gives developers flexibility in writing and can speed up iteration, but it also means some type errors only show up when the code runs. The flexibility extends to the object model, which relies on duck typing: The code cares less about what an object is than what it can do. The developers we interviewed said they sorely missed duck typing, as it makes testing and mocking more difficult in Go.

Go checks types before the program runs. This results in fewer type-related failures reaching production and makes refactoring safer, but also causes code verbosity, as we touched on earlier.

Object model and polymorphism

Python is object-oriented in the way that most developers first learn the term. Everything is an object, and classes inherit from other classes (several at once, if you insist). Polymorphism works in two ways: down the class hierarchy when a subclass overrides its parent’s method, and sideways through duck typing, where anything with a read() method can be handed to code that expects a file.

Go has none of that hierarchy. There are no classes, no inheritance, and no way to declare that one type is a subtype of another. Instead, structs have methods attached to them, as well as interfaces that types satisfy implicitly without ever naming them.

# Python: the implementation announces its role
class Store(ABC):
    @abstractmethod
    def get(self, key: str) -> bytes: ...

class RedisStore(Store):
    def get(self, key: str) -> bytes:
        ...
// Go: the consumer declares what it needs; RedisStore never mentions Getter
type Getter interface {
    Get(key string) ([]byte, error)
}

func handleRead(g Getter, key string) ([]byte, error) {
    return g.Get(key)
}

Notice how the dependency runs. In Python, RedisStore inherits from Store, so the abstraction sits with the implementation. In Go, handleRead declares the one method it actually calls, and RedisStore never learns that Getter exists. That’s why Go developers say to “accept interfaces, return structs”, and that’s why interfaces stay small – io.Reader and io.Writer have a single method each.

Performance and speed

Go follows a traditional compilation model, producing a native binary. Python, on the other hand, takes a hybrid approach: Source code is compiled to bytecode, which the interpreter then executes.

As most compiled languages do, Go wins in terms of raw speed. You can compare the patterns across latency, throughput, and startup time on The Computer Language Benchmarks Game. Microbenchmarks like these don’t really translate directly to real workloads, and we wouldn’t be surprised if you made nothing of them. Our interviewees told us what the difference meant in production for them: One team migrated to Go after cold starts on AWS Lambda in Python exceeded 10 seconds; another measured a tenfold improvement in request times after rewriting their Python service in Go.

But raw language speed matters only when your service is actually compute-bound or latency-sensitive, and plenty of services are neither. Equally importantly, the Python interpreter is not slow where it counts most for one of its largest user bases. In machine learning, data work, and numerical computing, libraries like NumPy and PyTorch offload expensive operations to optimized native code, making interpreter overhead much less relevant. When we asked migrating developers where they decided to keep Python code, they confidently listed all AI and ML workflows – LLMs, chatbots, RAGs, and model training.

Memory management

Memory management is another important part of the performance discussion. Both languages manage memory for you, but differently: Go uses a tracing garbage collector, while CPython uses reference counting alongside a cyclic garbage collector. This affects what developers can fine-tune and what they need to design around.

Go’s GC runs concurrently with the program and is designed to minimize stop-the-world pauses. Developers can tune this behavior: GOGC and GOMEMLIMIT set the pacing, and the memory profile (heap and allocs) tells you when a service allocates too hard.

In CPython, an object is typically freed the moment its last reference disappears. Memory use is predictable, and pauses are rarely worth measuring, but the cost is spread across every operation, and there’s little to room tune it.   

Concurrency and parallelism

Even though both languages support concurrency, developers we talked to cited better concurrency as the reason why they switched from Python to Go.

Goroutines are central to Go’s design. They are lightweight threads managed by the runtime. They are cheap to create, carry little overhead, and scale to thousands of concurrent operations. The runtime handles the scheduling, which makes the model simpler than in Python – there is no separate async/await syntax, so a function is just a function. However, if you start to spawn goroutines without controlling their lifecycle, you’d better be ready to deal with race conditions, leaks, and deadlocks before long.

The other half of the concurrency model in Go are channels – typed conduits that pass values between goroutines and synchronize them. Instead of guarding shared state with a lock, Go can pass the value to whichever needs it next. A select statement waits on several channels at once, which is how Go expresses timeouts, cancellation, and fan-in using built-in language constructs. These very same primitives also produce common Go bugs: goroutine leaks and more deadlocks. 

Meanwhile, Python relies on standard libraries, single-threaded event loops, and sub-processes to work around interpreter constraints. It offers threading, but in CPython, the global interpreter lock (GIL) has historically prevented threads from running Python bytecode simultaneously, making it ineffective for CPU-bound parallelism. For I/O-bound concurrency, there is asyncio, and for real parallelism there is multiprocessing, but that adds memory overhead and requires inter-process communication.

It’s worth noting that the GIL itself is no longer a necessity – starting with Python 3.13, PEP 703 introduced an officially supported free-threaded build, and 3.14 continues that work. Most production code still runs with the GIL in place, but with each new release, the claim that “Python can’t do real threading” is becoming less true.

# Python: async/await, and the coloring that comes with it
async def fetch_all(urls):
    return await asyncio.gather(*(fetch(u) for u in urls))
// Go: ordinary functions run concurrently
var wg sync.WaitGroup
for _, u := range urls {
    wg.Add(1)
    go func() {
        defer wg.Done()
        fetch(u)
    }()
}
wg.Wait()

The approach to concurrency gives Go much of its practical advantage in high-throughput services, and having experienced both, our interviewees praised Go for being “async by default” and better suited for high-concurrency components, and they described it as having a superior concurrency model that’s highly performant and appealing for real-world use cases.

Libraries, frameworks, and IDEs

Go’s self-contained ecosystem

Go was never built as just a programming language, but as an ecosystem. As the Go team puts it, the goal was “an end-to-end platform with tooling all around the software development lifecycle” (Google for Developers), with formatters, test frameworks, dependency management, and security tools included in the toolchain, alongside a standard library that’s comprehensive enough to make external frameworks optional, if not irrelevant.

The Developer Ecosystem 2026 survey shows how successful the Go team has been in achieving that goal. For example, among Gophers, the standard html/template and text/template library packages are used by 31% and 22% of developers respectively, whereas the only other significant alternative – templ – is used by 11%.

Almost half of Gophers either don’t write unit tests or don’t use testing frameworks: 14% don’t write unit tests at all, and 35% don’t use frameworks for testing – the testing package provides everything they need in that regard. Others may also reach for tools such as Testify (31%) or GoMock (25%). The remaining libraries are far less popular.

For web development, 46% of developers use the standard net/http library, compared to 48% who use Gin. This proves that where a third-party framework exists, it doesn’t compete with the many other frameworks, but only with the standard library. Oftentimes, it loses.

Go developers

Libraries and frameworks Go developers use

Template enginesTestingWeb frameworks

Template engines used for Go development

Which template engines do you use for Go development, if any?

None52%
html/template31%
text/template22%
templ11%
gomponents5%
pongo24%
Plush1%
Other2%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Go section (n = 1,529). Multiple answers allowed.

Testing frameworks and mock libraries in Go

Which testing frameworks or mock libraries do you regularly use, if any?

I write unit tests but don’t use any frameworks35%
Testify31%
GoMock25%
I don’t write unit tests for Go14%
Ginkgo7%
go-sqlmock6%
Godog5%
Gomega3%
GoConvey1%
Other2%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Go section (n = 1,518). Multiple answers allowed.

Go web frameworks in regular use

Which Go web frameworks do you regularly use, if any?

Gin48%
net/http46%
gorilla/mux15%
go-chi/chi15%
Echo13%
Fiber13%
None12%
Beego5%
Buffalo2%
Revel1%
Other5%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Go section (n = 1,519). Multiple answers allowed.

Python’s broad ecosystem

Python’s ecosystem works the other way around. The Python Package Index (PyPI) is vast and mature, and where the standard library stops, several strong alternatives tend to compete.

Take web frameworks, for example. Half of Python developers use FastAPI, and Django (31%) competes closely with Flask (30%). The data science landscape is more fragmented, and developers use those libraries simultaneously: 69% use NumPy, 68% use pandas, 50% use PyTorch, 49% use Matplotlib, etc. With Python, there’s often no clear leader, and choosing the right framework or library is part of the job.

Python developers

Frameworks and packages Python developers use

Web frameworksData science

Web frameworks used with Python

What web frameworks / libraries do you use in addition to Python?

FastAPI50%
Django31%
Flask30%
None28%
Other3%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Python section (n = 4,276). Multiple answers allowed.

Data science packages used with Python

What data science packages do you use in Python?

NumPy69%
pandas68%
PyTorch49%
Matplotlib48%
scikit-learn35%
OpenCV32%
TensorFlow30%
SciPy29%
Seaborn20%
Keras15%
None14%
XGBoost13%
Polars8%
Other1%
Show fewer options

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Python section (n = 4,277). Multiple answers allowed.

IDEs & editors

When it comes to editors, we see a similar pattern unfold. Go has an excellent language server, which makes general-purpose editors a viable alternative to a Go-specific IDE. When asked which IDEs or editors they use for Go development, 49% reported using GoLand, while 48% reported using VS Code. 

Go developers

IDEs and editors used for Go development

Which IDEs or editors do you use for Go development?

GoLand49%
Visual Studio Code48%
Zed14%
Cursor14%
Neovim10%
IntelliJ IDEA8%
Vim4%
Visual Studio4%
Sublime Text2%
Emacs1%
Windsurf1%
Atom<1%
Other4%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Go section (n = 1,529). Multiple answers allowed.

One reason is how much of Go’s surrounding ecosystem developers can access without having to assemble it themselves. GoLand installs with a test runner, debugger, coverage, and profilers wired into the toolchain. The analysis runs across the whole project, rather than only the open file. Interprocedural nil checks and unhandled-error inspections can catch the mistakes a Python developer might otherwise only see at runtime. Suffice it to say, Alan Donovan of the Go team has also described traditional IDEs like ours as setting “the gold standard” for refactoring because of their tight integration between the analysis logic and the user interface.

Python developers

Main IDE or editor for Python development

Which IDE or editor do you use the most for Python development?

Visual Studio Code41%
PyCharm22%
Cursor10%
PyCharm Pro8%
Jupyter Notebook5%
Vim / Neovim3%
IntelliJ IDEA3%
Zed2%
Notepad++2%
IDLE1%
Datalore<1%
Windsurf<1%
Emacs<1%
Other2%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Python section (n = 4,276). One answer per respondent.

The Python side is more fragmented and has more Python-specific options, such as Jupyter Notebook and, of course, PyCharm. The latter is used by 30% of Python developers (PyCharm – 22%, PyCharm Pro – 8%), with VS Code at 41%. Notebooks explain much of the fragmentation, since data and service work don’t necessarily require the same toolset. Whatever you build in Python, PyCharm has first-class support for your stack, your frameworks, and your workflow – for web, data, and ML workflows – with notebooks running alongside a debugger and type checker. It parses your code and resolves usages, types, and dependencies throughout your entire project. So you always know exactly what your code does and what will break if it changes, for you and your agents alike.

If you use both Go and Python – as a quarter of Gophers do – it’s worth noting that both GoLand and PyCharm are built on the same platform, so keymaps, shortcuts, and settings sync between them. GoLand also supports Python functionalities through the Python Community Edition plugin.

Python vs Go – broader landscapes

The language itself is one thing, but many other factors go into deciding which language you choose to work with. Developers consider what the languages are used for, who uses them, and how they’re maintained. In this section, we’ll provide insights on the factors that shape the broader landscapes of Python and Go.

Go developers are more senior

Across all questions about age, experience, and seniority in the Developer Ecosystem 2026 survey, Gophers tend to be further along in their career than Python developers.

On overall professional coding experience (not just experience in their main programming language), 20% of Go devs report 16 years or more, compared to 12% among Python developers. At the other end, 9% of Gophers have 1–2 years of experience, compared to 20% of Python developers.

Most Go professionals have senior roles, at 60%, with only 2% being trainees and 10% juniors. Meanwhile, 42% of Python professionals are seniors; trainees (6%) and juniors (19%) make up a quarter of the cohort.

72% of Go developers are employed full-time, compared to 51% of Python developers. Students and working students make up 8% of Gophers, compared to 23% of the Python population.

Finally, by age, the largest group of Go developers is aged 30–34 (23%), compared to Python’s largest group, aged 21–24 (22%).

These differences align with the point we made earlier: Python is a very popular first language for learners, while Go is almost never chosen as a first language and instead is picked up by more experienced developers later in their careers.

It’s important to keep this in mind as you read the following sections on developer demographics, because a lot of these numbers may look like differences between two languages, where in reality, they’re just differences between a senior population vs a general one that you would see regardless of what ecosystems you compare.

Go vs Python developers

Experience and seniority

ExperiencePositionEmploymentAge

Professional coding experience

How many years of professional coding experience do you have?

GoPython
Less than 1 year*Go 2%Python 10%
1–2 years*Go 9%Python 20%
3–5 yearsGo 22%Python 25%
6–10 years*Go 28%Python 19%
11–15 years*Go 17%Python 9%
16+ years*Go 20%Python 12%
No professional coding experience*Go 1%Python 5%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p < 0.05, adjusted).

Position level

What is the level of your current position?

GoPython
Trainee*Go 2%Python 6%
Junior*Go 10%Python 19%
Middle*Go 26%Python 30%
Senior*Go 60%Python 42%
OtherGo 2%Python 3%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,531, Python n = 6,891. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p < 0.05, adjusted).

Employment status

Which of the following best describes your employment and involvement in software development?

GoPython
Employed full-time*Go 72%Python 51%
Employed part-time*Go 2%Python 3%
Self-employed or freelancer*Go 10%Python 11%
Founder or business ownerGo 4%Python 3%
Working student*Go 4%Python 9%
Student*Go 4%Python 14%
Not employed, with development experienceGo 3%Python 3%
Learning as a hobby or career transition*Go 1%Python 4%
Other*Go <1%Python 1%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p < 0.05, adjusted).

Age

What is your age range?

GoPython
18–20*Go 4%Python 9%
21–24*Go 13%Python 22%
25–29Go 22%Python 21%
30–34*Go 23%Python 16%
35–39*Go 17%Python 12%
40–49*Go 18%Python 14%
50–59*Go 4%Python 5%
60 or older*Go <1%Python 2%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p < 0.05, adjusted).

Salary follows seniority

Salary bands clearly show how experience affects other demographic data. Go developers are better represented in the top bracket: 9% report earning more than $180,000 a year, compared to 6% of Python programmers. Meanwhile, Python users cluster more in the lowest brackets.

Go vs Python developers

Annual salary, USD

Salary bands in USD, converted from local currencies.

GoPython
Up to 1,000*Go 0%Python <1%
Up to 1,800Go 1%Python 1%
Up to 6,000*Go 4%Python 8%
Up to 12,000*Go 6%Python 8%
Up to 18,000Go 6%Python 6%
Up to 24,000Go 5%Python 7%
Up to 36,000Go 12%Python 14%
Up to 48,000Go 11%Python 10%
Up to 60,000Go 9%Python 8%
Up to 84,000Go 13%Python 12%
Up to 120,000*Go 17%Python 12%
Up to 180,000Go 8%Python 8%
More than 180,000*Go 9%Python 6%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,115, Python n = 5,004. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p < 0.05, adjusted).

However, if we look only at full-time developers, the differences are no longer statistically significant. The premium is attached to the seniority and employment status, not the primary language. In other words, learning Go itself will not guarantee you a higher salary, but the roles that require Go generally pay better.

What they build

The Developer Ecosystem survey also asks people what functionality their code implements.

Go developers more frequently reported:

  • 69% – providing APIs and services (Python – 41%)
  • 63% – integrating with APIs and services (Python – 47%)
  • 51% – application logic and workflows (Python – 37%)
  • 47% – user interface (Python – 41%)
  • 35% – libraries and frameworks (Python – 26%)

Meanwhile, Python developers reported higher rates for:

  • 38% – data processing and analytics (Go – 30%)
  • 36% – artificial intelligence and machine learning (Go – 20%)
  • 32% – data science and data analytics (Go – 15%)

The question of where their code is executed adds more context: A vast majority of Go developers target server, infrastructure, or cloud environments (74% compared to 57% of Python developers. On the other hand, 66% of Python developers target the desktop (Go – 47%).

Python is clearly a general-purpose language with a stronghold in AI, ML, and data work that favors local execution, while Go is heavily oriented towards networked services and infrastructure.

There is, however, a particularly interesting line item in the set: integration with AI. While AI development per se is a Python domain, integrations are not. 46% of Go developers report implementing AI integrations, against Python’s 44%, almost equal numbers. Asked about the types of development they do at work, 51% of Python developers reported working with AI and AI tools, compared to Go’s 48%. Go engineers may not train the models, but they are building AI-powered products at roughly the same rate as Python developers.

Go vs Python developers

What Go and Python developers build

FunctionalityPlatformsDevelopment type

What their code implements

Which specific functionality does your code implement?

GoPython
Integrating with APIs and services*Go 63%Python 47%
Providing APIs and services*Go 69%Python 41%
Integration with AIGo 46%Python 44%
User interface*Go 47%Python 41%
Application logic and workflows*Go 51%Python 37%
Data processing and analytics*Go 30%Python 38%
Libraries / frameworks*Go 35%Python 26%
Artificial intelligence and machine learning*Go 20%Python 36%
System tools and components*Go 27%Python 19%
Data science / data analytics*Go 15%Python 32%
Automating software testing and QA*Go 23%Python 20%
Ad hoc scripts*Go 18%Python 15%
Network communication protocols*Go 19%Python 12%
Security, encryption, and cryptographic protocols*Go 18%Python 13%
Audio or video processing*Go 8%Python 10%
Hardware interfacing and control systems*Go 8%Python 10%
Simulations and predictive modeling*Go 5%Python 9%
Rendering and processing graphics (2D/3D)*Go 5%Python 7%
Blockchain technologyGo 4%Python 3%
Other*Go <1%Python 1%
Show fewer options

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p < 0.05, adjusted).

Where their code runs

On which platforms is your code executed?

GoPython
Server / infrastructure / cloud*Go 74%Python 57%
Browser*Go 63%Python 57%
Desktop*Go 47%Python 66%
Mobile*Go 32%Python 26%
IoT / embeddedGo 11%Python 12%
WebAssembly*Go 7%Python 5%
Game consoles*Go <1%Python 2%
Other*Go <1%Python 1%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p < 0.05, adjusted).

Types of development at work

Which types of development are you involved in at work?

GoPython
Backend*Go 77%Python 54%
Full-stack*Go 55%Python 44%
AI and AI toolsGo 48%Python 51%
Infrastructure / DevOps*Go 45%Python 31%
Frontend*Go 39%Python 35%
Automated testGo 22%Python 20%
Data science and ML*Go 11%Python 27%
DesktopGo 18%Python 19%
MobileGo 18%Python 16%
Embedded and IoTGo 7%Python 9%
GamesGo 5%Python 4%
I don’t develop software professionally*Go 1%Python 6%
OtherGo 1%Python 1%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,595, Python n = 7,427. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p < 0.05, adjusted).

DevOps: Same job, different toolbox

One other point of convergence between Python and Go developers that deserves its own section is DevOps. Both groups are involved in that area, though Python developers (31%) somewhat less than Gophers (45%). The two groups also tend to use different tools.

  • For orchestration, Go developers are more likely to use tooling overall, and especially Kubernetes. Only 8% of Go developers don’t use container orchestration tools (compared to 17% for Python); 58% use Kubernetes (compared to 39%). The engineers we talked to cited Go’s deep integration with Kubernetes as one of the reasons they migrate entire services from Python to Go.
  • For configuration management, Terraform leads both groups. However, Python developers lean more toward cloud-native IaC tools (29% for Python, 23% for Go) or use nothing (21% for Python, 15% for Go), while Go developers choose GitOps more often (27% for Go, 21% for Python).
  • When it comes to DevOps practices, Go developers report using them more often overall, with one exception: AI-driven operations (12% of Go developers and 18% of Python developers). Python developers are also more likely to use no DevOps practices at all (6% for Python, 2% for Go).

So even if you move from Python to Go in the same type of role, the toolset change might be as big an adjustment as the language change itself.

Go vs Python developers

DevOps tools and practices

OrchestrationConfig managementPractices

Container orchestration tools

Which container orchestration tools or services do you use?

GoPython
Docker ComposeGo 68%Python 65%
Kubernetes (incl. EKS, GKE, or AKS)*Go 58%Python 39%
Amazon ECSGo 14%Python 13%
I don’t use any such tools or services*Go 8%Python 17%
Docker SwarmGo 8%Python 7%
OpenShift*Go 2%Python 4%
HashiCorp NomadGo 2%Python 1%
Apache Mesos*Go <1%Python 2%
OtherGo 1%Python 1%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,435, Python n = 7,242. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p < 0.05, adjusted).

Configuration management and IaC tools

Which configuration management or IaC tools do you use?

GoPython
Terraform*Go 47%Python 37%
Cloud-native IaC tools (CloudFormation/CDK, ARM/Bicep, etc.)*Go 23%Python 29%
GitOps*Go 27%Python 21%
Custom scripts or in-house solutionsGo 22%Python 22%
AnsibleGo 21%Python 22%
I don’t use any such tools*Go 15%Python 21%
Puppet, Chef, SaltStack, or similarGo 4%Python 5%
PulumiGo 3%Python 3%
OtherGo 2%Python 2%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 930, Python n = 3,109. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p < 0.05, adjusted).

DevOps practices in use

Which of the following DevOps practices do you or your team currently use?

GoPython
CI/CD pipelines*Go 88%Python 83%
Containerization and orchestration*Go 61%Python 52%
Infrastructure as code (IaC)*Go 50%Python 42%
GitOps*Go 36%Python 26%
Platform engineering*Go 25%Python 18%
DevSecOpsGo 20%Python 20%
AI-driven operations*Go 12%Python 18%
Serverless (FaaS), multi-cloud, or hybrid cloudGo 17%Python 13%
We don’t use any DevOps practices*Go 2%Python 7%
OtherGo <1%Python 1%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 930, Python n = 3,110. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p < 0.05, adjusted).

Operating systems

A curious difference surfaced when we asked developers about the operating system they use for their development environment. Go developers work on macOS (70%) and Linux (57%) significantly more than on Windows (44%). Meanwhile, Python developers use Windows first (66%), then split almost evenly between macOS (54%) and Linux (52%).

For developers planning to migrate to Go, sticking with Windows doesn’t have to complicate deployment, even when the target is a Linux server. For pure Go, building a Linux binary from any of the three operating systems takes no more than two environment variables, while a Python deployment still has to find a matching interpreter and native packages, wherever it ends up.

Go vs Python developers

Operating systems for development environments

On which operating systems are your development environments?

GoPython
macOS*Go 70%Python 54%
Windows*Go 44%Python 66%
Linux*Go 57%Python 52%
OtherGo <1%Python 1%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p < 0.05, adjusted).

Two different approaches to AI

We’ve already discussed using Python and Go for AI development, but what about using AI for Go and Python development? Both groups use AI heavily at work, but there’s a difference in how and what they use it for.

Go developers report using AI daily for tasks such as editing code across multiple files (60% vs 52%), agentic development of features or programs (51% vs 41%),  generating commit messages (51% vs 36%) and tests (47% vs 34%), or performing code reviews (39% vs 34%).

Meanwhile, Python developers lead on one task: learning new things about coding and software development (38% of Python developers vs 31% of Go developers), which is consistent with earlier data showing a larger early-career population among Python developers.

There is, however, a long list of tasks where the two groups are indistinguishable: refactoring, debugging, checking code for potential issues, asking general questions, or generating boilerplate – even though you’d expect Go developers to jump on the last one much more, considering the verbosity of the language.

Go vs Python developers

Tasks they use AI tools for every day

How often do you use AI tools for each of the following tasks at work? Share answering “Every day”.

GoPython
Generating code*Go 69%Python 64%
Editing code across multiple files*Go 60%Python 52%
Code completion*Go 55%Python 51%
Agentic development of features or programs*Go 51%Python 41%
Generating boilerplate, repetitive codeGo 45%Python 46%
Asking questions about software developmentGo 45%Python 45%
Generating code comments or documentation*Go 48%Python 42%
Generating commit messages*Go 51%Python 36%
Explaining bugs and offering fixesGo 40%Python 45%
Generating tests*Go 47%Python 34%
Improving or optimizing codeGo 40%Python 40%
Checking code for potential issuesGo 39%Python 41%
Performing code reviews*Go 39%Python 34%
Explaining codeGo 37%Python 36%
Brainstorming new ideasGo 35%Python 38%
Learning new things about coding*Go 31%Python 38%
Summarizing recent code changesGo 34%Python 34%
Debugging codeGo 32%Python 35%
Generating user documentationGo 32%Python 28%
Natural-language search for code fragmentsGo 31%Python 27%
Generating internal documentationGo 28%Python 24%
Refactoring codeGo 22%Python 22%
Converting code to other languagesGo 11%Python 13%
Show fewer options

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who rated these tasks (Go n = 993, Python n = 5,056); bases vary slightly by task. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p < 0.05, adjusted).

So AI-assisted coding is common in both ecosystems. Go developers have simply wired it into the production chores of a maintenance-heavy codebase: commits, tests, reviews, and multi-file edits.

The groups also tend to use different tools. Go developers are more likely to use terminal and agentic tools like Claude Code (45% vs 40%), OpenAI Codex (24% vs 17%), Cursor (17% vs 12%), and OpenCode (12% vs 6%). Python developers, in turn, reach more for general-purpose assistants and Google or Microsoft surfaces like ChatGPT (20% vs 16%), Google Antigravity (9% vs 5%), and Microsoft 365 Copilot (4% vs 1%).

Go vs Python developers

AI tools used for coding at work

Which of these AI tools do you use for your coding and other development-related tasks at work?

GoPython
Claude Code*Go 45%Python 40%
OpenAI Codex*Go 24%Python 17%
GitHub CopilotGo 18%Python 19%
ChatGPT (web, desktop, or mobile app)*Go 16%Python 20%
Claude (web, desktop, or mobile app)Go 16%Python 17%
Cursor*Go 17%Python 12%
OpenCode*Go 12%Python 6%
Google Antigravity*Go 5%Python 9%
Google Gemini (web or mobile app)Go 6%Python 7%
JetBrains AI Assistant*Go 7%Python 5%
DeepSeek (apps or self-hosted)Go 5%Python 4%
CodeGPT plugin in VS CodeGo 5%Python 3%
Zed*Go 5%Python 2%
Gemini CLI*Go 2%Python 4%
JetBrains Junie*Go 4%Python 2%
Microsoft 365 Copilot*Go 1%Python 4%
TraeGo 2%Python 2%
Gemini Code AssistGo 1%Python 2%
CodeRabbit*Go 2%Python 1%
Google AI Studio*Go <1%Python 2%
PerplexityGo 1%Python 2%
TONGYI LingmaGo 2%Python 1%
WindsurfGo 1%Python 1%
Qwen CodeGo 1%Python 2%
Amazon Q DeveloperGo 1%Python 1%
OpenClaw*Go 1%Python 1%
JetBrains AirGo 1%Python <1%
DevinGo 1%Python 1%
Gemini in Android Studio*Go <1%Python 1%
Warp / OzGo <1%Python 1%
Cline*Go <1%Python 1%
NoneGo <1%Python 1%
ConductorGo 1%Python <1%
AmpGo <1%Python <1%
FactoryGo <1%Python <1%
BLACKBOX AI*Go <1%Python <1%
Google JulesGo <1%Python <1%
GitHub Agent HQGo <1%Python <1%
TabnineGo <1%Python <1%
GitLab Duo Agent PlatformGo <1%Python <1%
SupersetGo <1%Python <1%
GraphiteGo <1%Python <1%
Ona (previously Gitpod)Go 0%Python <1%
OtherGo 2%Python 1%
Show fewer options

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,482, Python n = 6,747. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p < 0.05, adjusted).

One number that has to change

Software development remains a heavily male-dominated field, and the gap is particularly pronounced in Go, which – as it’s typically people’s second language – inherits whatever the pipeline hands it and exacerbates it further. In our sample, only 1.8% of Go developers identify as female, compared to 5.8% of Python developers.

Go vs Python developers

Gender

What is your gender?

GoPython
Male*Go 95.8%Python 90.8%
Female*Go 1.8%Python 5.8%
Non-binary, genderqueer, or gender non-conforming*Go 0.6%Python 1.2%
Prefer not to sayGo 1.8%Python 2.2%
Other*Go 0%Python 0.1%

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,833, Python n = 11,284. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p < 0.05, adjusted).

Transitioning from Python to Go

One-way path well traveled

You may ask why we’re focusing on transitioning from Python to Go, not the other way around. The data leaves little doubt about the path developers are taking. Python is already the most common second language among Go developers – 35% of Gophers declare it as their other primary language. But most Go developers (70%) say they have no intention of adopting another language in the next 12 months, and if they do, they name Rust (16%), rather than Python (2%). On the other hand, 10% of Python developers (a much larger cohort in terms of absolute numbers) plan to pick up Go, roughly 5.5 times the rate at which Go developers plan to pick up Python.

Go vs Python developers

Languages they plan to adopt in the next 12 months

Do you plan to adopt or migrate to other languages in the next 12 months? If so, which ones?

GoPython
Not planning to adopt any other language*Go 70%Python 61%
Rust*Go 16%Python 13%
Go*Go n/aPython 9%
C++*Go 3%Python 5%
Java*Go 2%Python 4%
Swift*Go 2%Python 4%
TypeScript*Go 2%Python 4%
Kotlin*Go 2%Python 4%
C#*Go 2%Python 3%
JavaScript*Go 1%Python 3%
CGo 2%Python 2%
SQL*Go 1%Python 3%
Python*Go 2%Python n/a
RubyGo 1%Python 2%
Shell scripting languages*Go 1%Python 2%
PHPGo 1%Python 1%
ElixirGo 2%Python 1%
DartGo 1%Python 1%
R*Go <1%Python 2%
HTML / CSS*Go <1%Python 2%
LuaGo 1%Python 1%
Assembly*Go <1%Python 1%
ScalaGo 1%Python 1%
MATLAB*Go <1%Python 1%
HaskellGo 1%Python <1%
Julia*Go <1%Python 1%
Visual Basic*Go <1%Python 1%
Platform-specific language (Apex, ABAP, 1C, etc.)*Go <1%Python 1%
PerlGo <1%Python <1%
COBOL*Go <1%Python <1%
GroovyGo <1%Python <1%
Objective-C*Go 0%Python <1%
LabVIEW*Go <1%Python <1%
F#Go <1%Python <1%
Delphi*Go 0%Python <1%
Clojure / ClojureScript*Go <1%Python <1%
CoffeeScript*Go 0%Python <1%
AdaGo <1%Python <1%
OtherGo 3%Python 2%
Show fewer options

Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,295. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. n/a: respondents already use this language as a primary one. * Statistically significant difference (p < 0.05, adjusted).

Why make the switch from Python to Go?

Despite working in different roles and on different products, the developers we interviewed gave consistent reasons for transitioning from Python to Go. These were:

  • Better performance and speed, including cold starts, latency, and operating cost.
  • Easier and more effective concurrency model.
  • Type safety that catches failures that would otherwise reach production at compile time.
  • Proximity to the platform, since Kubernetes and much of the cloud-native toolchain are written in Go, so teams working on that infrastructure already interact with Go daily.

What they gained and what they lost

Perceived potential gains are one thing, but did Go actually deliver? According to the developers we interviewed, it did in the areas described above. But they also found benefits they weren’t expecting: predictable formatting and linting that contributed to “clean code”, out-of-the-box tooling, and simplicity comparable to Python’s.

But Go also has flaws that are obvious to developers coming from Python. Just like the reasons for adopting Go were consistent, so were the complaints:

  • Explicit error handling that’s fundamentally different from Python, less intuitive, and more repetitive.
  • Overall verbosity and opinionatedness, with more lines needed to convey the same behavior and fewer ways to express it.
  • An object model that makes testing and mocking noticeably more difficult.
  • Library gaps, especially for testing.

Did they really leave?

“Migrating”, “transitioning”, and “switching over” may all sound like final decisions to leave Python behind, but that’s not really the case. Not one of the developers we interviewed removed Python from their stack completely. They kept it for artificial intelligence and machine learning, data science, and pipelines on platforms that only support Python, as well as simply because they work on larger teams that already know Python and are productive in it.

The realistic outcome of “moving to Go” is not becoming a monoglot, but having a polyglot codebase where each language is used for what it’s best suited for.

Conclusions

So, which language should you choose? Is it worth dropping Python in favor of Go? We hope that by now the answer is clear – it’s not a matter of which language is better, but which one is a better fit. Based on our data and developer testimony, here’s what we found.

Go may be a better fit if:

  • Performance is crucial for your app: Latency, throughput, or cold starts are problems you actually have and can measure.
  • The workload is concurrent, especially if it is I/O-heavy.
  • The service is long-lived and maintained by a team, not one person.
  • The system already depends heavily on Kubernetes and the rest of the cloud-native toolchain.

Python may be a better fit if:

  • The work is machine learning, data science, or numerical computing.
  • Your platform only accepts Python, as managed ETL and notebook environments frequently do.
  • Iteration speed matters more than runtime speed, which is often the case for internal tooling and prototypes.
  • The library you depend on has no Go equivalent; for a lot of the scientific stack, there isn’t one.

Language features alone rarely determine the best choice. When deciding what to build with, the teams weigh in the toolchain they already run, the languages their colleagues already know or are willing to learn, and how much of the existing system they are willing to change. Those things carry more weight than any benchmark, and they are why developers we talked to ended up using both languages, instead of choosing one.

Frequently asked questions

Can Go replace Python completely?

For a lot of backend work, yes, in principle. In practice, it doesn’t. None of the developers we interviewed removed Python from their stack completely. They kept it for machine learning and data science, for pipelines on platforms that only accept Python, and because the teams around them already know it. In the Developer Ecosystem 2026 survey, about a quarter of Go developers report using Python in the same project.

Is Go good for data engineering?

It depends on which end of the pipeline you mean. Go works well for moving data around, including ingestion services, stream processing, API integrations, and CLI tooling, and 30% of Go developers report working on data processing and analytics, compared with Python’s 38%. The analytical end is a different story: Only 15% of Gophers do data science and data analytics, against 32% of Python developers, and the library ecosystem reflects that.

How long does it take a Python developer to learn Go?

Days to weeks for the language itself. The syntax is small, gofmt settles the formatting arguments, and developers we talked to said Go “feels as easy to write as Python”. What takes longer is everything around it: system concepts such as pointers, interfaces, goroutines, and channels, as well as the habits Go asks you to change, from explicit error handling to designing test seams instead of patching at runtime.

The bigger adjustment may not be the language after all. Go work tends to sit closer to Kubernetes, Terraform, and GitOps, so if you’re moving into a Go team from a Python one, budget as much time for learning the toolchain as for the syntax.

Is Go good for machine learning?

For training models, probably not. 20% of Go developers work on artificial intelligence and machine learning, against 36% of Python developers, and the developers we interviewed were blunt about why: Python has the libraries, while Go lacks equivalents.

When it comes to building products around the models, it’s a different story. 46% of Go developers implement AI integrations, against Python’s 44% – a negligible difference. Gophers generally aren’t training the models, but they sure are serving them.

Can Go and Python be used in the same project?

Not only can they be used together, they often are. 27% of Go developers report using Python alongside Go in the same project, behind TypeScript (43%) and just ahead of JavaScript (24%). We know from interviews that the usual division of labor follows each language’s strengths: Go for the networked services and infrastructure, Python for data work, machine learning, and anything that depends on the scientific library stack.

show more
Coding, Math, and AI: What’s Ahead for School Students in 2026–2027
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-13 08:12:22 | Created: 2026-10-13 08:19:00

Looking for new ways to challenge your programming skills, explore AI, or get better at solving math problems?

This school year, JetBrains is bringing even more opportunities to young people interested in technology. From free online clubs and coding competitions across Europe to intensive programming camps, there’s plenty to get involved in.

Whether you want to prepare for competitions, learn something new, or meet other students who share your interests, here’s what’s coming up in 2026–2027.

Join one of our free Youth Clubs

Our Youth Clubs bring together school students who want to go further in mathematics, programming, and AI. Through practical assignments and challenging problems, participants can develop their skills and learn alongside like-minded peers.

Youth Math Club

Registration open until October 31

Mathematical thinking is at the heart of good programming. At the Youth Math Club, students practise solving unfamiliar problems, identifying patterns, and developing logical reasoning skills.

It’s an opportunity to strengthen mathematical foundations and learn to approach complex problems with confidence.

Youth AI Club

Registration open until October 31

What does it take to build and train a machine learning model?

At the Youth AI Club, students explore the mathematics and programming behind artificial intelligence. Through practical assignments, they work with machine learning problems, train models, and experiment with neural networks.

Youth Coding Club

Starts October 22

For students who enjoy solving programming problems and finding efficient solutions, the Youth Coding Club offers opportunities to put their skills into practice.

Participants tackle coding challenges, strengthen their problem-solving abilities, and develop their programming skills step by step.

JetBrains Coding Cups: Cyprus, Poland, and Serbia

This autumn, we’re bringing our in-person JetBrains Coding Cups to new locations: Cyprus, Poland, and Serbia.

Open to school students aged 13–19, these competitions offer a chance to test programming skills, tackle interesting problems, and meet fellow young coders.

DateCountry
October 17, 2026🇨🇾 Cyprus
October 24, 2026🇵🇱 Poland
November 14, 2026🇷🇸 Serbia

The Cyprus Programming Challenge returns for its fourth edition

November 8, 2026 | Cyprus

The Cyprus Programming Challenge is back for the fourth time!

This competition brings together young programmers from across Cyprus to solve problems, demonstrate their skills, and gain competition experience.

It’s open to both middle and high school students, with participants of all skill levels welcome.

Registration opens soon. Follow us on Instagram and LinkedIn for announcements.

Youth Coding Challenge: Put your skills to the test and unlock new opportunities

November 29, 2026

The Youth Coding Challenge is more than a programming competition. It’s also an opportunity for students to take the next step in their learning journey.

This year’s challenge features two leagues, each offering different opportunities.

Junior League (ages 13–15)

Winners may receive an invitation to join the second level of the Youth Coding Club in the spring semester, with opportunities for in-person learning alongside teaching assistants and teachers.

Senior League (ages 16–19)

Competition results can count towards selection for ACTS 2027.1, our intensive programming camp in Cyprus, planned for March 15–26, 2027.

ACTS stands for Algorithm and Code Training Schools. These camps bring motivated students together to learn from experienced teachers, take part in programming contests, and exchange ideas with other young programmers.

Registration opens soon. Follow us on Instagram and LinkedIn for announcements.

ACTS 2027.1: Eleven days of programming, AI, and learning together

March 15–25, 2027 | Cyprus

One of the highlights of the academic year will be the next edition of ACTS.

For eleven days, school students will come together in Cyprus for intensive learning, practical challenges, and discussions with teachers and peers who share their passion for technology.

ACTS 2027.1 will feature three tracks:

  • Competitive Programming: For students who want to deepen their algorithmic knowledge and sharpen their contest skills.
  • Software Engineering: For students interested in developing their software development and practical programming skills.
  • Artificial Intelligence: For students looking to explore advanced AI topics alongside other talented young learners.

Results from the Youth Coding Challenge on November 29 will be considered during selection for the Competitive Programming and Software Engineering tracks.

The AI track will follow a different format. Participation will be by invitation only, bringing together national teams from five countries and 20 students living in Cyprus who are taking part in the selection process for the country’s International Olympiad in Artificial Intelligence (IOAI) national team.

Beyond the lectures and coding challenges, ACTS is also about meeting people who share your interests, exchanging ideas, and finding new motivation to keep learning.

Registration is expected to open in mid-October. If you’re interested, follow our Instagram and LinkedIn channels for updates.

show more
Build Your Game Challenge: Join in and Compete for Prizes
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-12 10:18:32 | Created: 2026-10-12 12:11:59

This October, we’re launching a new challenge for the JetBrains Academy community. To take part, complete our Build a Game With an AI Coding Agent course, customize the game with your own ideas, and submit your project for a chance to win prizes.

How to participate

Joining the challenge is simple:

  1. Complete the Build a Game With an AI Coding Agent course.
  2. Add your own features or improvements.
  3. Submit your game.

You can add new levels, enemies, gameplay mechanics, visual improvements, or anything else that makes your game unique. Creativity is encouraged, so feel free to experiment and surprise us!

You’ll find the full challenge rules on our Discord server, where you can also submit your project.

Save the dates

  • October 12, 8:00 am UTC (10:00 am CEST) – The challenge begins! You can start taking the course and working on your game extension. 
  • October 19, 8:00 am UTC (10:00 am CEST) – Submissions and community voting open. Starting October 19, you can submit your project in our Discord channel. Anyone from the community can vote for their favorite submissions. You’re welcome to invite friends or share your project on social media to encourage more people to join the Discord server and vote for your project.
  • October 23, 9:00 am UTC (11:00 am CEST) – The clock stops! Voting and submissions close. Make sure your project is submitted before the deadline.
  • October 28 – Winners announced!

Build with a coding agent – free to start

You can complete the course in any setup you like. If you’re looking for an easy, free way to get started, our video guide shows you how to build your game with Junie Lite in JetBrains Air inside your IDE.

JetBrains Air brings coding agents right into your JetBrains IDE, and you can use Junie Lite, JetBrains’ cost-efficient coding agent, for free*. All you need is a JetBrains Account. 

Planning something more ambitious, like a new level system or complex game mechanics? You may want a more capable model. In Air, you can switch to another agent or use your own AI subscription whenever you need more power – and the early participant bonus below can help with that, too.

The agent writes the code. Making it a great game is up to you.

*Applies to the Junie Lite configuration after signing in with your JetBrains Account. Terms and available models may change.

How winners are selected

Winners will be chosen in two ways: by our community and by the JetBrains jury.

Community Choice

Community members can view the projects, choose their favorites, and vote by reacting to submission posts. Community Choice winners will be determined by the number of reactions received during the voting period.

JetBrains Jury Awards

A JetBrains jury will review all submissions and select projects based on creativity, originality, gameplay, and overall player experience.

Prizes await

We’ve got prizes lined up for the projects that win over our community and jury:

  • $400 – Community Choice #1
  • $250 – Community Choice #2
  • $150 – JetBrains Jury Award
  • 4 × $50 – JetBrains Jury Awards for standout projects

All prizes will be provided in the form of digital gift cards.

Join our Discord server, invite your friends, take part in the challenge, and have fun.

Good luck and happy coding!

show more
UI freeze reports are now available in JetBrains Marketplace
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-09 14:27:09 | Created: 2026-10-09 16:24:59

A user reports that the IDE stopped responding, and your plugin is the prime suspect. You try the same steps, but everything works. Without more details, such as a thread dump captured during the freeze, it’s hard to know where to start.

JetBrains Marketplace now gives plugin authors access to UI freeze reports attributed to their plugins. To see them, open your plugin’s management page and select the Freezes tab.

There’s one catch: you need to enable Marketplace reporting in your plugin first. Hopefully, the tab stays quiet, but it’s worth setting this up before you need it.

What is in a freeze report?

Marketplace groups freeze reports by error type and collects similar reports into piles. Each pile shows a representative report, so you can spot recurring patterns without opening every occurrence.

The automatically generated thread-dump excerpt gives you a starting point by showing the threads identified as involved in the freeze. It’s also a good first input for a coding agent: the short excerpt helps it get oriented while using fewer tokens than the full dumps. For a deeper investigation, use the analyze-freeze skill, then add the full dumps so the agent can trace connections between threads or coroutines.

The dump-N.txt files contain full thread dumps captured every five seconds during the freeze. Depending on what the IDE was able to capture, the report may also include:

  • snapshot.jfr, a CPU snapshot.
  • report.txt, an analysis of the captured thread stacks.
  • open-telemetry-metrics.csv, performance metrics covering areas such as VFS activity and UI responsiveness.

Start with one report

Open a report and find the event dispatch thread (EDT) in its excerpt. It is usually named AWT-EventQueue-0 or contains EDT. First, check whether the EDT is busy doing expensive work or waiting for something else to finish.

To investigate further, download a full dump and use Search Everywhere in the IDE to open Analyze Stack Trace or Thread Dump. Paste the dump text and inspect the results. As you trace what prevents the EDT from progressing, refer back to the original thread data. If several dumps are available, compare them to see whether the same operation remains on the stack across samples.

In the example below, the analyzer identifies file I/O on the EDT in org.xml.sax.helpers.XMLFilterImpl.parse.

The cause can also be on a background thread. A long, non-cancellable read action may hold a lock needed by a write action, leaving the UI waiting even though the expensive work runs elsewhere. ⁠UI Freezes and the Dangers of Non-Cancellable Read Actions in Background Threads walks through this pattern and explains how to address it.

Try the freeze-analysis skill

Our colleague Patrick Scheibe created the ⁠analyze-freeze skill to help AI coding agents investigate IntelliJ Platform thread dumps. It includes guidance on coroutine behavior, Dispatchers.Default starvation, and other common freeze patterns, along with suggestions for fixing them.

To try it:

  1. Save the gist’s SKILL.md in your investigation folder.
  2. Add the downloaded full thread dumps, along with report.txt and coroutine-dump text if available.
  3. Ask your agent to read the skill and analyze those files with this prompt:
Read SKILL.md and apply its analyze-freeze instructions to the attached IntelliJ Platform thread dumps.
Start with the EDT, then trace what prevents it from progressing.
Identify the relevant code frame, participating threads or coroutines, any service involved, and the probable plugin.
Cite the dump evidence for each conclusion. Distinguish observed facts from hypotheses.
If the excerpt or dumps are insufficient, say which evidence is missing.
Suggest a minimal fix and how to validate it.
Do not edit code yet.

Before sharing dumps with an AI service, follow your project’s process for handling diagnostic data. Use the agent’s explanation to guide your investigation, and check the cited frames against the full dump and your code before making changes.

Enable Marketplace reporting

To use Marketplace’s built-in reporting, register its error handler in plugin.xml:

<extensions defaultExtensionNs="com.intellij">
  <errorHandler implementation="com.intellij.diagnostic.JetBrainsMarketplaceErrorReportSubmitter"/>
</extensions>

This handler has been available since IntelliJ Platform 2023.3 and requires no custom implementation. For plugins that support Split Mode, register it in a frontend or shared plugin module. A backend-only registration will not make it available to the frontend.

Users can submit reports through the IDE’s error-reporting UI or enable Send error reports to JetBrains automatically to send them in the background. If the Freezes tab is empty, check your handler registration. Reports also depend on the user’s settings and whether the IDE identified your plugin as being involved.

If you maintain a custom reporting backend, the ⁠SDK error reporting guide explains the user-facing ErrorReportSubmitter API and the experimental ErrorReportSink API for automatic background reports. You don’t need a custom sink for the built-in Marketplace setup described here.

For a video overview, Patrick Scheibe’s How IntelliJ Plugin Error Reporting Actually Works compares Marketplace reporting with a custom ErrorReportSubmitter. It also covers what gets submitted and why attachments matter for freeze reports.

Check the evidence before choosing a fix

Before matching a dump to your code, check which plugin version it came from. Version information is not always available, making it difficult to identify the affected release or deobfuscate a stack trace. If the version is missing, keep it marked as unknown rather than assuming the report came from your latest release.

Once you have a likely cause, focus on the operation preventing the UI from progressing. For a long background read action, this may mean shortening the time spent accessing the model or choosing a cancellable read-action API. Keep blocking I/O outside the read action, and make sure any computation that can restart is safe to retry.

Test the change by repeating the affected operation and examining fresh diagnostic evidence. If you’re still stuck, ask in the ⁠JetBrains Platform Forum with the IDE build, plugin version if known, relevant dump evidence, and what you’ve already checked.

Even when you can’t reproduce a freeze, its full dumps show what the IDE’s threads were doing during the stall and give you a place to investigate. If Marketplace reporting is enabled for your plugin, visit its Freezes page and check for reports; the short excerpts can help you decide where to look first. Good luck with the investigation, and happy debugging!

show more
Content and Community Basics for JetBrains Content Creators
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-06 09:38:46 | Created: 2026-10-09 14:13:59

Digital creators are living through a golden age of opportunity and accessibility. The number of YouTube channels, newsletters, livestreams, and lifestyle content is constantly growing, while demand remains steadily high. For tech creators, there are innovations in just about every aspect of their work, in large part due to the wide adoption of AI.

These external factors don’t diminish the human aspect – creator communities are becoming more widespread as users flock together around their shared interests and passions, with a creator serving as the community organizer in addition to their production duties.

With this article, we hope to help you make your community space thrive. People are accepted into the Content Creators Program daily, whether they’re an established channel or just starting off on their creator path. Feel free to use this as a quick checklist of things you considered but never came back to, or a place to make sure your bases are covered!

Showcase opportunities to your followers

It always starts with the idea that a creator might provide something for someone out there who is searching for it. On a large scale, this means your topics, expertise, and understanding of the area you’re covering in your content. For tech, it’s your best coding practices or your thoughts on new features and recent industry developments.

As your channel grows, your chances of finding sponsorships also increase. When that happens, consider the publishing end of things: what your video description looks like, how you mention the product, and whether your followers have all of your social media and community links. If you mention JetBrains in your content, this is the perfect place to do so. Here’s an example of a description mentioning the JetBrains promotional discount:

JetBrains provides access to IDEs for all relevant coding languages, frameworks, and technologies. Use the code [code] at checkout to claim 20% off your IDE of choice for both new and existing subscriptions.

Explore a variety of tools in your work

It’s always a good idea to consider several paths for your creativity. As part of the Content Creators Program, you can explore all JetBrains IDEs if they are relevant to your work or content with the All Products Pack. You don’t have to use or cover everything in it, but there are plenty of options to try in your workflow that your audience might find interesting.

The JetBrains Content Creators Program provides access to the All Products Pack that includes all JetBrains IDEs, AI solutions, and ultimate flexibility.

Keep your social media active!

No matter how small your channel is, good distribution is everything in content creation. There is no way of knowing where your next readers and viewers might come from, and not all of them refresh their Substack and YouTube as often as you might think.

You can leverage social media to talk about your initiatives and partnerships. For the Content Creators Program, we provide creators with all sorts of news-worthy items such as impromptu merch drops, features, and opportunities to highlight a new IDE update. 

Stay in touch with your audience

The cornerstone of community building is communication. You might chat with one viewer today, and make them your head moderator on a freshly launched Discord server for your new followers tomorrow. Make sure you spend time coming up with new activities and ideas to engage however many people you have with you. Use challenges or giveaways to say thank you, celebrate milestones, or introduce tools you want your community to try out.

As part of the Content Creators Program, you can receive up to twelve free IDE subscriptions to conduct giveaways. Our creators’ giveaway experience is always different, but even the most regular ‘subscription+repost’ formula works like a charm.

All new creators not yet into the program are welcome to join in. Read through our eligibility terms, e.g., activity and follower count, learn more about perks, and let us know if there are any more tips we could include and cover here!

show more
Mellum2.1 Gets to Work: A Fast Open Model for Coding Agents
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-08 12:00:00 | Created: 2026-10-08 13:57:58

Trained with reinforcement learning in real environments, Mellum2.1 is built for coding agents and fast sub-agents that run on your own hardware.

Today, we’re releasing Mellum2.1, the next version of the 12B mixture-of-experts model we open-sourced in June. The architecture hasn’t changed since version 2: it’s still a compact, fast model with 2.5B active parameters, released under the Apache 2.0 license. What has changed is everything that happens after pre-training.

Mellum2 was fast, but it couldn’t work inside a repository at the level we wanted. After a summer of reinforcement learning in real environments, with millions of sandboxed runs across thousands of environments, Mellum2.1 can: it explores a codebase, edits files, and checks its own changes.

Try Mellum

The changes we made in Mellum2.1

Almost all of the work for this version went into post-training, primarily reinforcement learning (RL).

  • Reinforcement learning at a new scale: RL went from a short final stage to the main part of training. We ran many experiments on how to train both the methods and the data, and we kept what held up.
  • More data, filtered harder: We added new RL tasks in math, competitive programming, science, tool use, and software engineering, combining open RL datasets with tasks we built ourselves. Open data often comes with broken tests, unverifiable answers, or tasks that are too easy or impossible for the model, so every source was filtered before it reached training.
  • Real environments for agentic skills: We built the infrastructure to run thousands of RL environments in-house and launched millions of sandboxes over the course of training.

How Mellum2.1 performs

We compared Mellum2.1 with Mellum2 – as well as two open models of a similar class, Qwen3.5-9B and Gemma 4 E4B – using the same evaluation setup for all of them.

Mellum2.1 compared with Mellum2, Qwen3.5-9B, and Gemma 4 E4B

The biggest improvement is in agentic coding, where Mellum2.1 advanced the most compared with Mellum2. The model also got better across the board, showing gains in coding, competitive programming, math, tool calling, and general knowledge, and it holds up on hard problems as well as everyday ones.

Speed

Post-training didn’t touch the architecture, so Mellum2.1 is as fast as Mellum2, and multi-token prediction (MTP) makes it faster.

Under heavy load, Mellum2.1 is the fastest model in the group and serves almost twice as many tokens as Qwen3.5-9B. For a single request, MTP makes it about 1.6 times faster.

Output tokens per second on one H200 for Mellum2.1, Qwen3.5-9B, and Gemma 4 E4B

Key use cases for Mellum2.1

  • A capable worker inside agentic systems: Mellum2.1 can handle different parts of an agent’s plan, from identifying the root cause of a failing test to drafting and checking a fix.
  • Problems beyond coding: Mellum2.1 is a capable general assistant, too. It handles everyday questions and works through hard math and reasoning problems step by step.
  • Private, self-hosted deployment: Run Mellum2.1 locally or on your own infrastructure to keep code and data fully under your control.

Get started with Mellum2.1

Mellum2.1 is available on Hugging Face. GGUF builds for llama.cpp, Ollama, and LM Studio, as well as the multi-token prediction (MTP) head for speculative decoding in vLLM, are coming soon.

If you’re building coding agents, sub-agents, or AI tools that run on your own infrastructure, we’d love for you to try Mellum2.1. Tell us what works and what doesn’t. Your feedback will shape the next version.

Open source is how better models get made.

Try Mellum

show more
New Report: The State of CI/CD in 2026
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-08 08:15:44 | Created: 2026-10-08 09:54:59

CI/CD remains one of the foundations of modern software development. According to the JetBrains Developer Ecosystem Survey 2026, 83.4% of respondents who use DevOps practices run CI/CD pipelines.

The new report looks at how teams are running those pipelines, which tools they use, and where AI fits into their workflows. It brings together findings from four JetBrains studies, including the State of CI/CD Tools Survey 2026.

Here are some of the numbers that stood out:

  • 72.8% run their primary CI/CD system on premises or on self-managed cloud infrastructure.
  • 30.5% use an on-premises installation, the highest share recorded in five years.
  • 48.8% of organizations use AI for at least one CI/CD task.
  • Only 8% run AI-powered steps directly inside a build or test.
  • 28% interact with their CI/CD tools through MCP or agent skills, compared with 10% who use an assistant built into the CI/CD product.

Most AI use currently happens around the pipeline. Teams use it to review code, write or fix tests, and diagnose build failures. 

At the same time, self-hosting remains an important part of the CI/CD landscape, especially for organizations that need more control over their infrastructure, data, security, or costs.

The report also explores the most widely used CI/CD tools, why organizations maintain several platforms, what makes teams consider switching, and the main barriers to wider AI adoption. Give it a read!

See the report

show more
Code Quality Never Changes – Or Is AI Challenging This Notion?
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-08 09:22:14 | Created: 2026-10-08 09:54:58

This post was adapted from Kai Schmithuesen’s talk at JetBrains Game Development Day 2026. See the full video presentation and Q&A below, or keep reading!

First we are going to define what we mean by code quality then have a look at how this impacts business outcomes, where AI comes in, AI’s impact on quality and how to safeguard it in your team.

You can take the methodologies described in here and use it for many solutions but we will also explore a Qodana example.

Code quality is a topic that tends to get overlooked at times, especially in game development where you might have other issues on your plate. However, speaking with a lot of JetBrains customers at game development conferences, there is an awareness that this is an important topic. That being said there isn’t a set of industry best practices in the gaming industry and so we share some of these best practices from other industries in this presentation.

What do we mean by code quality?

This can be “fuzzily” defined for such an important topic. If you speak with ten colleagues it could be that you get a lot of different answers. Point one, is correctness.

Correctness: Does my code do what I designed it to do?
Performance: Important for gaming, is it fast enough?
Stability: Does it crash or not crash, and how stable it is from a players perspective.
Security: Also important where you don’t want to show up in an industry news story because you got hacked.
Maintainability: Does my code work today and will it work in a couple of years as well?Especially with some games going on for 10 to 12 years.
Reusability: This is a topic getting more relevant for larger studios: can I reuse the code I’ve already developed for other projects? And all of these give you an overview of what code quality entails.

If you go to the wild west that is X or LinkedIn, for example, you can see that whether or not code quality is important is a hotly debated topic. From one person saying they don’t care how their code looks, to the other extreme “My code needs to be beautiful and spotless before I release it,” and anything in between. There are loads of different opinions out there.

The Qodana team advises that code quality can have a real impact on your business and how your game is received. There was a AAA studio that lost 33% of its value a week after launch.

70% was cut from GTA load times by simply fixing two small code flaws. Time to load was cut from 6 minutes to 2 minutes (by a player) and then Dark Souls was offline for 2 months because there were remote code execution flaws (security issue) and if you lose players over these two months they are most likely not coming back and there is real-life impact on revenue. Bad code doesn’t only stay on your side. It lands with your players which can lead to refunds, bad reviews.

When we look at IGN or PC Gamer, quality, bugs, how stable is it, always influences scores. This ultimately determines how many players you will attract and buggy games lead to disgruntled payers. There are some examples of big studios able to get away with it, like Bethesda but this is something you shouldn’t risk.

Why is bad code released?

In a lot of conversations, we find that just the pressure of getting your game to market is immense. Scheduling is a real issue and is reflected in the number of game developers who had to do crunch periods or extended hours – which is over half. This entices a lot of studios to figure out how they can use AI to help with this topic.

AI, especially in game development is a hotly discussed topic. However, 95% of Unity developers (2026 Unity Game Developer Report) use it at work for assistance in the coding process so this shows that AI if it is used correctly can be a helpful tool.

You can prototype much faster, try out new game mechanics, etc. In the past you had to spend a couple of months but now you can use a couple of days and throw out what doesn’t work. You don’t have to spend so much time on boiler issues which results in increased efficiency.

Qodana AI

The goal is not to cut developers from the teams, only enable your team to use AI to do something more interesting. However, this speed and the usage of AI comes with a potential downside when it comes to code quality. AI can generate a lot of code real fast but it’s not necessarily better or worse but does exasperate the amount of issues. In the past you may have written a couple of hundred lines. Now, in the same time AI can write 10,000 lines. This leads to real-life issues for example:

Slow code, is my game up to scratch when it comes to performance, is it stable? Is it exploitable or does it have potential security issues? The good and bad news is that AI code is not necessarily worse than human-generated code, it seems quite on par when it comes to the overall amount of issues but it fails in different ways compared to human-generated code.

When it comes to logic and errors, it creates 1,7x more issues than human-generated code. When it comes back to maintainability etc. is it worse and most concerning it will also potentially create more security issues than a human developer would. This is coming from a study by CodeRabbit. They are an AI vendor themselves.

Qodana AI

However, it’s not necessarily what kind of issues are created by who (humans or AI) but the only question that we pose is “Is our code overall up to scratch and does it meet our quality standards and this is where static analysis can help. The good news is that you can use static analysis to basically cover all of these 6 areas.

Using static code analysis to solve problems for game developers

When it comes to correctness, you have standard inspections. You can also check for code coverage thresholds, which are becoming more important. Not only in coverage but how to use them as well.

Performance is an area that static analysis can cover. Stability a couple of examples would be null safety, resource leak, exception inspections, security inspections and software component analysis – checking for outdated dependencies or doing taint analysis as part of your static analysis to find more complex issues like SQL scripting and so on.

From a maintainability perspective, you can locate code smells, code complexity and duplication. This is something AI is really well-known for. It likes duplications but it doesn’t like refactoring. if you don’t have a way to keep that in check, this will really hurt your maintainability going forward, as no one will be able to understand your code at some stage.

The same with reusability, duplicate code makes it more complicated and static analysis can check if your code adheres to your own internal coding standards, in order to have the same approach – regardless of the project that you’re working on. This way you are also able to share your code much more easily.

AI creates these kind of issues, the most common reason is because it got trained on outdated sources. These are all sucked dry and there isn’t much new work coming up which is what can lead to outdated dependencies and similar.

Static analysis in conjunction with AI as the answer

The downside is, this kind of analysis has been around for a long time but for good reason. One is the results are deterministic.

If you give a static code analysis tool an analysis ten times, it will give you the same set of results ten times. If you run it ten times, it doesn’t cost you more too because it doesn’t consume any tokens. If you give AI the same piece of code 10 times you’ll get 20 answers.

It’s fast and cheap, if you compare an AI reviewer to static analysis – usually static analysis is much faster. Coming back to being deterministic, you can tie every result to a specific inspection and see why it’s an issue.

This will become more important as compliance keeps growing. One big one is the new EU Cyber Resilience Act already in effect in some areas. Part of this act requires you to create a software bill of materials. If you use AI this will be difficult. If you use static code analysis and you can show a 1-1 relationship between the result and the source you are more likely to comply. However both have their pros and cons.

Pros and cons of static analysis and AI analysis

It can’t understand the intent of your code because it basically looks for patterns. This is where AI comes in. If you want to check that the code does what you want it to do across files or across your project or check for logic-related issues, that’s where AI comes in.

So Ideally, you’d use a combination of static analysis to cover the base and AI on top of that. A human writes the code and AI can also write some . Then once you kick off your pipeline, static analysis covers the initial analysis. Qodana can check for any issues but can also create quick-fixes automatically. So you can still automate even without AI.

These quick fixes are not generated by QIA so this gives you the advantages of static analysis in general, fast, doesn’t cost extra, and reliable. Then you will move on to your AI tool of choice and review the rest and create fixes for other complex issues like a logic issue or refactoring. This can complement your pipeline.

Ideally you then have a loop, AI will push it back in the pipeline to your static analysis so that static analysis can reconfirm that what AI created is up to scratch and passes your code quality and security standards. Then you can merge the code into your main branch.

It sounds time-consuming but the irony is that this probably takes a couple of minutes each time and can save you time in future. These are a couple of minutes to not spend hours later if there were uncaught issues.

What do the numbers say?

There are already some studies out there that show the advantages of this approach. If you combine static analysis with LLM calls, then the amount of token usage was going down by 72 to 92% while still increasing the code used in that study. The second study found that if you use this combination then you can have up to 33% fewer vulnerabilities in your LLM code going into your master branch.

Here is a quick example of how this can look in Qodana or a static analysis tool of your choice. We support the most common gaming engines out of the box. This is what it looks like in Qodana itself. Normally as a developer you wouldn’t spend much time in here. This is nice for a team lead or a project manager. One of the Qodana team vibe-coded this example project below. It was a banking front-end written in Java and the vibe-coding part itself just took a few minutes to get it up and running.

Watch Qodana Demo

Qodana found 126 issues and gives you a nice way to give you a quick view into what is important. Then you can apply quick-fixes to them. There are different ways to set this up (with varying levels of automation).

Here we’ve done it as part of a GitHub Actions pipeline. Then we put the remaining problem into the Baseline. Once they are in the Baseline they don’t slow you down. The next time you run a scan with Qodana and you find new issues, ideally it would fix 3 automatically, and you’d only see 2 new ones. So it’s easier to figure out how to spend your time.

If we look at the five remaining issues, you can see some show duplicated code. While you can view them from Qodana, you don’t fix them from here. So if we open this in IntelliJ IDEA, you can see it brings us to the exact position in the IntelliJ IDEA codebase.

This will work for our IDEs however, it also works with Visual Studio, Visual Studio Code and Cursor. You can also use our CI tool as well. Here you can review the issues, like duplicated code, by hovering over it (depends on your solution) and then go to more actions, AI actions and have AI fix these issues for you.

You can do it manually or with an agent, semi-automating it so it works in the background and you wait for the clean code on the other end. If you are interested in finding out more, please contact us and we can show you how to use it or you and your team can try it out for free.

Try Qodana

Users have also tried Qodana for game development. Read how Doc Bok used Qodana for a Minecraft game – or how Qodana works on Unity and Unreal Engine projects.

Once you ask AI to add tests, eventually these tests and all repositories start to overflow and even trivial processes like linting can lag. Do you have experience with this?

In some cases you have to jump through ten different loops to release code. Most of the time this is due to someone starting but no one ever reviews the pipeline, what makes sense and what not but static analysis shouldn’t slow you dow.n So, in Qodana, a so-called pull request mode only checks the changed files and should only take a minute or two.

How much can the JetBrains built-in agents in the IDEs read the IDE’s static analysis tools?

Rider has a feature called Hooks. Every time the agent generates code, it’ll call the Hooks in Rider. One of them will be to reformat the code and the other to check for the current problems in a file, do the linting, check the problems and report that back to the agent, then the agent can regenerate the code using your standards or fix what you only ask it to. It is deterministic so the agent is forced to use the hooks rather than being advised. The hook is enabled and executed every time.

Please note: Widely adopted AI technology is relatively new and the results of burgeoning data should always be deeply interrogated, including data presented in this post.

Special thanks to Kai for his insights.

show more
Introducing Warm Agents, a TeamCity Plugin
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-07 14:23:08 | Created: 2026-10-07 15:52:58

Waiting on “waiting for a starting agent” is a special kind of annoying when you just want your PR tests to run. It stings most when a quick one-minute build sits in the queue for ten minutes while that one slow Windows cloud instance spins up.

The Warm Agents plugin is our answer to this delay.

With this plugin, TeamCity maintains a target count of idle, pre-started agents for a given cloud image. Whenever the number of idle agents drops below your target, TeamCity immediately provisions a new one – ensuring builds start the moment they arrive. The plugin works with any cloud provider supported by TeamCity.

There’s just one thing to budget for up front. Each running warm agent consumes a build agent license, and idle cloud instances still cost money with your provider. Warm agents trade cost for latency, so pick a target that reflects how much queue time you actually want to buy back.

Prerequisites

  1. TeamCity 2024.12.3 or later.
  2. A cloud profile and a cloud image configured in a project.
  3. The “Manage project’s agent cloud profiles” permission granted in the project.
  4. The Warm Agents plugin, installed and enabled.

To get started with the plugin, go to Admin | Plugins, click Browse plugins repository, and find Warm Agents in the JetBrains Marketplace listing. Install and then enable it.

Once the plugin is operational, make REST API calls to configure warm agents. This article illustrates how to do this using teamcity-cli, the most convenient way to manage your server from a terminal. If you would rather call the endpoints directly, see our REST API Quick Start guide and example requests in the repository. 

Setup

To keep ten idle agents ready for a cloud image, run:

teamcity api '/app/<projectExternalID>/<cloudProfileID>/<cloudImageName>/warmAgents?target=10' -X PUT

To stop maintaining warm agents for an image, pass target=0.

If your cloud image has a hard limit of total running agents configured, TeamCity will respect that, although it is still possible to set the target to a higher value.

To verify the configuration, call:

teamcity api '/app/<projectExternalId>/warmAgents?includeSubprojects=<true|false>'

Alternatively, navigate to Project Settings | Integrations | Warm Agents:

TeamCity monitors the number of idle agents for the image and starts new instances whenever the count drops below the target. Note that instances start in batches, with short delays between them, so a high target might take a while to fill.

To find the IDs used above, use teamcity-cli or the REST API:

  • teamcity project list 
  • teamcity project cloud profile list --project <projectExternalID>
  • teamcity project cloud image list --project --profile
    • Use only the name: teamcity-linux-aws-a (lt-0cd4ecf32d77770a9) -> teamcity-linux-aws-a

Alternatively, open the cloud profile page on your server and read the IDs out of the URL: Look for projectId=My_Project and profileId=amazon-123 in an address like my.teamcity.com/admin/editProject.html.

Advanced Usage

Demand for warm agents rarely stays flat. Keeping agents warm overnight can burn resources for no return, so the feature is built for frequent target changes. TeamCity picks up a new target on the fly and adjusts by launching more or fewer agents. Changing the target never affects agents that are already running – TeamCity does not forcibly stop instances when you scale down. The “idle timeout” configuration of your cloud image still applies, although TeamCity might restart some instances that just went down to maintain the agent count. 

A schedule is the obvious application. Configure a build with a schedule trigger that drops the target overnight and restores it in the morning. In Kotlin DSL:

// define parameters like warmAgents.token, warmAgents.projectId and so on...

steps {

    script {

        scriptContent = """

            #!/bin/bash

            # update the target to the parameter value

            curl --oauth2-bearer %warmAgents.token% -XPUT ${DslContext.serverUrl}/app/%warmAgents.projectId%/%warmAgents.profileId%/%warmAgents.imageName%/warmAgents?target=%warmAgents.target%

        """.trimIndent()

    }

}

Store warmAgents.token as a password-type parameter so the value stays masked in build logs.

And the trigger:

// schedule trigger to scale warm agents up to 2 each morning

schedule {

    branchFilter = "+:*"

    triggerBuild = always()

    withPendingChangesOnly = false

    schedulingPolicy = daily {

        hour = 8

    }

    buildParams {

        param("warmAgents.target", "2")

    }

}

Add a second trigger with target=0 for the evening. See this repository for a complete sample.

The day-night split is the common case, but your workflow may call for a different shape. To see how demand actually fluctuates, the plugin exposes a small set of metrics:

teamcity api '/app/projectMetrics?projectId=<projectExternalID>' | grep 'warmAgents'

With a multi-node setup, add an X-TeamCity-Node-Id-Cookie=<main-node-id> cookie to pin the request to the main node, which collects the metrics.

The plugin computes utilization and saturation metrics per configured cloud image, showing how busy your agents are and how well they keep up with the queue. Metrics come out in Prometheus format, so you can scrape them over time and see when demand peaks. A minimal Prometheus config is available here as an example. 

Tell us what you think

We would love to hear how the feature works for you and what your use cases look like. Share your feedback in the comments section below or in the original feature request, and take a look at our plans for future improvements if you’re curious.

show more
Faster Developers Don’t Make a Faster Team
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-07 13:08:09 | Created: 2026-10-07 14:03:59

What engineering teams tell us about working with AI agents. Part 1 in the series.

Over the past few months, I’ve spent a lot of time on discovery calls with engineering organizations, from a 16-developer software agency to telcos, game studios, and consultancies with thousands of developers. Almost none of them are asking whether to use AI agents. At one financial data provider, a survey showed that roughly 80% of engineers use them daily.

When I sort what I hear into three levels – the individual developer, the team, and the organization – a pattern appears. Individual developers can now move much faster with agents, but the gains are uneven. The organization level is about visibility, cost, and control. The team level is where the gains stall. A few people get much faster, but even teams that are redesigning their workflows struggle to turn faster implementation into faster delivery.

Here are the three scenarios I hear most often.

1. Everyone has an agent. Nobody shares the setup.

When I ask whether developers share prompts, rules, or instruction files, the honest answer is usually a version of what an architect at an IT services company told me: “We are not there yet. We are just sharing knowledge around coffee in the morning.”

Even where teams have started to formalize their practices, it spreads by osmosis. A head of engineering at a legal-tech company said, “There are no standards. We’ll set it in the [AI team’s] repo, and then it slowly creeps into the older .NET ones as well, just through sharing what’s working.”

Where sharing is systematic, it is fragile. A platform lead at a mobility company with over a hundred repositories who keeps base rules in one repo and copies them into every service explains, “If we update the base, we need to update all repos, which people may have customized.” 

A solution architect at a consultancy who watches more than fifty client teams adds that shared configuration is often theatre:

“

People eagerly create agents, skills, CLAUDE.md files, everything. But they may find that they actually make quality worse. Some of them are not working at all.”

The result is a widening gap inside the team. An engineering manager at a mapping company illustrates, “20% of the engineers are generating 80% of the code or consuming 80% of the tokens. We do not really know if the other 80% are smarter, just not using it well, or need training.” 

A staff engineer at the financial data provider says, “There’s a big gap in proficiency. If you make a bad prompt, the codebase is read three times.” 

The CEO of a cloud consultancy asked the question behind all of this: “In my team, there is one superstar developer who is like 10x better than anyone else. How can I capture his behavior patterns and spread them across the team?”

Knowledge about how to work with agents lives in personal configs, Slack threads, and wikis. Agents start every task cold; everyone re-explains the same conventions, and output quality depends on who is prompting rather than on what the team decided. As a senior engineer at a large consultancy put it, “No one is mature. This is too new to be mature.”

2. Implementation got cheap. Review didn’t.

“As we do more of this, we see the bottlenecks move to the code review and planning stage. Implementation’s quite quick these days,” says the legal-tech head of engineering, and they already run an AI review gate before any human looks at a pull request.

The mapping company measured it: “If we looked at the pure numbers, PR time actually increased. It’s probably the human in the loop, or low confidence in the quality, which leads people to check everything. But we do not know the answer yet.”

A platform group at a large networking vendor, where everyone uses agents daily, identified the same ceiling: “We’re basically trying to apply non-agent-based processes to very, very rapidly changing work.

“

Just because you can build 100 things doesn’t mean you should. People can’t consume that much.”

A principal engineer at a gaming company summed up the distance between a demo and a team’s real workflow: “Experimenting is one thing, but putting stuff into production – with all the flows, the good and the bad, reviews, and all the things people have to deal with in 2026 – is another thing.”

The bottleneck also moves upstream. With one product manager per five or six developers, the developers are getting through the work so fast that getting backlog items into a state where they’re ready to be picked up by a person or an agent is challenging.

Review processes were designed for human-paced change. If verifying the output costs more than the savings it generated, the team has actually regressed.

3. Automating the boring work creates a new operational burden.

Teams know exactly what they would hand to agents. A head of engineering at a gaming company shares, “Every time somebody creates an MR [merge request], we want to run specific things. Every night, we run a documentation updater that goes through all the repos and makes sure that everything is aligned.” 

Next on his list? “Upgrading libraries, upgrading frameworks, tackling identified security vulnerabilities in a more autonomous way.” Yet for many teams, simply getting these background automations off the ground remains a hurdle due to a lack of time and dedicated infrastructure.

Some have proven it by hand. An agency took a vague customer ticket and had the pull request ready within 10 minutes. Now they want the loop to run without them, envisioning that “When we’re done with the workday, we come back the next day and it has completed all the tasks we asked of it.”

For teams that do manage to build operational pipelines, what stops them from scaling is not ideas, but where the automation runs, who owns it, and how it reaches every project. A senior engineer at a consultancy built exactly this – an agent in a Docker container on a VM, reacting to webhooks – and hit a wall:

“

The main issue is that we have to maintain it. If we deploy on one customer, we also have to figure out how to distribute updates to another project.”

Meanwhile, the platform lead turns into a human API. From the mobility company: “Today, the backend team asked, ‘Can you give us a key in CI inside GitHub and a secret to auto-generate tests?'” And when every team automates on its own, coordination breaks. The gaming company had: “a very heated discussion about how to contain the situation where everybody wants to create an agent, and we have no way to govern it.”

What these have in common

Giving every developer a capable agent does not solve these problems on its own. Some teams lack shared infrastructure, while others are already building it and discovering the ongoing work required to maintain it. That gap is what we are building Air Teams around. 

In the coming posts, I will address three scenarios one at a time – shared context and skills, reviews built for agent output, and automations a team owns together. Based on real customer stories, I will show how sharing intent, decisions, impact, and verification results helps the next person understand changes independently and reduces review effort.

Stay tuned.

show more
Start Your Next KMP App With Kotlin Toolchain 0.13
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-07 10:21:46 | Created: 2026-10-07 11:51:58

The Kotlin Toolchain is a unified entry point into Kotlin. It lets you build JVM, Android, iOS, multiplatform, and server-side applications with a simple declarative configuration.

With the release of v0.13, we now recommend the Kotlin Toolchain for most new Kotlin Multiplatform (KMP) projects.

Earlier this year, we promoted the Kotlin Toolchain to Alpha. Since then, our Slack channels and issue tracker have been very active. So many of you in the community have joined us to create a great build experience for Kotlin. Thank you – your continuous feedback helped us get here!

Not using the Kotlin Toolchain yet? Experience automated environment setup and an intuitive CLI that works well with your AI agents.

Install Kotlin Toolchain

To access the latest Kotlin Toolchain features from your IDE, use IntelliJ IDEA 2026.2.3,  Android Studio Rabbit 1 | 2026.2.1 (or newer). Make sure the latest version of the Kotlin Toolchain plugin is installed.

How the Kotlin Toolchain simplifies getting started

Getting started with Kotlin Multiplatform often means working with unfamiliar platforms. Android developers might be discovering iOS for the first time, while other teams are expanding to web or desktop. Every platform comes with its own tools to install and build configurations to understand.

The Kotlin Toolchain changes that. It is a single CLI entry point for configuring the environment, creating, building, testing, and publishing your KMP apps and libraries. It comes with a declarative project configuration and set of all necessary tools – everything you need in one place.

In recent releases, we’ve refined the CLI and IDE experiences, added support for web and cinterop, and made many other improvements based on your feedback. Our internal dogfooding and positive community feedback have given us the confidence to recommend it for new projects!

We’ll feature the Kotlin Toolchain in our KMP getting started guides, web and IDE project wizards. These updates will make it easier for both developers and AI agents to select the Kotlin Toolchain when it’s most appropriate for the task at hand.

Direct support for agentic workflows

From early on, we designed the Kotlin Toolchain to be reliable and easy to use for both developers and IDEs. It turns out that the automatic environment setup, declarative configurations, and clear, actionable error messages provide an ideal foundation for AI agents as well.

We’ve taken this further by introducing a Hot Reload MCP server and dedicated AI agent skills, included in the official AI agent skills for Kotlin. You can install them with:

npx skills add kotlin/kotlin-agent-skills

Eventually, these skills will be delivered directly through the Kotlin Toolchain. In our benchmarks, AI agents already generate and maintain Kotlin Toolchain projects more reliably while consuming fewer tokens.

What’s new in the 0.13 release

New project creation with kotlin new

Version 0.13 introduces the kotlin new command, offering an interactive setup flow similar to the Kotlin Multiplatform Wizard. Note that the kotlin init command remains available; it has been updated to match the behavior of kotlin new, but it generates project files directly inside your current directory.

When you run kotlin new, the first prompt asks you to select your application type:

For Kotlin Multiplatform applications, you can choose your target platforms in the second step:

Better onboarding UX for iOS applications

Setting up iOS applications on a clean machine is now significantly smoother:

  • Better Xcode installation diagnostics: Get clear, actionable messages regarding Xcode license acceptance and first-run status.
  • iOS simulator runtimes are downloaded automatically when needed. An iOS simulator is created automatically if none exists.

Download progress reporting in the CLI

The TUI now displays rich download progress bars when the Kotlin Toolchain downloads required tools, such as JDKs, Android SDK components, iOS runtimes, and compilers.

Android improvements

In previous versions, the Android SDK was automatically provisioned when running kotlin build or kotlin run but not when opening the project in an IDE. If you opened a project in your IDE before running a build, missing SDKs could cause setup errors.

We have aligned CLI and IDE behavior, and the Kotlin Toolchain now automatically provisions missing Android SDK components on project import.

Additionally, we’ve also tightened validation for namespace and application ID definitions so you don’t accidentally publish app or library builds with sample IDs like com.example.app.

Sync status in the IDE editor

You can now monitor the current IDE sync status inside your file editor:

SPM import

The Kotlin Toolchain now supports Swift Package Manager dependencies for Apple platforms.

Modules with Apple platform support (e.g. kmp/lib, ios/app) can import Objective-C APIs from Objective-C and Swift code using SwiftPM dependencies:

product: ios/app

dependencies:
  - swiftPackage:
      repository: "https://github.com/firebase/firebase-ios-sdk.git"
      version: "12.17.0"
      products: [ "FirebaseCore", "FirebaseFirestore", "FirebaseAnalytics" ]

Imported Objective-C APIs are namespaced using the swiftPMImport prefix and ending with the module name:

// app/src/app.kt
import swiftPMImport.app.FIRAnalytics
import swiftPMImport.app.FIRApp

Kotlin Toolchain also supports local SwiftPM packages using the localSwiftPackage key. See our documentation for more details.

Multiplatform library publication improvements

When publishing multiplatform libraries, your Compose Resources and SwiftPM dependencies metadata are published along with your build artifacts.

Compose Resources are also resolved from third-party multiplatform libraries.

Kotlin/Native compiler caches

Kotlin/Native rebuilds just got faster. With KTC-5422, the Kotlin Toolchain caches compiled native dependencies and reuses them across builds and even across projects. Project code gets per-file caches, letting the compiler rebuild only the affected code during linking. Once the caches are populated, small edits mean less work and faster edit–build–run cycles for native apps and tests.

The feature uses the existing settings.kotlin.compileIncrementally setting and supports non-optimized debug binaries on compatible targets. Compilation to .klib files continues to run in full.

What’s next for the Kotlin Toolchain and KMP

We have some exciting milestones on our roadmap, including:

  • Installing the Kotlin Toolchain via brew install kotlin.
  • Providing AI skills out of the box.
  • Supporting Swift Export as it stabilizes.
  • Streamlining and automating app store publishing workflows.

Much of our immediate focus will be on understanding new user feedback and closing existing gaps, including those for existing Gradle projects, before recommending migrations.

To achieve this, we want to hear from you! As we refine the functionality, some changes may require adjustments to your projects, and we’ll do our best to support you through those migrations and make them as smooth as possible.

Join the conversation in the #kotlin-toolchain Slack channel (get invite: kotl.in/slack) or share your suggestions and ideas in JetBrains YouTrack. Your input and use cases help shape the future of the Kotlin Toolchain!

Install Kotlin Toolchain 0.13.0

Ready to give the Kotlin Toolchain a go? Check out our Getting started guide to dive into code examples, tutorials, or our comprehensive user guide.

Already using the Kotlin Toolchain? Simply run kotlin update in your terminal to upgrade.

show more
Your Next Action Is Two Dots Away
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-07 07:38:06 | Created: 2026-10-07 07:49:58

What’s new for command completion in IntelliJ IDEA 

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 tax on developer focus: As an IDE grows more capable, keeping every feature within reach gets harder.

That’s why we created command completion, a context-aware entry point to useful functionality from the place where you spend most of your time – the editor.

Typing .. 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.

Rather than answering “What can I type here?”, command completion addresses a more useful question: “What can I do here?”

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.

Here’s what’s new and improved:

Logpoints are easier to reach

Debugging with temporary println() 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.

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

Simply type .. 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.

If you’re new to logpoints, take a look at the logpoints tutorial. 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.

In-context AI assistance

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.

Note: If you have the Air plugin installed, your requests will be automatically routed through it.

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.

Postfix completion and live templates

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.

More contexts

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

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

Why this matters

Command completion isn’t just another flavor of autocompletion. It is a fundamental shift in how you discover IDE functionality. 

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.

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

Try it out today

Open any Java, Kotlin, or Scala file in IntelliJ IDEA 2026.2 or 2026.3 EAP and type .. 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 Search Everywhere. The completion popup will reflect what’s possible in that exact spot.

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.

show more
Our Framework for Reviewing AI-Generated Code
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-06 12:17:53 | Created: 2026-10-06 13:59:59

AI coding agents can now write thousands of lines of production code across a dozen files in the time it takes you to make coffee. The bottleneck is no longer code generation; it’s review, and nobody’s quite sure how to do it well yet.

Our Human-AI eXperience team, in collaboration with researchers from Lund University, examine how a tool for reviewing AI-generated code should look like and be integrated into the development process. The study is written up in a new paper and will be presented at the Empirical Software Engineering International Week 2026 (ESEIW) in October.

The main message of the study is that the core problem with reviewing AI-generated code is trust calibration. Until the tools catch up, developers will continue to fly blind. 

Our paper proposes a conceptual framework for building AI-ready code review tools that reveal risk and confidence signals at the actual granularity where developers put their attention. This proposal is based on a participatory design study with active feedback and collaboration from 17 practitioners, plus a follow-up survey with 43 software professionals. In this blog post, we present the conceptual framework and then discuss how it applies to developer tools for designing with this framework.

Why your usual review instincts fail with AI-generated code

Traditionally, when you review a colleague’s code, you have a lot of invisible scaffolding working in your favor. You know roughly how senior they are, which parts of the codebase they’re confident in, and which parts they tend to rush. You can ask them questions. When something looks odd, you can ping them on Slack and get a rationale in thirty seconds. However, none of that exists when the author is an LLM.

On top of that, a language model presents every line of generated code with the same apparent confidence, regardless of how uncertain it actually was when it produced that line. There’s no signal telling you that the authentication logic was straightforward and the database migration was a stretch. It all looks the same, and it all reads the same.

The rational response to this is to read every line, because any line could be the one that’s wrong. But, that’s a line-by-line audit of potentially thousands of lines of code, and it scales terribly as AI agents get more capable and start generating larger and larger change sets.

In our paper we argue that review of AI-generated code needs to be reframed to keep up with the changing times. We frame this as the diff-view paradigm failing to scale. A traditional diff viewer assumes that the reviewer’s job is to understand what changed. But when the author is an LLM that can generate large changes quickly and present heterogeneous output with homogeneous confidence, understanding what changed is the easy part.

Knowing whether to trust it – and where – is the hard part. As AI agents take on increasingly large and complex tasks, and as the volume of LLM-generated code in professional codebases continues to grow, this reframe is going to matter. The diff viewer was the right tool for reviewing what your colleague wrote. It may not be the right tool for reviewing what your agent wrote.

Another way to say it is that reviewing LLM-generated multi-file changes is not a diffing problem, but that it is a trust-calibration problem. We define trust calibration as the capacity to allocate review effort proportionate to segment-level risk when the author can’t be interrogated about their confidence or reasoning. It’s the skill of knowing how to differentiate where to look hard and where you can afford to skim – a skill that human-authored code review supports implicitly through social and contextual cues, and that AI-generated code review currently provides almost no support for at all.

Three-level review workflow: From high-level to selective details

There’s a well-known principle in information visualization from Shneiderman, where the overview comes first, then zoom and filter, then comes the details on demand. This is shown in the image below.

Our three-level review workflow maps onto it almost exactly, following what expert developers say about how they read unfamiliar code. This is sketched in the image below.

Namely, first the reviewer forms high-level hypotheses, then they selectively drill down to validate these hypotheses. In contrast, a more traditional line-by-line diff would force the developer to skip the high-level reviewing, which feels more cognitively expensive when it comes to large amounts of AI-generated changes. That is, when a task contains many interacting elements, a poorly organized presentation consumes processing capacity that could otherwise go toward understanding and judgment.

We developed our proposed workflow structure following a series of four workshops. In addition to a workflow structure, we gleaned recurring design constructs from participants’ inputs, which support the workflow structure. More details on our proposal, and how we brainstormed with developers about what they need in a workflow, can be found in our paper.

Tools: What’s out there now and how our proposal can help tool-builders support developers

None of these ideas appeared in a vacuum, and we discuss this in the paper. Several of the constructs have partial counterparts in tools that already exist: CodeRabbit offers prose walkthrough summaries of pull requests. Claude Code launches multiple reviewer agents that tag findings by severity level. Graphite‘s stacked pull-request model splits large changes into independently reviewable units – the closest existing analogue to our chunk idea, even though it operates across multiple pull requests, rather than decomposing a single generated proposal. GitHub has noticed the shift too. The platform now puts out guidelines specifically for reviewing AI-generated code. It also reports that Copilot-assisted code review already accounts for more than one-fifth of the platform’s reviews. 

All of this suggests that the workflow we are proposing is already relevant to developers, even if no one tool fully incorporates the ideas. Especially not in a way that addresses trust calibration. The high-level beginnings to the workflow – overview before files, files before lines, risk stratification before analytical reading – isn’t something any current tool imposes or even suggests. That’s the actual design gap our framework is proposing to fill.

The implication for tool designers is clear and direct: If you’re building IDE tooling for the era of AI-native development, the question to organize around is not How do we display the diff? It’s At what granularity does the reviewer need to allocate attention, and what signal do we need to surface there?

Our three-level framework gives you a principled scaffold for building these tools. Some guidelines are:

  • Overview-level tools should substitute for the interpersonal orientation that a human-authored review gets for free, e.g. the ability to ask the author what they were thinking, to draw on knowledge of their strengths and weaknesses. 
  • File-level tools should do risk stratification before the reviewer reads a single line — helping them invest effort where it matters. 
  • Code snippet-level tools should recover the fine-grained analytical work that good code review has always required, but equipped with chunk decomposition and chain-of-thought linkage that human-authored review can’t provide.

Our framework also suggests what to avoid when building. That is, tools that address comprehension without addressing trust calibration may improve efficiency for low-stakes changes while leaving the more consequential failure mode untouched. By this, we mean the systematic misallocation of review effort toward low-risk segments and away from high-risk ones.

In a previous blog post, we discussed how extended reality could be integrated into tools to help developers with AI-generated code review (see the section entitled Sketches of what could be built). Keep an eye on this space for updates on similar research.

show more
Java and Kotlin by IntelliJ IDEA: The LSP-Based Extension Reaches Release Candidate
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-06 09:54:39 | Created: 2026-10-06 11:53:58

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, giving developers and their agents accurate, project-aware code understanding across their tools and workflows.

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.

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

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

Install from Visual Studio Marketplace

Install from Open VSX registry

From preview to Release Candidate

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

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

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.

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.

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.

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.

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.

What the Release Candidate means for licensing

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

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.

Try the Release Candidate

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.

You can leave a comment here or submit a request to us.

Thank you!

Get Java and Kotlin by IntelliJ IDEA from Visual Studio Marketplace

Get Java and Kotlin by IntelliJ IDEA from Open VSX Registry

show more
Amper Is Now the Kotlin Toolchain: Moving to the Kotlin Blog
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-06 10:14:56 | Created: 2026-10-06 11:53:58

Amper has evolved into the Kotlin Toolchain, and our blog is moving along with it.

This isn’t a goodbye – it’s a continuation

With the release of Kotlin Toolchain 0.11, Amper became the Kotlin Toolchain: a single, unified entry point into Kotlin, now in Alpha.

What’s changing

To keep Kotlin ecosystem news in one place, all future news and release announcements will be published on the Kotlin Blog.

What stays the same

This blog will stay online as an archive, so existing posts and links will keep working, but it won’t receive new posts.

How to keep following along

  • Subscribe to the topics you care about on the Kotlin Blog, so you won’t miss any Kotlin Toolchain updates.
  • Follow the project on GitHub for releases and changelogs.

The Kotlin Toolchain team

show more
JetBrains Joins the Open Source Security Foundation
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-06 09:32:48 | Created: 2026-10-06 10:04:58

JetBrains has joined the Open Source Security Foundation (OpenSSF) as a general member. OpenSSF is a cross-industry initiative of the Linux Foundation that works to secure the software supply chain on which the industry depends. The foundation announced our membership today, together with other new members, at OpenSSF Community Day Europe in Prague, co-located with Open Source Summit Europe.

OpenSSF is home to projects that many teams already rely on, including Sigstore for signing and verifying software and SLSA for supply chain integrity. Its AI/ML Security Working Group publishes guidance on signing machine learning models and on writing safe instructions for AI code assistants.

Open Source Security Foundation General Member

Why we are joining

As coding agents take on more development work, code becomes cheaper to produce but more expensive to verify, and much of that verification is security work. Developers need to know where their code and dependencies come from, and AI adds new questions about how to trust the models and assistants that help write it.

JetBrains Air is how we are working on these questions in our own products, helping developers understand and verify what agents produce. OpenSSF is where we can work on the same questions out in the open, with the wider industry.

“Software development is at an inflection point. AI is changing how software is built and creating new security challenges, making it more important than ever that developers can understand, verify, and trust the software they produce.

JetBrains has supported professional software development for more than two decades, and we believe staying ahead of these challenges is best done collaboratively and in the open. OpenSSF brings together some of the strongest expertise in the industry, and we are glad to join the community and help shape the future of secure software development.”

– Katherine Druckman, Head of Community and Partnership Engagement, JetBrains

We want to stay ahead of the security questions AI raises, and help guide how the industry answers them. OpenSSF is the right place to do both.

Looking ahead

Developers trust JetBrains tools with their code every day. We take that trust seriously, and supporting the community working to make software more secure is part of how we aim to keep earning it. We look forward to working alongside the rest of the OpenSSF community.

show more
dotInsights | October 2026
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-05 13:57:56 | Created: 2026-10-05 15:49:58

Did you know? The System.Threading.Interlocked class provides atomic operations on shared variables, so multiple threads can update them safely without a lock.

Welcome to dotInsights by JetBrains! This newsletter is the home for recent .NET and software development related information.

🔗 Links

Here’s the latest from the developer community.

☕ Coffee Break

Take a break to catch some fun social posts.

📖 It’s just how things are now ….

📨We’ve all been there.

🖥️ What kind of IT department is this?!?

🗞️ JetBrains News

What’s going on at JetBrains? Check it out here:

🎉  .NET Day Online 2026 | October 7, 2026 at 11:00 CEST | tune in here 🎉`

✉️ Comments? Questions? Email us. 

show more
TeamCity 2026.2.1 and 2026.1.5 Are Out
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-05 11:59:09 | Created: 2026-10-05 13:52:59

Today we’re rolling out two bug-fix updates for the 2026.1 and 2026.2 TeamCity On-Premises versions. Similarly to the previous updates, these focus heavily on security issues, addressing over 40 vulnerabilities combined.

Additionally, these updates ship a few fixes for regular bugs and performance problems, including:

  • TFS projects fail to display diffs;
  • Pipelines cannot import YAML configuration files from a main repository branch;
  • MSBuildTools are not detected after the Visual Studio Build Tools 2026 September update.

Because these updates contain a significant number of security fixes, we strongly recommend upgrading as soon as possible.

See TeamCity 2026.1.5 Release Notes and TeamCity 2026.2.1 Release Notes for the complete list of resolved issues.

Why update?

Staying up to date with minor releases ensures your TeamCity instance benefits from the following:

  • Performance improvements.
  • Better compatibility with integrations.
  • Faster, more stable builds.
  • Enhanced security for your workflows.

Compatibility

All TeamCity bug-fix updates released for the same major version share data format. As a result, you can upgrade or downgrade within this series without the need for backup and restoration.

How to upgrade

  1. Use the automatic update feature in your current TeamCity version.
  2. Download the latest version directly from the JetBrains website.
  3. Pull the updated TeamCity Docker image.

Need help?

Thank you for reporting issues and providing feedback! If you have questions or run into any problems, please let us know via the TeamCity Forum or Issue Tracker.

Happy building!

show more
Java Annotated Monthly – October 2026
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-05 13:05:48 | Created: 2026-10-05 13:52:58

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 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!

Featured Content

Marit van Dijk

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.

Java 27 was released last month. Of course, we support it from day 1 in IntelliJ IDEA. You can read all about it in Java 27 in IntelliJ IDEA or watch the release stream if you missed it. Piotr Przybył and I updated our talk Learning modern Java the playful way and presented it at GOTO Copenhagen last week, where I was also on stage for two other sessions. This week, Piotr and I will be doing a Deep Dive version at Devoxx Belgium. Later this month you can find us at JDD and Hello Stavanger.

In other news, JetBrains Air was announced; one system for building software with agents. Please try out Air in the IDE and let us know what you think! 

Igor Kulakov wrote a Logpoints Walkthrough on how to use Logpoints; a new debugging feature in IntelliJ IDEA. Anton Arhipov shows how to tie that all together. And Siva Prasad Reddy K announced a course Building with AI Agents From Idea to Production where he will teach you about agentic development with IntelliJ IDEA and Spring Boot.

Finally, we are starting to release the videos from IntelliJ IDEA Conf 2026 on the IntelliJ IDEA YouTube channel, or catch up on IntelliJ IDEA Tech Talks episodes.

Java News

Here’s what’s new in the Java world: 

Java Tutorials and Tips

Give your next coding session a head start with these practical guides:

Kotlin Corner

A little Kotlin inspiration? Right this way: 

AI 

Beyond the AI buzz, there’s plenty to explore:

Languages, Frameworks, Libraries, and Technologies

Your next useful discovery might be outside your usual stack:

Conferences and Events

Clear some space on your calendar for these conferences: 

  • Devoxx Belgium – Antwerp, Belgium, October 5-9; Come meet JetBrains people and learn the recent news at our booth. 
  • JavaCro – Rovinj, Croatia, October 11-14
  • Dev2Next – Lone Tree, USA, October 12-15
  • BaselOne – Basel, Switzerland, October 14-15
  • {j}DD – Kraków, Poland, October 20-21; Join the session by Marit van Dijk. 
  • JCon USA – Atlanta, USA, October 26-29
  • J On the Beach – Malaga, Spain, October 29-30

Culture and Community

Great software starts with people, and people have stories to tell:

And Finally…

One last detour before you go: 

That’s it for today! We’re always collecting ideas for the next Java Annotated Monthly – send us your suggestions via email or X by October 20. Don’t forget to check out our archive of past JAM issues for any articles you might have missed!

show more
Discontinuing Swift Language IDE Support in the Kotlin Multiplatform Plugin
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-05 10:46:19 | Created: 2026-10-05 11:46:58

Starting with IntelliJ IDEA 2026.3 and Android Studio Rabbit 2 | 2026.2.2, we’re discontinuing Swift language IDE features in the Kotlin Multiplatform (KMP) plugin. This includes editing, syntax highlighting, and navigation within Swift files and between Swift and Kotlin.

Running iOS applications and debugging Kotlin code on iOS will remain fully supported. Kotlin/Native functionality, such as Swift Export and importing Swift packages into Kotlin projects, is not affected. 

The existing Swift functionality will remain available in earlier versions of IntelliJ IDEA, Android Studio, and the Kotlin Multiplatform plugin, though these older versions will not receive further updates.

Background

We originally developed Swift support for AppCode (our since-discontinued iOS IDE) and for working directly with Xcode projects. This technology was later adapted for Fleet’s polyglot capabilities and, most recently, for working with mixed Kotlin–Swift codebases using the Kotlin Multiplatform plugin.

While analyzing feature adoption, we found that active usage was limited and steadily declining. Our telemetry and user research showed that most iOS developers working on KMP projects prefer using Xcode for Swift development, while teams that primarily work in the Kotlin Multiplatform plugin increasingly use Kotlin and Compose Multiplatform.

Maintaining this Swift tooling, which inherited its core architecture from AppCode, requires substantial ongoing effort to stay compatible with continuous changes in Swift, Xcode, and the IntelliJ Platform. While we previously considered expanding Kotlin–Swift IDE support in the plugin, after weighing the necessary engineering investment against actual usage numbers we decided not to continue.

Looking ahead

We do not currently plan to replace these features. Moving forward, we will continue evaluating workflows and focus on providing excellent Kotlin tooling in IntelliJ IDEA and Android Studio and improving the KMP experience for iOS developers.

We would like to thank everyone who used Swift IDE features, especially those who have been with us since the AppCode days, and to all the contributors who put so much dedication into building and refining Swift support over the years.

Yours, 

The Kotlin team

show more
A New Agentic Experience: JetBrains Air in IDEs – EAP Now Open
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-01 12:42:32 | Created: 2026-10-01 13:41:58

Last week, we shared our point of view on where we think agentic development is headed and introduced JetBrains’ answer to it: JetBrains Air, an open system of products for agentic development.

Today, we’re launching the Early Access Program for Air in JetBrains IDEs. It’s available now as a plugin on JetBrains Marketplace or natively in the 2026.3 EAP builds of JetBrains IDEs. Try Air with free Junie Lite runs, our efficient coding agent for everyday tasks.

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.


Why a new experience?

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’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. 

Air is designed around that difference.

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’s length will struggle to stay relevant. 

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.

Introducing JetBrains Air in IDEs

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

  1. Bring your existing agents into the IDE

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’s terminal and full-screen tab. 

You don’t need a JetBrains AI subscription to use your agents with Air. Use your existing AI provider subscriptions or JetBrains AI if you already have it. 

  1. IDE intelligence for you and your agents

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.

And agents benefit from the IDE, too. 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.

  1. An agentic-first UX

Air is designed for working with multiple agents in parallel, 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.

Working with Air

Here’s what that looks like in practice:

Stay on top of parallel agent work. 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.

Delegate a task in one keystroke. 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.

Choose the preferred UI for an agent session. 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. 

Run agents locally or in the cloud. 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.


Keep parallel agent work isolated with temporary worktrees. 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.

You stay in control

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.

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? 

No agents? Nothing leaves your machine. 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’t allow agents, there’s nothing for Air to run and nothing to send.

Your data goes to your provider, not to JetBrains. With a third-party subscription, data goes directly to that provider under the agreement you already have with them. It doesn’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.

You can turn it off. Disable the Air plugin, and nothing else changes.

Try it — with Free Junie Lite

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. 

Give Air a real task: Run agent sessions across multiple projects and tell us how it fits into your workflow. Share your feedback via YouTrack so it lands in our teams’ backlog, or drop your thoughts in the comments below.

Install Air from JetBrains Marketplace, 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 Settings | Plugins, or reinstall it from Marketplace.

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

Frequently Asked Questions: 

What is going to happen to AI Assistant?
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. 

Which agents and models are supported?
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.

Can I use my Claude subscription? 
Yes, You can use your Claude subscription in Air’s terminal surface which opens as a full-screen IDE tab. 

Do I need a JetBrains AI subscription?
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. 

show more
RustRover vs VS Code + rust-analyzer: What Changes in Your Rust Workflow
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-10-01 09:39:15 | Created: 2026-10-01 11:38:59

As the team behind a dedicated Rust IDE, we’re naturally curious to see how RustRover stacks up against other popular setups for Rust development and the strengths and trade-offs of each one. This article is the first in a series where we’ll look at different Rust workflows.  

We’re not unbiased, but we want to give you an objective overview of what each tool offers. We’ll break down what each setup does well, its limitations, and what it’s like to use day-to-day. We’ll start with VS Code + rust-analyzer, one of the most common setups. We’ll also share a few tips for switching from VS Code to RustRover, so you can try it yourself and see what workflow is the best fit for you.

TL;DR: RustRover vs VS Code + rust-analyzer

  • VS Code is a general-purpose editor. The rust-analyzer extension provides Rust-specific completion, diagnostics, navigation, and refactoring.
  • RustRover is a professional Rust IDE with its own code analysis engine integrated with its Cargo project model, while other IDE tools use project context provided by that model.
  • VS Code gives you a modular environment that you can customize with extensions, settings, tasks, and launch configurations.
  • RustRover may suit developers who want code analysis, Cargo, testing, debugging, and refactoring connected through one project model.
  • Either setup works well for day-to-day Rust development. The better fit depends on how you prefer to organize and configure your tools. Some developers prefer to keep both options available, and switch between them based on the task at hand.
RustRover vs VS Code

VS Code + rust-analyzer and RustRover: A quick overview

VS Code + rust-analyzer

VS Code was launched by Microsoft back in 2015, with the first released version 1.0 in 2016. It’s a general-purpose editor that you can extend for different languages and workflows. For Rust, language support comes from rust-analyzer, which runs as a language server and analyzes the Cargo workspace behind the files you have opened. It provides completion, diagnostics, inlay hints, navigation, quick-fixes, and refactoring inside VS Code.

VS Code lets you further customize your setup with extensions, tasks, launch configurations, terminal commands, and personal settings. This makes it a flexible option for those who want to use the same editor for multiple languages.

RustRover

JetBrains introduced RustRover in public preview in 2023 and released it in 2024. It grew out of the IntelliJ Rust plugin, and we built it as a dedicated professional Rust IDE.

RustRover uses its own Rust analysis engine. When you open a Cargo project, the IDE analyzes the workspace and builds a model of its crates, dependencies, targets, and code structure. This understanding supports completion, navigation, inspections, quick-fixes, and project-wide refactoring.

Cargo, testing, debugging, databases, web dev support, and version control are also built into the IDE. RustRover remains configurable within this structure. You can customize keymaps, settings, code style, run configurations, toolchain behavior, and the interface, as well as install plugins for additional technologies and workflows.

RustRover vs VS Code: Key differences

Before we get into the table, a quick note about what we mean by “VS Code + rust-analyzer”: We’re focusing only on the parts of the setup that are essential for Rust development, which include the integrated terminal, tasks, launch configurations, and (in some cases) a debugger extension. We won’t cover every optional extension, only the tools needed for the workflows in this article.

The overview above explains how the two setups are put together. The table below shows how they differ when you navigate code, run Cargo targets, test, debug, and refactor.

Workflow areaVS Code + rust-analyzerRustRover
Rust code analysisRust-specific analysis comes from the rust-analyzer language server, which runs through the VS Code extension.RustRover does not use rust-analyzer. It uses JetBrains’ own Rust analysis engine, integrated with the IDE’s project model.
Navigationrust-analyzer provides actions such as Go to Definition and Go to References. You can use them with VS Code’s Explorer and workspace search.RustRover provides declaration and usage navigation through its indexed project model. The Project and Cargo tool windows provide additional workspace views.
Cargo and running codeYou can run Cargo commands in the integrated terminal or start supported targets through rust-analyzer. Tasks can save commands you use regularly.You can run targets from the editor or the Cargo tool window. RustRover creates run configurations that you can save and adjust.
TestingYou can run tests through rust-analyzer actions, Cargo commands, or VS Code tasks.You can run tests from the editor or the Cargo tool window and view the results in the IDE’s test runner.
DebuggingRust debugging requires a compatible extension, such as CodeLLDB or Microsoft C/C++. Launch configurations can save your debugger settings.Rust debugging is included in the IDE and works through the same run/debug configurations used for targets and tests. 
Inspections and refactoringrust-analyzer provides diagnostics, quick-fixes, renaming, and other refactoring actions. Cargo Check or Clippy can provide additional feedback.RustRover combines built-in inspections, quick-fixes, and refactoring tools with feedback from Cargo Check or Clippy. You can review affected usages before applying project-wide changes.

That difference in how the two setups are put together also comes up in community discussions. One Reddit user described it this way:

Comment
by u/metalciaga from discussion
in rust

AI-assisted development in VS Code and RustRover

If AI is part of your workflow, you can use it in either environment for quick suggestions or larger-scale tasks that use broader project context. The agents you can connect, how you access models, and which development tools those agents can use differ. Here is a short overview of AI capabilities in both environments. 

AreaVS CodeRustRover
AI workflowsVS Code supports inline suggestions, chat, planning, multi-file editing, and agent-driven tasks.JetBrains AI provides code suggestions and other in-IDE features, while Air lets you run agent-driven tasks inside RustRover
Agent choiceYou can use agent providers such as GitHub Copilot, Claude, and Codex.Air works with agents including Junie, Claude Agent, Codex, GitHub Copilot, and OpenCode. You can also connect other compatible agents through ACP.
Models and accountsYou can use models included with a GitHub Copilot plan, connect supported providers with your own API key, or use supported local models.You can use JetBrains AI, supported provider subscriptions, or your own API keys. Available options depend on the agent and provider you choose.
Development tools and contextAgents can work with workspace code, errors, tests, the terminal, and tools connected through MCP.You can run agents inside RustRover and review their changes with the IDE’s project and code tools. Starting with RustRover 2026.3, agents can also control the debugger through MCP.

Air also goes beyond the IDE. You can use it through the web, command line, and mobile, while its team features cover shared environments and automations. For this comparison, we’re focusing on Air inside RustRover: running agents and reviewing their work alongside your code.

What do these differences look like in practice?

Imagine you are working in a multi-crate workspace. A function called from a binary crate is defined in a library crate and re-exported through another module. You need to find its declaration, check its uses, rename it, and run the tests that cover this functionality.

In VS Code, you can start with rust-analyzer’s Go to Definition action to find the function. Next, Go to References shows where it is used across the Cargo workspace, and Rename Symbol applies the new name across the relevant Rust files. Once the change is ready, you can run the affected test through a rust-analyzer action or use Cargo in the integrated terminal. If the test fails, rust-analyzer can provide the Debug action, while a compatible debugger extension provides debugging support. You can save commands and debugger settings in tasks and launch configurations to repeat the workflow.

In RustRover, you can start by following the function to its declaration through the IDE’s indexed project model. The Project and Cargo tool windows provide additional workspace views, while Find Usages shows where the function is referenced. You can then use the Rename refactoring and see what will change before applying the new name. Once the change is ready, run the test from its gutter action or the Cargo tool window. If it fails, you can start debugging from the same gutter action or run/debug configuration. RustRover creates a temporary configuration that you can save if you want to reuse the same arguments or environment variables.

Both environments can take you from navigation to a completed change. The difference is the path you follow and how the tools present the wider project context along the way.

We asked several Rust developers who normally used VS Code to work in RustRover for a week and keep a diary of their experience. This was a JetBrains study, so their comments do not represent every Rust developer, but they tell us a lot about what it’s like to make the switch.

“The debugger was easily the best part, honestly. Being able to stop right on the age check and see the real numbers made it click instead of me just assuming the math worked.”

Anonymous participant in a JetBrains RustRover diary study

How to switch from VS Code to RustRover in five steps

Switching from VS Code to RustRover doesn’t mean you have to re-learn everything. Follow the steps below to customize your setup so that RustRover feels familiar from day one. 

1. Import your settings and select the VS Code keymap

When you first open RustRover, select VS Code in the Import Settings dialog and choose what you want to bring over. This can include your keymap, theme, extensions, and recent projects.

2. Open a familiar Cargo project

Start with a real project rather than a sample. If the repository has multiple Cargo projects and RustRover asks which ones to attach, include the projects you want the IDE to work with. Do not dismiss the dialog without checking it, or parts of the repository may be missing from the project model.

Orhun Parmaksız, a JetBrains Developer Advocate and open-source Rust contributor, shared how he brought his familiar workflow into RustRover:

“When I move to a new IDE, I prefer to keep the keybindings and habits I already use. For RustRover, I used IdeaVim and asked Codex to adapt my Neovim configuration. I saved the result in my dotfiles so I could reuse it, and VS Code users can take the same approach with their own keybindings. The transition was smooth; the only drawback was needing to restart the IDE for the configuration changes to take effect.”

You can see Orhun’s .ideavimrc and RustRover configuration files on GitHub.

3. Check your Rust toolchain

Before opening the project, go to Settings | Rust and ensure that RustRover has detected the toolchain you expect to use. If the Toolchain version shows a version number and you do not see an option to install or download Rustup, you are ready to continue.

4. Wait for the project to load

Let the first Cargo sync and indexing finish before investigating red highlighting or unresolved code. At this stage, RustRover is still building its understanding of the project, so some warnings may be only temporary.

5. Run or debug something you’re already familiar with

Choose a familiar test or target and run or debug it from the editor. This is a quick way to confirm that the project, toolchain, and main development actions are ready.

If your project uses Cargo features, you can manage them through the IDE instead of a separate JSON configuration. For complete setup instructions and more VS Code equivalents, see the migration guide.

RustRover or VS Code: Choosing the right fit?

If you already use VS Code for several languages, prefer a lighter editor, and want to choose your own extensions and configuration, staying with VS Code and rust-analyzer may make the most sense. 

But if you want a professional Rust IDE with an integrated debugger, project-wide refactoring, Cargo.toml assistance, and tools that share the same understanding of your Cargo project, RustRover feels like a natural choice. The trade-off is that a full IDE can feel heavier and busier than an editor-based setup.

“VS Code still feels lighter for quick edits, but RustRover feels better when working inside a project for a longer time and trying to understand the code structure.”

Anonymous participant in a JetBrains RustRover diary study

If you are still unsure, open one of your projects in both environments and try doing a task you perform regularly. Seeing each setup in action will tell you far more than a list of features ever could.

FAQ

Does RustRover use rust-analyzer under the hood?

No, RustRover does not use rust-analyzer. It uses JetBrains’ own Rust analysis engine, which is integrated directly with the IDE’s project model, Cargo support, and other built-in tools.

Is RustRover free?

RustRover is free for individual non-commercial use, while commercial development requires a paid license. The free version has the same IDE features, but it includes anonymous usage statistics. However, this data does not include your source code or custom input.

Which Rust IDE is better for beginners: RustRover or VS Code?

RustRover is better for beginners because you can learn and practice Rust without leaving the IDE. Free courses such as Learn Rust and 100 Exercises to Learn Rust guide you through Rust concepts with exercises, hints, and feedback on your code. You can also find tutorials and more beginner resources on our Getting Started with Rust page.

Do I have to rebuild my workflow from scratch when switching to RustRover?

No, RustRover allows you to import your VS Code keymap, theme, extensions, and recent projects, so running and debugging in RustRover will feel familiar from the get-go.

show more
Small Talk with Emiliano Bonilla, CEO and Co-Founder of Synnax
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-09-30 13:00:36 | Created: 2026-09-30 13:31:01

What is Small Talk?

Small Talk is our short Q&A with founders from the JetBrains Startup Program. They answer a handful of questions in their own words about what they’re building, why they started, and what they’ve figured out along the way. No pitch, no polish – just a two-minute read to meet the person behind the product.

This time, we sat down with Emiliano Bonilla, CEO and Co-Founder of Synnax, the software behind rocket engine testing. He talked us through launches gone wrong, building a programming language from scratch, and why he won’t leave his IDE.

Emiliano Bonilla, CEO and Co-Founder of Synnax

Synnax is a software platform for controlling hardware and capturing, organizing, and reviewing the data it generates in real time. Built for high-stakes environments like rocket engine testing, it replaces the spreadsheets and unstructured file dumps the industry has long relied on. It also includes Arc, a purpose-built real-time programming language. The company is extending its technology from aerospace into fields such as cryogenic control for quantum computing, oil and gas, and manufacturing.

TL;DR

  • Synnax is a mission-control and data platform for teams testing and operating hardware, replacing the Excel sheets and 20-terabyte file dumps aerospace still runs on.
  • The team built its own real-time language, Arc, in about six months, after Excel and Python both fell short.
  • Emiliano’s team works in JetBrains IDEs (GoLand, CLion, and PyCharm) with Claude Code alongside, and is taking Synnax beyond rockets into quantum computing, oil and gas, and manufacturing.

You built software before Synnax. What was it?

I built aerospace ground software. When you watch a NASA launch and see all the screens people are staring at, that’s what I built in industry, and it’s what we build at Synnax now. I was at a rocket startup in Texas, Firefly Aerospace, through their first two orbital launches. They’re the fifth private company in history to reach orbit.

So why start Synnax?

Because the industry runs on tools built in the 80s. We mostly do rocket engine testing – you put an engine on a stand, wire up hundreds of sensors, and collect huge amounts of data. The old software dumps it into unorganized files, drives with 20 or 30 terabytes named only by date and time. Teams make bad calls because they can’t review it fast enough. I’ve seen things blow up. I’ve seen millions of dollars lost. Synnax tightens the loop between collecting data and acting on it.

What’s the hardest part of building software this mission-critical?

Balancing speed against quality when a small mistake can destroy a multi-million-dollar system. If a normal app goes down for a few minutes, it’s survivable. If Synnax misses a timing requirement by a few milliseconds, that can be the end of a customer’s hardware. I stand right behind the engineers at a test site while they run it, and it’s always nerve-wracking.

You built your own programming language, Arc. Why take that on?

Because existing resources weren’t a good fit. Excel can’t handle complex logic or state machines, and Python isn’t fast or safe enough for real-time control of engines. We resisted building our own language until it was unavoidable, then did it in about six months. It’s simpler than Python on purpose, and the developer experience is a night and day difference. A real editor flags a typo in two milliseconds, whereas using Excel would’ve meant carrying files between machines on a USB stick just to find an error.

You build all this in JetBrains IDEs. Why those over other editors?

The debuggers, mostly. You point at any target, press play, and it just works, with none of the configuration wrangling I used to do. We’re in GoLand, CLion, and PyCharm, with Claude alongside, and I like reviewing Claude’s output right inside the IDE. The merge conflict tool is far better than what I used before, and saving a file in our big codebase is basically instant.

Where does Synnax go from here?

Aerospace is still our bread and butter, but we’re expanding. One of the interesting segments is cryogenic control for quantum computers. Beyond that, oil and gas, and manufacturing, where I’d love to be running the control for an entire production line. The potential market is huge, so we pick our segments one at a time instead of trying to do everything at once. On the Arc side, the big thing we’re building is automated data review. A human can only review so much in real time, so we want anomaly detection in the loop to flag and correct things automatically.

Last one. What actually makes a tool win?

It’s rarely one big thing. You win through the accumulation of a lot of small things that make someone’s day a little better. That’s how we think about our own product, and it’s the same reason I stick with the tools I do.

Read the full case study here.


JetBrains Startup Program FAQ

Q: Do I qualify?
A: You qualify if your company is privately owned, established within the last five years, and has a website or other discoverable online presence.

Q: Where do I apply?
A: You can apply here.

Q: What is the timeline for the JetBrains Startup Program application process?
A: After you apply, our team will review your application within 48 hours. If you meet the criteria, you will receive an acceptance email, followed by a quote for the products. If you’re not accepted, our team will get in touch and share our reasoning. An application may be unsuccessful either due to missing information (e.g., a document or website) or because you do not meet our eligibility requirements (e.g., your business is more than five years old).

Q: What products are included in the terms “IDE subscription”, “AI subscription”, and “team or learning tool subscription”?
A: A variety of products are available through IDE subscriptions, including IDEs as well as .NET and Visual Studio tools. “Team tool subscription” refers to team tools, including TeamCity, YouTrack, Datalore, Qodana, and our learning tool (JetBrains Academy).

show more
The Companions to Come
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-09-30 10:33:03 | Created: 2026-09-30 11:29:58

We are working on extensions to our companions mechanism to unlock new code patterns and improve interoperability across different platforms. This post outlines these new features and provides preliminary guidance on migration.

Companion blocks and extensions

Many programming languages provide a notion of class or type members – functionality that does not belong to each particular value of a class, but to the class itself. Constants, utilities, and factory methods are often in this group.

val v1 = Vector(1.0, 2.0)             // a regular vector
val v2 = Vector.ZERO                  // the constant zero vector
val v3 = Vector.unit(angle = PI / 2)  // unit vector with an angle 

Previously, companion objects were used to define these members. From Kotlin 2.5.0 on, you can also use an experimental companion block, which is very close syntactically, but with profound changes in compilation.

data class Vector(val x: Double, val y: Double) {
  companion {
    val ZERO = Vector(0.0, 0.0)
  }
}

In fact, these members may not be defined directly on the class itself. You can also use an experimental companion extension to declare new class members in a type, even if you don’t control them.

companion fun Vector.unit(angle: Double) = Vector(cos(angle), sin(angle))

The design of companion blocks and extensions overcomes the limitations imposed by companion objects. First of all, you can define companion extensions for any class or interface – whether you control it or not, whether it originally comes from Kotlin or from Java, or whether it has a companion object or not. 

Second, the compilation strategy resembles that of static members in other platforms. For example, on the JVM, companion blocks are compiled as static members. This has additional implications for Kotlin Multiplatform: you can now define expected companion block members and actualize them using a Java class that contains static members.

If you want to know more about this upcoming language feature, the corresponding KEEP proposal contains all the information.

Using experimental companions

Companion blocks and extensions are experimental features available starting Kotlin 2.5.0-Beta1. That means that you need to pass an additional compiler flag to use the feature:

  • -Xcompanion-blocks to allow companion blocks.
  • -Xcompanion-blocks-and-extensions to allow both companion blocks and extensions.

Using the second feature causes the compiler to produce pre-release binaries, which means libraries using companion extensions may not be consumed as dependencies until the feature becomes stable. This restriction does not apply to exposing companion blocks, although consumers of such blocks still need to enable the companion blocks feature.

What about my companion objects? 

This leads to a natural question: What is the role of companion objects in a language with companion blocks and extensions? There are two answers to this question:

  • On the one hand, most usages of companion objects would be better served by companion blocks, so new code may prefer the latter to the former.
  • On the other hand, there are a few use cases that are only served by companion objects. For example, if your companion needs to implement a particular interface, companion objects are the only possibility, since they compile to a full-fledged class.

There’s no need to migrate, though. Companion objects are an integral part of Kotlin, and support for them is fully guaranteed. 

If you prefer to move to companion blocks, removing the object keyword should be enough in most cases – but note that the project and any code depending on it need to be recompiled. Other tooling in the ecosystem may not be ready for companion blocks, although we’re trying to ensure major players provide this support as soon as possible.

show more
Software Quality Assurance Tools and Tips for Developers
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-09-29 12:23:15 | Created: 2026-09-29 13:36:58

Testing applications before release alone is no longer enough when it comes to quality assurance for modern software development. It needs a more dynamic approach that makes QA a part of the ongoing process.

According to the 2025 Stack Overflow Developer Survey, 84% of developers use or plan to use AI tools in their development process. This increasing use of AI-generated code means tighter, more frequent quality reviews are essential.

The emergence of techniques like shift-left analysis is also advancing modern software development by moving quality checks earlier in the software development lifecycle (SDLC). Today, software quality assurance involves integrating checks at every stage to ensure reliability and high standards. 

Various automation and software quality assurance tools make this possible. But they can’t do it alone. You also need to understand and implement effective techniques to identify issues earlier and reduce risks and associated costs.

Here, we explore the importance of software quality assurance, the tools you can use at each touchpoint, and best practices to build quality into every aspect of your development lifecycle.

What is software quality assurance?

Software quality assurance (SQA) is an ongoing process of checks that ensures operational requirements and standards are met throughout the SDLC. These are fundamental to ensure the final product works, is safe, and complies with any company and industry standards.

SQA aims to detect, remove, and prevent defects by catching them early, before they slip through to production. Modern SQA uses a proactive approach to verify that all functional, performance, and reliability requirements are met. It differs from traditional quality control (QC), which is product-oriented and more reactive, often only testing the software before its release. 

By identifying and eliminating bugs early, SQA enables faster releases and better security while lowering technical debt. 

Automation and AI in SQA

Automation and the use of AI for SQA are becoming more prevalent to speed up the process and free up resources to dedicate towards other priorities. However, full automation (particularly AI-driven automation) introduces risks due to its use of training data and the potential for errors slipping through. A balance of automated and manual code review to validate outputs remains important to ensure good quality assurance.

Why software quality assurance tools are so important

Manual quality assurance still has its place. But alone, it can no longer keep pace with how software is built. Release cycles in modern SDLC have moved from months to days, and modern CI/CD pipelines mean code often moves from commit to production with minimal human intervention. 

Modern SQA tools are designed to keep up with these faster development cycles. As codebases become more complex with sprawling dependencies, microservices, and third-party integrations, SQA tools help identify hidden defects that human reviewers could easily miss.

Overlooking these potential issues can lead to software errors and huge financial costs. According to the Consortium for Information & Software Quality (CISQ), poor software quality costs the US at least $2.41 trillion annually. The shift-left philosophy of catching issues as code is written tackles this.

SQA alleviating modern development pressures

Various SQA tools directly address several modern development pressures, including:

  • Static analyzers, which catch bugs and security flaws before code merges.
  • Automated test frameworks, which verify behavior continuously.
  • Performance and coverage tools, which flag regressions early.


No one tool covers every aspect of quality assurance throughout the SDLC, so it’s vital to use a layered toolkit to address different quality concerns and ensure your SQA process is as tight as possible. 

The different stages of software quality assurance

Continuous quality assurance is embedded throughout the development process, with quality checks running at every stage rather than just at the final testing phase. Traditional models treat QA as a gate before release, so defects are often discovered after significant work has been built on top of flawed code, causing costly delays to release. 

Finding and fixing a bug just before production is far more expensive and disruptive than catching it early. Distributing quality assurance checks across the SDLC helps developers identify problems closer to their source, enabling faster refactoring and avoiding a pile-up of issues that may delay release and reduce customer satisfaction. 

Certain tools suit specific stages of SQA as the goals and requirements of each differ.

SDLC stageQA goalQA tools
Planning and requirementsDefine clear and testable requirementsRequirements management tools (RMTs) Static requirement linters
DesignValidate architecture and identify design flaws before codingModelling toolsDesign review checklists
DevelopmentWrite clean, secure, and maintainable codeStatic analyzersLintersIDE-integrated code inspections
Build and integrationEnsure components work together and catch errors earlyCI pipelinesAutomated unit/integration test frameworks
TestingTest and verify functionality, performance, and securityAutomated test suitesLoad testing toolsSecurity scanners
DeploymentConfirm stability in production-like conditionsDeployment verification toolsCanary/rollout monitoring
MaintenanceDetect issues post-release and provide ongoing improvementsAPM toolsLog analysisError tracking platforms

Essential software quality assurance tools

Using quality assurance tools involves matching a suitable tool to specific testing processes. This is important as static analysis, performance testing, security scanning, and functional testing surface different issues.

Let’s take a look at some of the essential software quality assurance tools to use for each process.

1. Static code analysis

Static code analysis examines source code without execution. It scans the code during development for bugs, security vulnerabilities, and violations of coding standards. Operating directly on the code means it flags issues as they’re written, often inside the IDE. This shifts left and saves time compared to waiting for a test run or code review to surface them.

Developers avoid discovering a null pointer risk or an SQL injection vulnerability during integration testing or production. Fixes are cheaper and easier while context is fresh. Static analysis also enforces consistency across a codebase and team. Style violations, unused variables, and overly complex functions are caught that a human review may miss.  

Qodana is a static code analysis and quality assurance tool that complements, rather than replaces, other types of testing. It eliminates many preventable defects during development, achieving high-quality standards throughout the SDLC.

2. Unit testing

Unit testing is a foundation of strong software quality assurance, even with the increasing use of AI and automation. It delivers stability through early error detection to help create maintainable code, testing individual components and functions in isolation to verify each unit performs as expected.

These are common examples of unit testing tools for QA:

  • JUnit is the default Java unit testing standard.
  • Jest offers strong performance for JavaScript and TypeScript development.
  • PyTest is a testing framework in Python.
  • NUnit is flexible and reliable for C sharp and .NET teams.

3. Integration testing

Integration testing tools validate how various components, services, and APIs interact. This identifies errors in data flow and communication that affect functionality so they can be addressed to ensure quality.

Validating integration is important in distributed architectures and microservices. Component interactions here can commonly cause issues, so checking interactions operate as expected ensures high-quality levels.

Examples of integration testing tools include Postman, which specializes in API integration testing with the ability to create and execute API tests. Soap UI also provides comprehensive SOAP and REST support, ideal for enterprise web services and complex service integrations.

4. Functional and UI testing

Functional and end-to-end testing tools simulate real user interactions such as clicking buttons, filling forms, and navigating between pages. They verify an application’s behavior from the user’s perspective and across entire workflows. This goes beyond just the code level to catch issues that only appear when components interact in a live environment.

Automated browser testing is a core for functional and UI testing. It’s particularly important for regression testing, where teams must confirm that new changes don’t break existing functionality.

Tools like Playwright, Cypress, and Selenium let teams script user journeys once and run them repeatedly across browsers and releases. This transforms previously tedious manual click-throughs into fast, repeatable, and reliable QA checks.

5. Performance testing

Validate how an application behaves under expected and unexpected traffic levels with performance testing tools. They reveal quality issues, including bottlenecks, memory leaks, and slow queries under pressure, to address bugs so they don’t reach real users.

This provides assurance that it can handle stress scenarios, beyond simply confirming that features work. It measures how response times hold up as load increases, whether the system recovers from traffic spikes, and where infrastructure limits appear.

Tools like JMeter, LoadRunner, and k6 test performance by simulating realistic traffic patterns, from steady baseline load to sudden surges. JMeter suits complex, protocol-diverse test plans, while k6 offers a developer-friendly, scriptable approach for CI/CD pipeline integration and continuous performance validation.

6. Security testing

Security is integral to software quality assurance and reflects the high costs of late-stage vulnerabilities.

Several types of security testing tools can combine to cover different angles:

  • Static application security testing (SAST) analyzes source code for known vulnerability patterns.
  • Software composition analysis (SCA) and dependency scanning check third-party libraries for common vulnerabilities and exposures (CVEs).
  • Dynamic application security testing (DAST) probes running applications for exploitable weaknesses.
  • Secret detection catches accidentally committed credentials or API keys.

Security testing tools like Qodana move these checks directly into the development workflow. It surfaces vulnerabilities alongside code quality issues during development rather than in a separate, later security review. This reinforces a shift-left approach across the security testing landscape.

How to choose the right software quality assurance tools

Determining the most suitable quality assurance tools depends on your development process and specific business requirements. The most effective strategies combine multiple QA testing tools for comprehensive coverage, rather than relying on just one.

The main factors to consider when comparing and selecting software quality assurance tools are:

Qodana plugs right into youCI/CD pipeline - Software quality assurance tools
  • CI/CD integration: A good QA tool should plug directly into your existing CI/CD pipeline. This enables automatic checks on every commit or build with no manual triggering required.
  • Language support: You need a QA tool that fully supports your codebase’s programming languages and frameworks to avoid incomplete or inaccurate analysis.
  • Automation: Choose tools that automate repetitive testing tasks, reduce manual effort, and enable faster and more consistent feedback throughout development.
  • Scalability: Your tools must support growing codebases, test volumes, and bigger teams with no negative performance or usability impact.
  • Reporting: A QA tool must deliver clear and actionable reporting to help developers understand issues and prioritize fixes.
  • Security: The tool itself must follow strong security practices and identify vulnerabilities within your code or dependencies.

Best practices for building quality into your development workflow

Choosing effective tools is essential, but you must implement them properly to ensure quality at every stage. Whatever tools you use, apply these techniques to build reliable quality assurance into your development workflow:

  • Shift left: Move quality checks early in development, preferable at the point of writing code. This catches defects when they’re cheapest and easiest to fix. Context is fresh and it avoids expensive and reputation-damaging post-production repairs.
  • Automate repetitive quality checks. Routine manual checks are prone to human error and hard to scale. Automating them frees up time and resources, so your team can focus on complex, exploratory testing that requires and benefits from human judgment.
  • Integrate testing into CI/CD pipelines. Run quality checks automatically on every commit or build, not as a separate manual step. Keep feedback fast and prevent issues from accumulating unnoticed.
  • Monitor technical debt. Track code complexity, duplication, and test coverage trends across releases. This helps identify and address quality regressions early.
  • Treat security as integral. Include security scanning and vulnerability checks in your regular QA process rather than treating them as an afterthought. Address vulnerabilities as they arise, don’t reserve them for a pre-release audit.

Build a complete software quality assurance strategy with Qodana

Software quality assurance spans the entire SDLC. It’s not just a final testing action. Combining different tools to address various quality needs at each stage is a modern requirement that reflects today’s demands for speed, complexity, and continuous integration.

Automating static code analysis in development pipelines with tools like Qodana strengthens QA. Surface bugs and vulnerabilities as code is written to ensure high-quality development and reliable performance.

What is software quality assurance?

Software quality assurance (SQA) is the ongoing process of ensuring software meets defined quality, reliability, security, and operational standards throughout the software development lifecycle. Unlike traditional quality control, which tends to focus on finding problems in the finished product, SQA aims to prevent and detect defects throughout development.

What are software quality assurance tools?

Software quality assurance tools help development teams automate and manage activities that improve software quality throughout the SDLC. They include static code analysis tools, unit and integration testing frameworks, functional testing tools, performance testing tools, security scanners, and CI/CD quality controls.

What are the main types of software quality assurance tools?

Common software quality assurance tools include:

Static code analysis tools
Unit testing frameworks
Integration testing tools
Functional and UI testing tools
Performance testing tools

Security testing tools, including SAST, SCA, DAST, and secret detection
Each addresses a different aspect of software quality, so organisations typically combine multiple tools rather than relying on a single solution

How does CI/CD improve software quality assurance?

Integrating QA tools into CI/CD allows quality and security checks to run automatically when code changes. This creates faster feedback for developers, helps prevent issues from accumulating, and makes quality assurance a continuous part of development rather than a separate activity before release.

How does AI-generated code affect software quality assurance?

AI can increase the amount of code developers produce, making scalable and automated quality controls increasingly important. AI can also assist with QA activities, but AI-generated output still needs appropriate validation. Combining automated analysis and testing with human review helps teams maintain quality as development becomes increasingly AI-assisted.

show more
The State of Kotlin in 2026 Report
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-09-29 12:38:29 | Created: 2026-09-29 13:36:58

In 2026, Kotlin turned fifteen. Over those fifteen years, Kotlin has built a mature ecosystem, been adopted by companies around the world, and established a large and active developer community.

Fifteen years is long enough to understand which technology trends lasted and which didn’t. This report looks back at Kotlin’s first fifteen years to see what they reveal about how the language matured, while answering questions like: “Is Kotlin here to stay?”, “Can Kotlin scale across platforms?”, and “How does Kotlin fit into the AI era?”

View Report

Today, developers worldwide use Kotlin across a diverse range of applications, including mobile, backend, and multiplatform. The language is also finding its place in the rapidly evolving AI space, where Kotlin’s strengths, like static typing, null safety, and coroutines, take on new relevance. Kotlin is actively participating in the shift toward AI-assisted development: Among surveyed Kotlin developers, 93% use at least one AI coding tool, while 81% already use or are likely to try AI coding agents. An equal share – 81% – say that AI-generated Kotlin code is fully correct or requires only minor fixes.

The State of Kotlin in 2026 report combines data from JetBrains research with independent industry data and real-world adoption evidence. Some findings confirmed what we expected; others challenged some familiar assumptions. While the language remains deeply established in Android development, more than half of Kotlin developers now report working on backend projects, highlighting how far its usage has expanded beyond mobile.

Together, these findings point to a broader story: Kotlin’s evolution isn’t just about growth, but about how diverse its usage has become, spanning backend, multiplatform, AI-assisted development, and more. At the same time, the developer community itself has grown more experienced.

State of Kotlin in 2026: Explore the highlights

See what the data tells us about how Kotlin has evolved and where its ecosystem stands today.

Read the full report → Download the State of Kotlin in 2026 PDF

show more
Air Teams: Bring Your Best Agentic Workflows to the Whole Team – and Automate Repeatable Work
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-09-28 13:15:11 | Created: 2026-09-28 15:04:58

Today, we’re introducing JetBrains Air Teams – the team layer for agentic development. It gives humans and agents the shared context, environments, tools, and instructions they need to work effectively together across the full development lifecycle.

Air Teams is already available to JetBrains business customers, with plans to expand access to individual customers later.

Try Air Teams now

The new chapter: From individual developers to teams

We introduced the Air app several months ago as our first step into agentic development. Since then, we’ve learned a lot and seen real productivity gains for developers working with agents.

As we developed Air further, two things became increasingly clear. First, developers don’t need another standalone app – tools and agents should be integrated into the environment where they already work. Second, as individual developers became more productive with agents, the real bottleneck started shifting to the team level.

That’s why we’re expanding Air beyond a standalone desktop app into a broader system. Air now supports agentic development at three levels: individual developers, teams, and organizations. Let’s take a closer look at what Air Teams brings to engineering teams.

What is Air Teams?

Air Teams is a shared workspace where engineering teams run coding agents and reuse what works. Today, most agentic work happens on individual laptops: Each developer has their own setup and prompts, and what works for one person doesn’t easily spread to the rest of the team. Air Teams brings your agentic workflows into one place: what one developer figures out, everyone can use.

Air Teams has four parts:

Automations handle recurring work on their own, such as code reviews, issue fixes, and dependency updates. An event or a schedule starts each run.

Shared cloud environments give agents the tools, dependencies, and credentials they need to build and test the code. The team sets an environment up once, and everyone reuses it.

Cloud tasks run in those environments, in parallel, without tying up anyone’s laptop. You can start and follow them from your IDE or browser, and soon also from your phone.

Projects tie it all together, with shared credits, clear roles, and Automations that don’t depend on any one person.

Let’s walk through each part.

Automations: No more babysitting agents

Agents can work fast, but they still wait for humans to start tasks, provide instructions, and proceed to the next step. At some point, manually orchestrating every run becomes the bottleneck.

Air Automations are agentic workflows that run on their own, in the cloud, triggered by an event or a schedule instead of a person. They are shared team assets: One developer can build an automation, and the whole team can run, reuse, and improve it. What works well for one person can become part of how the entire team works. For example, an Automation can review every new pull request the moment it opens, or update dependencies twice a week.

Air Teams comes with 10 Automation templates, including code review, bug fixes, dependency upgrades, and documentation maintenance. Use one as is, or adapt it to how your team works.

How Automations work

Automations are for recurring work that follows a pattern: a pull request needs reviewing, a labeled issue needs investigating, or dependencies need checking every week.

You set up four things once, and the Automation reuses them on every run:

Instructions: what the agent should do.

Environment: where the agent runs.

Tools: what the agent can use, including Jira, Figma, and Linear through connectors.

Trigger: when the agent starts, whether that’s a GitHub or Jira event, a webhook, or a schedule, with more trigger types on the way.

Here’s an example: an Automation triggered by a label. When someone adds the Bug label, the Automation starts an agent. The agent reads the issue and the linked Jira ticket, finds the cause in the code, and opens a pull request with a proposed fix for an engineer to review.

Automations belong to a team project, so the whole team uses the same Automation instead of each person building their own. Once an Automation proves itself, it can go beyond the project: the team can reuse it on another repository or save it as a template that anyone in the organization can use as-is or adapt.

An Automation is instructions, an agent, and a trigger. Set them up once, and every run reuses them.

Automations examples

Here are three Automations we run on our own team:

Code reviews. When a pull request opens, an agent reads the relevant code and discussion, posts inline comments and a summary, and can approve the pull request or request changes. Each new commit starts another run: The agent reads its previous review and any replies, notes which issues were fixed and which remain, and collapses its old reviews so only the latest one stays visible. An AI agent should assist your workflow, not block it. When you decide to handle an issue in a separate pull request, the agent respects your choice and completes its check.

Issue fixes. When a teammate tags a small, well-scoped issue in YouTrack, an agent gathers context, attempts a fix, and opens a pull request for review. The same Automation also handles review feedback. When a pull request opened by an Automation gets review comments from a teammate or from the code review Automation, the agent picks them up and fixes them.

Dependency updates. Twice a week, an agent upgrades the project’s dependencies, skipping any that its instructions say to leave alone. It builds the project and runs the tests. When an upgrade breaks something, the agent fixes the affected code without changing its behavior, or reverts the upgrade if a fix can’t be found. It then opens a pull request listing which upgrades were applied, skipped, or reverted. If the previous pull request is still unmerged, the agent closes it, so the team always has one up-to-date pull request to merge when it’s ready.

We’ll cover more Automations in upcoming posts, including how we set up and use them.

Stay in control

A valid concern with AI agents is noise: comments nobody reads and pull requests nobody asked for. Automations keep the decisions with the team. Engineers choose what an agent works on, and its instructions can keep the output small, as in the examples above: one open pull request for dependency updates, one current review per pull request. Each run also keeps the agent’s full conversation and tool calls, so when a result looks wrong, the team can see why. Every code change arrives as a pull request, and an engineer decides whether to merge it.

Create your first Automation

Shared cloud environments: A setup your team and agents can reuse

Every Automation, like every cloud task, runs in an environment, and an agent can perform only as well as its environment allows. Before it can build or test anything, it requires what a new engineer needs on day one: the right tools, dependencies, credentials, and network access. A small project may run on the defaults, but most codebases need more, such as a private package registry, pinned toolchain versions, or an internal issue tracker that the agent must reach. Someone has to set that up, and once should be enough.

Set up an environment by hand, or let an agent do the first pass and commit a tested startup script for you to review. Either way, you set it up once, and the whole team reuses it.

In Air Teams, that setup lives in a shareable cloud environment. You create one for a repository in your team project. Pick the VM size, decide which domains the machine can reach, and add the variables and secrets the build needs. The setup itself lives in your repository at .air/cloud/startup.sh, so your team versions and reviews it with the rest of the code. 

You can also hand the first pass to an agent. It inspects the repository, runs the real install and build, asks for any missing secrets, and commits a tested startup script to a separate branch. You review it like any other change.

When the environment is ready, Air saves it as a snapshot, and you share it with the team. Sharing the setup doesn’t mean sharing credentials. Shared secrets let your teammates and Automations use a value without seeing it, while personal secrets and repository access stay with each person.

From then on, teammates pick the environment for their cloud tasks, and the project’s Automations run on it. No agent spends time and tokens rediscovering how to build the repository. Every task starts on the actual work.

Learn how to configure environments

Cloud tasks: Work from your IDE and any device

With environments set up, you can start giving agents work. Choose an environment and an agent, then describe the task. If your repository doesn’t need a custom setup, use the default environment.

You can run a task locally or in the cloud. The right choice depends on the task, the setup it needs, and how closely you want to work with the agent.

Local agentCloud agent
Getting startedAn existing workspace is ready immediately. A new worktree or container may need to be set up first.The environment has to start and copy the repository first. Configuring it in advance and saving it as a shareable environment with a cached state will shorten the wait.
Machine resourcesBuilds and tests share your machine’s CPU and memory with your other work.Builds and tests run on a cloud machine, preserving local resources.
Files and toolsThe agent works with your local tools and your working copy, including uncommitted changes.The agent works from a remote branch, with the tools, dependencies, and credentials configured for the environment.
Agents and accountsYou can use any supported or ACP-compatible agent you’ve installed, with an account it supports.You can use the supported cloud agents your organization has enabled.
Reusing the setupTeammates can share setup scripts, but each person still prepares their own machine.Teammates share one environment, and each task runs in its own copy of it.
Following upYour machine has to stay on. Remote access depends on your own tools.The task keeps running even if your machine is off. You can follow up through Air in JetBrains IDEs or on the web, and soon also on mobile.

The key difference is that cloud tasks aren’t tied to the device you started them on. You can start a task in your IDE and pick it up later on the web. The agent keeps working even after you close your laptop.

See the cloud-task workflow

Team projects: Work that belongs to the team

A team project is a shared home for a team’s agentic work. It brings together members, environments, connectors, and Automations.

Two roles define who can do what. Project admins manage membership, environments, connectors, and Automations. They can also let specific members edit an environment. Members use the shared environments, create their own Automations, and see the results of every run.

Automations don’t have to depend on the person who created them. Each project has its own service account and AI credits, and a project admin decides whether the project’s Automations spend those credits or their creators’ own. On project credits, Automations run under the project’s account and keep running after their creator leaves.

Learn about project roles and credits

Get started with Air Teams

With Air Teams, agentic work becomes something the whole team shares. Automations handle recurring work, shared environments give every task the same setup, cloud tasks keep running after you close your laptop, and team projects make sure none of it depends on one person.

Try Air Teams at air.jetbrains.cloud. Everything above is built to be shared, so invite your teammates from the start.

For the full system of Air products, visit jetbrains.com/air.

Get some Air

show more
Rider 2026.2.3 Is Released!
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-09-28 12:25:44 | Created: 2026-09-28 13:04:58

Rider 2026.2.3 brings AI performance analysis to the Monitoring tool window and fixes an issue with the AI Agent Setup widget on Windows. You can update directly from the IDE, through the Toolbox App, or by downloading the latest version from our website.

AI performance insights from the Monitoring tool window

Now you can ask your AI agent to investigate your application’s performance right from the Monitoring tool window. Monitoring collects runtime data every time you run your app, so your agent has the information it needs to find bottlenecks and link them to your code.

To get started, use the Analyze with AI action to set up an analysis request for your latest session with the AI agent. Check the prompt, then send it to begin the investigation. Your chosen agent uses the dottrace-analyze skill to show where time was spent, follow hot paths in your code, and give you useful performance insights in the chat.

You can find the Analyze with AI action above the charts on the Performance tab. You can also use it from the context menu for older snapshots on the Recent snapshots tab in the dotTrace tool window.

This feature is only available on Windows, and you need to have dotUltimate or the All Products Pack, plus the AI Assistant plugin installed.

AI Agent Setup widget fix

This build fixes an issue with the AI Agent Setup widget (RIDER-143160), introduced in Rider 2026.2.2. Previously, the widget would sometimes fail to open when you clicked its taskbar icon on Windows with display scaling set to below 175%. Now it opens just fine.

We’d love to hear what you think. If you run into issues or have suggestions, please report them via YouTrack or message us on X.

show more
A More Reliable Compilation Scheme for Kotlin Multiplatform Modules
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-09-28 09:38:26 | Created: 2026-09-28 11:04:58

The current compilation approach to Kotlin Multiplatform projects works, but sometimes can lead to unexpected or hard-to-predict behavior. For example:

  • The IDE analysis disagrees with the compiler on an overload, type inference, or whether the code should compile at all – with the IDE being stricter than the compiler.
  • Your commonTest code can unexpectedly call something from a platform source set, breaking your assumptions.

With Kotlin 2.5.0-Beta1, we introduced an optional “separate compilation” approach to KMP that solves both problems: make the compilation results consistent with IDE analysis, and point more consistently to problematic calls of library code from common source sets. As a bonus, this approach enables us to implement incremental compilation for common source sets.

The separate compilation feature is Experimental and disabled by default. To opt in, add the following compiler option to your gradle.properties file (note the known issues):

kotlin.kmp.separateCompilation=true

Let’s look closer at the problem and the solution.

How multiplatform declarations are resolved within a module

Within a module, multiplatform code performs predictably:

// jvmMain
fun foo() {}

// commonMain
fun test() {
    foo() // Unresolved reference in IDE and during compilation
}

The compiler and the IDE agree: The code in commonMain is also compiled to other platforms, for example, to Kotlin/JS, and there might not be a fun foo() declaration in jsMain. Expect/actual declarations exist precisely to solve this problem: explicitly tie platform-specific declarations to common ones.

You would expect that the reference is also flagged as unresolved when the foo() function is declared in a dependency (a module in the same project or a binary artifact like Kotlin standard library or kotlinx-coroutines). Unfortunately, with the current compilation scheme that’s where the IDE and the compiler disagree.

How multiplatform declarations are resolved between modules

To understand where the problems stem from, let’s look closer at the current compilation setup.

Kotlin Multiplatform compilation setup

In a KMP project, a module with common code usually consists of several source sets: in the example above it’s a shared source set (commonMain) and a platform source set for a declared target (jvmMain for Kotlin/JVM).

With that setup, the compiler can produce the following artifacts:

  • A platform artifact for each platform source set like jvmMain – *.jar on JVM, *.klib on other platforms.
  • A metadata KLIB for each common or intermediate source set (like commonMain or nativeMain). A metadata KLIB contains all declarations from the compiled source set without bodies.

So where do the problems start?

Common code is compiled against platform artifacts; IDE disagrees

During compilation of a platform source set, both the code inside it (jvmMain) and the code in all relevant shared source sets (commonMain and other intermediate source sets) is compiled against the platform artifacts of its dependencies. Here code from commonMain has a chance to implicitly resolve to a jvmMain declaration.

If you expect this to happen, you’re probably fine. It would be more transparent and predictable, however, if commonMain could only call declarations from the dependency’s commonMain (as listed in the dependency’s metadata KLIB).

This is exactly what the code analysis in IntelliJ IDEA already assumes. As jvmMain declarations are not included in the KLIB metadata, IntelliJ IDEA reports the unresolved reference error when commonMain refers to something not declared in common code explicitly:

// lib/jvmMain
class Foo

// app/commonMain
fun main() {
    Foo() // Unresolved reference in the IDE, no error during compilation
}

The same mechanism is also in play with commonTest source sets, because tests also “depend” on main code: commonTest compiled against jvmMain can successfully call a declaration from platform code, instead of being restricted to declarations in commonMain. IDE reports the same unresolved reference problem:

// app/jvmMain
class Foo

// app/commonTest
fun main() {
    Foo() // "Unresolved reference" in the IDE, no error during compilation
}

Let’s see how separate compilation solves these problems.

How separate compilation solves the problem

KMP separate compilation makes the compiler behave stricter (aligning with the IDE expectation) when compiling common source sets of KMP projects. This makes the overall experience more predictable, although you may need to adjust your old code for stricter compile-time checks.

Let’s look at specific code examples and what happens to them with the switch between compilation schemes.

Red code in IDE, no error during compilation

When you turn on separate compilation, this code stops compiling, because compiler now resolves common code calls strictly using metadata KLIB declarations:

// lib/jvmMain
class Foo

// app/commonMain
fun main() {
    Foo() // Unresolved reference in IDE, now also a compilation error
}

The fix is to show an explicit connection: declare an expect class in lib/commonMain and make the platform Foo class an actual class:

// lib/commonMain
expect class Foo()

// lib/jvmMain
actual class Foo

// app/commonMain
fun main() {
    Foo() // ok
}

Same for commonTest: with separate compilation, the test code won’t resolve to a platform call in jvmMain. If that’s what you want to test, declare the corresponding expect in commonMain:

// app/jvmMain
actual class Foo

// app/commonMain
expect class Foo

// app/commonTest
fun main() {
    Foo() // Ok, calls Foo from jvmMain
}

IDE and compiler don’t agree on selected overload

When several overloads are declared in lib/commonMain and lib/jvmMain, the IDE currently interprets the call from app/commonMain differently from the compiler:

// lib/commonMain
fun foo(x: Any) = "common"

// lib/jvmMain
fun foo(x: String) = "platform"

// app/commonMain
fun main() {
    // "Go to declaration" on foo() jumps to lib/commonMain,
    // but at runtime "platform" is printed
    println(foo(""))
}

The IDE resolves the foo("") call to the declaration fun foo(x: Any) in lib/commonMain, as it assumes that common code can only depend on common declarations. But during the actual compilation app/commonMain currently sees both declarations and chooses the more specific overload fun foo(x: String). At runtime, “platform” is printed.

With the new compilation scheme, the call is resolved to fun foo(x: Any) in lib/commonMain and at runtime, and “common” is printed.

Unexpected type inference

A trickier problem can occur when the error is triggered not at the app/commonMain call site, but in platform code. In the following example the IDE actually sees no problem, but the JVM compilation fails.

actual classes are allowed to have different supertypes than their expect counterparts, so you can reasonably arrive at the following code structure:

// eventsLib/commonMain
interface Event { val name: String }

expect class ClickEvent(target: String) : Event { override val name: String }
expect class ScrollEvent(offset: Int) : Event { override val name: String }

// eventsLib/jvmMain — serialized events get queued or stored in a session
actual class ClickEvent actual constructor(target: String) : Event, Serializable { /* ... */ }
actual class ScrollEvent actual constructor(offset: Int) : Event, Serializable { /* ... */ }

// app/commonMain
fun currentEvent() = if (clicked()) ClickEvent("buy") else ScrollEvent(120)

fun report() = currentEvent().name // e: Unresolved reference 'name' only on the JVM

The IDE only matches commonMain declarations, which allows it to (correctly) infer the return type of currentEvent() as Event and resolve the .name reference.

On JVM, however, the library declares an additional supertype for each actual class. When compiling app for the JVM, the compiler currently resolves common code against the eventsLib JAR which has the eventsLib/jvmMain version of the classes. With the two supertypes, the return type inference for the currentEvent() call arrives at Any, which doesn’t have a .name, and the JVM compilation fails.

With the separate compilation enabled, app/commonMain code is resolved only against eventsLib/commonMain declarations. So when compiling the JVM target of app, the compiler already has the resolved common code and has inferred the Event return type for the currentEvent() function. The JVM compilation runs separately, doesn’t have to infer anything, and finishes successfully.

How to enable separate compilation

The separate compilation feature is Experimental and disabled by default. To opt in, add the following compiler option to your gradle.properties file (note the known issues below):

kotlin.kmp.separateCompilation=true

Known issues

For separate compilation to work correctly in KMP projects, it is important that authors of multiplatform libraries publish the metadata KLIBs. This is the default behavior for publishing tasks of the KMP Gradle plugin, but the new compilation scheme makes metadata KLIBs essential.

There are some known issues with KMP separate compilation that are still being fixed:

  • Some problems with commonization of cinterops (like KT-88178 or KT-41509). These are unlikely to affect an average KMP project, but enable the separate compilation mode with caution if you use C interoperability.
  • KMP modules with common source sets and a single declared target are not affected by separate compilation for now.
  • Various smaller issues such as KT-88148.

Send feedback

We’d be grateful for any feedback you have on separate compilation: leave a comment in the dedicated YouTrack issue.

show more
Continuing to Move PHP Open Source Forward
Feed: The JetBrains Blog (https://blog.jetbrains.com/feed/)
Published: 2026-09-24 09:46:38 | Created: 2026-09-24 10:56:56

A year ago, we introduced the first wave of PhpStorm’s open-source sponsorships. We truly believe in the power of open source and the importance of it to the PHP community, and so we want to do our bit, too. 

Each year, we pick five open-source projects to sponsor for a whole year. Our goal is not only to financially support these projects but also to raise awareness of the crucial role open source plays in PHP development and to encourage others to pitch in as well.

Before announcing the new projects, I want to thank everyone for sending in their suggestions. We know there are many more projects to sponsor, and we had to make some tough decisions. Eventually, we decided on projects we thought would have the biggest impact and the greatest need for financing.

So here goes, the new projects on our sponsor list:

  • Sebastian Bergmann, the creator and maintainer of PHPUnit, the most impactful test suite for PHP. 
  • George Dumitrescu, who’s creating Lerd, an open source tool for managing local PHP installations and servers.
  • Jerry Ma, who’s creating static-php-cli; a tool used for example by FrankenPHP and Native PHP.
  • Composer, which is basically the backbone of modern PHP.
  • Larabelles, because open source is about more than code; inclusivity is crucial.

If you or your company are in a position to pitch in as well, we would highly recommend doing so. Every bit and piece becomes a substantial difference when added together. Apart from sponsoring individual projects, we also stay committed to sponsoring the PHP Foundation, and encourage as many organizations to do so as well.

Let’s work together to continue to make PHP the best it can be!

show more
Page 1 of 4 (180 total items)