Lies, Damn Lies, and Github Stars
The social-proof machine for AI techniques and tools is circular, and itās getting absurd. A rant.
A blog version of this video:
The social proof machine
On the way to the office the other day I was catching up on AI coding videos, and I heard something Iād heard before, but this time it was the last straw. A popular agentic coding influencer said: āthis skill is absolutely blowing up on social media!ā.
OK⦠so?
Weāre in this strange era where a lot of people are talking about AI coding in ways that arenāt backed up by anything except social proof. Other people are talking about it, other people are doing it, so it must be good.
In particular, thereās a flood of newā¦
Beginning a job search, itās clear that to stay in technology means to be in the orbit of AI and AI-generated code, and I need to come to terms with this and figure out how to navigate it. As such, Iām going to start writing more about AI. I process information via writing, so here we are.
What I will be writing about:
- The hard truths that the existence of AI-generated content forces us to face.
- How to achieve goals now that content/code can be produced quickly that appears to work.
- Where and how humans can add value to systems that include AI-generated content?
That said, there will be guardrails. I cannot abide AI-boosting or AI-psychosis. I also just cannot engage anā¦
Coming soon: the 2027 Gem Fellowship
Last year I founded the Gem Fellowship with $100,000 in funding. Myself and the gem.coop team judged applications from 40+ projects and funded eight with awards between $2500 and $20,000. This year Iām providing $100,000 again but we want to do more! Would you and your company like to join me in supporting Ruby OSS maintainers? More details on sponsorship here.
Ruby open source tooling and its community are fundamental to Sidekiq and its success. I believe in committing both time and money to ensure that the Ruby ecosystem provides not only recognition to the people maintaining our common infrastructure every day but funding. Open source maintainers canāt pay their rent or mortgage withā¦
Ruby 4.1's first preview is here
#ā821 ā October 15, 2026
Ruby Weekly
Ruby 4.1 Preview 1 Released ā Two months out from its final release, we get a 4.1 preview to play with, complete with Module#descendants, Ractor-local GC, YJIT on Windows, and a raft of smaller changes. Worth testing to shake out the effects of things like Symbol#to_s returning frozen strings and all Regexp instances being frozenĀ too.
Yui Naruse
Your Rails App Doesnāt Need a Data Warehouse ā Slow Rails reports usually get a warehouse and an ETL job. Now numbers lag and you run two systems. TimescaleDB extends the Postgres your app already uses, so analytics runā¦
The Hidden Life of a UPI ID
Custom elements are amazing. Theyāre a built-in browser feature, not some library you npm install and then hope it will be maintained. You define a tag once and it just works, anywhere and in any framework (and browser). I have talked about them many times before and think they are a great fit for server-rendered apps like Hotwire is (I even added an extension to Attractive.js to make them even awesomer).

I will use them whenever I need a small, reusable UI behavior. The latest one I used (in my main product) is a tooltip and itās a good example of why this approach is so clean. š§¼
The usage will show you my point:
<tool-tip label="Search">
<%= icon "magnifying-glass", aria: {label: "Viewā¦
You just wrap any element with tool-tip.ā¦
Most of us have a routine for adding a gem: search for it, open its page on rubygems.org, glance at the download count and the number of days since the last release, then copy the Gemfile line.
The whole process takes half a minute. But until now, rubygems.org did not tell you whether the version you were about to install had a known security issue.
That information has been public for years. Sources such as the GitHub Advisory Database, OSV and Ruby Advisory Database already track vulnerabilities. It just wasnāt shown on the page where many developers make the decision to add a dependency.
Now it is.

How security advisories appear on gem pages
When you view a gem version affected byā¦
Deploying a Roundhouse app with Kamal
During the latest episode of The Pingback Podcast, we were talking about Roundhouse and Raul asked me how would you deploy a Rails app, compiled to a binary with Roundhouse and Spinel. It is actually pretty simple with Kamal, and here comes a little post about how to do it.

MRR is easy to calculate and easy to get subtly wrong. Here's how to normalize Stripe subscriptions, classify every movement, and reconcile your number with Stripe's own charts.
MRR and the dynamics of its components are the metrics investors lean on to judge an early-stage company's growth and health (often before they read anything else in the update). Unfortunately, MRR is also the easiest metric to get subtly wrong. It looks trivial: sum the subscriptions, chart it, done. Then... a refund dents a month itā¦
Ruby AI News - October 14th, 2026
Welcome to the 39th edition of Ruby AI News! This edition features a continued look at the future of Rails, RubyLLM 2.1, decision models, impatient programming, and much more.
Recorded at Rails World, David sits down with Buzzsprout co-founder and CEO Tom Rossi for a wide-ranging conversation about AI, software development, product thinking, and the changing role of developers.
Tom shares his perspective on the rapid pace of change in the software industry and why today's AI transition reminds him of the early days of the internetāonly moving much faster. They discuss how AI is already changing development inside Buzzsprout and Higher Pixels, from adding AI-powered features for podcasters to making it dramatically easier to understand, maintain, and extend older Rails applications.
But as the cost of building software falls, Tom argues that anotherā¦
4.0.23 Released
RubyGems 4.0.23 includes enhancements and Bundler 4.0.23 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.23
RubyGems Release Notes
Enhancements:
- Update vendored gems to latest versions. Pull request #9948 by Hiroshi SHIBATA
- Drop setuid, setgid and sticky bits when extracting gems. Pull request #9929 by Hiroshi SHIBATA
- Improve handling of paths with invalid Windows characters. Pull request #9276 by Said Kaldybaev and Hiroshi SHIBATA
- Installs bundler 4.0.23 as a default gem.
Bundler Release Notes
Enhancements:
ā¦We recently ran a webinar on setting up Claude Team for small businesses. Hereās the short version, for anyone who wants the plan but couldnāt join us.
Whatās Claude Team?
Claude isnāt one product. Thereās Free, Pro, and Max for individuals, and Team and Enterprise for companies.
Team gets you everything in an individual account (Claude Code, Cowork, projects, a 200k context window) plus the things that matter for a company: admin tools and billing, SSO and role-based access, connectors to things like We Google Drive, Gmail, Calendar, GitHub, Microsoft 365, and Slack, spend controls, and mixed seat types so power users get Premium and everyone else gets Standard. It currently runs 2 toā¦
Going Enterprise
For the past two years, I've been working with a client, an enterprise software company (built with Ruby on Rails, of course), particularly in the niche of software used by enterprises of all sizes + MSPs and IT administrators for real businesses like law firms, municipalities, architects, hospitals, manufacturers, financial institutions, and government agencies.
Working with an enterprise software company has revealed a whole new world of B2B software companies and managed service providers (MSPs) that I had no idea existed before. I guess most people building typical SaaS startups and Rails apps donāt know much about it either. Personally, Iāve had to revisit many of my priorsā¦
I was in the audience at Rails World 2026 for Ryan Sherlockās talk, āShipping is your heartbeat: Rails in the agentic era.ā Ryan is Senior Director of Engineering at Fin, the company formerly known as Intercom, and he shared how a very large Rails monolith gets code from a pull request into production.
And it is large. The app is 15 years old, has about 5 million lines of code, and gets deployed more than 200 times a day, with roughly 5 minutes between merging a pull request and seeing it live. In a post on X after the talk, Ryan added that they run about 230,000 tests (25,000 of them added in August alone) and ship a new backend every two to three minutes.

The traffic is large too.ā¦
Now that we understand better how agents deal with contained tasks and contained codebases, itās time to push them a little harder. Stage 3 adds a set of large multi-step tasks that test how well a model can build on its own work over multiple sessions without turning it into a hot mess. Weāve also greatly expanded the variety of apps we test the models on.
Finally, we revisited Stages 1 and 2 to combine all three into a single benchmark that answers one question: which model is the best all-rounder for tasks large and small in your Rails apps?
We chose nine models for this stage and used our test runs to pick reasoning settings, aiming to balance capability and cost. We ran Claude Opusā¦
I visited BNI at Conrad Pune today, thanks to an invitation from Manish. At Saeloun, we build software for businesses around the world. I want to bring that engineering experience closer to home, to the shops, studios, and small businesses here in Pune.
Iām calling it Vipulās AI: a free service to help small and medium businesses in Pune build and ship useful websites and apps.
Bring me something your business needs. It could be a better website, a way to track repairs, a product catalogue, or a simpler process for getting customer approvals. Weāll work out a useful first version and build towards it.
I want to make this India-first, starting here in Pune. And I want to show the actualā¦
Debt metaphors abound! In this weekās episode of The Bike Shed, Aji and Joel ponder the question, what are risks in a code base?
From looking at technical risk as a different lens on the idea of technical debt, to the perils inherent with introducing debt into a system, this is certainly the episode to listen to if you donāt want your own projects to blow up in your face.
ā
Your hosts for this episode have been thoughtbotās own JoĆ«l Quenneville and Aji Slater.
Don't forget you can now also watch the show over on our YouTube channel!
If you would like to support the show, head over to our GitHub page, or check out our website.
Got a question or comment about the show? Write toā¦
Leaving Tech
Iāve now applied for over 3 dozen jobs and Iāve heard back from 24 of them with a rejection. This tech market at the moment is so very cooked and for that reason Iām stepping away from tech.
Iāve been a developer for 20 years across more than just the Ruby and JavaScript that Iām known for. Iāve written books about programming, Iāve given talks and Iāve ran events. I maintain two of the most downloaded Ruby packages. And yes, I delivered the fuck out of value for shareholders. I also grew a team from 2 people to 12 people at my last job.
I cannot continue to put myself through this process of rejection. It is causing me a great deal of mental harm and anguish.
The industry at the momentā¦
GitHub formatter for Sobelow
Two weeks ago a new version of Sobelow was released. Sobelow is a static code analysis tool focused on security and these days it is a de facto standard for providing a minimal security measures to Elixir projects. I am mentioning this release because it contains one feature suggested and developed by me: Github Workflow commands formatter.
The strory behind this feature is relatively simple and may sound familiar. When you have Sobelow check added as a Githb Aciton on your PR and the code change actually violates on of the rules, the check fails and you need to go to the job output to read it. This is bearable, but if you are like me then you probably are not a fan of Github Actions UI inā¦
Thor is a really nice command-line runner, with much nicer support for arguments than Rake imo. The Rails framework supports both, but since Rails 5.1 most Railsā built-in commands (like bin/rails generate) use Thor, and itās very simple to add custom Thor-based commands to gems and engines too, which Rails will auto-discover when placed in the engineās lib/commands directory.
The one place Thor commands donāt work out of the box is your Rails application. Rails ships with a lib/tasks directory, but not a lib/commands directory. But when you create that directory, and add your custom command to it, it still wonāt work.
Thereās a simple fix to make lib/commands workā¦
Direct link to podcast audio file
Unlike Sam Altman, I sat down and did the math by hand to calculate that it would actually be less time to produce the show if I were to livestream it than to edit it after the fact and upload it. The fact I recently got upgraded from 30mbps to 2000mbps upstream might allso have something to do with it: welcome to the first ever LIVE episode of Breaking Change!
I regret to inform you the episode is now over. You can listen like you always do or watch what remains of the recording on YouTube.
It was particularly fun for me to build a production pipeline with updating chyrons, a dynamic salt meter, and on-demand generated stock videos. It'sā¦
I was in the audience in Austin when DHH opened Rails World 2026. The conference tagline was āShaping the future of Ruby on Rails,ā so I walked in expecting to hear about the future of Rails.
Thatās not quite what happened.
The opening keynote was almost entirely about AI agents. DHH told the room that 37signals has gone āpencils downā on writing code by hand, that HEY is moving to native apps with a Rust backend, and that he has retired as a professional programmer.
The next day, he sat down with Matz and Jeremy Daer for Ruby, Rails, and the future of programming, which went even further down the same path.
Iāll recap both sessions, share where I disagree with them, and explain why Iāmā¦
Ruby 4.1.0-preview1 Released
We are pleased to announce the release of Ruby 4.1.0-preview1. Ruby 4.1 introduces Ractor local GC, Windows support of YJIT, autoload_relative, and adds many improvements.
Ractor improvements
A lot of work has gone into making Ractors more stable, performant, and usable. These improvements bring Ractor implementation closer to leaving experimental status.
-
The default GC now runs per Ractor: each Ractor collects its own heap on its own thread without stopping the others, and a stop-the-world collection only runs when it is really needed (explicit full
GC.start, shareable-object growth, reclaiming dead Ractorsā heaps). Allocation-heavy Ractor programs now scale like forked⦠-
GC.ā¦
Hanami, Why?: Class Action
Welcome back to my "Hanami, Why?" series. If you missed it, be sure to read Hanami, Why?: Bits & Bobs before you start this issue. Today we are going to be diving into one of my absolute favorite abstractions in all of Hanami: Actions. I have actually gone a bit back and forth on what I want this issue to be. This is, dare I say, my fourth draft of this issue. My initial inclination was to give you a pretty robust walkthrough of what actions are and how they work. However, one of the reasons actions are one of my favorite abstractions in Hanami is that they are stupid simple to wrap your head around. I feel as though any deep dive into how actions work would simply result in me rephrasingā¦
Continuations 2026/41: Speedy reviews
This was the last week of the spring school holidays, and we spent the last weekend staying in beautiful Narooma on the NSW south coast. We swam in the ocean and hung out with some seals!
I also shipped some code. The larger part of my week was in getting some of the final Dry CLI pieces in place. After last weekās introduction of required options, I did some work on their counterparts, and went in the opposite direction, being strict about how how we handle required arguments, since their positional nature makes them much more fragile.
Phil has been a godsend for my work lately, providing speedy reviews on all my recent changes, and he even pushed up a stacked fix for our handling of rā¦
When you add a search box backed by a LIKE or ILIKE query, user input can change the pattern. A search for 100% returns every row containing 100. A bare % returns the whole table. Active Recordās sanitize_sql_like fixes this.
Instead ofā¦
ā¦dropping the userās term straight into the pattern:
class Article < ApplicationRecord
scope :containing_text, ->(query) {
where("articles.title ILIKE :q", q: "%#{query}%")
}
end
Article.containing_text("100%") # also matches "100 days of Rails"
Article.containing_text("snake_case") # also matches "snake-case vs kebab-case"
Article.containing_text("%") # matches everything
Useā¦
ā¦sanitize_sql_like around the term, before youā¦
Living in the Weimar era of Ruby
Much has been said about the DHH keynote that he gave at RailsWorld. To me, it was the voice of a person in an existential crisis, but also a very jaded one. āLook how I donāt care anymore, and you should not care eitherā is not a great message when you are the headline speaker at the conference - letās call it CareConf - that you have, yourself, lobbied for.
The message from the supreme leader was clear: we vibe-rewrote HEY in a more performant way, it worked great, we neither need nor care about Rails anymore. I honestly believe that, instead of amassing even more applause via vitriolic truth-bombing, he could have just left the toy he no longer loves - including its community - in peace.
ā¦Whole Routes in a Box
Runsheets: Runbooks That Keep a Record of Themselves
I should say up front that runbooks are not my usual territory. Iām a Ruby developer who has spent most of his time on libraries, frameworks and AI tooling. The people who live in runbooks are SREs and DevOps engineers, and they will probably spot where Iāve misunderstood their world. Iād like to hear about it. More on that at the end.
Here is what I did to get started: I read what the practitioners say about runbooks, then I built a small tool around the gap they keep describing.
What a runbook is
A runbook is a step-by-step guide for carrying out a task in a system. On-call engineers use them during incidents. Platform teams useā¦
I recovered another program I wrote in 1995: ELPDS, or Enhanced Logical & Physical Drive Status. Run ELPDS C: and it reports physical disk geometry, partition entries, FAT boot-sector details, and free space. It doesnāt change anything on the disk. My help says it was for checking whether a partition existed and was formatted. I think I was just trying to learn about the underlying partition mechanics.

I didnāt write all of it. The help credits āMr. Schaefferā for a āhuge part of FIPS code.ā That was Arno Schaefer, whose name I misspelled. FIPS could split a FAT partition without deleting its files, often to make room for Linux. Its original project page and Berkeley project page areā¦
What a JIT Can't Know
Katami
Over the last few months I've built a couple of tools to help me work with our new AI friends. My favorite one so far is katami (Japanese ćkaćtaćæmi for "keepsake").
The best way to explain what katami does is with an example:
$ mkdir hey2 $ cd hey2 $ cargo init $ katami claude > Can you set this project up for me? > It will be a server with a CLI connected to MySQL, Redis > and Elasticsearch I'll set this project up with a hey2-core crate for logic and a hey2 crate for the CLI using usage-rs, configure AGENTS.md with a CLAUDE.md shim, .agents/skills and a docs folder, add a .mise.toml file and set up mbx just like in your other projects. ...
Didn't catch that? Claude, without beingā¦
CVE-2026-107399 (mechanize): Mechanize sends credential headers to another origin after a meta refresh
CVE-2026-107715 (mechanize): Mechanize sends credential headers to another host after an HTTP redirect
In 1998 I needed to convert PDF files to text for a search engine called Alkaline, without requiring separately installed libraries. So I wrote a C++ parser. Alkaline is another story.
I recovered the source from a backup dated December 26, 1998. It reads PDF 1.0 through 1.2, follows object references and page trees, decompresses content with bundled zlib, and prints metadata, page text and bookmark titles. There are my own string, vector and hash-table libraries in there too. The encryption code is a stub. This was a work in progress.
I wasnāt reverse engineering an undocumented format. Adobe had published the specification in 1993, and my comments refer to the PDF Reference, right downā¦
ZJIT is now as fast as YJIT
After some infrastructure deployment shenanigans, we deployed some regions of storefront renderer (SFR) running on ZJIT. We have seen some promising numbers.
Get in losers, weāre going benchmarking
ZJIT is our new SSA-based method JIT compiler for Ruby. Weāve been working on it and blogging about it for a year and a half and recently deployed it to production.
Iām going to share some screenshots from our internal Grafana instance and use them to draw some very exciting preliminary conclusions about ZJIT.
First, ZJIT is probably as fast as or faster than YJIT. Here is a 24-hour chart of request response time comparing YJIT and ZJIT. YJIT is the green line and ZJIT is the yellow line.
ā¦
I build a client application with an AI agent. Each piece of work, a slice, goes through the same thirteen steps. The AI does most of them. I decide at five points.
The steps
# Step Who What happens Gate / evidence
-- ---- --- ------------ ---------------
1 Request client, a wish in an e-mail, a spec chapter, or an spec and input documents in the repo
me answer to an open question
2 Evidence AI read-only probe of each external system; real response saved as a test
ā¦Tests are code too, and they can get messy. I wanted a quick way to find the messy tests in a Ruby project, so I wrote a small gem called scrap4rb.
It copies the rules of SCRAP, a tool by Robert C. Martin (Uncle Bob) for Clojure tests. scrap4rb brings those rules to Ruby and Minitest.
What scrap4rb does with your tests:
Why bother
There are good Ruby tools that score code: flog, flay, reek and rubycritic. But they look at a test as if it were normal code, and that gives strange results:
- reek does not see a
test "..." doblock at all, because it is not a method. - rubycritic says ālong is badā. A test that is long because it checks many things gets a D.
- A test that clicks āSaveāā¦
scrap4rb asks other questions.ā¦
A couple of weeks ago, I gave my keynote, āThe Most Valuable Engineer Isnāt Shipping Features,ā at Rails World 2026 in Austin, Texas.
If you want to just go ahead and watch it, here it is.
If youāre interested in the backstory⦠read on.
Just a few months ago, I took myself to a somewhat secluded Airbnb near the Oregon Coast and started writing it. I ordered a stack of yellow notepads, index cards, Sharpies, and a bottle of scotch.

I had been drafting ideas before my retreat, but this was when I knew I really needed to immerse myself in the subject matter. This is what proper authors do, right?
So, I was out at the coast and found myself in a flow state, with all these wildā¦
A Preflight You Can Run
The SaaS Reckoning: Lessons from Guru
On October 7, I attended 1682, O3 Worldās business of innovation conference at the Barnes Foundation in Philadelphia.
This yearās theme was āAI for All of Usā and one of the sessions I enjoyed the most was āThe SaaS reckoning: knowledge, agents, and the future of workā by Rick Nucci, co-founder and CEO of Guru.
In this article, Iāll share Rickās five lessons from rebuilding Guru for AI, what he thinks comes next, and where I think his points apply to companies rolling out AI today.

Accuracy, Not Access
Rick started with the question every founder asks themselves (and every good VC asks every founder):
āWhy now?ā
For Atlassian, the why now was the industry moving from waterfallā¦
Hi, Wojtek here. Letās explore this weekās changes in the Rails codebase.
Stop setting the public-read ACL on S3 uploads for services configured with public: true
Bucket owner enforced is now both the default and the recommended S3 object ownership setting, and rejects any request that specifies an ACL. Uploading through a public: true service to such a bucket previously failed outright because Active Storage always attached a public-read ACL, with no way to opt out.
Setting this to false skips the ACL; grant public read access through a bucket policy instead. Buckets that still use ACLs can restore the previous behavior for a given service by setting the acl option explicitly in its uploadā¦
Add maintenance_database option to the PostgreSQL adapter
Database tasks connect to the postgres databaseā¦
Rails World 2026 Recap with John Athayde
Fresh off Rails World 2026, Chris, Andrew, David, and returning guest John Athayde unpack the surprisingly emotional conversation surrounding AI, Ruby, Rails, and the future of programming. What starts as a discussion about Spinel, Roundhouse, Rust, and Rails performance quickly turns into a much bigger question: what happens to developers when writing code is no longer the main job? They dig into AI-assisted development, changing ideas around craftsmanship and creativity, the growing importance of testing and CI, and whether frameworks like Rails become more valuable in an AI-driven world. They also reflect on the mood at Rails World, autonomous cars, AI-generated design, and why the realā¦
Many Keepers
DHH opened Rails World by saying what he believes, plainly, and betting his company on it. That's the bar for an opening keynote. He also asked us to be optimistic, and I am, about Rails in particular. Today I open the second day of Deccan Queen on Rails, and I hope I clear the bar he set.
If you're not in the room
The talk opens by asking the room to post in the conference chat, which has been on the second screen since yesterday morning. That chat is Basecamp's Campfire, with the organizers' sign-in, branding and dashboard added in Rails, then compiled to a native binary with no Ruby in it. Everyone at the conference has been its test suite for two days.
You can't join that one, but youā¦
I am writing this at 5 AM, catching up on everyoneās posts from Deccan Queen on Rails, and feeling very proud of my city.
I missed the 1ā4 PM talks. A true Puneri needs his afternoon sleep to toil through the night. š I was also sick and medicated, which is my slightly more respectable excuse.
But seeing the day through everyoneās photos, videos, and conversations has been special. Friends from the international Rails community came to Pune, and we got to welcome them into our home culture.
That was something I really wanted this conference to do.
A Puneri welcome
The food was Puneri. The welcome was Puneri. We had modak. We had dalcha bhat. We opened the day with an all-womenā¦
If your team uses Google Docs, Sheets, or Slides daily, youāve probably developed a workflow that goes: open Claude, write a prompt, copy the result, switch back to the doc, paste it in, adjust the formatting, and start over.
Anthropic recently released two things in beta: Claude for Google Workspace, an add-on that puts Claude in a sidebar directly inside your files, and a set of Google Docs, Sheets, and Slides connectors that let Claude create and edit your files from the Claude interface. In this article, weāll cover what the integration actually does, where it removes real friction, what changes when your AI setup travels with you into a document, and what to think through beforeā¦
Making a case for real macros in Ruby
#ā820 ā October 8, 2026
Ruby Weekly
Warming Up the Puma Master Before It Forks ā Using Puma with preload_app!? Your workers still start cold, each compiling templates and YJIT code on live traffic. This post covers Basecamp's fix of running real requests in the parent process before forking, giving workers a warmĀ app.
Lewis Buckley (37signals)
š¤ Ready for AI-Native Rails Modernization? ā šØ Rails 8.0 EOL Nov 7. Our AI agents upgrade your app on your CI runners. PRs open only when your test suite passes. You review and merge. No quiet test deletions. Join the private-beta waitlist to lock in betaā¦
FastRuby.io |ā¦
RubyLLM 2.1: You Can Have It All
RubyLLM 2.1 is out. I released it on stage at Deccan Queen on Rails in Pune.
With 2.1, RubyLLM does everything LangChain, LangGraph, and LangSmith do together, apart from two things it leaves out on purpose. Several things those frameworks leave to you or to their paid platform, such as per-user MCP OAuth, cancelling a run from another process, and provider batch APIs, are built in. The comparison has the details.
Thereās also a three-minute tour of 2.1.
It builds on 2.0 and adds an MCP client, tool search, typed judgments, evaluations, tool progress, OpenTelemetry tracing, and a nineteenth provider. Itās also faster, with no code changes. In this post:
A looping GIF is a practical running joke in accessibility (a11y). It moves whether you want it to or not, you canāt stop it, and screen readers have nothing to grab onto. I built a small custom element that fixes all three at once.
The whole thing is paused-gif. Drop it in your markup and it renders a still frame with a button to play the animation:
<paused-gif src="/celebration.gif" alt="A confetti cannon going off at a launch party"></paused-gif>
Thatās it. Let me walk through why each accessibility decision in there matters, because thatās the interesting bit.
Pause by default
The āposter frameā (the initial image) is captured the moment the element mounts, so nothing animates untilā¦
4.1.0.beta2 Released
RubyGems and Bundler 4.1.0.beta2 include features, enhancements, breaking changes 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.1.0.beta2
Release Notes
RubyGems
Changes already released in 4.0.x are not repeated here.
Features:
- Support content addressable gems in
Gem::PackageTask. Pull request #9897 by Harriet Oughton, Gira Chawda and Jenny Shen - Add
--content-addressabletogem buildand make--ruby-abionly set the Ruby ABI. Pull request #9906 by Harriet Oughton
Enhancements:
- Drop setuid, setgid and sticky bits when extractingā¦
I was in the audience at Rails World 2026 when Mike Dalessio, a Rails Core team member who joined earlier this year, put up a slide that said āYou are not worried enough (probably).ā
He had good reasons to say it.
This summer, Mike handled CVE-2026-66066, an Active Storage vulnerability that let a crafted image upload read files from the server, including your applicationās secrets.
His talk, Hot Cell: Securing Active Storage in the age of AI, was half post-mortem and half proposal: if we canāt stop image libraries from being vulnerable, maybe we can stop their vulnerabilities from reaching our secrets.
In this article, you will learn what that CVE actually meant, why patching imageā¦
Unrolled Code
The other day I was looking at a little project called grubby, a minimal static site generator for git repos, written in Ruby. The style is quite interesting. It feels solid and unapologetic:
def fill_template(template, page_title, root_prefix)
template
.gsub("{{title}}", escape_html(page_title))
.gsub("{{root}}", root_prefix)
.gsub("{{stylesheet}}") { STYLESHEET }
.gsub("{{build_date}}", BUILD_DATE)
end
Nothing is particularly optimized, it just uses available tools to do its work:
def write_page(page_path, page_title, root_prefix = "")
FileUtils.mkdir_p(File.dirname(page_path))
header = fill_template(HEADER_TEMPLATE, page_title, root_prefix)
footer = fill_tempā¦After running git ls-tree and collecting the filenamesā¦

PostgreSQL does not guarantee row order without ORDER BY. Use Rails 8.2 or pg_disorder to shuffle unordered SELECT results and expose hidden order dependencies, flaky tests, and application bugs. This is chaos engineering directed at your database.
SELECT * FROM posts carries no promise about the order of the returned posts. Yet, every relational database hands them back in some order, and code and tests start depending on that order.
You can't grep for a bug like this, but you can smoke it out by deliberately shuffling the rows of every unorderedā¦
Recorded at Rails World, Marco Roth joins the podcast to discuss the rapidly evolving future of the Rails view layer. Marco explains Herbās integration into Rails 8.2, how its parser and tooling improve the experience of working with HTML+ERB, and how Herb creates opportunities that werenāt previously possible with traditional Rails templates.
The conversation then turns to ReactionView, Marcoās approach to bringing fine-grained reactivity to Rails applications while allowing developers to continue writing familiar ERB. Marco explains how ReactionView can identify dynamic portions of a template, track dependencies, and update the browser without requiring developers to manuallyā¦
What retry_on Actually Means
When a job fails halfway through, what runs again, and what has already happened?
Suppose a job sends a webhook. The receiving service accepts it. Then the job fails while saving the delivery receipt in your database.
You have configured retry_on for that database error. Rails schedules another attempt. When it runs, the receiving service gets the webhook again.
The retry worked as configured. The first delivery also worked.
The question I start with when reviewing a retry policy is: what could have already happened when the exception fires?
Letās follow one job through that failure. The behavior below is checked against Rails 8.1.3.
The next attempt starts the job again
Consider this applicationā¦
Keep the Gems
GHSA-3553-vcg5-72jw (dalli): Unbounded decompression and reply sizes allow memory exhaustion
GHSA-4qp6-2jcr-596v (dalli): Routing tokens can inject meta protocol flags, and failed requests can retry forever
GHSA-m252-9cgf-vx2w (dalli): With a namespace, a retried request reads or writes a different key
GHSA-p6pm-ch9v-44vx (dalli): Pipelined get_multi can return another key's value after an error reply
GHSA-w39f-xq2m-4g8x (dalli): Forking can resend buffered memcached requests and desynchronize the parent's connection
GHSA-wr87-m4jw-29x5 (dalli): Per-request raw and the JSON serializer don't prevent unsafe deserialization
I was in the audience at Rails World 2026 when Aaron Patterson (tenderlove) kicked off the closing keynote. Aaron opened with a well-worn line: āthe purpose of a system is what it does.ā He wasnāt satisfied with it. The purpose of a system, he argued, is what it does for whoever is observing it.
Hand an old Nokia 3310 to someone who has never seen a cell phone before, and they might use it as a hammer. In that moment, to that person, it is a hammer. What a system does depends on whoās watching.
That distinction has a name in compiler design: The as-if rule.
In this post, weāll walk through what the as-if rule means for Rubyās compiler, where Ractors push it right up to its edges, and howā¦
Joƫl takes Bike Shed out onto the conference floor at RailsWorld as he interviews programer and streamer Rachael Wright-Munn, aka ChaelCodes.
Rachael talks about her efforts to index all ruby events around the world with RubyEvents.org, how she augments her workflows with years old generators rather than LLMs, the rising cost of tokens and why AI may not always be your best solution to a problem.
ā
Keep up to date with all things Ruby conferences, past and future, with Rachaelās index at RubyEvents.org
Read more about the SPIDR approach Rachael mentioned.
Our guest for this episode was Rachael Wright-Munn, connect with her on LinkedIn or check out her website to follow alongā¦
Your host for this episode hasā¦
Gusto Went to LDX3 NYC
In September, Gusto attended LDX3 NYCāāāa conference entirely dedicated to leadership in tech. There were managers, directors, tech leads, and senior engineers. Attendees jumped between the technical and management stage, learning about āRe-engineering the software development playbookā on the management stage one hour and āHow to kill the code reviewā on the technical choices stage theĀ next.
The one thing we had in common: everyone there was invested in learning how to become a betterĀ leader.
šø Pictured left to right: Kamilah Taylor, Vianca Martinez, Tori Huang, Rebecca Borison, Irina Khafizova, Anshuma Chandak (and Alyssa Hester here inĀ spirit!)Because, of course, AI. Everything is changingā¦
Today we are releasing Hot Cell v1.0, a suite of gems that moves Active Storageās attachment processing out of your Rails application and into an unprivileged sidecar container with no network, no credentials, and nothing on its filesystem worth stealing. Adopting it is a configuration change, not a code change. It is already running in production at 37signals, in Basecamp, HEY, and Fizzy.
I introduced Hot Cell at Rails World 2026 in a talk titled āHot Cell: Securing Active Storage in the age of AI.ā What follows is basically that talk, written down, plus a couple of things that have changed since then. (If youād rather watch the video or flip through the slides, go for it.)
Where we are
ā¦šļø Breaking Change podcast v56.0.1 - Zach Holman wants more of everything
Direct link to podcast audio file
Zach Holman, founder of Signed, joins me for another š„Hotfixš„. Zach wants more of everything. Let's see what we can do about that.
Write into the show at podcast@searls.co.
Show notes:
CVE-2026-67987 (ruby_llm): Polynomial-Time Regular Expression Denial of Service (ReDoS) vulnerability
CVE-2026-67989 (ruby_llm): Polynomial-Time Regular Expression Denial of Service (ReDoS) vulnerability
Continuations 2026/40: Green on JRuby
Heckuva week.Ā
Hanami Minitest had started failing its scheduled builds due to our ongoing work on Hanamiās reloading support. I fixed it here and here. (Why do I mention such small things here in my weeknotes? Because these are just as important aspects of maintenance as everything elseāfixing broken windowsāand it all takes time.)
Adam merged Alexanderās transient attribute support into Rom Factory, a very handy improvement!
Adam also finished updating Rom Factory for our repo-sync, and I followed up by preparing it for automated releases. With that done, I released v0.14.0!Nice to see a few things from Sean this week. First, in Hanami Action: I reviewed and merged his fix to handleā¦
RubyLLM 2.0 is the biggest release since 1.0. It starts with tool approval:
class RefundOrder < RubyLLM::Tool
description "Refunds an order"
parameter :order_id, description: "ID of the order to refund"
requires_approval # that's all it takes
def execute(order_id:, tool_call: nil)
Refunds.issue(order_id:, idempotency_key: tool_call.id)
end
end
class SupportAgent < RubyLLM::Agent
chat_model Chat
tools RefundOrder
end
chat = SupportAgent.create!
chat.ask "I was charged twice for order 42." # stops before refunding
# later, when the user approves
chat = SupportAgent.find(chat.id)
chat.approve(chat.pending_approvals.first)
chat.complete # issues the refund and answers
Tā¦
Last week the topic on everyone's mind seemed to be the future of programming. All my friends were talking about it, people I follow were talking about it, and I was thinking about it as well. Then David's (DHH's) Rails World keynote turbocharged the conversation.
His talk didn't come as a surprise to me. I was a week into rewriting HEY in Rust during Rails World. And "Pencils down" only codified how we'd been working for months at that point.
David is right. Like it or not, we programmers, like painters before us, are slowly going to disappear. AI, like the camera, completely changed the game. You can sulk about it, or you can pick up a camera, start learning, and become a photographer.
ā¦Short URLs
Resolvers Have Types Too
In The Browser Half I looked at the part of a Hotwire app where nothing checks anything: the strings that wire Stimulus controllers to each other and to Ruby. A GraphQL server is the opposite case. Its contract is already typed and explicit, and graphql-ruby validates every incoming query against it.
What it doesn't check ahead of time is the other side: whether the Ruby behind each field returns what the field declares. A field declared null: false that comes back nil, or a field with no method behind it, is found when a request reaches it. That's the half Roundhouse can see, because it already infers the types of a Rails app's Ruby without annotations.
Following the schema down
Aā¦
kamal-backup 1.1 adds dump, which downloads one database dump from your backups without running a restore:
bundle exec kamal-backup dump latest -o tmp/app.pgdump
It works with PostgreSQL, MySQL, MariaDB, and SQLite. Use it to look at production data locally, to give someone a dump to debug against, or to load a backup into a tool that expects a plain dump file. Before 1.1, that meant restoring somewhere first or running restic by hand inside the accessory.
How It Works
dump talks to the backup accessory over SSH, with the same user, port, proxy, and keys Kamal already uses from config/deploy.yml. The accessory reads its own mounted repository config, so your restic credentials neverā¦
For Rails applications, you probably want to serve HTML5, and you only want to support browsers that support HTML5. And even if you must support older browsers, you probably want to make sure your application works for HTML5-compliant browsers.
If youāre using Capybara with the Selenium driver, this will happen automatically if the headless browser is HTML5-compliant. This introduces some overhead, so I try to use the Rack::Test driver if I can get away with it. Unfortunately, when using the Rack::Test driver, Capybara processes the HTML as HTML4. This can hide bugs in your HTML.
For example, when nesting button_to inside a form_for block, the form end tag emitted by button_to will closeā¦
Generated Rails
Hifumi generates a complete Rails application from a natural-language prompt. It runs a plain rails new, then a planning model breaks your request into revisions and Claude agents write each one. The prompt steers them toward a default Rails 8 app: Tailwind and Hotwire, the default Gemfile, and sign-in via has_secure_password plus sessions rather than Devise. Each revision has to pass a verify loop before it's committed: bundle check, db:prepare, zeitwerk:check, a smoke test that requests every static GET page, and rails test. What you get at the end is an ordinary Rails repository, yours to keep.
Roundhouse reads a Rails app and compiles it, to Ruby, to native code via Spinel, and to aā¦
If you write software for a living, youāve probably been told some version of this lately: the code doesnāt matter anymore. The AI writes it now. Your job is to think like a product manager, or a QA engineer, or a āmakerā who describes what they want and lets the machine figure out the rest.
I donāt buy it. Youāre a programmer, and thatās a great thing to be.
Things are changing radically and rapidly, but the essence of programming remains. There is still such a thing as a better architecture, a solution that better fits the problem. There is still such a thing as well-modeled and well-factored code. There is still such a thing as a great abstraction, one that gives you leverage andā¦
In 1997 I wrote UcsLink.Fusion for the University of Geneva. We had hundreds of PCs across the city, Sun and Windows NT servers, and Windows 95 and Linux workstations. Getting a userās software and settings onto whichever PC they sat down at was a job for login scripts. I wrote a Delphi 2.0 application to do it instead.
UCS stood for Universal Copy System. Fusion read a script that mapped network drives, copied shared software, created shortcuts, connected printers, set environment variables and synchronized the clock. It could include other scripts, test conditions and clean up files left by a previous run. The surviving configuration maps a personal drive, a software drive and a groupā¦
The Way and Remainder

1970 - 2024: BCC Era (Before Claude Code)
Writing software in the ābefore timesā was an iterative process, evolving from punching holes in paper all the way to clacking away on custom, clicky mechanical keyboards.
Through variations of this process, the steps were mostly the same:
- Understand the problem
- Come up with a solution
- Break the solution into parts
- Write code that solves each part
- Test that new things work
- Test that old things still work
- Repeat as needed
As time went on, patterns emerged. Then those patterns were overused and new patterns took their place. Programming dogma went from āeverything can be functional programmingā to ānothing can be functionalā¦
The Browser Half
In As If I compared two ways of making Campfire fast: compiling the Rails app with Roundhouse, and porting it by hand to Rust, as 37signals did with once-campfire-rust. Both check their output against the running Rails app. Both are, it turns out, ports of the server only.
Campfire's app/javascript is 3,749 lines. Its models are 1,375 and its controllers 1,325, so the JavaScript is larger than both together. Roundhouse copies it into the output byte for byte. The Rust port serves the Rails app's JavaScript too, and shadows exactly three files.
A bug both ports shipped
One of the Rust port's three overrides is base_autocomplete_handler.js, and its OVERRIDES.md says why: the original calls
feā¦CVE-2026-12545 (hammer_cli): hammer_cli - Insecure interpolation of the $EDITOR environment variable
šļø Merge Commits podcast - YAGNI: Retiring from programming
Direct link to podcast audio file
Matt Swanson had me back on YAGNI to talk about the fallout from DHH's Rails World keynote and what it means for your weekend. We discuss what happens to the "one-person framework" when agents write the code, how frustrating it is when something is absolutely correct but still misses the point, and how I've accidentally constructed a dark factory with agents building and maintaining my iOS apps.
We also get into what I'd tell developers who are worried about where all this is heading and why World of Warcraft is my dark horse candidate to beat Grand Theft Auto 6 in November.
Appearing on: YAGNI
Published on: 2026-10-02
Original URL: https://share.trā¦
Comments? Questions? Suggestionā¦
Hi, itās Greg. Letās explore this weekās changes in the Rails codebase.
The Rails World talk recordings are online
Blazing fast, one week after the event, you can watch all the talks from Rails World on YouTube!
āAutoloading and Reloadingā guide community review
The updated āAutoloading and Reloadingā guide is ready for community review. Please have a loook and give feedback.
Bump minimum Ruby version to 3.3.5
This commit bumps the minimum Ruby version to 3.3.5 so the WeakKeyMap polyfill can be removed, which would allow using non-Thread/Fiber/etc. as keys, and enable a refactor to prevent iterating over every connection pool.
Look at all the things he's not doing
Thereās a moment in the early seasons of South Park when Cartman et al find the source of an underwear crisis in their mountain town. Itās the underpants gnomes in their cave. They have a plan.
- Collect Underpants
- ???
- Profit
Iāve been considering Davidās opening Rails World keynote and realised that this is the main problem I have with it. Rails World is about āshaping the future of Ruby on Railsā. Instead what we got was opinionmaxxing: a lot of certainty about the destination, but in his own words, not much that was āpracticalā or āprescriptiveā about getting there.
- The model got good at writing code
- ???
- Models write all code, we donāt need to care
Thereās a vibrationā¦
Ruby AI News - October 2nd, 2026
Welcome to the 38th edition of Ruby AI News! This edition features⦠well you know what weāre talking about this edition. This is a special edition, the 39th edition will follow next week.
Here We Go
There areā¦
Hanami, Why?: Bits & Bobs
Welcome back to my "Hanami, Why?" series. If you missed it, be sure to read Hanami, Why?: Introductions before you start this issue. It is my intent to keep these issues focused on singular subjects whenever possible. However, in today's issue we are going to cover several topics that are too small to warrant their own issue but still important to have for context. As I mentioned, Hanami has a lot of important abstractions, and today we are going to be covering what I consider "system level" abstractions. We have lots to cover, but this context will be important for a further understanding of how Hanami works.
Dependency Injection
Most of the time Ruby is pretty great at telling you what aā¦
Live At Rust, Uhh, Rails World 2026
Recorded live from Rails World 2026, Andrew, Chris, David, Jason Charnes, and eventually Andy Croll, unpack the strange mood surrounding this yearās conference. Much of the conversation centers on DHHās keynote and the increasingly agent-driven future of software development: if AI can write, debug, and even understand the code for us, what happens to the value of frameworks, developer expertise, documentation, and even Ruby itself? They also dig into Hotwire, Active Search, Herb, Active Job Continuations, security concerns around AI-generated software, and what the Ruby community might rally around if the language becomes less central to how developers identify themselves. And because itāsā¦
Basecamp 5 runs on Puma in cluster mode: one master process with preload_app! and 63 single-threaded workers per host, deployed as a Docker container with Kamal.
We serve Basecamp from several sites. Each site has its own web hosts and a read replica of the database, and writes go to a single primary database in one of them.
On our busiest hosts, each deploy left up to 2,000 requests waiting while the new workers warmed up. We reduced those queues by running signed-in requests through the app in the Puma master, before it forked the workers.
Why 63 single-threaded workers?
Basecamp has always served web requests from processes rather than threads. It ran on Unicorn, which only doesā¦
NWRUG's (Manchester, UK) October 2026 meeting ā It's time to bin your VCR
The next North West Ruby User Group in Manchester, UK is in a fortnight on 15 October at Colony, One Silk Street. Rob Whittaker will take us through one of his hot-takes: VCR does more damage than good, and there are imperfectly better ways to stub your external requests.
Rob Whittaker is Director of Software Development at thoughtbot. He has over two decades of professional web development experience and has worked with Ruby and Rails since 2012. (Heās also the co-organizer of NWRUG!)
Weāll be at the venue for pizza from 6:30pm with the talk starting at 7pm. Afterwards weāll retire to The Crown & Kettle for a drink. The venue, pizza, and drinks are kindly provided by NWRUGās sponsors Fatā¦
YAGNI: Camping Chair Development
I joined Matt Swanson on YAGNI to talk about how I build software now across Fireside, Flipper, and Box Out. Some of it even happens from a camping chair.
Some of the highlights:
Iām Not a Craftsman. I always thought of myself as a craftsman. Bespoke furniture. Samurai. Honor. All that. Then on December 14th I turned on a 20x Claude plan just to try Opus and realized nope, I just love shipping stuff and solving problems. These days I read the data models and the queries because those affect how fast things are for customers. JavaScript and view code? I donāt read it. Does it look right? Is it responsive? Whatās my Lighthouse score? Good enough.
Stripping Back. I went through a phase ofā¦
Garrett and I started a podcast. Itās called The Friday Deploy, and the tagline is the whole point: ship on Friday, sleep through the night.
We already do a marketing and business podcast for Fireside, so we figured, letās go full on dev with this one. Feature flags, deployments, infrastructure, incidents, product decisions, and all the little practices that let you deploy whenever you want without the sweaty armpits. Sometimes itāll be just me and Garrett, and sometimes weāll bring on a guest to walk through what they do.
Subscribe on Apple Podcasts, Spotify, or RSS.
Episode 1: Changing the Wheels While the Car Is Moving
Weāre almost exactly two years into owning Fireside, so for theā¦
Happy to report that in record time, all Rails World 2026 talks are now online.
While all four keynotes got everyone talking about AI, this yearās talks covered a good balance of whatās new in Rails and how Rails developers are using AI.
The AI-focused talks covered: making codebases agent-friendly, harness engineering, generators, AI pipelines in plain Ruby, agent loops driving Ractor-safety, building MCPs, and rapid deploys with the help of agents.
There were also talks about: Lexxy, Active Search, ONCE, Herb in Rails 8.2 and durable Active Job workflows, plus deep dives into Solid Cable, Hotwire, Kamal, sharding, the RubyGems compact index, and HotCellā¦

