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

<channel>
	<title>RubyMine : Intelligent Ruby and Rails IDE | The JetBrains Blog</title>
	<atom:link href="https://blog.jetbrains.com/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.jetbrains.com</link>
	<description>Developer Tools for Professionals and Teams</description>
	<lastBuildDate>Thu, 26 Mar 2026 12:37:33 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.jetbrains.com/wp-content/uploads/2024/01/cropped-mstile-310x310-1-32x32.png</url>
	<title>RubyMine : Intelligent Ruby and Rails IDE | The JetBrains Blog</title>
	<link>https://blog.jetbrains.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>RubyMine 2026.1: AI Chat Upgrades, New Code Insight, Stable Remote Development, and More </title>
		<link>https://blog.jetbrains.com/ruby/2026/03/rubymine-2026-1-ai-chat-upgrades-new-code-insight-stable-remote-development-and-more/</link>
		
		<dc:creator><![CDATA[Alexey Varfolomeev]]></dc:creator>
		<pubDate>Thu, 26 Mar 2026 12:13:26 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/03/RM-releases-BlogFeatured-1280x720-1-2.png</featuredImage>		<product ><![CDATA[ruby]]></product>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[ai-assistant]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[ai-chat]]></category>
		<category><![CDATA[claude-agent]]></category>
		<category><![CDATA[jetbrains]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[release]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=691179</guid>

					<description><![CDATA[RubyMine 2026.1 is here! This release brings a range of improvements aimed at making Ruby and Rails development faster and more enjoyable. You can get the new build from our&#160;website&#160;or via the free&#160;Toolbox App. Let’s take a look at the highlights of this release. AI RubyMine continues to evolve as an open platform that lets [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>RubyMine 2026.1 is here! This release brings a range of improvements aimed at making Ruby and Rails development faster and more enjoyable. </p>



<p>You can get the new build from our&nbsp;<a href="https://www.jetbrains.com/ruby/download" target="_blank" rel="noreferrer noopener">website</a>&nbsp;or via the free&nbsp;<a href="https://www.jetbrains.com/toolbox/app/" target="_blank" rel="noreferrer noopener">Toolbox App</a>.</p>



<p>Let’s take a look at the highlights of this release.</p>



<figure class="wp-block-image size-full is-style-default"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" fetchpriority="high" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/RM-releases-BlogFeatured-1280x720-1-1.png" alt="" class="wp-image-692257"/></figure>



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



<p>RubyMine continues to evolve as an open platform that lets you bring your preferred AI tools directly into your development workflow. With RubyMine 2026.1, working with multiple AI agents and integrating them into your IDE experience is now easier than ever.</p>



<h3 class="wp-block-heading"><strong>Use more AI agents in RubyMine</strong></h3>



<p>In addition to Junie and Claude Agent, you can now choose more agents in the AI chat, including <a href="https://blog.jetbrains.com/ai/2026/01/codex-in-jetbrains-ides/">Codex</a>. Additionally, <a href="https://blog.jetbrains.com/ai/2026/03/cursor-joined-the-acp-registry-and-is-now-live-in-your-jetbrains-ide/">Cursor</a> and GitHub Copilot, along with dozens of external agents, are now supported via the <a href="https://www.jetbrains.com/acp/" target="_blank" rel="noopener">Agent Client Protocol (ACP)</a>. With the new <a href="https://blog.jetbrains.com/ai/2026/01/acp-agent-registry/">ACP Registry</a>, you can discover available agents and install them in just one click.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/acp_registry.png" alt="Install From ACP Registry option in AI chat" class="wp-image-691192"/></figure>



<h3 class="wp-block-heading"><strong>Work with connected databases directly in the AI chat</strong></h3>



<p>The AI chat integration for Codex and Claude Agent now offers full, native support for your connected databases. With that, you can now query, analyze, and modify your database state using natural language right from the IDE. </p>



<p>The same functionality is available for external agents via <a href="https://www.jetbrains.com/help/ai-assistant/mcp.html" target="_blank" rel="noopener">MCP server</a>.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/ai_db-1.png" alt="Accessing rails project databases from AI chat using Claude Agent" class="wp-image-692294"/></figure>



<h3 class="wp-block-heading"><strong>Get next edit suggestions throughout your file</strong></h3>



<p>Next edit suggestions are now available without consuming AI quota of your JetBrains AI Pro, Ultimate and Enterprise subscriptions.<strong> </strong>These suggestions go beyond what is offered by traditional code completion for your programming language. Instead of updating only what’s at your cursor, they intelligently apply related changes across the entire file, helping you keep your code consistent and up to date with minimal effort.</p>



<p>This natural evolution of code completion delivers a seamless <em>Tab Tab</em> experience that keeps you in the flow.&nbsp;</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/next_edit_suggestions.png" alt="Enabling next edit suggestions for AI Assistant" class="wp-image-691225"/></figure>



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



<h3 class="wp-block-heading"><strong>Try the new code insight engine (Beta)</strong></h3>



<p>RubyMine 2026.1 introduces a new, currently experimental, <a href="https://www.jetbrains.com/help/ruby/code-insight.html" target="_blank" rel="noopener">symbol-based language modeling engine</a>.</p>



<p>This engine changes how RubyMine understands classes, modules, and constants (support for methods is planned for future releases), laying the groundwork for faster and more reliable code insight.</p>



<p>Our internal benchmarks show significant improvements.<br><br><strong>Qualified first-element constant completion</strong> is about 40% faster, while the overall time for constant completion improved by roughly 50%. <strong>Type-matched completion for exceptions</strong> became dramatically faster – by about 95%. In addition, the performance of <strong><em>Find Usages</em></strong> improved by around 60% in large projects and by about 15% in typical cases.</p>



<p>Additional areas that benefit from the new engine include:</p>



<ul>
<li><em>Rename</em> refactoring<br></li>



<li><em>Quick Documentation</em>,<em> Quick Definition</em>, and<em> Ctrl+Hover</em> hints<br></li>



<li><em>Structure</em> view<br></li>



<li>Navigation (<em>Go to Declaration</em> and <em>Go to Type Declaration</em>)<br></li>
</ul>



<p>Because the engine is still in Beta, it is disabled by default. You can enable it in <em>Settings | Languages &amp; Frameworks | Ruby | Code Insight.</em></p>



<p>Give it a try and share your feedback!</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/new_code_insight.png" alt="Enabling experimental code insight for Ruby" class="wp-image-691236"/></figure>



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



<h3 class="wp-block-heading"><strong>Boost your productivity with Stable remote development</strong></h3>



<p>Remote development officially moves out of Beta and becomes Stable in RubyMine 2026.1.</p>



<p>You can now connect to your development environments via SSH, Dev Containers, or WSL 2, and the IDE backend will run on the remote machine while the user interface remains fast and responsive on your local device.</p>



<p>This setup gives you the full RubyMine experience wherever your code lives.</p>



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



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



<h3 class="wp-block-heading"><strong>Work seamlessly with variables passed via </strong><strong>render</strong></h3>



<p>RubyMine now correctly recognizes local variables passed via render.</p>



<p>Variables provided through the locals: option are no longer marked as unresolved and appear in code completion.</p>



<p>This behavior works consistently across views, layouts, partials, and templates (ERB and HAML), providing cleaner code insight and fewer unnecessary warnings.</p>



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



<h3 class="wp-block-heading"><strong>Detect deprecated Rails associations instantly</strong></h3>



<p>Keeping Rails projects modern and maintainable is now easier with improved deprecation detection.</p>



<p>When a Rails association is marked as deprecated (for example, <code>has_many :posts,  deprecated: true</code>), RubyMine highlights all its usages throughout your project and shows a clear deprecation notice in the <em>Quick Documentation</em> popup.</p>



<p>This helps you identify outdated APIs early and update your code proactively.</p>



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



<h3 class="wp-block-heading"><strong>Use Rails virtual database columns</strong></h3>



<p>RubyMine 2026.1 adds recognition for virtual generated columns from PostgreSQL 18 (or later versions) in Rails projects.</p>



<p>These non-persisted columns behave just like regular attributes in the IDE. Code completion, type hints, and navigation to the column definition in <code>schema.rb</code> work seamlessly.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/virtual_columns.png" alt="Recognizing virtual database columns in Rails" class="wp-image-692180"/></figure>



<h2 class="wp-block-heading"><strong>Ruby and RBS</strong></h2>



<h3 class="wp-block-heading"><strong>Use endless methods with access modifiers</strong></h3>



<p>RubyMine now fully supports Ruby 4.0 endless methods with access modifiers. Code such as <code>private def hello = puts "Hello"</code> is now parsed correctly and no longer produces errors.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/endless_methods.png" alt="Supporting endless methods with access modifiers" class="wp-image-692191"/></figure>



<h3 class="wp-block-heading"><strong>Use more Ruby and RBS operators in completion</strong></h3>



<p>You can now type Ruby and RBS operators (<code>=</code>, <code>!</code>, <code>+</code>, <code>*</code>, and others) directly in the completion popup without closing it. This keeps you in the flow and helps you finish expressions faster.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/operators_complete.png" alt="Expanded range of operators in completion popup" class="wp-image-692202"/></figure>



<h3 class="wp-block-heading"><strong>Rename global variables safely</strong></h3>



<p>RubyMine now validates global variable names during renaming.</p>



<p>Invalid names such as <code>$foo!@#</code> are no longer allowed, preventing broken code and syntax errors. The IDE ensures renamed variables follow Ruby’s syntax rules, making refactoring safer and more reliable.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/invalid_name.png" alt="Alert notification about an invalid global variable name" class="wp-image-692213"/></figure>



<h3 class="wp-block-heading"><strong>Let RubyMine select the Ruby interpreter automatically</strong></h3>



<p>RubyMine 2026.1 can automatically detect the correct Ruby interpreter by analyzing configuration files such as <code>.ruby-version</code> or <code>.tool-versions</code>.</p>



<p>There are three scenarios:</p>



<ul>
<li><strong>Single match found</strong>: RubyMine sets the interpreter automatically so you can start coding immediately.<br></li>



<li><strong>Multiple matches or no match found</strong>: RubyMine shows a notification and helps you choose the correct interpreter.<br></li>



<li><strong>No configuration file found</strong>: RubyMine selects the latest installed MRI Ruby version as a safe default.<br></li>
</ul>



<p>If you prefer manual configuration, you can disable this behavior in <em>Settings | Languages &amp; Frameworks | Ruby.</em> Find more details in our <a href="https://www.jetbrains.com/help/ruby/configuring-language-interpreter.html#automatic_ruby_interpreter_selection" target="_blank" rel="noopener">docs</a>.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/ruby_sdk.png" alt="Updated Ruby settings page with the option of automatic Ruby interpreter selection" class="wp-image-692224"/></figure>



<h2 class="wp-block-heading"><strong>User experience improvements</strong></h2>



<h3 class="wp-block-heading"><strong>Debug failing tests faster with the diff viewer</strong></h3>



<p>RubyMine 2026.1 introduces a diff viewer for failed RSpec and minitest tests.</p>



<p>When a test fails, simply click <em>Click to see difference</em><strong> </strong>in the test results to open a side-by-side comparison of expected and actual values. This makes it much easier to identify the issue and fix failing tests quickly.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/03/diff_view.mp4"></video></figure>



<h3 class="wp-block-heading"><strong>Configure linting and formatting with ease</strong></h3>



<p>RubyMine now features a redesigned configuration for RuboCop and the standard gem, along with a new <em>Linting and Formatting</em> section in<em> Settings | Tools | RuboCop</em>.</p>



<p>You can choose from mutually exclusive options:</p>



<ul>
<li><em>Default</em><br></li>



<li><em>Standard gem inspections</em><br></li>



<li><em>Standard on save</em><br></li>



<li><em>RuboCop server mode</em><em><br></em></li>



<li><em>RuboCop on save</em><br></li>
</ul>



<p>The updated settings simplify configuration, prevent conflicts between tools, and integrate tightly with RubyMine formatting actions.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/03/rubocop.png" alt="Redesigned RuboCop settings page with new Linting and Formatting section" class="wp-image-692246"/></figure>



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



<h3 class="wp-block-heading"><strong>Plan ahead for the sunsetting of Code With Me</strong></h3>



<p>Starting with RubyMine 2026.1, Code With Me will be unbundled from JetBrains IDEs and distributed as a separate plugin on JetBrains Marketplace.</p>



<p>RubyMine 2026.1 will be the last IDE version to officially support Code With Me as the service is gradually sunset.</p>



<p>Read the full announcement and timeline in our <a href="https://blog.jetbrains.com/platform/2026/03/sunsetting-code-with-me/">blog post</a>.</p>



<h2 class="wp-block-heading">Stay in touch</h2>



<p>Follow <a href="https://twitter.com/rubymine" target="_blank" rel="noopener">RubyMine on X</a> to stay up to date on all the latest features.</p>



<p>We invite you to share your thoughts in the comments below. You can also suggest and vote for new features in our <a href="https://youtrack.jetbrains.com/issues/ruby" target="_blank" rel="noopener">issue tracker</a>.<br></p>



<p>Happy developing!<br></p>



<p>The RubyMine team</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Building LLM-Friendly MCP Tools in RubyMine: Pagination, Filtering, and Error Design</title>
		<link>https://blog.jetbrains.com/ruby/2026/02/rubymine-mcp-and-the-rails-toolset/</link>
		
		<dc:creator><![CDATA[Daniel Domjan]]></dc:creator>
		<pubDate>Wed, 25 Feb 2026 12:02:38 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/02/JB-social-BlogSocialShare-1280x720-1-9.png</featuredImage>		<category><![CDATA[ai]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[mcp]]></category>
		<category><![CDATA[rails]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=681154</guid>

					<description><![CDATA[RubyMine enhances the developer experience with context-aware search features that make navigating a Rails application seamless, a powerful analysis engine that detects problems in the source code, and integrated support for the most popular version control systems. With AI becoming increasingly popular among developers as a tool that helps them understand codebases or develop applications, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>RubyMine enhances the developer experience with <a href="https://www.jetbrains.com/ruby/features/#navigation-and-search" target="_blank" rel="noopener">context-aware search features</a> that make navigating a Rails application seamless, a powerful analysis engine that <a href="https://www.jetbrains.com/help/ruby/code-inspection.html" target="_blank" rel="noopener">detects problems in the source code</a>, and integrated support for the most popular <a href="https://www.jetbrains.com/ruby/features/#version-control" target="_blank" rel="noopener">version control systems</a>.</p>



<p>With AI becoming increasingly popular among developers as a tool that helps them understand codebases or develop applications, these RubyMine features provide an extra level of value. Indeed, with access to the functionality of the IDE and information about a given project, AI assistants can produce higher-quality results more efficiently.</p>



<p>To improve AI-assisted workflows, since 2025.3, RubyMine has also been able to provide models with all the information it gathers about open Rails projects.&nbsp;</p>



<p>In this blog post, we collected how we implemented the new Rails toolset and what we’ve learned about MCP tool design in the process from a software engineering perspective.</p>



<h2 class="wp-block-heading">What Is Model Context Protocol (MCP)?</h2>



<p>MCP, or <a href="https://modelcontextprotocol.io/docs/getting-started/intro" target="_blank" rel="noopener">Model Context Protocol</a>, is an open-source standard that enables AI applications to seamlessly communicate with external clients. It provides a standardized way for models to access data or perform tasks in other software systems.</p>



<h2 class="wp-block-heading">How MCP Servers Work in IntelliJ-Based IDEs</h2>



<p>IDEs built on the IntelliJ Platform come with their own integrated MCP servers, making it easy for both internal and external applications, such as <a href="https://www.jetbrains.com/ai-assistant/" target="_blank" rel="noopener">JetBrains AI Assistant</a> or <a href="https://code.claude.com/docs/en/jetbrains" target="_blank" rel="noopener">Claude Code</a>, to interact with them. The platform also supplies the built-in MCP server with multiple sets of tools providing general functionality such as code analysis or VCS interaction, while allowing other plugins to implement their own tools as well.</p>



<div class="wp-block-columns is-layout-flex wp-container-24 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:5%"></div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.20.56.png" alt="Toolsets supplied by the IntelliJ Platform and RubyMine" class="wp-image-681315"/></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:5%"></div>
</div>



<p>RubyMine 2025.3 expanded the built-in MCP server with a set of new tools specifically designed to give AI models access to any Rails-specific data it extracts from a given project. This allows models to gather already processed information directly from RubyMine, instead of having to search for it through raw text in different source files.</p>



<p>However, while developing this toolset, we encountered a number of obstacles inherent to the process of working with large language models.&nbsp;</p>



<p>Let’s take a look at what these obstacles are and how we’ve overcome them to ensure that models can use the new tools smoothly in an AI-assisted workflow.</p>



<h2 class="wp-block-heading">Context Window Limit</h2>



<p>Large language models operate within a fixed <a href="https://www.jetbrains.com/help/ai-assistant/supported-llms.html" target="_blank" rel="noopener">context window</a>, which limits how much information they can process at once. Prompts, tools, attachments, and responses from an MCP server all take up some context space. Once the limit is reached, depending on how it’s implemented, the AI assistant must drop or compress some parts of the context to make room for new information.</p>



<div class="wp-block-columns is-layout-flex wp-container-28 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:26.5%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.21.55-2.png" alt="The layout of a Large Language Model Context Window." class="wp-image-681464"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:26.5%"></div>
</div>



<p>Consider a large Ruby on Rails application such as <a href="https://gitlab.com/gitlab-org/gitlab" target="_blank" rel="noopener">GitLab</a>. Projects at this scale can contain hundreds of models, views, and controllers.&nbsp;</p>



<p>The information about a single controller that the <code>get_rails_controllers</code> tool returns also contains every object associated with it.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "class": "Controller (/path/to/controller.rb:line:col)",
  "isAbstract": false,
  "managedViews": ["/path/to/view.html.erb"],
  "managedPartialViews": ["/path/to/_view.html.erb"],
  "managedLayouts":  ["/path/to/layout.html.erb"],
  "correspondingModel": "Model (/path/to/model.rb:line:col)"
}</pre>



<p>One way to implement this tool would be to simply return a single list of controller descriptions. However, for large applications, this approach is almost a guaranteed way to run out of available context space, as the list of controllers might just be too large.</p>



<div class="wp-block-columns is-layout-flex wp-container-32 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:22%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.22.54.png" alt="Returned tools not fitting in the context window." class="wp-image-681337"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:22%"></div>
</div>



<p>Also, some clients, such as <a href="https://www.jetbrains.com/ai-assistant/" target="_blank" rel="noopener">JetBrains AI Assistant</a>, may proactively <a href="https://www.jetbrains.com/help/ai-assistant/ai-chat.html#set-message-trimming-threshold" target="_blank" rel="noopener">trim responses</a> that exceed a certain portion of the context window before forwarding them to the model, resulting in even more data loss.&nbsp;</p>



<h2 class="wp-block-heading">Pagination Strategies: Offset vs Cursor</h2>



<p>To mitigate these issues, we allow the model to retrieve the data in arbitrarily sized chunks with pagination.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="ruby" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">get_rails_controllers(page, page_size)</pre>



<p>With offset-based pagination, a page is defined as a number of items starting from an offset relative to the beginning of the dataset. Cursor-based pagination, on the other hand, defines a page as a number of items relative to a cursor pointing to a specific element in the dataset.&nbsp;</p>



<p>Offset-based pagination has lower implementation costs, hence it is mostly used for static data. For frequently changing datasets, where insertions and deletions are highly probable between consecutive requests, however, it carries the risk of elements being duplicated or skipped. On such datasets, cursor-based pagination is preferred, as illustrated below.</p>



<div class="wp-block-columns is-layout-flex wp-container-36 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:24%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.18.51.png" alt="Showcasing offset-based and cursor-based paginations." class="wp-image-681304"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:24%"></div>
</div>



<p>Notice that with offset-based pagination, item 1 is returned on both pages 1 and 2, and item 2 is skipped over, while cursor-based pagination correctly returns every item in order.</p>



<p>RubyMine’s Rails tools operate on a snapshot of the application state, where every element in the project is known at the time of the first request and is returned from RubyMine’s cache, which rarely needs to be recalculated between fetching 2 pages. Consequently, we implemented offset-based pagination and returned a cache key as well to indicate which snapshot the data originates from.</p>



<div class="wp-block-columns is-layout-flex wp-container-40 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:25%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.24.33.png" alt="The LLM receives two pages with a different cache key." class="wp-image-681348"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:25%"></div>
</div>



<p>With caching, if a modification happens, and the cache is recalculated, data from older snapshots is considered to be invalid. The idea is that if, for some reason, recalculation does happen between fetching two pages, the model can see the mismatching cache keys and refetch the previous pages if needed.</p>



<p>Besides the cache key, the returned data also contains the page number, the number of items on the page, the total number of pages, and the total number of items.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "summary": {
    "page": 1,
    "item_count": 10,
    "total_pages": 13,
    "total_items": 125,
    "cache_key": "..."
  },
  "items": [ ... ]
}</pre>



<p>Pagination makes it possible for the model to process the data progressively and stop early once the necessary information is obtained, without enumerating the full dataset. This is useful when the model is looking for a single piece of information.</p>



<div class="wp-block-columns is-layout-flex wp-container-44 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:3%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.26.29-1.png" alt="The LLM answers a question while using the rails toolset with early stopping." class="wp-image-681370"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:3%"></div>
</div>



<p>On the other hand, it is important to note that if the model needs to consider the entire dataset but that doesn’t fit in the context window, pagination alone is not sufficient. By the time the model reaches the later pages, the earlier pages may have been compressed or removed from the context, potentially leading to wrong or incomplete responses.</p>



<div class="wp-block-columns is-layout-flex wp-container-48 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:3%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.27.47.png" alt="Data is removed from the LLM context window due to reaching it's limits." class="wp-image-681381"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:3%"></div>
</div>



<h2 class="wp-block-heading">Tool Call Limit</h2>



<p>As we’ve established, pagination enables the model to process search queries by iterating through pages and stopping early once the answer is found. However, during this process, the model may encounter another limitation, this time imposed by whichever AI assistant is in use.</p>



<p>If the model makes too many consecutive tool calls, some applications may think it is stuck in an infinite tool calling loop and temporarily block the execution of further tools until the next user request. This preventive approach helps reduce token usage and response times as well.</p>



<div class="wp-block-columns is-layout-flex wp-container-52 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:5%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.31.07.png" alt="Tool calls beyond the allowed limit are getting ignored." class="wp-image-681392"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:5%"></div>
</div>



<p>If an agent enforces a limit of 15 tool calls, the model cannot iterate over 18 pages of data to locate the answer, as the sixteenth and later calls will be blocked.</p>



<p>This limits scaling the toolset on 2 axes. Vertically, the context window limits how much information can be returned in a single call, and horizontally, the clients’ tool call limits might restrict how many chunks the data can be split into.</p>



<div class="wp-block-columns is-layout-flex wp-container-56 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:9%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-14-5.33.45.png" alt="Tool call limit and context limit can be visualized on two axes." class="wp-image-681403"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:9%"></div>
</div>



<p>This means it is essential to utilize the available space as efficiently as possible. Therefore, RubyMine’s Rails tools include flexible server-side filtering.&nbsp;</p>



<h2 class="wp-block-heading">Designing Server-Side Filtering for LLM Efficiency</h2>



<p>Applying filters can significantly reduce the search space the model needs to explore, which means less context space is used, and fewer tool calls are needed to retrieve it.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="ruby" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">get_rails_views(
  page,
  page_size,
  partiality_filter,
  layout_filter,
  controller_filter,
  included_path_filters,
  excluded_path_filters,
  included_controller_fqn_filters,
  excluded_controller_fqn_filters,
  included_controller_directory_filters,
  excluded_controller_directory_filters
)</pre>



<p>The tools allow the model to apply filters to any property of the returned data, with support for positive and negative conditions where applicable. Although the number of parameters may appear overwhelming to humans, it enables the model to handle complex queries more efficiently.</p>



<div class="wp-block-columns is-layout-flex wp-container-60 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:3.5%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2026/02/Kepernyofoto-2026-02-23-14.22.25.png" alt="" class="wp-image-683204"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:3.5%"></div>
</div>



<h2 class="wp-block-heading">Tool Number Limit</h2>



<p>While implementing the toolset, we also examined multiple MCP clients and found that some enforce a hard limit on the number of discoverable tools. For instance, <a href="https://code.visualstudio.com/docs/copilot/chat/chat-tools#_im-getting-an-error-that-says-cannot-have-more-than-128-tools-per-request" target="_blank" rel="noopener">GitHub Copilot allows up to 128 tools</a>, <a href="https://junie.jetbrains.com/docs/junie-ide-plugin.html#view-available-tools" target="_blank" rel="noopener">Junie sets this limit at 100</a>, and <a href="https://forum.cursor.com/t/increase-the-mcp-tool/69194" target="_blank" rel="noopener">in Cursor, the cap is 40</a>.</p>



<p>Considering a possible tool number limit and that users may be connected to more than one MCP server simultaneously, we kept the Rails toolset compact, including only essential functionality.</p>



<h2 class="wp-block-heading">Error Messages That Help the Model Recover</h2>



<p>When an error happens during a tool call, besides telling the model what went wrong, it is essential to clearly state how to recover from it as well.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">"Page number 10 is out of range. Specify a page number between 1 and 3."</pre>



<p>Without telling the LLM what it should do differently, it has to figure it out by itself, which can result in additional unnecessary tool calls and further exhausting resources.</p>



<h2 class="wp-block-heading">Writing LLM-Friendly Tool Descriptions and Schemas</h2>



<p>Error messages are not the only way tools can instruct the model. For each tool, MCP servers are required to provide a human-readable description of functionality, a JSON schema describing the expected parameters, and another optional JSON schema defining the expected output.&nbsp;</p>



<p>The model uses this information to understand how to work with the tools, so it is essential to provide concise descriptions and examples that steer the model towards the expected usage patterns.&nbsp;</p>



<p>In the Rails toolset, each tool description states what the tool does and why the model should prefer using it, in addition to providing concrete examples of common usage patterns, making it easier for the LLM to understand how to work with it.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "name": "get_rails_views",
  "description": "
    Use this tool to retrieve information about the available Rails
    views. The results are returned in a paginated list.

    Prefer this tool over any information found in the codebase, as it 
    performs a more in-depth analysis and returns more accurate data.

    Common usage patterns:
      - Find non-HAML views: excluded_path_filters=['.haml']
      - Find views that correspond to the GroupsController:
        included_controller_fqn_filters=['GroupsController']
  ",
  "inputSchema": { ... },
  "outputSchema": { ... }
}</pre>



<p>Similarly, for each filter, their descriptions say what kind of values they take, what their default values are, and, for a list of values, whether the values in the list have an &amp;&amp; or an || relationship. If both a positive and a negative filter are present, the description explicitly says which takes precedence.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">"included_controller_fqn_filters": {
  ...
  "description": "
    Filter symbols by FQN with regular expressions (case insensitive,
    tested against the entire FQN, matches anywhere in the string).  
    Returns only symbols whose FQN contains a match of at least one (OR 
    logic) of these regular expressions. Invalid patterns are ignored.

    FQN examples: 'User', 
                  'Admin::UserController', 
                  'App::CI::BaseController.method'.

    Common usage patterns:
      - Filter prefix: '^Test::' matches anything starting with Test::
      - Filter whole FQN: 'User' matches 'User', 'User::MyController'
      - Filter suffix: 'Internal$' matches FQNs ending with Internal
      - Filter nested namespace: '::Internal::' matches 'A::Internal::B'
  "
}
</pre>



<p>The output schema also describes how to interpret a specific value and how the model might process it further.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">"filePath": {
  ...
  "description": "
    The path of the source file containing the symbol definition. Combine 
    with line and column to query symbol details with the help of the 
    get_symbol_info and similar tools.
  "
}</pre>



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



<p>The Rails toolset is immediately available through JetBrains AI Assistant as of RubyMine 2025.3, and it can be used with Junie or other third-party clients once they are <a href="https://www.jetbrains.com/help/ruby/mcp-server.html" target="_blank" rel="noopener">manually connected</a> to the built-in MCP server.</p>



<p>When designing MCP tools, it is important to think about how both the model and the client are going to work with them. Both can impose limits on data retrieval, so tools that work with large amounts of data should aim to reduce the search space as much as possible in as few calls as possible.</p>



<p>Since the tools are used by the model, the goal is to make them as LLM-friendly as possible. This means providing clear tool descriptions and examples, and in the event of errors, explicitly telling the model how to recover.</p>



<p>Some clients are known to limit the number of tools they can handle, and it’s safe to assume that a client is connected to multiple MCP servers, so it’s best to keep the toolset as compact as possible to not take away too much space from other tools.</p>



<p>We invite you to try our new toolset on your own Rails project in RubyMine and let us know your thoughts.</p>



<p>Happy developing!</p>



<p>The RubyMine team</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ruby Turns 30: A Celebration of Code, Community, and Creativity</title>
		<link>https://blog.jetbrains.com/ruby/2025/12/ruby-turns-30-a-celebration-of-code-community-and-creativity/</link>
		
		<dc:creator><![CDATA[Alexey Varfolomeev]]></dc:creator>
		<pubDate>Thu, 25 Dec 2025 09:11:01 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/12/JB-social-BlogFeatured-1280x720-1-7.png</featuredImage>		<product ><![CDATA[ruby]]></product>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby-on-rails]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=670121</guid>

					<description><![CDATA[Created by Yukihiro “Matz” Matsumoto and first released in 1995, Ruby arrived with a purpose that was simple but profound: to make coding more human, more intuitive, and more enjoyable. Its object-oriented model, dynamic typing, and elegant syntax offered a fresh alternative to the heavier and more complex languages of that era. As Ruby marks [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Created by Yukihiro “Matz” Matsumoto and first released in 1995, Ruby arrived with a purpose that was simple but profound: to make coding more human, more intuitive, and more enjoyable. Its object-oriented model, dynamic typing, and elegant syntax offered a fresh alternative to the heavier and more complex languages of that era.</p>



<p>As Ruby marks its 30th anniversary alongside the release of Ruby 4.0, we on the RubyMine team want to reflect on the path that led the language to where it is today and honor this remarkable milestone.</p>



<p>This year, with Ruby turning 30, <a href="https://www.jetbrains.com/ruby/promo/" target="_blank" rel="noopener">we’re making RubyMine free for non-commercial use</a>, helping nurture the next generation of Ruby developers and supporting a thriving community.</p>



<p><em><a href="https://www.jetbrains.com/ruby/download/" target="_blank" rel="noopener">Click here </a>to try Ruby 4.0 in RubyMine for free</em>.</p>



<h2 class="wp-block-heading">From revolutionary philosophy to thriving community</h2>



<p>Since its inception, Ruby has been more than a set of language constructs. Matz built it around the Principle of Least Surprise, so code would read naturally and behave as developers expect. Ruby’s “Everything is an object” model and its expressive method syntax made everyday tasks clearer, while metaprogramming enabled elegant, domain-specific abstractions. The vision for the language highlights readability and flexibility, showing that the way we write code is as important as the result.</p>



<p>This philosophy spread throughout the community, emphasizing practical, elegant solutions over hype and leading to the creation of valuable tools like:</p>



<ul>
<li><strong>Bundler</strong>, by Yehuda Katz and Carl Lerche, which enabled reliable team collaboration through dependency management.&nbsp;</li>



<li><strong>RSpec</strong>, initiated by Steven Baker and refined by David Chelimsky and others, which made behavior-driven testing natural to read and write.&nbsp;</li>



<li><strong>RuboCop</strong>, maintained by Bozhidar Batsov, which brought a shared foundation for code style and automated linting.</li>
</ul>



<p>Together, these tools extended Ruby, which today is more than a language: It is a community, a set of conventions, and a mindset that values craftsmanship and expressive, maintainable code.</p>



<h2 class="wp-block-heading">The path to modern excellence</h2>



<p>Over the years, Ruby has advanced to meet constantly increasing demands and evolving development paradigms. Here’s a closer look at the milestones that shaped the language.</p>



<p><strong>Ruby 1.x (2003–2007)</strong></p>



<p>Ruby 1.8 stabilized the language with mature libraries and solid object-oriented foundations, paving the way for early web frameworks like Rails. Ruby 1.9 introduced the YARV VM, improving speed, regex handling, and syntax. Upgrading to v1.9 cut web request times nearly in half, making Ruby practical for real applications.</p>



<p><strong>Ruby 2.x (2013–2018)</strong></p>



<p>Ruby 2.x boosted reliability and added features to help developers be more productive. Keyword arguments clarified method calls, refinements allowed safer class changes, and incremental GC improved performance. Enhanced libraries simplified tasks like JSON parsing and date handling, helping developers scale complex projects.</p>



<p><strong>Ruby 3.x (2020–2023)</strong></p>



<p>Ruby 3.x delivered on the long-promised <a href="https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/" target="_blank" rel="noopener">vision of Ruby 3×3</a>. Ractors enabled parallelism, JIT improved real-world performance, and RBS with TypeProf added static analysis and safer refactoring. The update reinforced Ruby’s readable, flexible, and productive coding philosophy.</p>



<p><strong>Ruby 4.0 (2025)</strong></p>



<p>The <a href="https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released" target="_blank" rel="noopener">latest version</a> comes with ZJIT, a method-based JIT compiler that redefines Ruby’s performance potential. It also introduces Ruby::Box, an experimental namespace-on-read mode, and notable Ractor improvements, such as Ractor::Port and safer shareable Proc objects.</p>



<h2 class="wp-block-heading">Ruby’s global impact</h2>



<p>The early 2000s brought a transformative moment with the release of <strong>Ruby on Rails</strong>. Created by David Heinemeier Hansson and released in 2004, Rails paired Ruby’s transparency and natural flow with a framework that emphasized convention over configuration, streamlined workflows, and rapid development.&nbsp;</p>



<p>Suddenly, Ruby became the engine behind a new generation of web startups, proving that elegant design could coexist with productivity and scale.</p>



<p>Ruby’s influence quickly spread to platforms that reshaped the digital world. Here are some of the standout projects:</p>



<ul>
<li><strong>GitHub</strong>, launched in 2008, relied on Rails and Ruby’s syntax to build a collaborative environment capable of handling millions of developers and repositories.&nbsp;</li>



<li><strong>Shopify</strong>, which was created in 2006 and now boasts the title of the <a href="https://world.hey.com/dhh/six-billion-reasons-to-cheer-for-shopify-55720846" target="_blank" rel="noopener">world’s biggest app</a> powered by Ruby and Rails, scaled from a platform supporting small online shops to a global e-commerce powerhouse.</li>



<li><strong>Airbnb</strong>, founded in 2008, used Ruby to power dynamic booking systems, host management, and pricing algorithms, enabling the platform to expand worldwide.&nbsp;</li>



<li><strong>Homebrew</strong>, created by Max Howell in 2009 to simplify software installation and dependency management on macOS, was built using Ruby and serves millions of developers.</li>
</ul>



<p>Today, Ruby continues to be a popular choice for young startups, including Whop, a Gen‑Z marketplace, and Chime, a rapidly growing fintech company. Both of these projects leverage Ruby on Rails to build scalable and modern platforms, highlighting the framework’s enduring relevance.</p>



<h2 class="wp-block-heading">Refining the Ruby experience with RubyMine</h2>



<p>Introduced by JetBrains in 2009, RubyMine was built as a dedicated IDE designed to bring the full expressive power of Ruby and Rails to developers. With deep code understanding for metaprogramming, smart navigation aligned with Rails conventions, robust testing framework support, and debugging tools, RubyMine enables developers to work efficiently while staying true to the spirit of the language.</p>



<p>More than just supporting the ecosystem, RubyMine actively helps shape it. As Ruby continues to evolve, introducing new syntax, technologies, libraries, and development approaches, RubyMine quickly adopts and supports these changes, providing developers with up-to-date, practical tooling from day one.&nbsp;</p>



<p>By delivering advanced static analysis, powerful refactoring tools, and a continuously updated understanding of the language, RubyMine contributes directly to Ruby’s ongoing popularity and relevance. Its design reflects Ruby itself; it’s powerful, ever-evolving, and built to make coding enjoyable.&nbsp;</p>



<h2 class="wp-block-heading">Final words</h2>



<p>As Ruby enters its fourth decade, we celebrate not only the language but also the people whose passion, creativity, and dedication have made it thrive. From mentors and contributors to conference organizers and Rails developers worldwide, this community embodies the spirit that keeps Ruby vibrant and evolving.</p>



<p>The RubyMine team is proud to pay tribute to both this inspiring language and the people who bring it to life.</p>



<p><br>The RubyMine team</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Join the RubyMine Team on Reddit AMA Session</title>
		<link>https://blog.jetbrains.com/ruby/2025/12/join-the-rubymine-team-on-reddit-ama-session/</link>
		
		<dc:creator><![CDATA[Iryna Pisklyarova]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 09:53:42 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/12/251128_JB_Reddit-Individual-Posts_10_16x9_JL_V1.png</featuredImage>		<category><![CDATA[news]]></category>
		<category><![CDATA[ama]]></category>
		<category><![CDATA[reddit]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubymine]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=666493</guid>

					<description><![CDATA[The RubyMine team will be stopping by r/jetbrains on December 11 from 1–5 pm CET and doing an Ask Me Anything (AMA) thread. You&#8217;re invited to join us! This isn’t a product launch or a marketing campaign – it’s a chance to have an open conversation about RubyMine and the challenges you face as a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The RubyMine team will be stopping by<strong> </strong><a href="https://www.reddit.com/r/Jetbrains/" data-type="link" data-id="https://www.reddit.com/r/Jetbrains/" target="_blank" rel="noopener">r/jetbrains</a> on December 11 from 1–5 pm CET and doing an<strong> <a href="https://www.reddit.com/r/Jetbrains/comments/1pi37ky/ama_session_with_the_rubymine_team_december_11th/" data-type="link" data-id="https://www.reddit.com/r/Jetbrains/comments/1pi37ky/ama_session_with_the_rubymine_team_december_11th/" target="_blank" rel="noopener">Ask Me Anything (AMA) thread</a></strong>. You&#8217;re invited to join us!</p>



<p>This isn’t a product launch or a marketing campaign – it’s a chance to have an open conversation about RubyMine and the challenges you face as a Ruby and Rails developer.&nbsp;</p>



<h2 class="wp-block-heading">How to Participate</h2>



<p><strong>When:</strong> December 11, 1:00–5:00 pm CET (7:00–11:00 am EST)</p>



<p><strong>Where:</strong> <a href="https://www.reddit.com/r/Jetbrains/comments/1pi37ky/ama_session_with_the_rubymine_team_december_11th/" data-type="link" data-id="https://www.reddit.com/r/Jetbrains/comments/1pi37ky/ama_session_with_the_rubymine_team_december_11th/" target="_blank" rel="noopener">r/jetbrains</a></p>



<p><strong>Format:</strong>Drop your questions in the AMA thread anytime during the session.<br>We’ll be online responding in real time, but if you can’t make it live, you can post your questions early. This AMA is your chance to tell us what matters most, what’s working well, what’s not, and where we can do better.</p>



<h2 class="wp-block-heading">Who You’ll Be Talking To</h2>



<p>The following members of the RubyMine team will be there to answer your questions:&nbsp;</p>



<ul>
<li>Dmitry Pogrebnoy (<a href="https://www.reddit.com/user/DmitryPogrebnoy/" target="_blank" rel="noopener">u/DmitryPogrebnoy</a>) &#8211; RubyMine Team Lead</li>



<li>Mikhail Veselov (<a href="https://www.reddit.com/user/MikhailVeselov/" target="_blank" rel="noopener">u/MikhailVeselov</a>) &#8211; RubyMine Product Manager</li>



<li>Olga Kuvardina (<a href="https://www.reddit.com/user/SeekingRuby/" target="_blank" rel="noopener">u/SeekingRuby</a>) &#8211; RubyMine Support Engineer</li>



<li>Jan-Niklas Wortmann (<a href="https://www.reddit.com/user/jan-niklas-wortmann/" target="_blank" rel="noopener">u/jan-niklas-wortmann</a>) &#8211; Developer Advocate for AI</li>
</ul>



<h2 class="wp-block-heading">Why We&#8217;re Hosting This AMA</h2>



<p>We know that great tools are built in collaboration with the people who use them every day. That’s why we want to talk directly with you about not only features, but how RubyMine actually fits into your daily workflows.</p>



<p>Your feedback is foundational to our roadmap. It helps us boost performance, refine the tools you already rely on, and choose what to build next.</p>



<p>So ask away! Whether you’re curious about the new <a href="https://www.jetbrains.com/ruby/whatsnew/" target="_blank" rel="noopener">RubyMine 2025.3 release</a>, the <a href="https://www.jetbrains.com/help/ruby/debugging-code.html" target="_blank" rel="noopener">debugger</a>, <a href="https://www.jetbrains.com/help/ruby/navigating-through-the-source-code.html" target="_blank" rel="noopener">code navigation</a>, existing <a href="https://www.jetbrains.com/ruby/features/" target="_blank" rel="noopener">features</a>, or the<a href="https://blog.jetbrains.com/ruby/2025/12/rubymine-2025-3-multi-agent-ai-chat-rails-aware-mcp-server-faster-multi-module-projects-startup-and-more/"> latest AI enhancements</a> – we’re here to chat.</p>



<h2 class="wp-block-heading">Part of JetBrains AMA Week</h2>



<p>The RubyMine AMA is part of JetBrains AMA Week, a series of live Reddit discussions where teams from across JetBrains are connecting directly with their communities. Each AMA focuses on a specific product, giving users a space to share their experiences, ideas, and feedback.</p>



<p>If you have questions about JetBrains AI Assistant features specifically, the AI team is doing an AMA on December 12 at 1:00–5:00 pm CET, where they’ll be able to answer questions about their strategy and the direction they’re headed in. We&#8217;re happy to discuss how AI features work in RubyMine and your feedback on them, but for more general questions about JetBrains AI, you’ll be better off consulting the AI team.</p>



<p>See the full AMA Week schedule <a href="https://www.reddit.com/r/Jetbrains/comments/1pbcrk9/jetbrains_ama_week_dec_8th_to_12th/" target="_blank" rel="noopener">here</a>.</p>



<p>We’re looking forward to hearing from you on December 11 at 1:00 pm CET!</p>



<p>The RubyMine team</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RubyMine 2025.3: Multi-Agent AI Chat, Rails-Aware MCP Server, Faster Multi-Module Projects Startup, and More</title>
		<link>https://blog.jetbrains.com/ruby/2025/12/rubymine-2025-3-multi-agent-ai-chat-rails-aware-mcp-server-faster-multi-module-projects-startup-and-more/</link>
		
		<dc:creator><![CDATA[Alexey Varfolomeev]]></dc:creator>
		<pubDate>Mon, 08 Dec 2025 12:24:12 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/12/RM-releases-BlogFeatured-1280x720-1-2.png</featuredImage>		<category><![CDATA[releases]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[2025-3]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[ai-assistant]]></category>
		<category><![CDATA[release]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=662213</guid>

					<description><![CDATA[RubyMine 2025.3 is out! This blog post briefly goes over the highlights of the latest release. For a detailed description, check out our What’s New page.&#160; You can get the new build from our website or via the free Toolbox App. AI Assistant Multi-agent experience: Junie and Claude Agent With the addition of Claude Agent, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>RubyMine 2025.3 is out!<br></p>



<p>This blog post briefly goes over the highlights of the latest release. For a detailed description, check out our <a href="https://www.jetbrains.com/ruby/whatsnew/" target="_blank" rel="noopener">What’s New</a> page.&nbsp;</p>



<p>You can get the new build from our <a href="https://www.jetbrains.com/ruby/download" target="_blank" rel="noopener">website</a> or via the free <a href="https://www.jetbrains.com/toolbox/app/" target="_blank" rel="noopener">Toolbox App</a>.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/12/RM-releases-BlogFeatured-1280x720-1-1.png" alt="" class="wp-image-664822"/></figure>



<h2 class="wp-block-heading">AI Assistant</h2>



<h3 class="wp-block-heading"><strong>Multi-agent experience: Junie and Claude Agent</strong></h3>



<p>With the addition of <strong>Claude Agent</strong>, the first third-party AI agent fully integrated into JetBrains IDEs, your development workflow becomes more flexible and powerful.</p>



<p>Both <strong>Claude Agent</strong> and <strong>Junie</strong> are now accessible from the same chat interface, allowing you to seamlessly switch between them and get the right kind of assistance for every task, whether it’s code generation, debugging, or architecture guidance.</p>



<p><em>(You can keep using Junie in a separate tool window if you prefer.)</em></p>



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



<h3 class="wp-block-heading"><strong>Transparent AI quota tracking</strong></h3>



<p>Keeping track of your AI usage is now easier than ever. RubyMine shows your remaining AI Credits, renewal dates, and top-up options directly in the IDE. When your credits run out, you can top up instantly without leaving RubyMine.</p>



<p>This makes managing AI resources more convenient and gives you full visibility over your usage.</p>



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



<h2 class="wp-block-heading">Ruby and Rails</h2>



<h3 class="wp-block-heading"><strong>Smarter autocomplete for constants</strong></h3>



<p>Autocompletion now supports <strong>fuzzy searching across namespaces</strong>. Type parts of a class or module name – even nested ones – and RubyMine will suggest the right constants. For example, typing FoBa will bring up Foo::Bar.</p>



<p>For more precise suggestions, fuzzy completion can be disabled in <em>Settings</em>.</p>



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



<h3 class="wp-block-heading"><strong>Accurate type navigation for global variables</strong></h3>



<p><em>Go to Type Declaration</em> now works correctly for all global variables, making it easier to explore and understand your code.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/12/go_to_typedeclaration-2.gif" alt="" class="wp-image-664888"/></figure>



<h3 class="wp-block-heading"><strong>Full Unicode regex support</strong></h3>



<p>RubyMine no longer flags valid regex patterns with errors. You can now use Ruby’s extended Unicode syntax, including emojis and other characters, without any false warnings.</p>



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



<h3 class="wp-block-heading"><strong>Rails Project view sunset</strong></h3>



<p>Starting with RubyMine 2025.3, the <em>Rails</em> <em>Project</em> view has been removed. Modern Rails applications have grown too complex for a dedicated <em>Project</em> view to work reliably across all projects. Usage of this feature was also low.</p>



<p>The most useful parts of the <em>Rails</em> <em>Project</em> view, such as enhanced navigation and visibility of model attributes, will be reimplemented in a way that benefits all RubyMine users.</p>



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



<h3 class="wp-block-heading"><strong>Console-based installation&nbsp;</strong></h3>



<p>Bundler is now installed via the <em>Run</em> tool window instead of a modal dialog. RubyMine automatically installs the version your project requires, making setup smoother and preventing permission errors.</p>



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



<h3 class="wp-block-heading"><strong>Seamless gem installation in multi-module projects</strong></h3>



<p>If gem installation fails for one module, RubyMine continues installing gems for the remaining modules. Each failed module keeps its own error log on a separate tab, so you can inspect issues without interrupting the process.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/12/uninterrupted.gif" alt="" class="wp-image-664921"/></figure>



<h2 class="wp-block-heading">Code insight</h2>



<h3 class="wp-block-heading"><strong>Cleaner autocomplete after </strong><strong>::</strong></h3>



<p>Autocompletion of singleton methods after :: is now disabled by default. Typing String:: will show only classes, modules, and constants, reducing clutter while preserving accurate navigation.</p>



<p>This option can be re-enabled in <em>Settings</em> if you prefer.</p>



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



<h3 class="wp-block-heading"><strong>Rails-aware MCP server</strong></h3>



<p>The MCP server now includes Rails-specific tools. It automatically recognizes Rails code and project structure, making AI-assisted exploration faster and more reliable. The server comes preconfigured for AI Assistant but can also be used for external clients.</p>



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



<h2 class="wp-block-heading">Multi-module project performance</h2>



<h3 class="wp-block-heading"><strong>Accurate gem resolution</strong></h3>



<p>RubyMine now restricts code navigation, completion, and symbol resolution to the current module and its dependencies. This eliminates distractions from unrelated modules, making code insight precise and focused.</p>



<h3 class="wp-block-heading"><strong>Faster startup for multi-module projects</strong></h3>



<p>Startup for multi-module projects has been optimized. Each module is processed only once, progress bars are consolidated, and unnecessary background tasks have been removed, reducing clutter and notifications when opening large projects.</p>



<h2 class="wp-block-heading">Data collection</h2>



<p>The detailed data collection option in JetBrains IDEs, initially announced earlier this year, has been delayed to version 2025.3.1, as we are still working to incorporate your feedback. Among other things, we’re improving safeguards and streamlining the opt-out process for non-commercial users. If you want the full scoop, check out the <a href="https://blog.jetbrains.com/blog/2025/09/30/detailed-data-sharing-for-better-ai/">blog post</a>.</p>



<h2 class="wp-block-heading">Stay in touch</h2>



<p>Follow <a href="https://twitter.com/rubymine" target="_blank" rel="noopener">RubyMine on X</a> to stay up to date on all the latest features.</p>



<p>We invite you to share your thoughts in the comments below. You can also suggest and vote for new features in our <a href="https://youtrack.jetbrains.com/issues/ruby" target="_blank" rel="noopener">issue tracker</a>.<br></p>



<p>Happy developing!<br></p>



<p>The RubyMine team</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RubyMine Is Now Free for Non-Commercial Use</title>
		<link>https://blog.jetbrains.com/ruby/2025/09/rubymine-is-now-free-for-non-commercial-use/</link>
		
		<dc:creator><![CDATA[Iryna Pisklyarova]]></dc:creator>
		<pubDate>Tue, 02 Sep 2025 10:58:39 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/Blog-Featured-1280x720-1-15.png</featuredImage>		<category><![CDATA[releases]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[news]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=593941</guid>

					<description><![CDATA[Hold on to your helper methods – RubyMine is now FREE for non-commercial use! Whether you&#8217;re learning Ruby and Rails, pushing open-source forward, creating dev content, or building your passion project, we want to make sure you have the tools to enjoy what you do even more… for free. Another chapter in the story We [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Hold on to your helper methods – RubyMine is now FREE for non-commercial use! Whether you&#8217;re learning Ruby and Rails, pushing open-source forward, creating dev content, or building your passion project, we want to make sure you have the tools to enjoy what you do even more… for free.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/ruby/download/" class="btn" target="_blank" rel="noopener">Get RubyMine for free</a>
                                                    </div>
    </div>







<h2 class="wp-block-heading">Another chapter in the story</h2>



<p>We recently introduced a <a href="https://blog.jetbrains.com/blog/2024/10/24/webstorm-and-rider-are-now-free-for-non-commercial-use/">new licensing model</a> for WebStorm, RustRover, Rider, and CLion – making them free for non-commercial use. RubyMine is now joining the party! For commercial use, our existing licensing model still applies.</p>



<h2 class="wp-block-heading">Why are we doing this?</h2>



<p>We believe developers do their best work when the right tools are accessible. We’ve been listening closely to the Ruby and Rails community – their feedback, success, challenges, and passion for building with joy. Now, we’re making a change that reflects what we’ve heard.</p>



<p>By making RubyMine free for non-commercial use, we hope to lower the barrier to starting and help more people write clean, confident Ruby code from day one. It’s our way of supporting the unique Ruby community – from those who choose Ruby for their projects to maintainers of gems and frameworks who contribute to the Ruby ecosystem. Whether you&#8217;re debugging at midnight, crafting clever DSLs, or launching your first Rails app, RubyMine is here to help you build smarter (and crash less).</p>



<h2 class="wp-block-heading">Commercial vs. non-commercial use</h2>



<p>As defined in the <a href="https://www.jetbrains.com/legal/docs/toolbox/license_non-commercial/" target="_blank" rel="noopener">Toolbox Subscription Agreement for Non-Commercial Use</a>, commercial use means developing products and earning commercial benefits from your activities. However, certain categories are explicitly excluded from this definition. Common examples of non-commercial uses include learning and self-education, open-source contributions without earning commercial benefits, any form of content creation, and hobby development.</p>



<p>It’s important to note that, if you’re using a non-commercial license, you cannot opt out of the collection of anonymous usage statistics. We use this information to improve our products. The data we collect is exclusively that of anonymous feature usages of our IDEs. It is focused on what actions are performed and what types of functionality of the IDE are used. We do not collect any other data. This is similar to our Early Access Program (EAP) and is in compliance with our Privacy Policy.</p>



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



<p>Below are answers to the most common questions. Check out the <a href="https://sales.jetbrains.com/hc/en-gb/articles/18950890312210-The-free-non-commercial-licensing-FAQ" target="_blank" rel="noopener"><strong>full FAQ</strong></a> for more information.</p>



<h3 class="wp-block-heading">Licensing</h3>



<h4 class="wp-block-heading">What features are included under the free license?</h4>



<p>With the new non-commercial license type, you can enjoy a full-featured IDE that is identical to its paid version. The only difference is in the Code With Me feature – you get <a href="https://www.jetbrains.com/code-with-me/buy/?section=personal&amp;billing=monthly" target="_blank" rel="noopener">Code With Me Community</a> with your free license.</p>



<h4 class="wp-block-heading">Which license should I choose if I want to use RubyMine for both non-commercial and commercial projects?</h4>



<p>If you intend to use RubyMine for commercial development for which you will receive direct or indirect commercial advantage or monetary compensation within the meaning of the definitions provided in the <a href="https://www.jetbrains.com/legal/docs/toolbox/license_non-commercial/" target="_blank" rel="noopener">Toolbox Subscription Agreement for Non-Commercial Use</a>, you will need to purchase a commercial subscription (either individual or organizational). This license can then also be used for non-commercial development.</p>



<h4 class="wp-block-heading">How do renewals and upgrades work now?</h4>



<p>Non-commercial subscriptions are issued for one year and will automatically renew after that. However, for the renewal to happen, you must have used the assigned license at least once during the last 6 months of the subscription period. If it has been more than 6 months since you last used an IDE activated with this type of license and the renewal did not occur automatically, you can request a new non-commercial subscription again at any time.</p>



<h4 class="wp-block-heading">Am I eligible for a refund if I’ve already bought a paid subscription but do non-commercial development?</h4>



<p>If you’re unsure whether you qualify for a refund, you’ll find full details of our policy <a href="https://sales.jetbrains.com/hc/en-gb/articles/115000913704-How-can-I-get-a-refund" target="_blank" rel="noopener">here</a>. Please note that if you also work on projects that qualify as commercial usage, you can’t use the free license for them.</p>



<h3 class="wp-block-heading">Data collection </h3>



<h4 class="wp-block-heading">Does my IDE send any data to JetBrains, and can I opt out?</h4>



<p>When using a commercial subscription, you have full control over whether or not you want the product to send IDE telemetry to JetBrains, and detailed data collection is disabled by default.</p>



<p>With a non-commercial<em>&nbsp;</em>subscription, JetBrains IDEs may collect the following types of data:</p>



<ul>
<li><strong>Anonymous telemetry</strong>. This refers to generalized, anonymous statistics about how features are used (such as time spent, clicks, or general workflows). Like with Early Access Program builds, using the free non-commercial subscription means agreeing to send anonymized usage statistics, which enables us to improve the product. It is not possible to opt out.</li>



<li><strong>Detailed code‑related data</strong>&nbsp;pertaining to IDE activity, such as edit history, terminal usage, and your interactions with AI features. This may include code snippets, prompt text, and AI responses. If you’re using a non-commercial subscription, detailed code‑related data collection is enabled by default. To disable it, you must do so manually via the product settings:<em>&nbsp;Settings | Appearance &amp; Behavior | System Settings | Data Sharing</em>.</li>
</ul>



<p>If you allow us to collect this data, we will make sure that:</p>



<ul>
<li>No sensitive or personal information is shared.</li>



<li>Data is properly secured.</li>



<li>Access is restricted to authorized personnel and use cases.</li>
</ul>



<p>Read more about&nbsp;<a href="https://www.jetbrains.com/legal/docs/terms/product_data_collection/" target="_blank" rel="noreferrer noopener">what data is collected and how it is protected</a>.</p>



<h3 class="wp-block-heading">Getting a non-commercial subscription&nbsp;</h3>



<h4 class="wp-block-heading">What should I do to apply for this subscription?&nbsp;</h4>



<p>It can be easily done right inside your IDE:</p>



<ol>
<li>Install RubyMine and run it.</li>



<li>Upon startup, there will be a license dialog box where you can choose the <em>Non-commercial use </em>option.</li>



<li>Log in to your JetBrains account or create a new one.&nbsp;</li>



<li>Accept the <a href="https://www.jetbrains.com/legal/docs/toolbox/license_non-commercial/" target="_blank" rel="noopener">Toolbox Subscription Agreement for Non-Commercial Use</a>.</li>



<li>Enjoy development in your IDE.</li>
</ol>



<p>If you’ve already started a trial period or have activated your IDE using a paid license, you still can switch to a non-commercial subscription by following these steps:</p>



<ol>
<li>Go to <em>Help | Register.</em></li>



<li>In the window that opens, click on the <em>Deactivate License</em> button.</li>



<li>Choose <em>Non-commercial use.</em></li>



<li>Log in to your JetBrains account or create a new one.&nbsp;</li>



<li>Accept the <a href="https://www.jetbrains.com/legal/docs/toolbox/license_non-commercial/" target="_blank" rel="noopener">Toolbox Subscription Agreement for Non-Commercial Use</a>.</li>



<li>Enjoy development in your IDE.</li>
</ol>



<h4 class="wp-block-heading">I don’t see the <em>Non-commercial use</em> option in my IDE. What should I do?&nbsp;</h4>



<p>The most likely explanation for this is that you’re using an older version of RubyMine. Unfortunately, we don’t support obtaining the non-commercial license for any releases prior to RubyMine 2025.2.1.</p>



<p>That’s it for today! If you don’t find an answer to your question, feel free to leave a comment or contact us at <a href="https://www.jetbrains.com/support/sales/#email-sales" target="_blank" rel="noopener">sales@jetbrains.com</a>.</p>



<p>The RubyMine team</p>



<p><em>JetBrains</em></p>



<p>Make it happen. With code.</p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[zh-hans]]></code>
                        <url>https://blog.jetbrains.com/zh-hans/ruby/2025/09/rubymine-is-now-free-for-non-commercial-use/</url>
                    </language>
                                    <language>
                        <code><![CDATA[ja]]></code>
                        <url>https://blog.jetbrains.com/ja/ruby/2025/09/rubymine-is-now-free-for-non-commercial-use/</url>
                    </language>
                	</item>
		<item>
		<title>Unveiling Ruby Debuggers: byebug, debug gem, and the Power of RubyMine</title>
		<link>https://blog.jetbrains.com/ruby/2025/08/unveiling-ruby-debuggers-byebug-debug-gem-and-the-power-of-rubymine/</link>
		
		<dc:creator><![CDATA[Dmitry Pogrebnoy]]></dc:creator>
		<pubDate>Tue, 26 Aug 2025 07:11:53 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/RM-social-BlogFeatured-1280x720-2x-1.png</featuredImage>		<category><![CDATA[rubymine]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=594034</guid>

					<description><![CDATA[Hello, Ruby developers! Whether you are a seasoned Ruby developer or just getting started, mastering the debugger will save you time and frustration when tracking down bugs. At RubyMine, we’ve spent years building debugging tools for Ruby. In this blog series, we’re sharing some of the insights we’ve gained along the way. In this post, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Hello, Ruby developers!</p>



<p>Whether you are a seasoned Ruby developer or just getting started, mastering the debugger will save you time and frustration when tracking down bugs. At RubyMine, we’ve spent years building debugging tools for Ruby. In this blog series, we’re sharing some of the insights we’ve gained along the way.</p>



<p>In this post, we’ll take a closer look at the internal workings of byebug and the debug gem, comparing their unique approaches, strengths, and limitations. We’ll also break down the architecture of the RubyMine debugger to see how it works. Finally, we’ll conduct an experiment to test the performance of these debuggers and find out which one comes out on top.</p>



<p>This is the third post in a series inspired by Demystifying Debuggers, a talk by Dmitry Pogrebnoy, RubyMine Team Lead, presented at <a href="https://2024.euruko.org/speakers/dmitry_pogrebnoy" data-type="link" data-id="https://2024.euruko.org/speakers/dmitry_pogrebnoy" target="_blank" rel="noopener">EuRuKo 2024</a>, <a href="https://rubykaigi.org/2025/presentations/DmitryPogrebnoy.html" data-type="link" data-id="https://rubykaigi.org/2025/presentations/DmitryPogrebnoy.html" target="_blank" rel="noopener">RubyKaigi 2025</a> and <a href="https://rubyconf.africa/speakers/dmitry-pogrebnoy" data-type="link" data-id="https://rubyconf.africa/speakers/dmitry-pogrebnoy" target="_blank" rel="noopener">RubyConf Africa 2025</a>. In this post, we go deeper into how Ruby debuggers work under the hood and share insights about Ruby debuggers.</p>



<p>If you haven’t seen the earlier posts yet, we recommend starting there:</p>



<ol>
<li><a href="https://blog.jetbrains.com/ruby/2024/12/mastering_ruby_debugging/" data-type="link" data-id="https://blog.jetbrains.com/ruby/2024/12/mastering_ruby_debugging/">Mastering Ruby Debugging: From puts to Professional Tools</a></li>



<li><a href="https://blog.jetbrains.com/ruby/2025/06/inside-ruby-debuggers/">Inside Ruby Debuggers: TracePoint, Instruction Sequence, and CRuby API</a></li>
</ol>



<p>Prefer watching? You can also check out the original talk here: ? <a href="https://youtu.be/9jjQIrunl00?si=8ZvNJQ19MIarunI2" target="_blank" rel="noopener">Dmitry Pogrebnoy, &#8220;Demystifying Debugger&#8221;</a></p>



<p>Let’s dive into the internals!</p>



<h3 class="wp-block-heading">Is the debugger an essential tool for Ruby developers?</h3>



<p>Before we jump into how debuggers work, let’s take a step back and ask: How often do Ruby developers actually use a debugger? The answer might surprise you.</p>



<p>The need for and reliance on a debugger can vary greatly depending on the programming language and framework you’re using. It’s also influenced by the preferences of the developer community and the specific needs of the domain. Some developers might use a debugger all the time, while others might prefer different tools or methods for troubleshooting. Some of these tools were covered in the <a href="https://blog.jetbrains.com/ruby/2024/12/mastering_ruby_debugging/#choosing-the-right-tool">first post</a> in the series.</p>



<p>Unfortunately, there aren’t any reliable public stats on how often Ruby developers use debuggers overall. But thanks to anonymous usage data from RubyMine users, we can still get a rough sense of how common debugger usage is in real-world projects.</p>



<p>The pie chart below shows how often RubyMine users run their code using a debugger compared to other types of run configurations. These numbers come from anonymous usage stats collected in RubyMine 2025.1.</p>



<p><em><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/10/AD_4nXdzWqhntI8N8dsDOdkqtS9hMod6kn1z39NY_motKXjGLS0x2pJmttYHdafZfUT9Z5PsZDLkTOtvaDJKzq248iPnYbqLM1V1yweq1dIQv1aRl9SvNa8E-dI_qrX7YLFjvPNZ1qYF5g.png"></em></p>



<p>As we can see, almost every third run in RubyMine is a debugger run. This demonstrates just how essential and fundamental the debugger has become for professional Ruby developers. That&#8217;s why the RubyMine team tries to provide the smoothest possible debugger experience that will enhance your efforts in investigating problems.</p>



<h2 class="wp-block-heading">How do Ruby debuggers work internally?</h2>



<p>In the previous section, we covered the main building blocks of Ruby debuggers. Now it&#8217;s time to see how these components are applied in real-world tools. In this section, we&#8217;ll start with the byebug gem, then move on to the debug gem, and finally take a look at the RubyMine debugger. Let&#8217;s begin with byebug!</p>



<h3 class="wp-block-heading">Simplified model of the byebug debugger</h3>



<p>byebug is a simple Ruby debugger. It provides essential features like breakpoints, basic stepping, and variable inspection. By default, it offers a command-line interface (CLI) for debugging, but there’s also an option to install and configure a plugin for GUI support in code editors.&nbsp;</p>



<p>To start a debugging session with byebug, you typically need to <a href="https://github.com/deivid-rodriguez/byebug?tab=readme-ov-file#usage" data-type="link" data-id="https://github.com/deivid-rodriguez/byebug?tab=readme-ov-file#usage" target="_blank" rel="noopener">modify your project&#8217;s source code by inserting <code>byebug</code> statements</a>, or run commands manually in the terminal, which require some adjustments to your project setup, especially when working with Rails applications.</p>



<p>Let’s take a look at the simplified model of how byebug works. This code in the model should be executed before any code of the application that we are going to debug.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="ruby" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">breakpoints = [] # list of breakpoints
tracepoints = [] # contains a single tracepoint for each event type


# For every type of tracepoint event
tracepoints &amp;lt;&amp;lt; TracePoint.trace(:line) do |tp|
 breakpoint = breakpoints.find do |b|
   tp.path == b.path &amp;amp;&amp;amp; tp.lineno == b.lineno
 end


 if breakpoint
   handle_breakpoint(breakpoint)
 end
end


# Ordinal code execution
# ...</pre>



<p>Let’s examine how this works. At its core, byebug maintains two important lists — one for storing breakpoints set by the user throughout the debugging session, and another for tracepoints. TracePoint is a instrumentation technology in Ruby that works by intercepting specific runtime events such as method calls, line executions, or exception raises and executing custom code when these events occur. Take a look at our <a href="https://blog.jetbrains.com/ruby/2025/06/inside-ruby-debuggers/">previous blog post</a> for more details.</p>



<p>byebug has one TracePoint for each type of event it tracks — one for line events, one for call events, and so on. Each TracePoint in the list follows a similar pattern. When a trace event occurs at runtime, the corresponding TracePoint is triggered, and byebug checks whether there&#8217;s a breakpoint set at that location by comparing file paths and line numbers. If a breakpoint is found, byebug pauses program execution and hands control to the developer, who can then inspect variables, step through code, evaluate expressions, or perform other debugger actions. If no breakpoint is found, execution simply continues until the next trace event, where the same process is repeated. This is how byebug detects breakpoints and stops at them during runtime.</p>



<p>It is a simple yet effective approach that works well and allows developers to debug their code. However, it comes with one major drawback — performance.</p>



<p>With each event emitted during program execution, byebug has to perform breakpoint checks — even when there&#8217;s only a single breakpoint set in the entire application. This means that if you place just one breakpoint somewhere in your code, the debugger will still check for breakpoint matches on every single trace event. It&#8217;s like having a security guard check every room in a building when you only need to monitor one specific door.</p>



<p>Consequently, these constant checks add significant computational overhead when running code with byebug. Our performance tests show that applications can run more than 20 times slower under byebug compared to normal execution. This performance impact makes byebug challenging to use with complex real-world Rails applications, where execution time really matters. Fortunately, more modern debugging solutions have found ways to address this limitation.</p>



<h3 class="wp-block-heading">Performant debug gem and TracePoint improvement</h3>



<p>Our next tool is the debug gem — a debugger designed for modern Ruby versions starting from 2.7. It provides CLI by default, but you can also set it up with a plugin to get GUI in code editors.</p>



<p>Just like byebug, the debug gem requires you to <a href="https://github.com/ruby/debug?tab=readme-ov-file#invoke-with-the-debugger" data-type="link" data-id="https://github.com/ruby/debug?tab=readme-ov-file#invoke-with-the-debugger" target="_blank" rel="noopener">modify your code by adding <code>binding.break</code> statements</a> to start a debugging session. Alternatively, you can run it manually from the terminal, which may require some additional project configuration, especially in Rails applications.</p>



<p>The debug gem completely solves the significant performance limitation described in the previous section. Before we start with the debug gem, let&#8217;s take a look at the main feature that helped to overcome the performance problem.</p>



<p>The magic behind the strong performance of the debug gem is related to the TracePoint update that was released in Ruby 2.6 back in 2018.</p>



<p>This improvement added a key feature — TracePoints could now be targeted to specific lines of code or specific instruction sequences. No more checking for breakpoints on every event. Instead, TracePoints would only trigger exactly where breakpoints were set, solving the performance problem.</p>



<p>Let&#8217;s look at a practical example of how this feature works.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="ruby" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def say_hello = puts "Hello Ruby developers!"
def say_goodbye = puts "Goodbye Ruby developers!"


iseq = RubyVM::InstructionSequence.of(method(:say_hello))
trace = TracePoint.new(:call) do |tp|
 puts "Calling method '#{tp.method_id}'"
end


trace.enable(target: iseq)


say_hello
say_goodbye
# => Calling method 'say_hello'
# => Hello Ruby developers!
# => Goodbye Ruby developers!</pre>



<p>Here we have two methods — <code>say_hello</code> and <code>say_goodbye</code>. The key change is that we&#8217;re targeting our TracePoint specifically to the instruction sequence of the first method only.</p>



<p>Looking at the output in the comments, we can see how powerful and precise targeted TracePoints are. The TracePoint is triggered only for <code>say_hello</code> but is completely ignored for <code>say_goodbye</code> — exactly what we needed. This level of control is a major improvement over the old approach where TracePoints would fire for every method indiscriminately.</p>



<p>This example demonstrates a simplified version of how the debug gem uses TracePoint under the hood. Unlike byebug, which maintains a general-purpose list of TracePoints and checks every single trace event against all breakpoints, the debug gem takes a more efficient and targeted approach. It creates a dedicated TracePoint for each individual breakpoint and binds it directly to the corresponding location in the code — either a specific line or an instruction sequence.</p>



<p>This means the TracePoint will only trigger when that exact location is executed, eliminating the need for constant runtime checks across unrelated code paths. As a result, the debug gem introduces significantly less overhead and performs much better in practice. This difference becomes especially noticeable in large Ruby codebases or performance-sensitive environments, where byebug’s frequent event scanning can lead to substantial slowdowns.</p>



<p>Despite its significant advantages, this TracePoint improvement wasn&#8217;t backported to Ruby versions before 2.6. As a result, the debug gem only supports Ruby 2.7 and newer versions where additional fixes for the TracePoint improvement were released. This circumstance leaves projects running on older Ruby versions without access to this powerful debugging tool, even though they might still need advanced debugging capabilities for investigating complex issues.</p>



<p>Starting with Ruby 3.1, the debug gem is bundled as the default debugger. It’s an excellent starting point for many Ruby developers — especially those who haven’t yet explored more advanced tools like the RubyMine debugger to meet their growing need for a better debugging experience and more powerful capabilities.</p>



<h3 class="wp-block-heading">How is the RubyMine debugger structured?</h3>



<p>As we&#8217;ve seen, both popular open-source Ruby debuggers have their limitations. Byebug suffers from performance issues that make it impractical for large applications, while the debug gem doesn&#8217;t support Ruby versions before 2.7. This can be frustrating for professional developers who need reliable debugging capabilities across different Ruby versions. The RubyMine debugger solves these problems by supporting Ruby versions from 2.3 onwards, covering practically any Ruby version your application might use.</p>



<p>One significant benefit that sets the RubyMine debugger apart is that it doesn&#8217;t have any performance issues and maintains excellent speed even on older Ruby versions. This feature makes the RubyMine debugger the go-to debugging tool for professional Ruby developers, regardless of their project&#8217;s specific requirements.</p>



<p>Another advantage is a straightforward debugging experience, with all features available immediately after setup. There&#8217;s no need to modify your project configuration, install and configure extra plugins, or manage terminal commands to start debugging. It works even with production size Rails applications and lets you focus on solving problems rather than setting up tools.</p>



<p>In addition, the RubyMine debugger offers <a href="https://www.jetbrains.com/help/ruby/stepping-through-the-program.html#smart-step-into" target="_blank" rel="noopener">smart stepping</a> — a feature that lets you step into a specific method when there are multiple calls on the same line. Instead of always entering the first call, it highlights all available options so you can choose the one you want. It’s especially useful for debugging chained or complex expressions — a level of control that other Ruby debuggers don’t offer.</p>



<p>The RubyMine debugger provides versatile debugging capabilities and a productivity-focused debugger experience. If you haven&#8217;t tried the RubyMine debugger yet, it&#8217;s definitely worth a chance.</p>



<p>Let’s take a closer look at the architecture of the RubyMine debugger and how it’s built to be such a powerful tool.</p>



<h4 class="wp-block-heading">General RubyMine debugger architecture</h4>



<p>This is a high-level architecture of the RubyMine debugger.</p>



<p><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" height="819.283" src="https://blog.jetbrains.com/wp-content/uploads/2025/10/AD_4nXd7IdHTJ18RT2U6wasdO1DBB9a7LvNBcgAmU84hhANY3386y5sh_qSBakgir1eOukkOV_DnQnggeRF9PUayw8TFHHyMzZZ2rw5EvRNh6gQtaAW9CJ7LSrTRv_gZ0ZsjURTF2eaDWw.png"></p>



<p>Let&#8217;s examine the diagram to understand how the RubyMine debugger works internally. The architecture consists of three main parts that work together to provide a smooth debugging experience.</p>



<p>The first component is the debase gem — the core backend of the RubyMine debugger. Written as a C extension, it handles all low-level operations like retrieving execution contexts, managing stack frames, and manipulating instruction sequences. This backend is responsible for direct interaction with Ruby internals, which makes it a convenient and efficient interface for other debugger components.</p>



<p>The second part is the ruby-debug-ide gem, which serves as the internal debugger frontend. This critical piece manages the communication between RubyMine and the backend by establishing and maintaining their connection. It handles the message protocol and processes commands coming from RubyMine. Additionally, it&#8217;s responsible for creating readable text representations of Ruby objects that developers will see in the RubyMine debugger Tool Window.</p>



<p>Finally, there&#8217;s RubyMine itself. Its primary role is to provide a smooth and productive debugging experience. Most of the debugger features that enhance developer productivity — like smart stepping, inline-debugger values, and frames and breakpoints management — are mainly implemented at this level. The IDE also handles communication with the debugger frontend by sending commands and processing responses.&nbsp;</p>



<p>Having three separate parts with clear interfaces between them brings several key benefits. This modular structure significantly reduces the overall system complexity, making it easier to maintain and less prone to bugs. Each component can be developed independently and at its own pace, which streamlines development and makes maintenance more efficient.</p>



<h4 class="wp-block-heading">The real RubyMine debugger architecture</h4>



<p>The architecture we&#8217;ve discussed is a simplified view of the RubyMine debugger. While it helps you understand the core concepts, the real-world implementation has additional layers of complexity. Let&#8217;s dive deeper and explore how the actual system is structured.</p>



<p><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" width="2115.977" src="https://blog.jetbrains.com/wp-content/uploads/2025/10/AD_4nXeWldBBToKI5RM625GSYGqL4XFCCz6XSSutfE5NTmoPRLqpGDwpncaFdYdJHWXHEeMZwV47vKE0DU0oc8PSxvRpqnRNrug66Cols16OuUPKieS5zQ6o7hWCMbTfARcJzZN_t50jwQ.png"></p>



<p>Instead of a single branch of debugger gems, there are two separate branches of debugger gems — a top branch and a bottom branch — each specified for different Ruby versions.</p>



<p>The top branch supports Ruby versions 2.3 through 2.7. These gems use several clever low-level hacks to achieve high performance without the TracePoint improvements we discussed earlier. While these hacks work effectively, they make the gems harder to maintain and extend. Still, this approach ensures excellent debugging capabilities for legacy Ruby applications.</p>



<p>The challenges of maintaining and extending the top branch gems led to the creation of the bottom branch of gems. This branch is designed specifically for modern Ruby and ensures a smooth debugging experience with Ruby versions 3.0 and onwards. Unlike the top branch, these gems don&#8217;t rely on low-level hacks. Instead, they leverage modern Ruby APIs and the improved TracePoint mechanism, resulting in a cleaner and more maintainable codebase. This approach not only simplifies the implementation but also makes it easier to add new features and support new Ruby versions.</p>



<p>Having two separate branches for different Ruby versions helps us keep the RubyMine debugger maintainable and performant. It lets us support legacy versions while steadily raising the quality bar and reliability of the debugging experience for modern Ruby.</p>



<h2 class="wp-block-heading">Which debugger is the most performant?</h2>



<p>Before we dive into performance, let’s quickly recap what we’ve covered so far. We began with an in-depth look at how the byebug debugger works internally and where it falls short. Then, we examined how the debug gem takes a different approach to overcome those limitations. Finally, we explored the architecture of the RubyMine Debugger and the advantages it brings to the table.</p>



<p>Now, it’s time to ask the big practical question: which of these debuggers performs best?</p>



<p>Rather than guess, let’s put these debuggers to the test with a straightforward benchmarking experiment.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="ruby" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def fib(n)
 raise if n &lt; 0 # place a breakpoint on this line
 return n if n &lt; 2
 fib(n - 1) + fib(n - 2)
end


require 'benchmark'
TOTAL_RUNS = 100
total_time = TOTAL_RUNS.times.sum do
 Benchmark.realtime { fib(40) }
end


puts "Avg real time elapsed: #{total_time/TOTAL_RUNS}"</pre>



<p>We use the Fibonacci method with an added condition specifically to set a breakpoint. Although the breakpoint is never hit, it allows us to measure how simply having a breakpoint in place can impact the performance of each debugger. To run the experiment, we used the benchmark gem and averaged the execution time over 100 runs to get stable, meaningful results.</p>



<p>Let&#8217;s state the Ruby debugger and Ruby versions for that experiment to get reproducible results.</p>



<figure class="wp-block-table"><table><tbody><tr><td><strong>Ruby 2.6.10</strong></td><td><strong>Ruby 3.4.2</strong></td></tr><tr><td>byebug – 11.1.3</td><td>debug gem – 1.10.0</td></tr><tr><td>RubyMine debugger<br>    • ruby-debug-ide – 2.3.24<br>    • debase – 2.3.15&nbsp;</td><td>RubyMine debugger<br>    • ruby-debug-ide – 3.0.2<br>    • debase – 3.0.2</td></tr></tbody></table></figure>



<p>For this experiment, we&#8217;ll use the latest available versions of Ruby and debugger gems at the time of writing. We define two test groups based on Ruby versions they support. One for Ruby 2.6.10, representing older versions, and one for Ruby 3.4.2, representing modern versions. The Ruby 2.6.10 group includes byebug. The Ruby 3.4.2 group features the debug gem. The RubyMine debugger is included in both groups, but it uses different gem versions optimized for the respective Ruby version.</p>



<p>Let&#8217;s run the benchmark and see how each debugger performs.</p>



<figure class="wp-block-table"><table><tbody><tr><td></td><td><strong>Ruby 2.6.10</strong></td><td><strong>Ruby 3.4.2</strong></td></tr><tr><td>Original run</td><td>17.7 sec</td><td>15.8 sec</td></tr><tr><td>byebug</td><td>529.1 sec</td><td>✕</td></tr><tr><td>debug gem</td><td>✕</td><td>15.8 sec</td></tr><tr><td>RubyMine debugger</td><td>17.7 sec</td><td>15.8 sec</td></tr></tbody></table></figure>



<p>Let&#8217;s first examine the results for the older Ruby version. The most striking observation is the performance of byebug. The benchmark shows it runs about 30 times slower than the original code without any debugger attached — a significant performance hit that makes it impractical for debugging complex applications.</p>



<p>On the other hand, the RubyMine debugger shows no noticeable performance impact on older Ruby versions. This means that for applications running on older Ruby versions, particularly production applications, the RubyMine debugger stands out as the only practical option for effective debugging. While having limited choices isn&#8217;t ideal, this is the reality when working with older Ruby versions.</p>



<p>Looking at a modern Ruby version group, the situation is much better. Both the RubyMine debugger and debug gem show excellent performance with no noticeable slowdown. This gives developers the freedom to choose either tool based on their specific needs and preferences. The availability of multiple performant debuggers empowers Ruby developers to choose the best tool for their situation and makes the Ruby debugging ecosystem stronger.</p>



<p>Overall, the RubyMine debugger delivers consistently high performance across both old and new Ruby versions, while byebug significantly slows down execution and is impractical for complex applications. On newer Ruby versions, the debug gem matches RubyMine in speed, giving developers an open-source alternative.</p>



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



<p>Debugging is a practical skill for every Ruby developer, and understanding the inner workings of Ruby debuggers can help you recognize each debugger’s limitations, choose the right tool for your needs, and avoid common pitfalls. In this post, we’ve examined the internal mechanics of Ruby debuggers like byebug, the debug gem, and the RubyMine debugger, highlighting the advantages and downsides of their approaches.</p>



<p>Byebug and the debug gem both offer basic debugging features like breakpoints, stepping, and variable inspection. The debug gem delivers significantly better performance than byebug, but it only supports Ruby versions 2.7 and newer. Byebug, on the other hand, works with older Ruby versions but tends to be much slower — especially in larger projects.</p>



<p>The RubyMine debugger stands out by combining the best of both worlds. It supports a wide range of Ruby versions, delivers strong performance across all of them, and offers a smooth, reliable debugging experience — even in complex Rails applications. On top of the basic features, RubyMine includes advanced capabilities like smart stepping, inline variable values, and more. You can explore the full set of features in the<a href="https://www.jetbrains.com/help/ruby/debugging-code.html" target="_blank" rel="noopener"> RubyMine debugging documentation</a>.</p>



<p>We hope this post has helped clarify how Ruby debuggers work internally and provided useful insights for improving your debugging workflow.</p>



<p>Happy coding, and may your bugs be rare and simple to squash!</p>



<p>The RubyMine team</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RubyMine 2025.2: Junie and AI Assistant Upgrades, Faster Rails Project Startup, Enhanced Bundler Management, and More</title>
		<link>https://blog.jetbrains.com/ruby/2025/08/rubymine-2025-2-junie-and-ai-assistant-upgrades-faster-rails-project-startup-enhanced-bundler-management-and-more/</link>
		
		<dc:creator><![CDATA[Alexey Varfolomeev]]></dc:creator>
		<pubDate>Mon, 04 Aug 2025 13:06:23 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/RM-social-BlogFeatured-1280x720-2x.png</featuredImage>		<category><![CDATA[releases]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[2025-2]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[ai-assistant]]></category>
		<category><![CDATA[junie]]></category>
		<category><![CDATA[release]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=585179</guid>

					<description><![CDATA[RubyMine 2025.2 is out! In this blog post, we briefly go over the highlights of this release. For a detailed description, check out our What’s New page.&#160; You can get the new build from our website or via the free Toolbox App. AI Assistant JetBrains AI Assistant has received a major upgrade, offering smarter code [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>RubyMine 2025.2 is out!</p>



<p>In this blog post, we briefly go over the highlights of this release. For a detailed description, check out our <a href="https://www.jetbrains.com/ruby/whatsnew/" target="_blank" rel="noopener">What’s New</a> page.&nbsp;</p>



<p>You can get the new build from our <a href="https://www.jetbrains.com/ruby/download/?_gl=1*1eyvko0*_ga*MTkyMjY3OTIxMy4xNjY0ODc1NjA2*_ga_9J976DJZ68*MTY3MTM5ODA0Mi4zMjIuMS4xNjcxMzk5OTk3LjIzLjAuMA..&amp;_ga=2.135890417.1325099170.1671311045-1922679213.1664875606" target="_blank" rel="noopener">website</a> or via the free <a href="https://www.jetbrains.com/toolbox/app/" target="_blank" rel="noopener">Toolbox App</a>.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/07/RM-social-BlogSocialShare-1280x720-2x.png" alt="" class="wp-image-586166"/></figure>



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



<p>JetBrains AI Assistant has received a major upgrade, offering smarter code completion, greater project awareness, and more control over AI in your IDE. Below is an overview of the main improvements. Read the full article <a href="https://jb.gg/ai-assistant-252" target="_blank" rel="noopener">here</a>.</p>



<h3 class="wp-block-heading"><strong>Code completion for ERB</strong></h3>



<p>Cloud-based code completion for ERB has been expanded to work directly within ERB tags like &lt;% &lt;caret&gt; -%&gt; and &lt;%= &lt;caret&gt; %&gt;. This feature builds on RubyMine’s existing AI-based code completion for Ruby and includes enhancements like better string handling, multiline code support, and the avoidance of duplicate closing tags.</p>



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



<h3 class="wp-block-heading"><strong>Stronger project awareness in AI chat</strong></h3>



<p>AI Assistant’s chat now uses the <em>Search Everywhere</em> functionality for <em>Classes </em>and <em>Symbols</em> to offer more accurate and project-specific context.</p>



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



<h3 class="wp-block-heading"><strong>More ways to connect local models</strong></h3>



<p>You can now connect any OpenAI-compatible local model server, including <strong>llama.cpp</strong>, <strong>LiteLLM</strong>, and others. This lets you take advantage of powerful AI features offline, without any data being sent to the cloud.</p>



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



<h3 class="wp-block-heading"><strong>Expanded and improved code suggestions</strong></h3>



<p>In RubyMine 2025.2, AI Assistant offers more frequent and context-aware code suggestions. Improved formatting for multiline outputs also ensures a smoother coding experience.</p>



<h3 class="wp-block-heading"><strong>Image attachments</strong></h3>



<p>JetBrains AI Assistant now supports image attachments in the chat when using Anthropic and OpenAI models.</p>



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



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



<p>RubyMine now offers an exciting new way to code thanks to <a href="http://jb.gg/2us52e" target="_blank" rel="noopener">Junie,</a> the AI coding agent from JetBrains, built to streamline your workflow and boost your productivity. Available in RubyMine 2025.2 as a plugin, Junie is reliable for simple tasks, but it really shines when assigned complex challenges. Use<em> Code </em>mode to delegate coding tasks or <em>Ask </em>mode<em> </em>to brainstorm features and explore new solutions.</p>



<p>Junie recently received several major updates. It is now up to 30% faster, and it offers MCP support and added functionality for remote development.</p>



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



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



<h3 class="wp-block-heading">More control over code inspections</h3>



<p>RubyMine 2025.2 gives you the flexibility to disable specific type signature providers used in certain inspections. For example, the <em>Mismatched Argument Type</em><strong> </strong>inspection uses RBS and Sorbet, which might conflict with each other. To avoid any issues, you can disable one of them.</p>



<p>Find and customize them in <em>Settings | Editor | Inspections | Ruby | Probable bugs</em>.</p>



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



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



<h3 class="wp-block-heading"><strong>Streamlined project startup</strong></h3>



<p>RubyMine 2025.2 increases the speed of project startup by optimizing how background tasks are handled. Nonessential operations like refreshing Rake tasks or updating RBS collections now run only when needed, so you’re not stuck waiting on them. Get started on your work faster with fewer interruptions right from the get-go.</p>



<h3 class="wp-block-heading"><strong>Better performance when editing migration files</strong></h3>



<p>If your Rails project is packed with migration files, you know how sluggish and glitchy editing them can get. Not anymore – RubyMine ensures smooth edits, even in projects with tons of migrations, so that you can make changes quickly and without any hassle.</p>



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



<h3 class="wp-block-heading"><strong>Hover hints for RBS</strong></h3>



<p>Digging into <code data-enlighter-language="generic" class="EnlighterJSRAW"><code>.rbs</code></code> files has never been easier. With <strong>hover hints</strong>, you can quickly preview type definitions and references without leaving your current file. Just press <code>Cmd</code> (Mac) or <code>Ctrl</code><em> </em>(Windows/Linux) and hover over a declaration to see a concise, in-context preview.</p>



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



<h3 class="wp-block-heading"><strong>RBS Collection integration enabled by default</strong></h3>



<p>The <a href="http://github.com/ruby/gem_rbs_collection" target="_blank" rel="noopener">RBS Collection</a> integration is now enabled by default, improving the precision of <em>Find Usages</em>, the <em>Rename </em>refactoring, and inlay hints when working with type signatures. This feature requires RBS 3.2 (bundled with Ruby 3.4), and if you’re on an older Ruby version, RubyMine will prompt you to install the correct gem.</p>



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



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



<h3 class="wp-block-heading"><strong>Simpler notifications</strong></h3>



<p>RubyMine now groups missing gem alerts across all modules into a single notification, cleaning up your workspace and reducing distractions.</p>



<h3 class="wp-block-heading"><strong>New </strong><strong><em>Bundler</em></strong><strong> tab</strong></h3>



<p>The new <em>Bundler </em>tab under <em>Settings | Tools</em> saves you from repetitive prompts every time you run a Bundler command. It contains two checkboxes you can mark that will:</p>



<ul>
<li>Allow the IDE to automatically install the Bundler version you need without asking you for confirmation.</li>



<li>Allow you to define default arguments for all Bundler commands, streamlining your workflow.</li>
</ul>



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



<h3 class="wp-block-heading"><strong>Smarter gem installation</strong></h3>



<p>To prevent conflicts and the unnecessary reinstallation of shared gems, RubyMine now installs gems on a per-module basis. This makes working on multimodule projects far smoother.</p>



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



<h3 class="wp-block-heading"><strong>Improved exception-constant completion</strong></h3>



<p>RubyMine’s autocompletion for exception constants just got a lot smarter. When you trigger autocompletion without typing a prefix, the suggestions are now limited to a focused, relevant set of constants.</p>



<p>This makes the feature faster and far more precise, which is especially helpful in larger projects where suggestion bloat used to slow you down.</p>



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



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



<h3 class="wp-block-heading"><strong>Non-modal installation</strong></h3>



<p>You no longer have to wait around when setting up debugger gems in RubyMine! Starting with version 2025.2, debugger installation is now non-modal. The progress is displayed directly in the terminal window, so you can continue working without interruptions.</p>



<h2 class="wp-block-heading">Stay in touch</h2>



<p>To learn about the latest features as they come out, follow <a href="https://twitter.com/rubymine" target="_blank" rel="noopener">RubyMine on X</a>.&nbsp;</p>



<p>We invite you to share your thoughts in the comments below and to suggest and vote for new features in the <a href="https://youtrack.jetbrains.com/issues/ruby" target="_blank" rel="noopener">issue tracker</a>.<br></p>



<p>Happy developing!<br></p>



<p>The RubyMine team</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Inside Ruby Debuggers: TracePoint, Instruction Sequence, and CRuby API</title>
		<link>https://blog.jetbrains.com/ruby/2025/06/inside-ruby-debuggers/</link>
		
		<dc:creator><![CDATA[Dmitry Pogrebnoy]]></dc:creator>
		<pubDate>Tue, 10 Jun 2025 07:34:53 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/06/RM-social-BlogFeatured-1280x720-2x.png</featuredImage>		<category><![CDATA[rubymine]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=573824</guid>

					<description><![CDATA[Hello, Ruby developers! Debugging is a key part of software development, but most developers use debuggers without knowing how they actually work. The RubyMine team has spent years developing debugging tools for Ruby, and we want to share some of the insights we’ve gained along the way. In this post, we’ll explore the main technologies [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Hello, Ruby developers!</p>



<p>Debugging is a key part of software development, but most developers use debuggers without knowing how they actually work. The RubyMine team has spent years developing debugging tools for Ruby, and we want to share some of the insights we’ve gained along the way.</p>



<p>In this post, we’ll explore the main technologies behind Ruby debuggers — TracePoint, Instruction Sequence, and Ruby’s C-level debugging APIs.&nbsp;</p>



<p>We’ll begin with TracePoint and see how it lets debuggers pause code at key events. Then we’ll build a minimal debugger to see it in action. Next, we’ll look at Instruction Sequences to understand what Ruby&#8217;s bytecode looks like and how it works with TracePoint. Finally, we’ll briefly cover Ruby’s C-level APIs and the extra power they offer.</p>



<p>This blog post is the second in a series based on the <em>Demystifying Debuggers</em> talk by Dmitry Pogrebnoy, RubyMine Team Leader, presented at <a href="https://2024.euruko.org/speakers/dmitry_pogrebnoy" data-type="link" data-id="https://2024.euruko.org/speakers/dmitry_pogrebnoy" target="_blank" rel="noopener">EuRuKo 2024</a> and <a href="https://rubykaigi.org/2025/presentations/DmitryPogrebnoy.html" data-type="link" data-id="https://rubykaigi.org/2025/presentations/DmitryPogrebnoy.html" target="_blank" rel="noopener">RubyKaigi 2025</a>. If you haven’t read the first post yet, it’s a good idea to start <a href="https://blog.jetbrains.com/ruby/2024/12/mastering_ruby_debugging/" data-type="link" data-id="https://blog.jetbrains.com/ruby/2024/12/mastering_ruby_debugging/">there</a>. Prefer video? You can also watch the original talk <a href="https://youtu.be/ynrXsbuApXM?si=pHsA-Za3Y_N6_Kp9" data-type="link" data-id="https://youtu.be/ynrXsbuApXM?si=pHsA-Za3Y_N6_Kp9" target="_blank" rel="noopener">here</a>.</p>



<p>Ready? Let’s start!</p>



<h2 class="wp-block-heading">The core technologies behind any Ruby debugger</h2>



<p>Before diving into the debugger internals, it’s essential to understand the two core technologies that make Ruby debugging possible: TracePoint and Instruction Sequence. Regardless of which debugger you use, they all rely on these fundamental features built into Ruby itself. In the following sections, we’ll explore how each of them works and why they’re so important.</p>



<h3 class="wp-block-heading">TracePoint: Hooking into Code Execution</h3>



<p>Let’s begin with TracePoint, a powerful instrumentation technology introduced in Ruby 2.0 back in 2013. It works by intercepting specific runtime events such as method calls, line executions, or exception raises and executing custom code when these events occur. TracePoint works in almost any Ruby context, and it works well with Thread and Fiber. However, it currently has <a href="https://bugs.ruby-lang.org/projects/ruby-master/search?q=Ractor+TracePoint&amp;scope=&amp;all_words=&amp;all_words=1&amp;titles_only=&amp;issues=1&amp;open_issues=1&amp;attachments=0&amp;options=1&amp;commit=Search" data-type="link" data-id="https://bugs.ruby-lang.org/projects/ruby-master/search?q=Ractor+TracePoint&amp;scope=&amp;all_words=&amp;all_words=1&amp;titles_only=&amp;issues=1&amp;open_issues=1&amp;attachments=0&amp;options=1&amp;commit=Search" target="_blank" rel="noopener">limited support for Ractor</a>.</p>



<p>Let’s take a look at the example and see how TracePoint works.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="ruby" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def say_hello
 puts "Hello Ruby developers!"
end


TracePoint.new(:call) do |tp|
 puts "Calling method '#{tp.method_id}'"
end.enable


say_hello
# => Calling method 'say_hello'
# => Hello Ruby developers!
</pre>



<p>In this example, we have a simple <code>say_hello</code> method containing a <code>puts</code> statement, along with a <code>TracePoint</code> that watches events of the <code>call</code> type. Inside the <code>TracePoint</code> block, we print the name of the method being called using <code>method_id</code>. Looking at the output in the comments, we can see that our <code>TracePoint</code> is triggered when entering the <code>say_hello</code> method, and only after that do we see the actual message printed by the method itself.</p>



<p>This example demonstrates how TracePoint lets you intercept normal code execution at specific points where special events occur, allowing you to execute your own custom code. Whenever your debugger stops on a breakpoint, TracePoint is in charge. This technology is valuable for more than just debugging. It is also used in performance monitoring, logging, and other scenarios where gaining runtime insights or influencing program behavior is necessary.</p>



<h3 class="wp-block-heading">Building the simplest Ruby debugger with TracePoint</h3>



<p>With just TracePoint technology, you can build what might be the simplest possible Ruby debugger you&#8217;ll ever see.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="ruby" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def say_hello
 puts "Hello Ruby developers!"
end


TracePoint.new(:call) do |tp|
 puts "Call method '#{tp.method_id}'"
 while (input = gets.chomp) != "cont"
   puts eval(input)
 end
end.enable


say_hello</pre>



<p>This is almost the same code as in the TracePoint example, but this time the <code>TracePoint</code> code body is slightly changed.</p>



<p>Let&#8217;s examine what&#8217;s happening here. The <code>TracePoint</code> block accepts user input via <code>gets.chomp</code>, evaluates it in the current context using the <code>eval</code> method, and prints the result with <code>puts</code>. That&#8217;s really all there is to it — a straightforward and effective debugging mechanism in just a few lines of code.&nbsp;</p>



<p>This enables one of the core features of a debugger — the ability to introspect the current program context on each method invocation and modify the state if needed. You can, for example, define a new Ruby constant, create a class on the fly, or change the value of a variable during execution. Simple and powerful, right? Try to run it by yourself!</p>



<p>Clearly, this isn&#8217;t a complete debugger — it lacks exception handling and many other essential features. But when we strip away everything else and look at the bare bones, this is the fundamental mechanism that all Ruby debuggers are built upon.</p>



<p>This simple example demonstrates how TracePoint serves as the foundation for Ruby debuggers. Without TracePoint technology, it would be impossible to build a modern Ruby debugger.</p>



<h3 class="wp-block-heading">Instruction Sequence: Ruby’s bytecode revealed</h3>



<p>Another crucial technology for Ruby debuggers is Instruction Sequence.</p>



<p>Instruction Sequence, or <code>iseq</code> for short, represents the compiled bytecode that the Ruby Virtual Machine executes. Think of it as Ruby&#8217;s &#8220;assembly language&#8221; — a low-level representation of your Ruby code after compilation into bytecode. Since it&#8217;s closely tied to the Ruby VM internals, the same Ruby code can produce a different <code>iseq</code> in different Ruby versions, not just in terms of instructions but even in their overall structure and relationships between different instruction sequences.</p>



<p>Instruction Sequence provides direct access to the low-level representation of Ruby code. Debuggers can leverage this feature by toggling certain internal flags or even modifying instructions in <code>iseq</code>, effectively altering how the program runs at runtime without changing the original source code.&nbsp;</p>



<p>For example, a debugger might enable trace events on a specific instruction that doesn’t have one by default, causing the Ruby VM to pause when that point is reached. This is how breakpoints in specific language constructions and stepping through chains of calls work. The ability to instrument bytecode directly is essential for building debuggers that operate transparently, without requiring the developer to insert debugging statements or modify their code in any way.</p>



<p>Let&#8217;s take a look at how to get an Instruction Sequence in Ruby code.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="ruby" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def say_hello
 puts "Hello Ruby developers ?!"
end


method_object = method(:say_hello)
iseq = RubyVM::InstructionSequence.of(method_object)


puts iseq.disasm</pre>



<p>Let&#8217;s examine this code more closely. First, we have our familiar <code>say_hello</code> method containing a <code>puts</code> statement. Then, we create a method object from it using <code>method(:say_hello)</code>. Finally, we get the Instruction Sequence for this method and print out its human-readable form using <code>disasm</code>. This lets us peek under the hood and see the actual bytecode instructions that Ruby will execute.</p>



<p>Let&#8217;s examine the output and see what it looks like.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">== disasm: #&amp;lt;ISeq:say_hello@iseq_example.rb:1 (1,0)-(3,3)>
0000 putself                                                          (   2)[LiCa]
0001 putchilledstring                       "Hello Ruby developers ?!"
0003 opt_send_without_block                 &amp;lt;calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
0005 leave                                                            (   3)[Re]</pre>



<p>The first line shows metadata about our Ruby entity. Specifically, the <code>say_hello</code> method defined in <code>iseq_example.rb</code> with a location range <code>(1,0)-(3,3)</code>. Below that are the actual instructions that the Ruby VM will execute. Each line represents a single instruction, presented in a human-readable format. You can easily spot the &#8220;Hello Ruby developers ?!&#8221; string argument preserved exactly as it appears in the source code, without any encoding or decoding complexity, even with non-ASCII symbols. Such transparency makes it easier for you to understand what&#8217;s happening at the bytecode level.</p>



<p>Instruction Sequence plays a critical role in Ruby debugging by marking key execution points in the bytecode. In bracket notation in the output, you can notice markers like <code>Li</code> for line events, <code>Ca</code> for method calls, and <code>Re</code> for returns. These markers tell the Ruby VM when to emit runtime events. TracePoint relies on these markers to hook into the running program — it listens for these events and steps in when they happen. This tight connection between two technologies is what makes it possible for debuggers to pause execution and inspect the state.</p>



<h3 class="wp-block-heading">Going deeper: Ruby&#8217;s C-level debugging API</h3>



<p>So far, we&#8217;ve looked at the two core technologies behind Ruby debuggers — TracePoint and Instruction Sequence. These are enough to build a working Ruby debugger. However, if you want to implement advanced features like those offered by RubyMine, such as smart stepping or navigating back and forth through the call stack, TracePoint and Instruction Sequence alone won’t cut it. To support such capabilities, you need to go a level deeper and tap into the low-level debugging APIs provided by Ruby itself.</p>



<p>CRuby exposes a number of internal methods that fill the gaps left by the public Ruby APIs. These methods are defined in C headers such as <a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/vm_core.h" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/vm_core.h" target="_blank" rel="noopener">vm_core.h</a>, <a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/vm_callinfo.h" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/vm_callinfo.h" target="_blank" rel="noopener">vm_callinfo.h</a>, <a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/iseq.h" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/iseq.h" target="_blank" rel="noopener">iseq.h</a>, and <a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/include/ruby/debug.h" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/include/ruby/debug.h" target="_blank" rel="noopener">debug.h</a>, among others. These internal interfaces can unlock powerful capabilities that go beyond what’s possible with the public API, but they come with important trade-offs.</p>



<p>Since they are specific to CRuby, debuggers using them won’t work with other implementations like JRuby or TruffleRuby. Another downside is that these APIs are not public or stable across Ruby versions. Even minor updates can break them, which means any debugger depending on these methods needs constant attention to keep up with Ruby’s changes. Still, it’s worth exploring a few of these internal methods to get a better idea of what this low-level API looks like and what it provides for debugger tools.</p>



<p>Let&#8217;s start with <code><a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/include/ruby/debug.h#L423" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/include/ruby/debug.h#L423" target="_blank" rel="noopener">rb_tracepoint_new(...)</a></code>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">VALUE rb_tracepoint_new(VALUE target_thread_not_supported_yet, rb_event_flag_t events, void (*func)(VALUE, void *), void *data);</pre>



<p>This method works like creating a trace point in Ruby code, but with more flexibility for advanced use. It’s especially helpful for low-level debuggers written as C extensions that need deeper access to the Ruby VM. In the RubyMine debugger, this approach allows more precise control over when and where to enable or disable trace points, which is essential for implementing smart stepping.</p>



<p>Another useful method is <a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/include/ruby/debug.h#L227" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/include/ruby/debug.h#L227" target="_blank" rel="noopener"><code>rb_debug_inspector_open(...)</code></a>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">VALUE rb_debug_inspector_open(rb_debug_inspector_func_t func, void *data);</pre>



<p>This C-level API lets you inspect the call stack without changing the VM state. The <code>func</code> callback receives a <a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/include/ruby/debug.h#L207" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/include/ruby/debug.h#L207" target="_blank" rel="noopener"><code>rb_debug_inspector_t</code></a> struct, which provides access to bindings, locations, instruction sequences, and other frame details. In the RubyMine debugger, it’s used to retrieve the list of frames and implement the ability to switch between them back and forth on the call stack when the program is suspended by the debugger. Without this API, frame navigation and custom frame inspection in Ruby would be much more difficult.</p>



<p>The final example is a pair of methods for working with <code>iseq</code> objects. The method <code><a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/iseq.h#L221" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/iseq.h#L221" target="_blank" rel="noopener">rb_iseqw_to_iseq(...)</a></code> converts an <code>iseq</code> from a Ruby value to a C value, while <code><a href="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/iseq.h#L203" data-type="link" data-id="https://github.com/ruby/ruby/blob/a0fe0095ab2711ba54b29cdd2a5957f993cfc1de/iseq.h#L203" target="_blank" rel="noopener">rb_iseq_original_iseq(...)</a></code> converts it back from C to Ruby. These let Ruby debuggers switch between Ruby and C-extension code when precise, low-level control is needed. In the RubyMine debugger, they are actively used in the implementation of smart stepping, helping determine which code should be stepped into during debugging.</p>



<p>These low-level APIs offer powerful tools for building advanced debugging features — the kind that aren’t possible with TracePoint and Instruction Sequence alone. But they come with a cost: platform lock-in to CRuby and a high maintenance burden due to their instability across Ruby versions. Despite that, they remain essential for debuggers that need deep integration with the Ruby VM.</p>



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



<p>In this post, we explored the foundational technologies that power Ruby debuggers — TracePoint and Instruction Sequence. These two components form the basis for how modern Ruby debuggers observe and interact with running Ruby code. TracePoint enables hooks into specific runtime events like method calls and line execution, while Instruction Sequence provides low-level access to the compiled Ruby VM bytecode.</p>



<p>We also took a brief look at how low-level CRuby C APIs exert even more precise control over code execution, offering insight into how debuggers like RubyMine implement advanced features. While we didn’t dive into full debugger implementations here, this foundation lays the groundwork for understanding how these tools operate.</p>



<p>Stay tuned — in a future post, we’ll go further into how modern debuggers are built on top of this foundation.</p>



<p>Happy coding, and may your bugs be few and easily fixable!</p>



<p>The RubyMine team</p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[ja]]></code>
                        <url>https://blog.jetbrains.com/ja/ruby/2025/06/inside-ruby-debuggers/</url>
                    </language>
                	</item>
		<item>
		<title>What’s Next for RubyMine</title>
		<link>https://blog.jetbrains.com/ruby/2025/06/what-s-next-for-rubymine/</link>
		
		<dc:creator><![CDATA[Alexey Varfolomeev]]></dc:creator>
		<pubDate>Tue, 03 Jun 2025 07:55:54 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/06/Featured_Blog_1280x720-2x.png</featuredImage>		<category><![CDATA[eap]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[new-features]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=571724</guid>

					<description><![CDATA[Hello everyone! The RubyMine 2025.2 Early Access Program is already available! In this blog post, we’ll share the upcoming features and updates planned for this release cycle. What’s coming in RubyMine 2025.2? Debugger improvements We&#8217;re introducing a number of changes aimed at enhancing the debugger installation experience. The entire process will now take less time, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Hello everyone!</p>



<p>The RubyMine 2025.2 Early Access Program is already available! In this blog post, we’ll share the upcoming features and updates planned for this release cycle.</p>



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



<h2 class="wp-block-heading"><strong>What’s coming in RubyMine 2025.2?</strong></h2>



<h3 class="wp-block-heading"><strong>Debugger improvements</strong></h3>



<p>We&#8217;re introducing a number of changes aimed at enhancing the debugger installation experience. The entire process will now take less time, and the associated notifications will be less distracting and more informative. Finally, the RubyMine debugger will be updated to support newly released Ruby versions sooner than it previously did.&nbsp;</p>



<h3 class="wp-block-heading"><strong>Better multi-module support</strong></h3>



<p>A priority of the upcoming RubyMine release is the provision of support for multi-module projects. This will include bundler improvements, faster startup for multi-module projects, smoother switching between interpreters, and more.</p>



<h3 class="wp-block-heading"><strong>Automatic management of RBS Collection</strong></h3>



<p>We made <a href="https://youtrack.jetbrains.com/issue/RUBY-34075" target="_blank" rel="noopener">this feature</a> a default setting, which requires RBS 3.2. Ruby 3.4 comes with a compatible RBS version bundled. This is beneficial for all features related to code insight.</p>



<h3 class="wp-block-heading"><strong>Better remote development experience</strong></h3>



<p>We are continuing to enhance RubyMine remote development as an alternative to using just remote Ruby interpreters. In 2025.2, you will enjoy an even better overall performance and several improvements to split mode.</p>



<h3 class="wp-block-heading"><strong>AI Assistant improvements</strong></h3>



<p>In the new release, you can expect AI Assistant to generate more code suggestions across your projects. The quality of multi-line suggestions will also improve now that the formatting of outputs has been <a href="https://youtrack.jetbrains.com/issue/RUBY-33824/Incorrect-formatting-for-multi-line-completion-suggestions" target="_blank" rel="noopener">fixed</a>.&nbsp;</p>



<p>What’s more, in line with our efforts to expand AI Assistant’s functionality, we have improved code completion for ERB in RubyMine 2025.2.&nbsp;</p>



<h2 class="wp-block-heading"><strong>Join the Early Access Program</strong></h2>



<p>You can download the latest EAP build <a href="https://www.jetbrains.com/ruby/nextversion/" target="_blank" rel="noopener">from our website</a> or via the <a href="https://www.jetbrains.com/toolbox-app/" target="_blank" rel="noopener">Toolbox App</a>. The full list of tickets addressed by this EAP build is available in the <a href="https://youtrack.jetbrains.com/articles/RUBY-A-220365209" target="_blank" rel="noopener">release notes</a>.</p>



<p>Stay connected through our official <a href="https://twitter.com/rubymine" target="_blank" rel="noopener">RubyMine X channel</a>. We encourage you to share your thoughts in the comments below and to create and vote for new feature requests in our <a href="https://youtrack.jetbrains.com/issues/ruby" target="_blank" rel="noopener">issue tracker</a>.</p>



<p><em>Happy developing!</em></p>



<p><em>The RubyMine team</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Junie and RubyMine: Your Winning Combo</title>
		<link>https://blog.jetbrains.com/ruby/2025/06/junie-and-rubymine-your-winning-combo/</link>
		
		<dc:creator><![CDATA[Alexey Varfolomeev]]></dc:creator>
		<pubDate>Tue, 03 Jun 2025 07:55:50 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/06/RubiMine-1920x1080-1.png</featuredImage>		<category><![CDATA[jetbrains-ai]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[ai-agent]]></category>
		<category><![CDATA[junie]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=571765</guid>

					<description><![CDATA[Junie, a powerful AI coding agent from JetBrains, is available in RubyMine! Install the plugin and try it out now! Why Junie is a game-changer Unlike other AI coding agents, Junie leverages the robust power of JetBrains IDEs and reliable large language models (LLMs) to deliver exceptional results with high precision. According to SWE-bench Verified, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><em>Junie, a powerful AI coding agent from JetBrains, is available in <a href="https://www.jetbrains.com/ruby/promo/" target="_blank" rel="noopener">RubyMine</a>! </em><a href="https://plugins.jetbrains.com/plugin/26104-jetbrains-junie" target="_blank" rel="noopener"><em>Install</em></a><em> the plugin and try it out now!</em></p>



<h3 class="wp-block-heading"><strong>Why Junie is a game-changer</strong></h3>



<p>Unlike other AI coding agents, Junie leverages the robust power of JetBrains IDEs and reliable large language models (LLMs) to deliver exceptional results with high precision.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="You think it – Junie helps make it happen" src="https://www.youtube.com/embed/c--l1DZaeC0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>According to <strong>SWE-bench Verified</strong>, a curated benchmark of 500 real-world developer tasks, <strong>Junie successfully solves 60.8% of tasks on a single run</strong>. This impressive success rate demonstrates Junie’s ability to tackle coding challenges that would normally require hours to complete. This is more than AI – it’s the latest evolution in developer productivity.</p>



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



<h3 class="wp-block-heading"><strong>Your most trusted AI partner</strong></h3>



<p>Junie isn’t just an assistant – it’s your creative and strategic<em> </em>partner. Here’s what Junie can do for you in RubyMine:</p>



<ul>
<li><strong>Build entire Ruby apps, not just snippets</strong><strong><br></strong>Need more than individual code fragments? Junie can write entire applications, handling complex structures with ease and precision.</li>



<li><strong>Automate inspections and testing</strong><strong><br></strong>Pairing Junie with RubyMine’s powerful code insight tools means inspections and automated tests (RSpec, minitest) are no longer a chore. Let Junie ensure your code works – and works well.</li>



<li><strong>Suggest features and code improvements</strong><strong><br></strong>Stuck? Junie brings fresh ideas to the table, pointing out areas for improvement, suggesting optimizations, or brainstorming entirely new features for your project.</li>



<li><strong>Clean and align code with your style</strong><strong><br></strong>Junie doesn’t just write code – it ensures everything aligns with <strong>your coding style and guidelines</strong>, leaving your code polished, structured, and ready to deploy.</li>
</ul>



<figure class="wp-block-image"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/AD_4nXfHwXLlxMMbMGg08lwBqrWvl3ZHNsVVXImc-RPHpX_Vtqh0Mtk8NT5DpHA3EQXw8RRVqUesGHy1rpHpImGZ-SfxnjwprqKJsf84WG7tFwL61zOn8P3wy38ER0Ltkr1V42vS82J2gA.gif" alt="Junie responding to a prompt in RubyMine"/></figure>



<p>With most of the heavy lifting off your plate, Junie saves you time and mental energy. Instead of getting bogged down in the mundane, you’re free to focus on strategy, innovation, and big-picture ideas.</p>



<h3 class="wp-block-heading"><strong>You define the process, Junie elevates it</strong></h3>



<p>While Junie is indeed powerful and capable, it’s designed to enhance your coding experience, not take control of it. <strong>You remain the decision-maker at every step</strong> – from delegating tasks to reviewing Junie’s code suggestions.&nbsp;</p>



<p>You control how and when AI contributes to your workflow. No matter what you entrust to Junie, it will adapt to your style and always give you the final say, ensuring that your code remains truly yours.</p>



<h2 class="wp-block-heading"><strong>Try Junie in RubyMine today</strong></h2>



<p>Now is the perfect time to try Junie in RubyMine and experience firsthand how AI can boost your productivity, simplify your workflow, and enhance your coding experience.</p>



<p>To install Junie in RubyMine, visit <a href="https://plugins.jetbrains.com/plugin/26104-jetbrains-junie" target="_blank" rel="noopener">this page</a>.&nbsp;</p>



<p><strong>Follow us for updates and tips</strong></p>



<p>Find more about Junie and the project&#8217;s further development in&nbsp;<a href="https://blog.jetbrains.com/junie/2025/05/what-s-next-for-junie-building-a-smart-and-controllable-ai-coding-agent/" target="_blank" rel="noreferrer noopener">this article</a>.</p>



<p>Stay connected through our official <a href="https://twitter.com/rubymine" target="_blank" rel="noopener">RubyMine X channel</a>. Don’t forget to share your thoughts in the comments below and to suggest and vote for new features in our <a href="https://youtrack.jetbrains.com/issues/ruby" target="_blank" rel="noopener">issue tracker</a>.</p>



<p><em>Happy developing!</em></p>



<p><em>The RubyMine team</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RubyMine 2025.1: Major AI Assistant Upgrade, Cloud-Based Code Completion for RBS, More Ruby 3.4 Support, Kamal Schema Updates, Enhanced RemDev, and More</title>
		<link>https://blog.jetbrains.com/ruby/2025/04/rubymine-2025-1-major-ai-assistant-upgrade/</link>
		
		<dc:creator><![CDATA[Alexey Varfolomeev]]></dc:creator>
		<pubDate>Wed, 16 Apr 2025 12:15:35 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/04/Featured_Blog_1280x720-2x-1-3.png</featuredImage>		<category><![CDATA[releases]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[rubymine-2025-1]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=ruby&#038;p=559466</guid>

					<description><![CDATA[RubyMine 2025.1 introduces a massively upgraded AI Assistant (code completion for RBS, offline mode, more models available, and other features), support for the latest Kamal version, debugging for multi-module projects, and significantly improved remote development. Below is a brief overview of the most notable features. For a detailed description of this update, please visit our [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>RubyMine 2025.1 introduces a massively upgraded AI Assistant (code completion for RBS, offline mode, more models available, and other features), support for the latest Kamal version, debugging for multi-module projects, and significantly improved remote development.</p>



<p>Below is a brief overview of the most notable features. For a detailed description of this update, please visit our <a href="https://www.jetbrains.com/ruby/whatsnew/" target="_blank" rel="noopener">What’s New page</a>.</p>



<p>You can get the new build from our <a href="https://www.jetbrains.com/ruby/download/?_gl=1*1eyvko0*_ga*MTkyMjY3OTIxMy4xNjY0ODc1NjA2*_ga_9J976DJZ68*MTY3MTM5ODA0Mi4zMjIuMS4xNjcxMzk5OTk3LjIzLjAuMA..&amp;_ga=2.135890417.1325099170.1671311045-1922679213.1664875606" target="_blank" rel="noopener">website</a> or via the free <a href="https://www.jetbrains.com/toolbox/app/" target="_blank" rel="noopener">Toolbox App</a>.</p>



<h2 class="wp-block-heading">AI Assistant</h2>



<p>The new RubyMine release comes with all <a href="https://www.jetbrains.com/ai-ides/" target="_blank" rel="noopener">JetBrains AI features</a> accessible for free, with unlimited use for some, such as unlimited code completion and local model support, and limited credit-based access to others. You can choose what to use and how to use it with the <a href="https://www.jetbrains.com/ai-ides/buy/" target="_blank" rel="noopener">new subscription system</a>.</p>



<h3 class="wp-block-heading">RBS coding assistance</h3>



<p>RubyMine 2025.1 further expands the powers of the JetBrains AI Assistant plugin with code completion for RBS based on JetBrains’ new Mellum model. AI Assistant now also allows you to use natural language prompts directly in the editor to enhance your RBS coding.</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/rbs_inline_prompt.gif" alt="Editing RBS with cloud-based code completion" class="wp-image-559519" style="aspect-ratio:2.2666666666666666;width:840px;height:auto; width:100% !important; height:auto !important; max-width:100% !important;"/></figure>



<h3 class="wp-block-heading">Better AI suggestions</h3>



<p>AI code suggestions are now provided with error inspections and syntax highlighting to make sure you find and use only what best suits your purposes.</p>



<h3 class="wp-block-heading">New models and modes</h3>



<p>Take full control of your AI experience in RubyMine by choosing from the latest and most advanced models: Claude 3.7 Sonnet and Gemini 2.0 Flash.</p>



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



<p>You can now also use the plugin offline. With Ollama and LM Studio local models, all AI-powered coding assistance is still available even when there’s no internet connection.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/local_models_offline.png" alt="Enabling AI Assistant offlinemode" class="wp-image-559644"/></figure>



<h3 class="wp-block-heading">Improved AI chat</h3>



<p>Be more productive with the upgraded AI chat, which can now locate the most relevant files and make suggestions across your entire project within one interaction. Moreover, it will find and suggest where to insert the newly generated code to save you the trouble of manual copy-pasting. All it takes is one click on the <em>Apply </em>button.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/apply_snippet.png" alt="Applying suggested code snippet" class="wp-image-559544"/></figure>



<h3 class="wp-block-heading">Smarter AI awareness</h3>



<p>The revamped AI Assistant better understands your entire project thanks to the advanced RAG-based retrieval technique. While AI context now includes recently accessed files, you can tell AI Assistant which files or folders to ignore by configuring an <code>.aiignore </code>file.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/aiignore_enable.png" alt="Enabling .aiignore file" class="wp-image-559555"/></figure>



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



<h3 class="wp-block-heading">Ruby 3.4 support&nbsp;</h3>



<p>RubyMine 2025.1 displays warnings when you create constants or modify the global Ruby namespace and sends error messages when using keyword and block arguments inside index assignments.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/3.4_namespace.png" alt="Warning on using reserved Ruby namespace" class="wp-image-559566"/></figure>



<h3 class="wp-block-heading">asdf 0.16+ compatibility&nbsp;</h3>



<p>RubyMine 2025.1 supports the latest version of asdf to make sure the interpreters installed with this version manager are recognized properly. This fixes any issues you might have previously encountered in RubyMine when using the re-written 0.16 version of asdf.</p>



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



<h3 class="wp-block-heading">Kamal 2.4.0 and 2.5.0 support&nbsp;</h3>



<p>RubyMine 2025.1 comes with the updated <code>deploy.yml</code> schema to help you deploy your Rails applications with the new 2.4.0 and 2.5.0 versions of Kamal.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/kamal_support.png" alt="Editing deploy.yml config file with updated schema" class="wp-image-559577"/></figure>



<h3 class="wp-block-heading">Rake task and Rails generator handling</h3>



<p>Control the automatic refreshing of Rails generators and Rake tasks using advanced settings. When the automatic loading is disabled, only manual reload actions are available. We have also improved the UX by placing loading errors in balloon notifications instead of the previously used window notifications.&nbsp;</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/disable_automatic_loading.gif" alt="Disabling automatic Rake task and Rails generator loading" class="wp-image-559588"/></figure>



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



<h3 class="wp-block-heading">User interface updates</h3>



<p>The UI improvements in RubyMine 2025.1 include native Windows file dialogs, which are part of the default settings but can be changed to the previous option in <em>Advanced Settings | User Interface</em>. We also simplified the procedure of creating new files. After clicking the + icon in the <em>Project </em>tool window, you can now quickly find and select the required template from the popup using the search field.&nbsp;</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/new_file_popup-1.gif" alt="New File popup" class="wp-image-559599"/></figure>



<h3 class="wp-block-heading">Automatic plugin updating&nbsp;</h3>



<p>RubyMine 2025.1 can update plugins in the background. With this setting, all available and compatible updates are downloaded and applied on the next RubyMine restart.&nbsp;</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/automatic_plugin_update.png" alt="Enabling automatic plugin updating" class="wp-image-559610"/></figure>



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



<p>RubyMine 2025.1 no longer offers the modal commit interface as a bundled option, but you can still use it as a separate plugin. Another change is the enhanced <em>diff </em>view, which allows you to see commit details for quicker and easier analysis of the file history and modifications.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/enhanced_diff_view.png" alt="Viewing file details in new diff view" class="wp-image-559621"/></figure>



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



<h3 class="wp-block-heading">Containerfile support</h3>



<p>Enjoy more freedom and flexibility when using various tools for remote solutions in the same environment. With RubyMine 2025.1 featuring built-in Containerfile recognition, Docker, Podman, and Buildah can all be configured in the same file. And this file is fully recognized by the tools of your choice, with full support for syntax highlighting, linting, and snippet suggestions.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" loading="lazy" src="https://blog.jetbrains.com/wp-content/uploads/2025/04/containerfile.png" alt="Editing Containerfile " class="wp-image-559633"/></figure>



<h3 class="wp-block-heading">Improved editing</h3>



<p>With reduced typing, highlighting, and formatting latency, RubyMine 2025.1 ensures a better overall editing experience in remote development.</p>



<p>To learn about the latest features as they come out, please follow <a href="https://twitter.com/rubymine" target="_blank" rel="noopener">RubyMine on X</a>.&nbsp;</p>



<p>We invite you to share your thoughts in the comments below and to suggest and vote for new features in the <a href="https://youtrack.jetbrains.com/issues/ruby" target="_blank" rel="noopener">issue tracker</a>.<br></p>



<p>Happy developing!<br></p>



<p>The RubyMine team</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
