A lot of people have developed a gag reflex against anything touched by AI.
I understand where that comes from. There is a lot of slop, maintainers are tired of reviewing code from people who do not understand it, and people are tired of predictable cadence.
We’re also heading toward a version of the future where all code will be generated. The models are good enough that for a lot of work, especially the boring repetitive kind, typing everything by hand makes very little sense. You can describe what you want, steer the model, ask for changes, review the output, and get to a working implementation much faster than before.
That caused some people to jump from “models can generate code” to…
Blue Ridge Ruby Insights & Experiences
In this episode, Chris, Andrew, and David are back together with David starting out giving a recap of Blue Ridge Ruby and his renewed motivation to contribute to open source. The group discusses the value of smaller single-track conferences to hallway conversations, and lightning talks. The conversation then shifts into real-world Rails and Stripe lessons, including workshop prep, validation decisions, webhook recovery, subscription edge cases, and the growing complexity of payment integrations. Hit download now to hear more!
Links
- Judoscale- Remote Ruby listener gift
- Getting Started with Rails with Chris Oliver (Frontend Masters Live Interactive Workshop)
- Ruby Conferences 2026
Honey…
Introduction
Markdown has become the lingua franca of AI. Large language models output markdown by default, documentation lives in markdown files, and developers think in markdown.
Why AI “Speaks” Markdown
Markdown’s rise in the age of AI comes down to a few key factors:
-
Simplicity and Structure: Its minimalist, plain text syntax (
#for headings,*for lists) creates a clear, predictable structure that AI models are trained on and can easily interpret. -
Enhanced Comprehension: AI struggles with complex formats like PDFs or Word documents due to visual clutter and metadata. Markdown strips this away, letting AI focus on meaningful content.
-
Improved Prompting…
May 21, 2026 How MRI Really Implements include, prepend, extend, Singleton Classes and Method Lookup Ruby’s object model looks elegant from the outside: module Logging def call puts "before" super end end class Service prepend Logging def call puts "service" end end But internally, MRI/CRuby performs a surprising amount of machinery to make this work. … Continue reading Inside Ruby’s Object Model
Why Ruby still feels like home
#801 — May 21, 2026
Ruby Weekly
🛠️ One Year of Ruby on Rails Configuration — The creator of GoodJob shares a tour of the monkey patches, extensions, and appwide behaviors that have accumulated in his Rails app’s /config directory. It’s heavy on examples and things you might want to steal be inspired by.
Ben Sheldon
Ruby 4.0.5 Released — An off-schedule release to address a critical use-after-free race condition in the getaddrinfo timeout handler. It also resolves a build system regression under the C locale introduced in 4.0.4.
Takashi Kokubun
Welcome Back, Judoscale!
Welcome Back, Judoscale! We're excited to welcome Judoscale back as a Silver Sponsor of RubyConf for the second year in a row. If you've ever lost sleep wondering whether your Rails app could handle a sudden traffic spike, Judoscale is probably already on your radar and if it's not, it should be.
Judoscale is a dedicated autoscaler for Rails apps (and beyond), purpose-built around request queue time rather than blunt metrics like CPU or memory. That distinction matters: queue time tells you when your app is actually struggling, not just busy. The result is smarter, faster scaling up when you need it, down when you don't without the overprovisioning tax most teams quietly pay every month.…
Fuik is a Rails engine for handling webhooks that I launched recently. But it can also be used to process inbound emails! 💡
When working with inbound email in Rails using Action Mailbox, there’s a key requirement: managing EML files and blob storage. Once an email arrives at your domain, your email provider captures it and sends the data to you via webhook. You then extract what you need and process (or store) it. Action Mailbox requires: ActiveStorage ánd ActionMailer.
But what if you don’t have a need for ActiveStorage (including its cloud storage setup) or ActionMailer (because you use Courrier).
Most transactional email providers send their inbound emails as webhooks: Postmark,…
Making software accessible often comes down to removing small but repeated points of friction in everyday workflows. Today, on Global Accessibility Awareness Day, we’re sharing recent improvements in JetBrains IDEs across several areas: compatibility with assistive technologies on various platforms, keyboard navigation, and non-visual feedback. Some of these improvements are already available, and some are coming later this year.
You can use the audio player below to listen to this blog post.
Accessibility Blog Post AudioBetter compatibility with…
Dropping a column from a database table is one of the simplest possible migrations, if you just look at the syntax. But if you run that migration in a large application used by a ton of users where taking the application down for maintenance is not an option, you may run into problems.
One thing I didn't realize until researching this post: ActiveRecord caches each model's schema the first time the model is loaded, and in production, with eager loading on, that means the whole schema is effectively cached at boot.
This matters because of the deploy order. The migration runs first, then the app server restarts onto the new schema. In between, there's a window where the old process…
RailsEventStore 2.19: Starting Gun for 3.0
RailsEventStore 2.19.2 is out — grab that one, not .0 or .1 (more on why below).
This release is the starting gun for 3.0. We’ve added deprecation warnings for everything we’re removing in the next major version. Run your test suite — every warning you see is a hard error in 3.0.
Deprecations
We’re deprecating a batch of APIs in 2.19 that will be removed in 3.0.
RubyEventStore
in_batches_of
Renamed to in_batches for consistency with the rest of the API.
# deprecated
event_store.read.in_batches_of(100).each { |batch| ... }
# use instead
event_store.read.in_batches(100).each { |batch| ... }
of_types
Renamed to of_type. Singular, consistent with…
4.0.12 Released
RubyGems 4.0.12 includes enhancements and bug fixes and Bundler 4.0.12 includes enhancements and bug fixes.
To update to the latest RubyGems you can run:
gem update --system [--pre]
To update to the latest Bundler you can run:
gem install bundler [--pre]
bundle update --bundler=4.0.12
RubyGems Release Notes
Enhancements:
- Remove cygwin from WIN_PATTERNS. Pull request #9527 by fd00
- Installs bundler 4.0.12 as a default gem.
Bug fixes:
- Fall back to lockfile version when
BUNDLE_VERSIONis “lockfile”. Pull request #9545 by hsbt - Read
BUNDLE_VERSIONenv var inBundlerVersionFinder. Pull request #9538 by hsbt
Bundler Release Notes
Enhancements:
- Make
bundle config get…
Why thoughtbot is joining the Ruby Alliance
For more than two decades, Ruby has shaped how we think about software development at thoughtbot. It influenced how we write code, how we collaborate, how we teach, and how we build products alongside our clients. Many of the practices, tools, and ideas that define our company today were either born from or heavily influenced by the Ruby community.
Ruby also helped shape our careers, friendships, businesses, and opportunities. That’s a big part of why we’re excited to share that thoughtbot is joining the Ruby Alliance alongside Gusto as a founding company.
What is the Ruby Alliance?
The Ruby Alliance is a new coalition of companies making a long-term financial and operational…
A use-after-free vulnerability has been discovered in the pthread-based getaddrinfo timeout handler of Ruby. This vulnerability has been assigned the CVE identifier CVE-2026-46727. This issue has been fixed in Ruby 4.0.5. We recommend upgrading Ruby.
Details
A race condition exists in the timeout cancellation path of rb_getaddrinfo used by Addrinfo.getaddrinfo(..., timeout:) and Socket.tcp(..., resolv_timeout:). A remote attacker who can delay DNS responses near the specified timeout may cause the Ruby process to dereference freed memory and crash.
Recommended action
Please update to Ruby 4.0.5 or later.
Workaround
If you cannot upgrade immediately, avoid passing timeout: to Addrinfo.…
Ruby 4.0.5 Released
Ruby 4.0.5 has been released.
This release only contains a security fix for CVE-2026-46727: Use-after-free in pthread-based getaddrinfo timeout handler and a build system regression in Ruby 4.0.4 under C locale [Bug #22065].
Please see the GitHub releases for further details.
Release Schedule
We intend to release the latest stable Ruby version (currently Ruby 4.0) every two months following the most recent regular release. Ruby 4.0.6 will be released in July, 4.0.7 in September, and 4.0.8 in November.
If a change arises that significantly affects users, a release may occur earlier than planned, and the subsequent schedule may shift accordingly.
Download
Ruby Argentina May meetup
We gathered again at Working & Co in Buenos Aires for another Ruby Argentina meetup. As always, the event was streamed live on RubySur’s YouTube channel, and our sponsors (SINAPTIA, Rootstrap, OmbuLabs, and Crunchloop) kept us fed and hydrated throughout the night.
Vacas, Rails y Blockchain
Ignacio Cesarani presented his thesis project: a cattle trading platform built with Ruby on Rails and blockchain. The interesting part is the architecture: it uses Ethereum RSK as a sidechain to record transactions immutably, while keeping operational data in a traditional database.
Break
After the first talk, we had time to eat, drink, and chat. The sponsors put together a good spread, and the…

AI-assisted code generation is not free. It comes with a hidden cost: burnout. Are we dangerously ignorant to this problem? And how can we cope with it? In this post, we discuss this question.
We’re more productive than ever. AI allows us to generate code at supersonic speeds, unfold entire modules in seconds, and ship thousands of lines of code. It's easier to pick up tasks and generate value, even in unfamiliar codebases. But there’s a dark side. AI-assisted code generation isn't free; there's a hidden cost that we as an industry are only beginning to realize: AI burnout. Are we…
thoughtbot Joins the Ruby Alliance
We’re excited to share that thoughtbot has become the second company to join the Ruby Alliance.
For 23 years, thoughtbot has helped shape the Ruby ecosystem through thoughtful engineering practices, trusted guidance on large-scale application development, and some of the most respected educational resources in the community.
Their participation in the Ruby Alliance brings experienced leadership, operational perspective, and a strong commitment to helping support the long-term health of Ruby and the infrastructure the community depends on.
As the Ruby Alliance continues to take shape, thoughtbot’s consulting experience and community perspective will help inform how Alliance companies can work…
Passenger 6.1.3

Version 6.1.3 of the Passenger application server has been released. This release adds packages for Ubuntu 26.04 "resolute", and removes packages for Ubuntu 25.10 "questing" and Ubuntu 20.04 "focal".
Added support for Ruby app post response hooks
The optional feature of Rack 3 (`rack.response_finished`) is now supported, Closes GH-2418.
Fix a crash when buffer creation fails
Passenger could crash when it was unable to create a buffer file while handling a request that exceeded the in-memory buffer size. This was fixed through additional pointer validation.
Updates & improvements
- [Nginx] Build Nginx dynamic modules against nginx-dev sources on Ubuntu/Debian where available to accommodate Ubuntu's…
Rails 8 introduces a significant change to the asset pipeline by making Propshaft the default asset pipeline, replacing Sprockets which has been the default since Rails 3.1.
This change reflects the modern approach to asset management in Rails applications.
What is Propshaft?
Propshaft is a lightweight asset pipeline that does one thing well: it fingerprints assets and serves them.
Unlike Sprockets which bundles, transpiles, and concatenates files, Propshaft delegates those responsibilities to specialized tools.
Here’s what each pipeline actually does:
Feature Sprockets Propshaft Asset fingerprinting Yes Yes …
Arabic, Hebrew, and other right-to-left script users often can't type properly in apps that never considered them. The fix is usually two HTML attributes. Here's exactly what to add, and when.
You shipped, the app works, users sign up. Then a bug: "The input field doesn't work properly." Turns out their language is Arabic. When typing a prompt, text renders left-to-right. This meant alignment was off, punctuation lands on the wrong side, and the whole sentence reads garbled. When a user can use a right-to-left language, even English apps will break. This…
Continuations 2026/20: Repeated reads
A proud moment this week! After Sean made a nice performance related enhancement to Dry Configurable (now you can call
#to_dataon your config to get a data object that’s optimised for fast repeated reads), he became the first of my teammates to cut a new gem release via Release Machine! Thank you Sean, I’m looking forward to more of this in the future. 😃This was another week of PR reviews. Of note: improving Hanami View performance by using the new Dry Configurable data object (thanks Sean!), a Dry Types extension for Dry CLI (thanks Paweł!), making Dry Initializer usable from non-main Ractors (thanks Nikita!), a fix for array variables in Hanami Router route expansions (thanks Edouard…
I put together another nice enhancement to Dry Operation, making it possible to give names to steps, which are then…
Goblin Dot Business
Business Goblin (left) is a character created by friend and colleague Matthew Grey (right). Originally drawn for an internal presentation, he represents greedy unscrupulous businesses selling fake AI hype without the ability to follow through on their promises. After the presentation, Business Goblin took on a bit of a life of his own, appearing around the office as a life-sized coreflute cutout.
Recently, after a couple of Friday evening beers, a small group of collegues and I asked the question: what if you could email Business Goblin and he actually emailed you back? I happened to be looking for an LLM-related side project, and so 24 hours later https://goblin.business/ was up…
Send him an email…
I’ve never used “social” media. Instead, I read a lot on various topics: Rails, web/tech and beyond. Next to the weekly practical article a week on Rails, Hotwire, CSS, SaaS and design I published, I have, since March, started sharing some thoughts and notes. They’re not publicly listed, but accessible via Atom feed only.
I hope to see more platform-independent Twitter-style feeds from others too. Web standards like RSS/Atom are great and don’t lock you into a platform or company. Just linear posts, no ragebaits or shitposting from others (and if so, unsubscribe).
With Perron’s customisable feeds feature, this is super easy to set up. I also created a tiny Raycast extension that makes…
I…
May 18, 2026 Most Ruby developers use ranges every day: (1..5) ('a'..'z') (1...) (..10) They feel lightweight, expressive, and almost deceptively simple. Built for Ruby on Rails Build Maps WithoutGoogle APIs Generate beautiful production-ready maps directly from your Rails backend. Fast rendering, zero external dependencies, full control. View Live Demo → Read Docs ✓ No … Continue reading Inside Ruby’s Range: A Tour Through range.c
From Ruby User to Ruby Committer: Lessons from Stan Lo's Open Source Journey May 17, 2026 Stan Lo didn't follow the conventional path. No CS degree, no bootcamp pedigree, no Silicon Valley zip code just steady, deliberate contributions to the Ruby ecosystem over nearly a decade. The result? Ruby committer status, the 2025 Ruby Prize, … Continue reading From Ruby User to Ruby Committer: Lessons from Stan Lo’s Open Source Journey
The Rails Infrastructure team built an open-source toolkit for benchmarking Bundler performance reliably across machines. Along the way I learned that AI is great for scaffolding, but you can’t oursource the engineering rigor required to catch when numbers don’t add up.
Read more on the Shopify’s Rails at Scale Blog
Hi, it’s Greg. Let’s explore this week’s changes in the Rails codebase.
Rails World 2026 update
General Admission tickets are now out, and the CFP is closing this weekend.
Book your ticket or apply to speak at: https://rubyonrails.org/world/2026.
A new add-on tutorial is ready for community review
This builds on the existing e-commerce app and adds a complete Product Reviews
system with ratings, image uploads, rating filtering, and admin management. If
you want to help by reviewing, leave your feedback in the PR here:
https://github.com/rails/rails/pull/57244
Also, there are 2 new guides ready for community review:
https://github.com/rails/rails/pull/57371
and
https://github.com/rails/rai…
Add default #render_in implementation to ActiveModel::Conversion
This pull request adds a default #render_in…
<%#…Hello! 8 years ago, I wrote excitedly about discovering Tailwind.
At that time I really had no idea how to structure my CSS code and given the choice between a pile of complete chaos and Tailwind, I was really happy to choose Tailwind. It helped me make a lot of tiny sites!
I spent the last week or so migrating a couple of sites away from Tailwind and towards more semantic HTML + vanilla CSS, and it was SO fun and SO interesting, so here are some things I learned!
As usual I’m not a full-time frontend developer and so all of my CSS learning has happened in fits and starts over many years.
it turns out Tailwind taught me a lot
When I started thinking about structuring CSS, I was intimidated…
Blue Ridge Ruby 2026
I attended Blue Ridge Ruby for the first time and had a great time speaking and participating in the conference held in Asheville, North Carolina. The following are a learnings and experiences that might be of interest.
-
Conference
- Day 1 (Wednesday)
-
Day 2 (Thursday)
- State is the First Decision You Never Made by Joël Quenneville
- Yes, and: Ruby’s Secret Talent for Improvisation by Ifat Ribon
- Lunch
- How To Finish What You Start: Lessons From Actually Shipping a Big Refactor by Annie Kiley
- InstiLLMent of Successful Practices in an Agentic World by Kevin Murphy
- Dinner
- Roundtable Discussion
- Day 3 (Friday)
- Asheville
- Conclu…
Conference
Both my wife and I traveled together so she could work on her novel and I could focus on the conference then have time to…
Stripe Changes, File Upload Quirks, Scaling Sidekiq
Chris and Andrew catch up after Andrew’s whirlwind “vacation-ish” road trip before diving into Stripe’s latest announcements, usage-based billing, merchant-of-record pricing, Rails file upload quirks, Active Storage image handling, Sidekiq queue strategy, and the future of RubyGems. They also discuss browser form behavior, preserving and deleting attachments, image variant performance, and how to think more clearly about background job priorities. Hit download now to hear more!
Links
- Judoscale- Remote Ruby listener gift
- Dungeon Crawler Carl
- Everything we announced at Sessions 2026 (Stripe Blog)
- Scaling Sidekiq at Gusto (Medium)
- Scaling-Sidekiq -GitHub
- Nate Berkopec post on LinkedIn-Running…
May 14, 2026 In-depth technical analysis · RubyStackNews · Concurrency & Performance For decades, the Global VM Lock (GVL) — also known as the GIL — was CRuby's great concession: the safety and simplicity of an object model free of data races, in exchange for not being able to execute Ruby code in parallel within … Continue reading Ractors: Real Parallelism in Ruby Without the GVL
Added an MCP server and CLI commands to use Rails Blocks easily.
I’ve been working professionaly with Ruby on Rails for nearly 15 years (I’m also the author of GoodJob and Spectator Sport). Last year I left GitHub and co-founded a technology startup, Frontdoor Benefits, that helps people enroll and manage their US government welfare benefits like SNAP/EBT.
Therefore, I’ve been working in a fresh Ruby on Rails app full-time now for 1 year. One of the Rails pillars is “convention over configuration”, so I thought it would be fun to share what has so far accumulated in my app’s /config directory: monkeypatches, extensions, and appwide behaviors.
Let’s start with the most controversial one.
Object#not_nil? and boolean extensions
#…CVE-2026-44836 (view_component): view_component - Preview Route Can Dispatch Inherited Helper Methods'
CVE-2026-44837 (view_component): view_component - System Test Entry Point Path Check Allows Sibling Directory Escape
#800 — May 14, 2026
Ruby Weekly
One Engine, Many Tools: Introducing Rubydex — Prism unified Ruby’s parsing layer, and now Vinicius Stock (creator of Ruby LSP) is betting the Rubydex static analysis toolkit can do the same one-level-up for code indexing, with Ruby LSP, Tapioca, and Packwerk already migrating.
Vinicius Stock
Adopting Herb at GitHub — GitHub spent the past few months integrating the Herb ERB toolchain into its Rails monolith. Joel tells the tale, including what Herb caught that erb_lint missed in GitHub’s ~500,000 lines of ERB.
Joel Hawksley (GitHub)
Custom elements have been covered here berfore. If you have used Hotwire in Rails, you have already used them. Both <turbo-frame> and <turbo-stream> are custom elements. They are just HTML tags with JavaScript behavior attached.
This article walks through building a drag-and-drop image upload custom element that works great in Rails forms. Starting with a simple avatar and ending with a reusable component that handles both inline and external forms. The code is, as usual, available on GitHub.
So first, why not use a regular file input or a Stimulus controller? The answer is that custom elements are perfect for self-contained components. They work anywhere in your HTML without needing to…
I paid five dollars to read a Medium article about my own free, open source library. It was sold as hard-won production experience.
It was fabricated.
The first code sample used RubyLLM.client, which does not exist. It called client.chat(messages: ...), which does not exist. Then it invented RubyLLM::StreamInterrupted, RubyLLM::APIError, and a stream: proc API that RubyLLM has never had.
The problem was not merely wrong information. Wrong information can be corrected. This was sold as experience with RubyLLM in production, which is a much more valuable claim.
AI slop is not just filling the web with predictable cadence. It is fabricating experience. It is letting people skip the work,…
May 12, 2026 If you still think Ruby’s Array is “just a C struct with some methods on top,” you’re about 5 years out of date. Modern MRI tells a very different story. Today, Array sits at the intersection of: Ruby code (array.rb) VM intrinsics (Primitive.*) C runtime (array.c) JIT specialization (YJIT) And the result … Continue reading MRI Internals: How Ruby Arrays Became a VM Playground
Solidus versus Spree
Why should you choose Solidus versus Spree? The projects share a common history up until 2015. That year, Solidus forked off of Spree and began a new direction. Since then, a lot has changed, but a lot has stayed the same.
Before we dive into the differences, it’s important to understand the history. Solidus is a community-led fork of Spree that kicked off shortly before the corporate backing of Spree evaporated, leaving the project unmaintained. The project ultimately picked up new leadership, but during that gap much of the community moved to the new fork. You can see the gap in Spree’s commit frequency:
If we look at Solidus’s commit frequency, you instead see a…
Have you ever worked on a brand new codebase with talented engineers, only to find out a year later that it turned into the same “archaeological strata of quick fixes” as your last legacy project? I know I have, and it happened many times.
My go-to blame target for this was usually micromanagement and imposed unrealistic deadlines. And I’m sure these play a significant role in it. But a recent conversation led me to understand another cause of this – untimely feedback. Or, to be precise, feedback that was requested or given too late.
I think many of us know the story. Someone starts working on a new capability. They spin off a feature branch and keep tinkering with it for a couple of…
Continuations 2026/19: Ebbs and flows
One thing I’ve seen in my time on these projects is that the extra help comes in ebbs and flows. In this last little while, we’ve seen some good flow, so most of my time this week was reviewing work from the team.
Here’s some of what I reviewed, all really big, notable things: Prevent parent-class injection from discarding pass-through args, a fantastic, hard won fix in Dry AutoInject from Adam; Add dependency order cop, some helpful dev tooling for AutoInject from Nikita (it’s so great to see him back!); Add Config#to_data to allow faster reads in Dry Configurable, a very nice performance bump from Sean; a Dry Types extension for Dry CLI from Paweł; Include rouge gem in Gemfile for new…
One engine, many tools
A few years ago, the new Ruby parser Prism was released. One of its primary goals was to unify the community since we had multiple implementations of Ruby parsers, each with their own bugs, differences in implementation and portability. By having a single parser, community investments in performance and correctness benefit every single tool built on top of it (including Ruby itself!).
However, the story of repeated implementations of highly complex foundational blocks doesn’t end at the parser level. Move one level up the stack and the pattern repeats. Today, we have multiple tools that implement code indexing and related static analysis algorithms. Consider just…
Ruby 4.0.4 Released
Ruby 4.0.4 has been released.
This is a routine update that includes bugfixes. Please see the GitHub Releases for further details.
Release Schedule
We intend to release the latest stable Ruby version (currently Ruby 4.0) every two months following the most recent regular release. Ruby 4.0.5 will be released in July, 4.0.6 in September, and 4.0.7 in November.
If a change arises that significantly affects users, a release may occur earlier than planned, and the subsequent schedule may shift accordingly.
Download
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.4.tar.gz
SIZE: 23816838 SHA1: 3633db75e6b4848b509ecccc64704d8f4467f068 SHA256:…
Gusto Joins the Ruby Alliance
We’re excited to share that Gusto has become the first company to join the Ruby Alliance.
The Ruby Alliance is a small coalition of companies that are choosing to make a significant investment in the long-term health, resilience, and sustainability of the Ruby ecosystem and the infrastructure it depends on.
We are honored and humbled by how quickly and decisively Gusto moved to join us. They didn’t wait to see what other companies would step forward. They recognized the importance of this moment and chose to lead the way.
Ruby has always thrived because individuals and companies invested back into the ecosystem that supports their teams and businesses every day. Gusto’s leadership is a…
When you’re building views in Rails, you often need to apply CSS classes conditionally. Maybe a nav link should look different when it’s the current page, or a form field needs error styling. Since Rails 6.1, the class_names helper does this cleanly.
Instead of…
…interpolating conditional classes with ternaries or post-statement conditionals:
<div class="p-4 rounded <%= @error ? 'bg-red-50 border-red-500' : '' %> <%= 'opacity-50 cursor-not-allowed' if @disabled %>">
<%= @message %>
</div>
Use…
…the class_names helper:
<%= tag.div class: class_names(
"p-4 rounded",
"bg-red-50 border-red-500": @error,
"opacity-50 cursor-not-allowed": @disabled
) do %>
<%= @message %>
<% end %>…String arguments are always applied; trailing keyword-style entries are included when their value is truthy and silently dropped otherwise.
GHSA-c4rq-3m3g-8wgx (nokogiri): Nokogiri CSS selector tokenizer has regular expression backtracking
Introducing ruby-charts: Native Charts for Ruby May 10, 2026 Last Friday I released ruby-charts, a gem for generating charts directly in Ruby—no JavaScript, no external APIs. Built for Ruby on Rails Build Maps WithoutGoogle APIs Generate beautiful production-ready maps directly from your Rails backend. Fast rendering, zero external dependencies, full control. View Live Demo → … Continue reading
Introducing ruby-charts: Native Charts for Ruby
Rails 8 ships Thruster in the default Docker flow. Use it for simple, single-container apps. Keep Nginx when we need edge features.
Puma stays as the app server. Thruster runs in front of Puma and handles the common reverse-proxy duties.
What is Thruster?
Thruster is a lightweight, Go-based HTTP/2 proxy from 37signals. It runs alongside Puma and provides:
- HTTP/2 support
- Optional automatic TLS certificates with Let’s Encrypt
- Basic HTTP caching for public assets
- X-Sendfile support for efficient file serving
- Gzip compression
Before
Before Rails 8, a simple production setup often looked like this:
- Puma as the application server
- Nginx or Apache as a reverse proxy
- Certbo…
Live Background Job Progress in Rails 8.1 with Rails.event and Continuations
Migrating a Rails App from Sprockets to JS Bundling with esbuild
At FastRuby.io, we spend a lot of time upgrading Ruby and Rails applications. However, we do more than just that, we also pay attention to other areas of the application that can be improved. For example, we recently migrated a customer’s application from Sprockets to JS bundling with esbuild.
In this article, I share my experience migrating from Sprockets to JS Bundling (JavaScript Bundling for Rails).
This is not a step-by-step guide, as each application has its own unique needs. Instead, I discuss the problems I encountered and the approach I took during the migration to JavaScript bundling.
Why We Needed to Migrate
Before we discuss why we needed to migrate, let me give you some…
Direct Routes and Data Queries
On this episode of Remote Ruby, Chris, Andrew, and David kick things off with dentist trauma, gold star stickers, and fiber internet. The conversation centers on Rails direct routes, why they can be more powerful than helpers, the upcoming Rails World CFP and ticket rush, how AI is becoming more practical inside real engineering teams, a reminder to fill out the Rails survey, and Chris’s continued work expanding the Rails Getting Started Guide into a more realistic e-commerce tutorial with wishlists, reviews, ratings, and product images. Hit download now to hear more!
Links
Hi, it’s zzak. This week was full of changes, so grab a seat, there’s a lot to cover.
New Accessibility Guide open for review
The Rails Foundation is working on a new Rails-flavored Accessibility Guide, covering semantic HTML, ARIA, page structure, forms, Turbo interactions, CSS, and testing. Please take a look and share feedback on the pull request.
Add ActiveJob::Attributes to persist data between steps
Active Job can now declare typed attributes that are serialized with the job and restored on resume, removing the need to override serialize and deserialize.
class SubmitEnrollmentJob < ApplicationJob
include ActiveJob::Continuable
attribute :payment_token, :string
end
May 7, 2026 Modern chart rendering usually assumes a browser, a JavaScript runtime, or a frontend stack. But many Ruby applications do not actually need interactive dashboards. They need deterministic image generation. Things like: scheduled reports PDF exports transactional emails admin dashboards analytics snapshots CI metrics server-side rendering pipelines That was the motivation behind building … Continue reading Generating Charts in Pure Ruby Without JavaScript
CVE-2026-40295 (devise): Devise has an Open Redirect via Unvalidated `request.referrer` in Timeoutable Session Timeout Handler
Uma História de Upgrade para Rails 8: Ganhando Tração Sem Reescrever Tudo
Data Sovereignty: How to Keep All of Your Services in Europe (AppSignal + Hatchbox)
Over the last decade, a great deal of data privacy regulations have been passed in the European Union. Like it or not, measures like GDPR, the Digital Services Act, and the upcoming Artificial Intelligence Act are exerting increasing influence across industries over how and especially where the data of European customers is stored.
In this article, we will explore the ways to keep the simplicity of a Platform as a Service (PaaS) while utilizing only European providers.
Why Data Sovereignty Matters More Than Ever
The General Data Protection Regulation (GDPR), which was ratified in 2016, granted fundamental rights to the "data subject". These include the right of access, the right of…
#799 — May 7, 2026
Ruby Weekly
Ruby Concurrency: What Actually Happens — A from-the-ground-up tour of processes, Ractors, threads, and fibers. Concurrency is a common source of confusion, but this guide helps clear up when to reach for which primitive, complete with benchmarks, sequence diagrams, and traces of what happens behind the scenes.
Carmine Paolino
AI Uncertainty and Pressure Causing Existential Dread? — It’s real, and you’re not alone. C-suites pushing AI mandates without strategy. Teams with varying levels of fluency. AI workflows aren’t productive. Test Double offers confidential pairing…
Adding edit, delete and reposition for nested forms in Rails with Stimulus
In a previous article, I explored building nested forms with Stimulus. But what about when you need to edit existing questions, remove ones you no longer need or reorganize them? Let’s extend that foundation by adding: editing, deleting and repositioning questions using drag-and-drop.
This article builds directly on the previous setup, so make sure you have that in place before continuing (check out the repo for the full code base). The reposition logic is inspired by this article to create a Kanban board.
First, update the migration to include a unique index:
class AddPositionToQuestions < ActiveRecord::Migration[8.1]
def change
add_column :questions, :position, :integer, null: false
…
I like the positioning gem for this, make sure to set it…
I released RubyLLM 1.15 today.
It ships image editing, cost tracking, cleaner token accounting, inferred tool parameters, additive callbacks, and Rails fixes.
The theme is simple: stop making me write glue code. If the computer can infer it, RubyLLM should infer it. If a provider reports usage, RubyLLM should turn it into cost. If Rails already has a blob, RubyLLM should not download it and upload it again.
Image Editing
RubyLLM.paint could already generate images:
image = RubyLLM.paint("A watercolor robot holding a Ruby gem")
Now with: turns it into an image edit:
image = RubyLLM.paint(
"Turn the logo green and keep the background transparent",
model: "gpt-image-1",
with:…CVE-2025-67202 (sidekiq-cron): Sidekiq-cron is vulnerable to a cross-site scripting (xss) vulnerability via crafted URL
Asset pipelines: just say no
My good mate Yaroslav wrote about his new solution for bundling a complete Bun runtime inside a gem - by all means, give it a read.
A lot of points he makes are very sensible, but for a few months now I have decided that - for myself - I will not be using any frontend bundling nor JS runtime at all. Here’s how you can do the same.
How useful is an asset pipeline?
There is, in fact, just one sensible use case for needing an asset pipeline, and it goes as follows.
- You are running revision
abc0on two machines,box1andbox2 - You make some glorious changes to your frontend code, and a new version gets prepared which requires those changes to be applied to the frontend assets your users…
Rails Security, AI, and IBB
For quite a few years the Rails project has been working with the Internet Bug Bounty (IBB). The IBB is an organization that awarded cash to security researchers that reported issues to OSS projects participating in the IBB. For quite a while I wasn’t certain about my feelings toward the program because I felt like cash rewards could incentivize low quality reports as well as encourage reporters to “haggle” about the severity of a particular bug (the IBB paid more when the bug was more severe). In the beginning that certainly was the case. We were fielding many low quality reports, and people were haggling over severity. But the program evolved, and despite the never-ending haggling, I felt…

Most marketing sites ship a SPA framework just to toggle a sidebar. Here's how we migrated an Astro site from React and Ark UI to native Web Components: 100 KB less JavaScript, no functionality lost, and a tiny library called nanotags that makes Custom Elements enjoyable to write.
A while ago, I shipped a marketing site built with Astro, React, and Ark UI. It worked fine, the deadline was tight, and React was the right call at the time. But I always knew I'd come back to it. Months later, I did. The result: 100 KB less JavaScript and no…
Introduction
I just returned from RubyKaigi 2026, held from April 22nd to 24th in Hakodate, Hokkaido. For those unfamiliar with it, RubyKaigi is the biggest Ruby conference in the world, drawing speakers, committers, and Rubyists from across the globe. As always, it managed to combine deep technical talks with a uniquely Japanese atmosphere that no other conference comes close to.
This year's edition had a distinctly Hokkaido feel: the cold winds of the northernmost island, the smell of the sea, kaiseki dinners, sashimi at conference parties, and onsens - a lot of onsens. The conference itself was in the south of Hokkaido (Hakodate). Still, for me, the trip extended significantly further…
Do you need to build a State Machine at least once in your career? May 5, 2026 Probably not. Built for Ruby on Rails Build Maps WithoutGoogle APIs Generate beautiful production-ready maps directly from your Rails backend. Fast rendering, zero external dependencies, full control. View Live Demo → Read Docs ✓ No API fees ✓ … Continue reading Do you need to build a State Machine at least once in your career?
Frequently Played May 2026
Frequently Played 🔗
I tend to listen to the same songs or albums on repeat that are evocative of how I’m feeling or what’s going on with me. Here is what I’m currently listening to over, and over, and over, and over, again.
As Alive As You Need Me To Be 🔗
Dive into the album. The NIN x Boys Noize collaboration builds on their work together on the B stage during the Peel It Back tour.
I never had a choice, connection
I never had a chance to catch my breath
One Of The Greats 🔗
The dirty riff, pointed lyrics, and stilted delivery are a fantastic combination.
Did I get it right? Do I win the prize?
Do you regret bringing me back to life?
…
I will let the light in, I will let some…
Blue Ridge Ruby 2026 Recap
Blue Ridge Ruby 2026 🔗
I returned to Asheville for the first time since 2023. Both times for the Blue Ridge Ruby conference. Both times convinced for the same reason: organizer Jeremy Smith. Both times because I was selected as a speaker.
This post is not intended as a review of any of the talks, but to highlight the variety of great work from all involved. I hope you’ll seek out the full videos of all the sessions that interest you once they are available.
Preparing 🔗
Jeremy Smith conducted interviews with many of the speakers prior to the conference. Jeremy and I chatted about various topics related to conferences and writing. Beyond that, I mostly followed my own advice.
Day 1 🔗
Learning from…
Coding with AI Agents is Now a Baseline Expectation for Managers
AI-first Engineering is now the operating default in many organizations, including mine. Developers have kept up. Vibe coding became agentic engineering, and the race towards truly autonomous engineering isn’t slowing.
But what are we, managers, to do?
A manager job continues to include recruiting and retaining people, setting clear goals and expectations, fostering communication, owning team workflows, and coaching daily behaviors. To this list we must now add driving AI transformation.
Being a passive advocate is not enough. Unlike other subjects, no amount of AI training will help you keep up with the pace of evolution of this technology. Therefore, one cannot drive AI transformation…

A story of validating product demand on a $2K budget with 128 cold-traffic signups, an A/B winner at 95% confidence, and a sequenced playbook founders can run themselves.
Building a product is one thing; knowing someone is willing to pay for it is another. After shipping Thicket's marketplace in 2 weeks, Evil Martians built a full demand validation infrastructure around it. The results were 36K impressions, 128 cold-traffic waitlist joins, a landing page variant confirmed at 95% statistical…
I released kamal-backup today.
I run Chat with Work on Kamal, and I needed backups. There are already Kamal accessories for database backups. None of them also back up Active Storage. None use restic, so encryption, deduplication, and repository checks are on you. None ship a CLI with restores and drills. None produce evidence you can hand a security reviewer.
So I built one.
A gem and a Docker image
kamal-backup is two pieces: a Ruby gem you add to your Rails app, and a Docker image you boot as a Kamal accessory. They point at a restic repository you bring yourself.
The gem is your CLI. Local commands run directly on your machine using restic. Production-side commands shell out…
Introduction
Ship small nonroot images, scan for CVEs, and let Kamal gate traffic. Rails 8.1 gives us that path by default.
- Pin Ruby and keep it synced with
.ruby-version - Use multistage builds
- Precompile gems, app code, and assets during build
- Run production containers as a nonroot user
- Fail CI on high and critical CVEs
While our previous guide covered Rails 8 adds Kamal by default, this post focuses on containerization best practices, security hardening, and production optimization techniques.
The examples below use Rails 8.1, Ruby 3.4.9, and Kamal 2.11.0.
Understanding Rails Docker Setup
When we create a new Rails 8.1 application, it generates several Docker related…
Links to CSS colour palettes
A while back I decided to stop using Tailwind for new projects and to just write vanilla CSS instead.
But one thing I missed about Tailwind was the colour palette (here as CSS).
If I wanted a light blue I could just use blue-100 and if I didn’t like it
maybe try blue-200 or blue-50. I’m not very good with colours so it makes
a big difference to me to have a reasonable colour palette that somebody who is
better at colour than me has thought about.
But I’m also a little tired of those Tailwind colours, so I asked on Mastodon today what other colour palettes were out there. And then a friend said they wanted links to those colour palettes, so here’s a blog post so my friend can see them, and…
The Execution Boundary in Rails
When you need to build HTML outside of a template, it’s tempting to concatenate strings and call html_safe on the result. This bypasses Rails’s built-in XSS protection entirely: any user input in that string goes straight to the browser unescaped.
The good news is you almost never need html_safe. Rails provides three underappreciated tools that handle escaping for you.
Instead of…
…calling html_safe on strings you’ve built by hand:
def status_badge(label, color)
"<span class=\"badge badge-#{color}\">#{label}</span>".html_safe
end
def formatted_address(user)
[user.street, user.city, user.postcode].compact.join("<br>").html_safe
end
def render_comment(comment)
comment.body_html.…Use…
…the right tool for…
Oh Asheville! How wonderful, weird, and full of art you are! Aside from returning with sore shins (central Ohio isn’t known for its hills…), Adam and I head home from North Carolina with two primary reflections we feel worth sharing here.
Ye old Blue Ridge Mountains
1. “Humans are the X-factor”. There’s something irreplaceable about a gathering of humans in-person; something unmistakably creative and promising. Something you feel more than you can describe; a moment where the whole is indeed greater than its constituent components. Small Ruby conferences ooze this feeling! My point here is simply that there is no replacement for…
CVE-2026-42245 (net-imap): net-imap has quadratic complexity when reading response literals
CVE-2026-42246 (net-imap): net-imap vulnerable to STARTTLS stripping via invalid response timing
CVE-2026-42256 (net-imap): net-imap vulnerable to denial of service via high iteration count for `SCRAM-*` authentication
CVE-2026-42257 (net-imap): net-imap vulnerable to command Injection via "raw" arguments to multiple commands
CVE-2026-42258 (net-imap): net-imap vulnerable to command Injection via unvalidated Symbol inputs
Ten Years of Frontend
Continuations 2026/18: Hanakai! ☀️
This week we launched Hanakai into the world!
I won’t reiterate the full announcement here, and instead suggest you read it on our beautiful new site!
What I will reiterate are my words of thanks. Thank you to Aaron Moodie for creating our new brand identity. Thank you to Max Wheeler for doing everything to make the website look and feel as it does today. Thanks to Josephine Hall, Paweł Świątkowski, Philip Arndt, Mathew Button, Marco Roth, Adam Lassek, Jane Sandberg and Paul Oguda for their contributions along the way!
I started building this in earnest back in December 2024. This has been a long time coming! So it goes with a volunteer effort like this. However, what we have today has…
Testing Vue components in the browser
Hello! One of my long term projects on here is figuring out how to write frontend Javascript without using Node or any other server JS runtime.
One issue I run into a lot in my frontend JS projects is that I don’t know how to write tests for them. I’ve tried to use Playwright in the past, but it felt slow and unwieldy to be starting these new browser processes all the time, and it involved some Node code to orchestrate the tests.
The result is that I just don’t test my frontend code which doesn’t feel great. Usually I don’t update my projects much either so it doesn’t come up that much, but it would be nice to be able to make changes with more confidence! So a way to do frontend testing…
Behind the Scenes: Developing Podias New Version
Chris, Andrew, and David open with some classic confusion over what day it is then dive into Podia’s gradual rollout of a major new app version, including how the team is handling migration, feature flags, dogfooding, and eventual cleanup. From there, the discussion turns to underrated Rails routing features like direct routes and resolve routes, a newly merged Rails query command, observability improvements through Hatchbox’s AppSignal integration, and the ongoing pain of CSS build tooling in Rails apps. They also touch on conference season and their upcoming talks. Press download now to hear more!
Links
Ruby Classes
Classes are at the heart of Object-Oriented Programming and Ruby makes them effortless to use. They provide the following benefits:
-
Composition: Allow you to leverage the Dependency Inversion Principle (DIP) — the "D" in SOLID design — by injecting dependencies via your constructor or methods. Prefer composition over inheritance because this maximizes your ability to reuse your components to build robust architectures.
-
Inheritance: Allow you to subclass and inherit behavior from a superclass and/or use multiple inheritance to enhance your class with common functionality.
-
Encapsulation: Allows you to wrap data, state, and/or behavior (methods) within a single…
Hi, it’s Greg, bringing you the latest updates about Rails.
Updated guides await community input
The Asset Pipeline, Layouts & Rendering, Caching, and Active Job Basics Guides
have all recently been updated and are open for community input. If you have
time and would like to help review, please check the list of pull requests.
Apply for the Rails at Scale Summit
Reminder to apply by May 8 for the Rails at Scale Summit (Sept 22, Austin), a
one day, invite-only gathering for engineers working on large-scale Rails
applications.
Enable frozen string literal by default
New Rails apps now include a config/bootsnap.rb file that enables frozen string
literals. This only impacts the application…
It is also possible to enable…
Welcome to Hanakai
If you’ve followed Hanami for a while, you’ll know we’re rather fond of flowers. Today our garden has grown: Hanami, Dry, and Rom — three projects that have lived alongside each other across a decade and billions of downloads — are finally coming together as one. Welcome to Hanakai!
With Hanakai, we’re building a single shared community around the gems you know and love. The gems will carry on, now cared for by a bigger, unified team. And with our beautiful new website, now you can discover our vision for Ruby more easily than ever.
Loosely translated from the Japanese 花会, Hanakai means “flower fellowship”, sharing its first character 花 with Hanami, “flower viewing”. With…
NPM: putting the brown in brownout
Two weeks ago, the NPM endpoint that yarn audit from Yarn v1 uses, decided to stop working:
I imagine this won't be fixed (unfortunately), but it looks like npm has silently deprecated the security audit API that Yarn 1 uses:
yarn audit v1.22.22
error Error: https://registry.yarnpkg.com/-/npm/v1/security/audits: Request "https://registry.yarnpkg.com/-/npm/v1/security/audits" returned a 410
at params.callback [as _callback] (/usr/share/yarn/lib/cli.js:66689:18)
at self.callback (/usr/share/yarn/lib/cli.js:141410:22)
at Request.emit (node:events:517:28)
at Request.<anonymous> (/usr/share/yarn/lib/cli.js:142382:10)
at Request.emit (node:events:517:28)
at…
For years, our way of taking over legacy systems was simple: start small.
A client would come to us with an existing application and a list of things they needed done. Sometimes that list was mostly bugs. Sometimes it was features. Sometimes it was a mix of vague product wishes, or urgent production issues.
So we would begin with the safest tickets.
Fix a small bug. Change a minor behavior. Add a low-risk feature. Read the code around it. Ask questions. Ship. Repeat.
Starting with low-risk work lets us deliver value to the client while we build confidence and learn the codebase we’re working on.
As the weeks went by, we would move toward more complex parts of the system. By then, we…
Software consultancy and Rails Foundation member Planet Argon is once again collecting real-world insights from Rails developers and turning them into something the whole community can learn from.
The survey takes a deep look at how Rails is actually used today, including the tools people rely on, how teams and workflows are set up, how apps are built and deployed, and the challenges developers face. It also explores how AI is finding its place in everyday Rails work.
All results are shared openly, giving the community a clear, data-driven view of where things stand.
At RubyMine, we’re genuinely glad to see work like this continue. It takes real effort to run a survey at this…
#798 — April 30, 2026
Ruby Weekly
Spinel: An Ahead-of-Time 'Ruby' Compiler from Matz — Armed with AI, Matz has built a self-hosting compiler (for a subset of Ruby) that emits C which is then compiled to a native binary. It uses Prism for parsing and performs type inference. There are severe limitations (no eval or metaprogramming) and it can’t replace CRuby, but the performance potential is significant, though it's not a truly like-for-like comparison.
Yukihiro 'Matz' Matsumoto
💡 I'm working on a deeper dive of Spinel for next week. There's a lot of interesting stuff to chew on, even as a…
AI4Devs April meetup
The meetup took place last Friday, April 24th, at the FaHCE (Facultad de Humanidades y Ciencias de la Educación) in La Plata. The talks came from different places: empirical software engineering, custom coding agents, and multi-agent systems. The conversations continued afterward over beers and food provided by the organization.
Empirical software engineering: the scientific compass in the age of LLMs
The first talk was “Ingeniería de software empírica: La brújula científica en la era de los LLMs” (“Empirical software engineering: the scientific compass in the age of LLMs”) by Florencia Riva, a sociologist working at LIFIA.
Florencia’s talk pushed against a common temptation: asking LLMs…
Perron 1.0 here is here
Nine months ago, I introduced Perron, an OSS Rails-based static site generator. 190 commits and 18 releases later, lots of bugfixes and many new features—by yours truly and a few others—have been added. Today I am thrilled to announce Perron 1.0. 🥳
Want to check it out right away? Check out the docs, star it on GitHub or explore the showcase to see what others have built. 😻
Programmatic SEO
One of the most exciting features has been the ability to generate content programmatically. Whether you are building a SaaS directory, product comparison pages or anything else that mixes data with thousands of pages, with Perron this is now super easy.
Learn more about programmatic content creation.



