Plotting Mathematical Functions in Ruby, Inside Jupyter March 13, 2026 ruby-libgd: Scientific Plotting Comes to Ruby The Envy We Never Talked About Anyone who has spent serious time with Ruby and then watched a Python developer type plt.show() to produce a beautiful Matplotlib graph in a Jupyter notebook knows the feeling. It is not quite … Continue reading Plotting Mathematical Functions in Ruby, Inside Jupyter
Why Reliable Monthly Maintenance Became Non-Negotiable for a Solo SaaS Founder
For the past twenty years, TitleLeaf has been helping educational book publishers maintain and share their content with industry partners such as reviewers, wholesalers, and distributors. Its robust content management system and handcrafted digital solutions simplify the process of sharing metadata, digital assets, and marketing material for the book industry.
Here was the situation
Tim Peterson, Founder of TitleLeaf, is a solopreneur balancing the challenges of entrepreneurship with a flexible lifestyle. One of his dreams is to have more time and freedom to do what he enjoys most—skiing and biking in the mountains of Northern California while still running his company as efficiently as…
Hi, Wojtek here. Let’s quickly look at a few of this week’s fixes.
Validate URI scheme in Action Text markdown link conversion
Add a Rails::HTML::Sanitizer.allowed_uri? check to markdown_link. When the URI scheme is disallowed, return the escaped title wrapped in escaped brackets (\[title\]) instead of emitting a link.
Example: <action-text-attachment url="data:text/html,PAYLOAD"> previously produced  in markdown output. Now it produces \[Image\].
Restore previous instrumenter after execute_or_skip
Fix by saving and restoring the previous instrumenter value around the EventBuffer’s lifetime. On background threads, this is a no-op (saves nil, restores nil).…
Heroku, Hosting, and the AI Era
Chris and David welcome back Adam McCrea from Judoscale, to discuss the uncertainty around Heroku after Salesforce’s announcement that it would stop taking new enterprise customers. Adam shares how the news landed in real time during a founder’s retreat, and the conversation expands into what Heroku’s apparent “maintenance mode” means for developers, pricing, autoscaling, platform alternatives, and the broader challenge of building durable developer businesses in the AI era. They also touch on Judoscale’s upcoming “platform tour” and the value of smaller Ruby conferences. Hit download now to hear more!
Sponsors:
Links:
Red, Green, Premature Refactor
"Red, green, refactor" promotes premature abstraction.
I had all the information to come to this conclusion 20 years ago. I'm embarrassed to admit how long it actually took.
What makes me say that? Well, sometime between 2003 and 2005, I met Ward Cunningham at a Seattle Extreme Programming Users Group meeting. There was no presentation that night. Rather, we just sat around eating pizza and peppering Ward with questions. His answer to one question really stuck with me.
The question was, "How do you convince management to let you refactor code?"
Ward answered, "I don't," then paused for effect, and continued, "I give them two estimates: I say, it'll take this long to make room for the feature,…
Choosing the Right Debugger March 12, 2026 A Ruby Developer's Guide to TracePoint, ISeq, and why your choice of debugger affects more than just comfort If you write Ruby, you debug Ruby. Whether it's a subtle off-by-one error in a data pipeline or a race condition buried in a Rails controller, debugging is as much … Continue reading Choosing the Right Debugger: TracePoint, ISeq, and why your choice of debugger affects more than just comfort
Over the past few months, a few of us at Planet Argon have been experimenting with Claude Code on real client Ruby on Rails projects. Not demos or greenfield apps, but the kind of long-lived codebases where a backtrace can eat forty-five minutes before you even understand the call chain.
The part that surprised us is how often some of those debugging sessions now wrap up closer to ten minutes.
We’re not ready to make big claims. But we’ve developed enough of a feel for when to reach for it, which model to use, and how to keep it from making a mess of your codebase that it felt worth writing down.
The guide covers things like model selection (Sonnet vs Opus and when to switch…
Yesterday I described AI-generated code as “plausible-looking, locally coherent, globally wrong.” Here’s a concrete example from my own codebase.
I needed a cleanup job to close old Slack group DM conversations in my slack-sup2 app. The AI-generated solution looked perfectly reasonable:
def close_old_sups!
return 0 unless sup_close
old_sups = sups.where(conditions)
old_sups.each(&:close!)
old_sups.count
end
def close!
return unless conversation_id
return if closed_at
logger.info "Closing DM channel #{conversation_id}..."
slack_client.conversations_close(channel: conversation_id)
update_attributes!(closed_at: Time.now.utc)
end
This code looks pretty great and…
#791 — March 12, 2026
Ruby Weekly
Building a Faster Bundler — The Shopify team has been working on improvements to Bundler and RubyGems with the goal of reducing bundle install times. Increasing the HTTP connection pool size, parallel git clones, and optimizing hotspots in the codebase provide big wins, but they seek our help with another area in particular: precompiled gems.
Edouard Chin and Eileen Uchitelle
🛠️ As part of the above, Shopify has released cibuildgem, a tool to help gem authors release precompiled gems that can be installed faster.
Building on the video recording feature from earlier, let’s add a nice touch to the presentation index page: video previews that play on hover. You know the experience—hover over a video thumbnail and get a quick preview of what’s inside. It’s the same interaction you see on YouTube, Netflix and every modern video platform.
The presentations index
After recording presentations, you need a way to browse them. A simple index page lists all presentations with video thumbnails. When you hover over a thumbnail, the video plays a preview. Move your cursor away and it returns to the poster image.
Here’s the basic setup:
<% @presentations.each do |presentation| %>
<%= video_tag presentation.vid…Thank you Sidekiq for your support in 2026
We’re very excited to welcome back Mike Perham and Sidekiq as a patron of Hanami (and Dry and Rom) for 2026.
Mike was the very first person to come on board when we opened our sponsorships last year. His early support gave me the confidence to commit a dedicated day per week to this project, which helped us achieve everything we did in 2025: shipping our biggest release yet, growing our maintainer team, and beginning to unify our community and ecosystem.
We're excited to continue our work in 2026. This year you'll see us launch our new face to the world, bring you two exciting releases of Hanami, and more! Thank you Mike for helping make this happen.
We’d love to have you to join Mike in…
Before AI coding assistants, a typical engineering team of 8-10 people might have been lucky to have one or two “10x engineers”, or “workhorses”, the kind of engineer that both keeps project quality and feature velocity high.
AI tools have solved the workhorse half of this equation, enabling massive raw output. Today, almost every engineer can produce a high volume of code with GitHub Copilot, Claude, or Cursor.
But the quality half of the equation has not kept up. Teams are shipping more code, but a greater fraction of it is AI slop: plausible-looking, locally coherent, globally wrong. Code review remains a human activity. Until that changes, AI assistants cannot substitute for the…

Evil Martians is a developer tools consultancy. Founded in 2006, we work with about 40 early-stage startups a year, mostly seed to Series B. We helped bolt.new scale from zero to $40M+ ARR in 5 months. Teleport and Tines reached unicorn status with Martians on their teams.
Established nearly 20 years ago, Evil Martians is a trusted software development consultancy for developer tools startups.
Almost a year ago, I returned to the Linux Desktop after almost 20 years. I abandoned it a month or so later out of frustration with a surprising lack of configurability and general exhaustion of addressing the myriad papercuts that come with trying to change computing platforms.
In the last few weeks, I’ve revisited it and had a lot more success.
The Core Problems
The main problems that kept me from adopting Linux day to day were:
- Inability to set keyboard shortcuts for apps to provide a Mac-like experience (namely, using Meta or Alt instead of Ctrl so I could have the same common shortcuts everywhere).
- Clipboard Managers didn’t seem to really work.
- Lack of a Dash-like API…
There were some papercuts, too. These were the most painful:
- Inability to configure the Framework 13’s trackpad scrolling speed.
- Global text replacement/text expansion doesn’t work
- PWA support with…
I’ve found solutions for some of these and set…
IndieRails Podcast Interview
I joined Jeremy Smith and Jess Brown on the IndieRails podcast to talk about how I managed the transition from stained-glass master to freelance software engineer.
Here are my notes:
The importance of a well-crafted pitch
I already wrote about the differences between my story and my history – or how I had crafted a pitch to present my convoluted professional path – but it bears repeating the benefits of a pitch:
- It allows the people you talk to to verify you’re not a complete fluke.
- It hooks your audience and gets out of the way quickly so you can focus on what makes you a great hire / freelancer.
- It filters out the clients/teams with which you’re not compatible: mindset,…
The pitch came from a place of being tired of faking a competency in software engineering I did not have at the time (circa 2018). So, in a sense, it was a way to own my story…
Introduction
Ruby offers multiple concurrency primitives, and while Fibers have gained popularity for I/O bound tasks, they’re just one piece of the puzzle.
Understanding when to use Threads, Ractors, or Fibers is crucial for building performant Ruby applications.
This post explores Ruby’s concurrency landscape beyond fibers, with practical examples and guidance on choosing the right tool for your use case.
Understanding the GVL
Before diving into concurrency primitives, we need to understand the Global Virtual Machine Lock (GVL), sometimes called the Global Interpreter Lock (GIL).
The GVL ensures that only one thread executes Ruby code at a time within a single process. This design…
Ruby 3.4.9 Released
Ruby 3.4.9 has been released.
This release includes an update to the zlib gem addressing CVE-2026-27820, along with other bug fixes. Please see the GitHub releases for further details.
We recommend updating your version of the zlib gem. This release has been made for the convenience of those who wish to continue using it as a default gem.
Download
-
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.9.tar.gz
…SIZE: 22456968 SHA1: 6386200753caf4e336dafceeee165fa73fd234ec SHA256: 7bb4d4f5e807cc27251d14d9d6086d182c5b25875191e44ab15b709cd7a7dd9c SHA512: ac7147c0e575cf74f669abb991ee8695d4191c919f306f124b3ee85d6b61361e752a4f1afb7bdffb49aee21edace1fcc9bf2b074ada15fa6c1eb611354c1d54b -
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.9.tar.xz
SIZE: 16682004 SHA1: 1eb1b0b45b9e9191de9d2f360164e60eedf77012 SHA256: 4231c54072601a171faed1699f105985e9971c94cd382b78feb4eb44eec2dd1a SHA512:…
4.0.8 Released
RubyGems 4.0.8 includes enhancements and documentation and Bundler 4.0.8 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.8
RubyGems Release Notes
Enhancements:
- Use JSON for cargo metadata parsing. Pull request #9373 by hsbt
- Fix NameError in Gem::Request.get_proxy_from_env when requiring rubygems/request directly. Pull request #9362 by afurm
- Installs bundler 4.0.8 as a default gem.
Documentation:
- Unify Compact Index API naming. Pull request #9372 by simi
Bundler Release Notes
Enhancements:
- Add a new…
Sidekiq in the terminal
My favorite tech movement in 2025 wasn’t anything artifical, but rather the resurgence in interest around building terminal interfaces with two new frameworks, Charm and Ratatui, which make developing pure text user interfaces easier than ever before using Go or Rust. They provide a huge set of components and examples showing you how to build various types of functionality.
Mainframe applications ruled the 70s and 80s, providing terminal interfaces for business operations. You might still see a ticket agent using a terminal to check you in at the airport. That’s an interface to a mainframe application, allowing the agent to lookup your ticket and assign you a seat quickly, with just a few…
Hello! My big takeaway from last month’s musings about man pages was that examples in man pages are really great, so I worked on adding (or improving) examples to two of my favourite tools’ man pages.
Here they are:
- the dig man page (now with examples)
- the tcpdump man page examples (this one is an update to the previous examples)
the goal: include the most basic examples
The goal here was really just to give the absolute most basic examples of how to use the tool, for people who use tcpdump or dig infrequently (or have never used it before!) and don’t remember how it works.
So far saying “hey, I want to write an examples section for beginners and infrequent users of this tools” has been…
Indispensable

In 1962, an IBM mainframe computed the flight data for a manned spaceflight for the first time. The astronaut on board that mission, John Glenn, refused to fly until the data was confirmed by a NASA mathematician by hand.
The mathematician? Katherine Johnson. a former human computer whose reputation for accuracy had an astronaut asking for her by name.
The programmers? Dorothy Vaughan’s team of former human computers who’d taught themselves FORTRAN so they could run the machine that took the role of computer away from them.
The words “human computer“ are at best a misnomer. Based on the name alone, one could be forgiven for thinking of them as mere clerical workers operating mechanical…
Shared Partials, ViewComponents & AI-ready Markdown Docs
Released shared partials and ViewComponents across component sets, plus Markdown documentation for each set so LLMs can use focused context when customizing Rails Blocks.
Faster bundler
At Shopify, we want our development environments to be fast.
Installing dependencies is slow, especially in an application as large as Shopify. bun and uv have dramatically
improved install times for TypeScript and Python dependencies. What if we could do the same for Bundler and the Ruby community?
Our team at Shopify has been working on a series of improvements to Bundler and RubyGems. Bundler downloads gems up to 200% faster. Cloning git gems is now 3x faster in our monolith.
We were also able to decrease the overall bundle install time by 3.5x in one of our applications
by precompiling gems thanks to cibuildgem, a new
precompilation toolchain we’d love you to try!
Here’s an…

Wire your OpenAPI contract into a Node.js Fastify backend with auto-generated routes, typed handlers, and request validation—no manual route definitions, no type drift, no integration surprises.
Backend APIs usually start the same way: you write route handlers, add request validation, wire up auth. Afterward (if you're disciplined) you generate an OpenAPI spec from all that code. The spec becomes a byproduct of the implementation — not a shared agreement you designed upfront. But what if you wrote the OpenAPI contract first and let it build the server for you?
497: Diagrams we love
Aji and Joël get into a flow as they discuss the different diagrams that help guide their thought processes when working.
Together they compare their go to diagrams and why they find them so useful, the different analysis tools a diagram can offer and the alternative perspective on your work it provides, as well as how using diagrams can help communicate your mental models more effectively with your colleagues.
—
Be sure to check out these resources on diagrams and conditionals for some wider reading on today’s episode - BeautifulMermaid Repo - Visualising RSepc - Structuring Conditionals
You can also find our hosts speaking at various conferences over the next few months - H…
Aggregating models into value objects with `composed_of`.

At some point of any Ruby on Rails project’s life the codebase starts to get messy, and you sense that you have to address this before the tech debt pile reaches unmanageable proportions. There are a lot of places where this can occur, for example:
- organizing business logic between controllers and background jobs,
- managing database concurrency,
- orchestrating reactive and/or real-time user interfaces,
- etc.
The most likely place where this will bite you, though, is in the domain model layer. As it turns out, a poorly architected, tightly coupled domain model is a huge time and productivity sink. Large-scale refactorings to…
You are a security concious developer and you follow the advice given by security folks to have strong password requirements, and you set a rule of having at least 10 characters, containing one uppercase, one lowercase letter, at least one digit and special character. Surely, this will result in strong passwords, right?
I started the week with a couple of releases, thanks to the community contributions I merged last week: dry-struct 1.8.1 and dry-schema 1.16.0.
I’ve been working on an AI tool use policy for Hanami, Dry and Rom. After a few rounds of feedback and several iterations on the text, this week I got it to a point I’m happy with. I’m looking forward to publishing it in the coming week.
I finished off our current round of Dry Operation work by completing and merging a “Migrating from Dry Transaction” page in the guide. With this done, we have quite a nice release ready to go: validation extension, expanded monads support, and all new migration docs! Last step is for me to write a little blog…
Katafrakt Korner: Paweł…
Ruby-LibGD Reaches 3,000 Downloads: A Milestone in Ruby Image Generation March 9, 2026 Open-source development is often a marathon, not a sprint. Today, ruby-libgd, a Ruby library for image generation, has reached an exciting milestone: 3,000 downloads. This achievement reflects not only adoption but also the sustained effort behind a library that brings dynamic image … Continue reading Ruby-LibGD Reaches 3,000 Downloads: A Milestone in Ruby Image Generation
I created pwa.support as a way to both examine any website to see if it can be isntalled as a progressive web app, but also to capture in some detail the depressing state of support for this concept across major browsers and operating systems.
I’ve been revisiting desktop Linux since my last attempt, and it involved setting up a lot of websites as Progressive Web Apps. The state of platform and browser support for the “sweet solution” is extremely mediocre. There’s pretty much no combination of operating system and browser that provides a truly app-like experience (except maybe Chromebooks).
I’ve captured it all on pwa.support. The content there is 100% written by me, after trying…
When multiple validations share the same if: condition, or multiple callbacks share the same only: constraint, you end up repeating yourself. with_options groups them together.
Instead of…
…repeating conditions across multiple validations:
class Article < ApplicationRecord
validates :title, presence: true, if: :published?
validates :body, length: { minimum: 100 }, if: :published?
validates :author, presence: true, if: :published?
end
Use…
…the with_options method to group common configurations:
class Article < ApplicationRecord
with_options if: :published? do
validates :title, presence: true
validates :body, length: { minimum: 100 }
validates :author, presence: tr…Works well in controllers too:
class AdminController < ApplicationController
with_options only: [:edit, :update] do
before_action :…And associations:
class User …Your website’s next visitor is an AI agent
AI agents are your website’s new visitors. People are already using them to gather information, perform research or even make purchases online. Whether we like it or not, it’s a new way to use the internet. Agents do not care about modern design or fancy animations. They need an easy way to understand and interact with your content. If your website isn’t ready for them, you’re already losing traffic you don’t even know about. Let’s fix that.
What does “agent-friendly” even mean?
An agent-friendly website is one that AI agents can reliably navigate, understand, and interact with. There’s a growing set of standards and conventions that make this possible. Some already exist and just need to…
🎙️ Breaking Change podcast v52.0.1 - Len Testa: Bring back the Starcruiser
Direct link to podcast audio file
Today, we're joined by a very special guest, Len Testa! You might know him from The Disney Dish podcast or from his excellent theme park travel planning app Touring Plans. Or you might not know him at all! No wrong answers.
This episode is all about Disney's ill-fated Star Wars: Galactic Starcruiser live action role-playing hotel—which we both had the opportunity to experience right when it first launched. It was a life-changing experience for both of us, so why did it fail? Is it true that the top Disney brass learned all the wrong lessons from that failure? And will the CEO-in-waiting Josh D'Amaro ever have the courage to attempt something so…
Hi, it’s Claudio Baccigalupo. Let’s explore this week’s changes in the Rails codebase.
Set read-only permissions for GitHub Actions workflow generated by rails new
The workflow will run with the minimum required permissions, regardless of the GitHub Organization settings.
Don’t guard action_dispatch_request and action_cable load hooks
Removes the load hooks guard for action_dispatch_request in Action Pack and action_cable in Action Cable.
Improve Trix support for Action Text markdown
Adds <del> as a strikethrough alias (Trix emits <del>, not <s>).
Also, add a visit_div handler so Trix-style <div> blocks pass through their children’s content, letting <br> tags handle paragraph spacing…
Specify PostgreSQL 9.5 or higher is required
Rails includes array_p…
Blocking bots with fail2ban
If you run your own servers, you will surely get a lot of weird hackbot
requests, searching for accidentally accessible .env files and such. While
these bots are generally harmful, unless you have an issue, I prefer to block
them so they don’t spam my logs. If it is a Rails app, I use rack-attack, but
I also have some jekyll and other stuff and for those, fail2ban is a great tool
to solve this issue.
Fail2ban is an intrusion prevention tool, that scans your log files and based on
rules, blocks clients on the firewall. It is available on most Linux
distributions, and you can install it with your package manager, you can check
the installation instructions on the projects
documentation.
Once…
One exciting thing about this year’s book wrap up, at least to me, is that I wrote mini-reviews all year, so these reviews should have a stronger tendency to sound like I actually read the book. And also this will come out in March and not, like, May.
Another exciting thing, again, for me, is that I think I finally cracked my personal dilemma about How To Rate Books.
So, this is like the nerdiest thing ever, but basically I’ve never quite known what to do with 5 star or 1-10 ratings for books.
I have a pretty good system for finding books I will like, and I do, in fact, like about 90% or so of the books I read at least a little. So on a 5 star scale, basically everything is a 4. Storysite…
This article is part of our Upgrade Rails series. To see more of them, click here.
This article will cover the most important aspects that you need to know to get your Ruby on Rails application from version 8.0 to version 8.1.
- 1. Preparations
- 2. Ruby Version
- 3. Gems
- 4. Config Files
- 5. Rails Guides
- 6. Notable New Features
- 7. Application Code
- 8. Next Steps
1. Preparations
Before beginning with the upgrade process, we have some recommended preparations:
- Your Rails app should have the latest patch version before you move…
I like Hotwired Turbo like I liked UJS (Unobtrusive Javascript): it adds a few small but helpful tricks to my application’s toolbox. One problem though with adding any javascript is that because the webpage is more dynamic, writing full-browser system tests becomes harder because we need to make sure the webpage is in just the right state to interact with it in tests. It’s annoying to write tests super defensively to avoid flakey tests.
Enumerating states Turbo can be in
Turbo adds some attributes to the webpage DOM that we can look for in our tests to ensure that things are in the right state. But it’s tricky. Let’s start with the trickiest thing first.
Turbo sets …
The New Year often brings a rethinking of one’s habits, future, and identity. For me this year my future identity is more important than it ever was.
Most of you don’t know that 2024 into 2025 was a deeply painful year for me. I wrote my 2024 Rails World keynote while my now ex-husband was moving out of the home we’d shared for 11 years. I put on a brave face and went to the conference. And even though it felt like my life was falling apart, I gave the best damn talk of my career. Being on stage reminded me that I’m strong, capable, and have a lot of support from the community. I’ll never forget the way my friends showed up for me that weekend.
Now that I’m divorced and through the most…
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.
Everybody Scream 🔗
I’m very much looking forward to seeing the most powerful and beautiful singing voice I’ve ever heard in concert next month.
The witchcraft, the medicine, the spells and the injections
The harvest, the needle, protect me from evil
The magic and the misery, madness and the mystery
Oh, what has it done to me?
Buckle 🔗
Yes, this was featured recently. I’m still listening to it.
I wanna call you on the telephone
I made a thousand people love me,…
Jeff Dickey on Mise, Precompiled Rubies, and much more
Chris, Andrew, and David welcome special guest Jeff Dickey (jdx), creator of mise, discussing his background rewriting the Heroku CLI from Ruby to Node due to Ruby distribution/sandboxing issues. The conversation digs into why language CLIs are hard to distribute, the tradeoffs between shims vs PATH-based version switching, why tasks can be the “clean” solution, and Jeff’s Rust-first tooling philosophy. They also dive into his other projects: usage (CLI docs/completions), Pitchfork (dev daemon runner that starts/stops services by directory), and fnox/Fort Knox (secrets management with encrypted files or remote stores like 1Password), and a big upcoming shift: pre-compiled (portable) Rubies…
Understanding importmap-rails
If you’ve worked with modern JavaScript, you’re familiar with ES modules and import statements. Rails apps can use esbuild (or vite or bun) for this, but the default option (Rails way) is importmap-rails. It lets you write import { Controller } from "@hotwired/stimulus" without any build step at all.
Ever thought about how this works?
Import maps, just a web standard
Import maps are a web standard that tells browsers how to resolve bare module specifiers. A bare module specifier looks like import React from "react", which isn’t valid ESM on its own. The browser needs an absolute path (/assets/react.js), relative path (./react.js), or HTTP URL (https://cdn.example.com/react.js).
Import maps…
Ridge Notes
I caught up briefly with Blue Ridge Ruby organizer Jeremy Smith to talk about speaking, blogging, conferences, and why you should come to Blue Ridge Ruby.
Rails Business Podcast (again)
I joined Brendan Buckingham and Ryan Frisch on the Rails Business Podcast to talk about how AI has changed my day-to-day as a developer.
Here are the highlights:
- Your job as a tech leader is to go first. Get Claude Code with Opus, set up your local dev environment to be agent-friendly, then do the same for everyone on your team. I told everyone to get the $100 Max plan and offered to pay for…
#790 — March 5, 2026
Ruby Weekly
ruby-prof 2.0: The Tracing Profiler for CRuby — Now celebrating its 21st birthday(!), ruby-prof remains a great way to figure out what’s slowing your app down, particularly if you want to see exact call counts and precise timings that tracing profilers offer (as opposed to sampling profilers - see a comparison here). v2.0 adds Ruby 4.0 support, flame graph visualizations, improved docs, and more.
Savage, Kaes, Maeda, et al.
💡 As ruby-prof's 'comparisons' page shows, tools like Stackprof, rbspy, and Vernier are also useful for profiling, each with their own…
A buffer overflow vulnerability exists in Zlib::GzipReader. This vulnerability has been assigned the CVE identifier CVE-2026-27820. We recommend upgrading the zlib gem.
Details
The zstream_buffer_ungets function prepends caller-provided bytes ahead of previously produced output but fails to guarantee the backing Ruby string has enough capacity before the memmove shifts the existing data. This can lead to memory corruption when the buffer length exceeds capacity.
Recommended action
We recommend to update the zlib gem to version 3.2.3 or later. In order to ensure compatibility with bundled version in older Ruby series, you may update as follows instead:
- For Ruby 3.2 users: Update to…
JRuby 10.0.4.0 Released
The JRuby community is pleased to announce the release of JRuby 10.0.4.0.
- Homepage: https://www.jruby.org/
- Download: https://www.jruby.org/download
JRuby 10.0.4.x targets Ruby 3.4 compatibility.
Thank you to our contributors this release, you help keep JRuby moving forward! @evaniainbrooks, @katafrakt, @mrnoname1000
Standard Library
- The syslog library moves to bundled gems. (#9198)
- The unicode_normalize library is now thread-safely loaded as an internal library (#9231, #9232)
43 Issues and PRs resolved for 10.0.4.0
War
The second Iraq War started during Spring Break of my sophomore year of university. It was coming. The one international relations class I have ever taken, an honors seminar on US interventionism, had wrapped up several weeks prematurely. The classes’s teacher, Ambassador Barbara Bodine, had been recalled to Washington.
I spent that Spring Break week on campus alone with my thoughts, as any romantic 20-year old I imagine would be. The woman I had just begun dating, who I had met in that same university class, was traveling in Germany. That relationship would last another three years; the Iraq war would last eight.
I did not sign up. My best friend had been exercising…
Image Processing in Ruby with GD: Exploring ruby-libgd v0.3.0 March 4, 2026 Image processing is usually associated with languages like Python or C++, but Ruby can also manipulate images efficiently thanks to bindings for native libraries. One of those libraries is libgd, a well-known C library used to dynamically generate and manipulate images such as … Continue reading Image Processing in Ruby with GD: Exploring ruby-libgd v0.3.0
I’ve been running a few experiments to streamline our development workflow, and I keep talking with folks on teams who haven’t been granted the budget or access to this kind of tooling yet. So I’m writing some of these up to help demystify what the experience is actually like.
For this one.. I wanted to see if I could take an AppSignal error and go from alert → fix → deploy without leaving the terminal.
Using Claude Code and AppSignal’s MCP integration, the whole process took under five minutes.
For context, our Rails app is already configured with AppSignal and has been running in production for a while. Like many teams, there are a few low-priority errors that pop up from time to time,…
A few weeks ago, we ran into an interesting problem in one of our projects. We had a reports table with a reason column that used the classic Rails enum approach:
# db/migrate/XXXXXXXXXXXXXX_create_reports.rb
class CreateReports < ActiveRecord::Migration[7.1]
create_table :reports do |t|
t.string :title
t.integer :reason, default: 0, null: false
end
end
# app/models/report.rb
class Report < ApplicationRecord
enum :reason, {
spam: 0,
harassment: 1,
inappropriate_content: 2,
copyright: 3,
misinformation: 4
}, prefix: true
end
Everything worked fine until the client requested the ability to select multiple reasons for a report. A user could report…
We’re excited to welcome Planning Center as a Contributing member of the Rails Foundation - the first new member in 2026!
Founded in 2005 and headquartered in Carlsbad, CA (with a fully remote team), Planning Center builds church management software used by more than 90,000 churches around the world. Their platform helps churches organize the practical details of ministry - service planning, volunteer scheduling, donations, event registrations, check-ins, small groups, and more.
On Rails since day one
If it runs at Planning Center, it runs on Rails, and has for nearly two decades. That includes:
- Customer-facing web applications used daily by tens of thousands of churches
- API…
496: Test suite performance
Joël and Sally cover all the bases as they look at improving their test suite performances times.
Our hosts lay out some spicy takes on various different test suites, comparing the key differences across the different forms of testing, where you might encounter pitfalls in each method, and how to make the most of each test.
—
Interested in exploring different test suites to see if they could improve your projects? Check out these articles on everything our hosts discussed today, as well as Joël’s talk on slow tests.
Avoiding Factory Bot - Why Factories? - Parallelisation in Testing - Joël’s Talk
Your hosts for this episode have been thoughtbot’s own Joël Quenneville and Sall…
If you…

A deep dive extending Flipper in Rails: friendly actor IDs, team-wide flags, percentage rollouts, analytics events, and admin auditing.
Our client StackBlitz already had an in-house solution for feature flags in the admin panel. But as the product and team grew (alongside the launch and success of Bolt.new), so did the requirements for this feature: not only the need to enable flags for arbitrary groups of users, but for gradual rollouts, integration with analytics, audits, and so on. They decided on Flipper. Then came the interesting part: bending it to fit all of their different use cases. This is…
After picking up Minitest to complement the QA process of one of my retainer clients, I’ve had confusing errors in our test suite for a while. We were moving fast to cover critical parts of the application, so we never had the time to investigate the flakiness thoroughly.
While preparing my upcoming talk – Lost in Minitest, the missing guide for Minitest tourists – I dug into how Ruby on Rails pulls in Minitest. And there I found the answers to my burning question: why on Earth does the following test fail?
require "test_helper"
class CustomerIdentificationTest < ActionDispatch::IntegrationTest
before { @customer = customers.buffy }
it "checks proofs of identification" do
get …From the moment RubyGems was first created in 2004, Ruby Central provided governance without claiming ownership, to support the Ruby community. Providing governance meant creating processes to provide stability and predictability. Avoiding ownership meant allowing the community to contribute, to the point where unpaid volunteers created and controlled the entirety of RubyGems.org for many years.
Last year, Ruby Central flipped that successful formula on its head. They now claim ownership of both Bundler and RubyGems, but refuse to provide governance. Ruby Central now claims sole control over all code and decisions, despite paying for only a few percent of the work required to create and…
Last month, we finished a big upgrade for a client. The client had 2 main pain points for their app. The first one was that they were using Rails 2.3 LTS with Ruby 2.5. The next big issue was that the test suite took 40 minutes to run, blocking engineers from merging code into the main branch, and also slowing down the whole feedback loop for every code change.
After finishing the upgrade (we got the application to Rails 8.1.1 and Ruby 3.4.7), we focused our attention on improving the test’s speed and we reduced the time it took to run the whole test suite (over 10k tests) from 40 minutes to around 4!
The Different Causes of Slow Tests
The Test Runner
The most popular test runners for…
Kaigi 2026 Is Approaching — Why the Global Ruby Community Should Pay Close Attention March 2, 2026 With April approaching, RubyKaigi 2026 is about to take place in Hakodate, Japan — and for the global Ruby community, this is not just another date on the calendar. It is a moment that often defines the technological … Continue reading
Kaigi 2026 Is Approaching — Why the Global Ruby Community Should Pay Close Attention
Continuations 2026/09: Body parsing
This week I finished a particularly satisfying piece of work: adding request body parsing to Hanami Action. This finishes the story we started back in Hanami 2.3, where we significantly improved Hanami Action’s
formatshandling. Now you can also useformatsto ensure your bodies are appropriately parsed for your expected media type handling.
With this change, Hanami Actions can now serve as fully standalone mini Rack apps, along with everything you’d expect from params handling. It also means we can do away with the one-step-too-far-removed-and-awkward-to-configure body parser middleware that until now we’ve needed in full Hanami apps. Step by step, things get cleaner and better…I had the pleasure of reviewing a range of things…
Customize Model URLs with to_param
Rails models default to using their ID in URLs: /articles/42. The to_param method lets you customize this—use a slug, hide the ID, or combine both for readable URLs. Exposing IDs isn’t dangerous if you scope access properly, but you might want cleaner paths.
Instead of…
…exposing IDs in your URLs:
redirect_to article_path(@article)
# => "/articles/42"
Use…
…the to_param method to return a slug instead:
class Article < ApplicationRecord
before_save { self.slug = title.parameterize }
def to_param = slug
end
redirect_to article_path(@article)
# => "/articles/understanding-rails-extensions"
Then find records by slug in your controller:
def set_article
@article = Article.find_b…For…
Optimizations
Direct link to podcast audio file
Sure feels like some combination of AI, the US military, and the AI military could bring an end to the world any day now, so I figured I'd better record one last show for posterity. Welcome me on this version's speedrun to the apocalypse!
So long as the EMP blasts don't nuke all our ham radios, write in to podcast@searls.co and I'll read it on the next release of the program. Over.
Be sure to click all these links while the clickin's good:
htmx Infinite Scroll
Pagination is always a feature you have to tackle in web application development in one form or another. A common approach is to use a gem, like Pagy, to provide the following capabilities:
-
Load records in batches (a.k.a. pages).
-
Previous and next links.
-
Numbered links to specific pages.
-
Bookmarkable links complete with browser history.
Definitely useful to decrease server load since you’re only loading a small subset of records per request. The problem with this approach is:
-
Most people bail after reading through the first couple of pages and not finding what they want.
-
Includes a lot visual information, design-wise, that not only consumes…
We can do better. With infinite scrolling, we…
CVE-2026-0980 (rubyipmi): rubyipmi is vulnerable to OS Command Injection through malicious usernames
Hey there, it’s Emmanuel Hayford. A fresh batch of Rails changes just dropped, let’s get into it.
Action Text to_markdown generates markdown links for blobs
When a rendering context is available, blob attachments now produce real markdown links ( for images, [title](url) for others) instead of plain-text placeholders.
Add to_markdown to Action Text, mirroring to_plain_text
Introduces to_markdown across the Action Text stack (Content, Fragment, RichText, Attachment), converting rich text HTML into Markdown with support for inline formatting, block elements, lists, links, tables, and more. The underlying BottomUpReducer has been extracted into its own class for reuse by both…
Render MissingAttachable as “☒” in plain text
MissingAttachable now implements …
Added a bunch of fixes and improvements to the existing components.
Post your Prompts
This post is mostly a reaction and reflection on Jon Sully’s “Generative AI and Tech Writing: The Right Answer is to Disclose.” Strong agree! I wanted to zoom in on one part of Jon’s post: “Just Give Me the Prompt”
Seriously. If you are blogging, a prompt is good enough. It’s great! If you’ve got a thought or idea that you want to share with the world, just post that idea. It’s enough.
Jon’s post caused me to reflect on my own writing process. Over the course of the nearly 20 years (!) I’ve been writing here, I’ve become much more comfortable incorporating my initial “gosh, I have this thing to say in my head and I want to get it out”-compulsion into the the thing I…
The Hidden Cost of Callbacks
In the beginning, Rails callbacks like after_save or after_commit feel like magic. You save a user, and—poof—a welcome email is sent. It’s easy, it’s fast, and it keeps your controller clean.
But as your application grows, these “invisible” side effects become a maintenance nightmare. Today, we’ll explore why callbacks are often technical debt in disguise and how to move toward a more explicit, modern architecture.
1. The Problem: The “Side Effect” Trap
The biggest issue with callbacks is that they are implicit. When you call user.save, you expect a database write. You don’t necessarily expect a 3rd-party API call to Stripe, a background job enqueued to Intercom, and a cache purge for…
LiveComponent with Cameron Dutro
Cameron Dutro returns to the show to introduce LiveComponent, a new library that adds client-side state and targeted re-rendering to Rails ViewComponent using Hotwire + Stimulus with minimal JavaScript. Chris, Andrew, and Cameron dig into why he built it, how it serializes component state and models, how updates flow from events to fast server-rendered HTML morphs, where it shines compared to plain Turbo/Stimulus, and how optional React support can help with migration and interoperability. Hit download now to hear more!
Links
- Judoscale- Remote Ruby listener gift
- Cameron Dutro GitHub
- Cameron Dutro X
- Remote Ruby-Episode 134: Kubernetes, JSX for Ruby, and more with Cameron Dutro
- LiveComponent
- LiveCo…
Honeybadger is an application health monitoring tool built by developers for…
One of my priorities this quarter was running a few AI pilot experiments. This was one of them.
When I mentioned the project to a teammate, he said, “You should write this up.” So here we are.
Others on our team had already been exploring embeddings, vector databases, and RAG. I’d been watching from the sidelines… until it was time to roll up my sleeves and build something myself.
The Problem
At Planet Argon, we manage several client projects. We live in Jira (I know… I know…). We keep decisions in Confluence. We ship code from GitHub. Over years a lot of institutional knowledge piles up across those systems… past bugs, old tradeoffs, and the “we tried that once” stories.
The problem…
Heroku: What’s Next
In a move that surprised many of us — and one which I still can’t determine the business sense in making at all — Salesforce officially announced last week that Heroku will be moving into a “sustaining engineering model”. That’s essentially giant-software-corporation-speak for, “we’re putting this into maintenance mode”. The platform that taught a generation of developers to “push to deploy” has reached its investment limit from its owners 😕.
"Our work here is done"
Now, before you jump straight to “abandon ship!!”, there are real questions we should think about when looking ahead. Heroku is still an excellent platform, runs very stably,…
Behind the Fizzy Infrastructure
In this episode of RECORDABLES, we dive into the infrastructure journey behind Fizzy. Lead Programmer Kevin McConnell walks through the ambitious plan to give every customer their own SQLite database and the challenges the team ran into along the way. What started as a unique way to support both self-hosted and SaaS models evolved into a performance experiment, pushing multi-tenant design further than we had before.
But as launch day approached, the tradeoffs became harder to ignore. Kevin shares what worked, what got complicated, and the pivotal decision — days before release — to unwind months of work and revert to a more conventional setup. This conversation is a candid look at…
We're excited to announce that Ruby will participate in Google Summer of Code (GSoC) 2026! This program offers new open source contributors the chance to work on impactful projects supporting the Ruby ecosystem, such as RubyGems.org, RubyGems, and Bundler, with guidance from experienced mentors.
Google Summer of Code is an annual program run by Google that pairs open source organizations with new contributors (18+ years old with less than two years of open source experience). Contributors receive a stipend from Google to work on a defined project over roughly 12 weeks.
How to get involved
Our contributor wiki has everything you need to get started: project ideas, guidance on writing a strong…
I had never personally worked with embeddings, vector databases, or retrieval-augmented generation before this project. I knew the words. I did not know where the sharp edges were. Folks on our team do… but I felt it was time to wrap my own head around it.
What I did have was a real problem, a team that loves Ruby, and enough curiosity to see where things broke.
This is the story of that experiment… what worked, what surprised me, and what I’d tell another Ruby developer who’s considering something similar.
The Problem
At Planet Argon, we manage several client projects. We live in Jira (I know… I know…). We keep decisions in Confluence. We ship code from GitHub. Over years a lot of…
#789 — February 26, 2026
Ruby Weekly
Rage: The Modern, Real-Time Ruby Framework — We don’t mention Rage enough! 😅 It’s a high-performance fiber-based framework suited for concurrent workloads involving WebSockets, real-time communication, async jobs, etc. and it’s Rails compatible! This week’s v1.21.0 release makes it easier to adopt with an official set of agent skills to use. GitHub repo.
Roman Samoilov
💡 I think Rage's SKILL.md file is a good primer for humans too, really…
🚀 CTO-Ready Rails Upgrade Estimates. No AI Hallucinations — AI can’t replace hard-earned experience. The…
The first time I visited GitHub's HQ2 in 2012, they had a TV showing off their first animations of Mona and were using it to push their new tagline: Social Coding. The phrase certainly captured the moment we were living in, so in 2014, I borrowed it for the title of one of my more popular conference talks, The Social Coding Contract. The goal of that presentation was to warn audiences of the long-term risks of all these tools making it so trivially easy to publish and consume open source dependencies. Sure enough, what followed was a decade defined by the productive and destructive chaos of a ceaseless deluge of useful, but poorly-understood and under-maintained dependencies.
Thanks to the…

Konstantin Vinogradov, an open source and infra VC investor, and his co-founders are building the first permanent funding model for critical open source infrastructure. We dive into why OSE stands a chance at battling the Nebraska problem, and how Evil Martians contributed as a pro-bono donor.
If you're building a developer tool, your product almost certainly depends on open source code you did not write, do not control, and have probably never thought much about.
Konstantin Vinogradov, an open source and infra VC investor, along with his…
February 26, 2026 In recent years, Ruby and Ruby on Rails have quietly entered a phase of rapid, multidimensional evolution. Rather than a single disruptive change, what we are witnessing is a coordinated advance across the runtime, the framework, infrastructure tooling, and application capabilities. This shift has been especially visible in talks from RubyKaigi 2024–2026 … Continue reading Ruby 4 & Rails 8: A Multi-Front Acceleration of the Ruby Ecosystem
Hot Take on the whole AI Coding
(this post was written by hand btw - because I despise AI Slop rhythm, emojis and structure sooooo much)
I was recently asked to give a short AI-Coding Workshop for another company, which is outside my usual work. That made me recollect my thoughts on the whole matter, because there is kind of a rift in the industry, and also in the developer community.
On the one side, we have principled opponents and skeptics (especially on Mastodon!), on the other side we have the proverbial Vibe-Coders who use Agents without any supervision. I wouldn’t comment on the latter, but want to address the issues the former group usually has.
1.) Coding-performance related: results are worthless/the code is…
I often use timestamps, like completed_at as a boolean flag. It offers just a bit more (meta) data than a real boolean.
But of course on the UI you want to show a checkbox that a user can toggle instead of a datetime field.
I have done this often enough, that I created a simple concern that I use throughout my apps. Given above completed_at example, it gives you an API like:
@resource.completed?
@resource.complete!
@resource.complete=
So in your form, you can simply use form.check_box :completed and you’re off.
The concern is simple enough:
# lib/boolean_attributes.rb
module BooleanAttribute
extend ActiveSupport::Concern
class_methods do
def boolean_attribute(*fields)
fields.…In January 2024 I published the first article on Rails Designer’s blog. It listed some of my best practices; most of which I still use today.
Over those two years there were almost 200 articles published on topics ranging from Hotwire, to Rails and Tailwind CSS. Next to that I’ve launched various tools and dozen open source projects. With all those articles, tools and other pages, the site slowly started to feel incoherent. Less consistent in style, feel and branding. So it was time to lose some weight and put on some fresh clothes! 🎩💅
I spent some time recently to build the site from scratch. Not coincidentally this was a good time to build it using Perron, the Rails-based static site…
Rails 8 (released November 2024) is the smoothest upgrade yet. The focus? Simplicity and performance - removing external dependencies while boosting speed.
Solid Queue, Solid Cache, and Solid Cable eliminate Redis for many use cases. Built-in authentication removes the need for Devise. Ruby 3.4 (latest stable) with continued YJIT improvements delivers excellent performance.
Note: This is Part 5 of our Rails Upgrade Series. Read Part 1: Planning Rails Upgrade for the overall strategy.
Before We Start
Expected Timeline: 1-2 weeks for medium-sized applications (easiest upgrade!)
Medium-sized application: 20,000-50,000 lines of code, 30-100 models, moderate test coverage, 2-5…


