Why Report-Driven Analytics Fail: The Case for Real-Time Analytics for Investment Platforms
Why Independence Matters More Than Scale in Investment Software Architecture
Adding multi-tenancy to a DDD Rails app
Many businesses when they set out to create some software they need, don’t know that one day, they might need multi-tenancy.
This is one of the features, that is not easy for programmers to add later easily. It might take months or even years.
Let me describe how I approached this in an ecommerce app. Essentially, the idea is to allow to create multiple stores, where previously it was one (or actually lack of any, all resources were global).
The ecommerce project
The project I am talking about is called ecommerce and it is part of the RailsEventStore (RES) organization on github. It started as a sample application for RES but over the last 10…
Cat Pics



Did a few cat pics tonight!
Direct link to podcast audio file
During the end-of-year podcasting doldrums, I'm pleased to bring you this Feature Release, in which I eschew my tradition of eschewing traditions and present a second annual sorting of the puns. As 2025 (a.k.a. Season 2) of Breaking Change comes to a close, Aaron Patterson once again joins the show to execute our latest iteration of the punsort algorithm.
Following along at home? Here's a spoiler-free link to the original Season 2 rankings.
Ready to be spoiled? Visit /puns for the final pun rankings of 2025.
If you agree, disagree, or are indifferent about where things landed, feel free to get it off your chest at podcast@searls.co.

Two days ago, Rails added a new feature that makes working with bearer tokens easier. Before, you had to parse the Authorization header to extract them. Now, there's a dedicated bearer_token method on the request object that handles this for you.
When building APIs that use bearer token authentication (OAuth 2.0 and JWT-based authentication), you typically receive tokens from the client in the Authorization header…
When we are running Rails migrations, it’s common to combine multiple changes into a single change_table block especially when we want to keep database schema in sync.
Before Rails 7.1
Previously,
validate_constraint and
validate_check_constraint
had to be called outside the change_table block,
requiring constraint creation and
validation to be handled as two separate steps.
For example:
class AddNameColumnsAndConstraintToUser < ActiveRecord::Migration[7.0]
def change
change_table :user, bulk: true do |t|
t.string :first_name
t.string :last_name
t.check_constraint "first_name IS NOT NULL AND last_name IS NOT NULL",
name: "name_not_null", validate: false
…
After
With the enhancement introduced in Rails 7.1,
we can now create cleaner migrations by combining column additions and
constraint validations within a single change_table…
def validate_constr…487: ActiveModel custom attributes
Joël contributes some thoughts on working with custom attributes as he follows up on last week’s discussion about ActiveModels with Sally.
Joël breaks down how he transforms various strings and objects when working with ActiveModels to simplify more advance workloads, as Sally queries their different use cases and how best to utilise them for her own workflow.
—
If you’d like to give some of the gems mentioned in this episode a try for yourself they can be found here - phonelib - money-rails - astronoby
Thanks to our sponsors for this episode Judoscale - Autoscale the Right…
Can Bundler Be as Fast as uv?
At RailsWorld earlier this year, I got nerd sniped by someone. They asked “why can’t Bundler be as fast as uv?” Immediately my inner voice said “YA, WHY CAN’T IT BE AS FAST AS UV????”
My inner voice likes to shout at me, especially when someone asks a question so obvious I should have thought of it myself. Since then I’ve been thinking about and investigating this problem, going so far as to give a presentation at XO Ruby Portland about Bundler performance. I firmly believe the answer is “Bundler can be as fast as uv” (where “as fast” has a margin of error lol).
Fortunately, Andrew Nesbitt recently wrote a post called “How uv got so fast”, and I thought I would take this opportunity to…
schema.rb documents the database structure in a database-agnostic way, providing a Ruby representation of the schema within the limits of what Active Record can express.
Before
When running migrations, Rails generates the schema.rb file by dumping the current database structure. However, the order of columns in schema.rb reflects the physical column order in the database, which typically follows migration history.
Imagine you have a posts table:
create_table "posts", force: :cascade do |t|
t.string "title"
t.boolean "published"
t.text "summary"
end
After applying different migrations, the order of columns may differ on other machines:
create_table "posts", force: :cascade do |t|…#781 — December 29, 2025
Ruby Weekly
Ruby 4.0.0 Released — Yui Naruse of the core team took the helm for this year’s big, and extra special, Ruby release post where we celebrate 30 years of Ruby with the big v4.0! We’re listing a few of the most notable updates below, but it’s worth checking out the post, if only to enjoy the Ruby blog’s new theme.
Yui Naruse
A New Design for the Official Ruby Site — Unveiled a few days before v4.0, Ruby’s official web site has received more than a lick of paint, with a complete, modern redesign. It’s really well put together and gives off more of Ruby’s…
…
If you look closely, you'll spot that the Instagram algorithm has successfully identified my absolute number-one-with-a-bullet favorite topic. How on earth did it figure that out? My phone must be listening to me.
How RIZAP Technologies Turns Junior Developers Into Senior Ruby Engineers
How RIZAP Technologies Turns Junior Developers Into Senior Ruby Engineers December 29, 2025 At RubyWorld Conference 2025 and Kaigi on Rails 2025, a talk by Tomohiro Umeda from RIZAP Technologies quietly delivered one of the most important messages for the future of Ruby engineering. Most companies would love to hire senior engineers. But in reality … Continue reading How RIZAP Technologies Turns Junior Developers Into Senior Ruby Engineers
Continuations 2025/52: Do what you love
Happy holidays, and happy last week of the year!
If you haven’t yet, now is a great time to check our State of Hanami, December 2025, which I posted earlier this week. It’s a great snapshot of everything we achieved this year, and it ends with some of our goals for the year to come.I wasn’t sure if I’d end up writing one of these this week, since I’ve been off enjoying some family time by the coast. They say to do what you love while on holiday, so I’ve read a novella (Slow Bullets by Alastair Reynolds), done some retro gaming (The Legend of Zelda: The Minish Cap on my recently-acquired RG40XXV), done some beach swimming, and as it turns out, a bunch of Ruby open source. So here we are,…
After Ruby…
After a decade under Pablo Cantero's stewardship, Shoryuken has a new maintainer - me. I'm grateful for his graceful handoff of this Ruby SQS library, and I'm picking up where he left off: v7.0.0.rc1 is out now, with the stable release close behind.
What's in v7.0.0
This release modernizes the codebase substantially. It brings several improvements including:
-
Rails 8.1+ features:
- ActiveJob Continuations let jobs checkpoint progress during shutdown and resume after restart.
- Bulk enqueuing via
enqueue_allnow uses SQS batch API. -
CurrentAttributesautomatically flow from enqueue to execution.
-
Dependency reduction:
-
myumura removed
concurrent-rubyentirely, replacing it with pure Ruby… - Co…
-
myumura removed
📸 Doordash Couture
Who is this for? STEM majors realizing they're better off running Uber Eats?
[8/4] How a Scotsman saved hours of my time by turning an LLM into my virtual assistant
![[8/4] How a Scotsman saved hours of my time by turning an LLM into my virtual assistant](https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2025/12/ChatGPT-Image-Dec-27--2025--05_51_01-AM.png)
Sometimes you get stuck thinking about less-than-ideal solutions, missing the big green elephant staring right at you. I had a nice win in a short time that I didn't want to leave unshared.
I had used a bookkeeping app for several years to file my taxes. Once I decided to switch accountants, I found that this application isn't very interested in you leaving, so it doesn't offer an "export all functionality" option. (a black-hat churn buster right there for you SaaS builders!)
Here are a couple of these screens:
![[8/4] How a Scotsman saved hours of my time by turning an LLM into my virtual assistant](https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2025/10/Screenshot-2025-10-26-at-10.25.22.png)
![[8/4] How a Scotsman saved hours of my time by turning an LLM into my virtual assistant](https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2025/10/Screenshot-2025-10-26-at-10.26.09.png)
Basically, I stood before a gigantic mechanical task: clicking through dozens of pages and downloading hundreds of invoices I had uploaded manually for the past years.
My first thought…
A Ruby YAML parser
Recently I built the psych-pure gem, a pure-Ruby implementation of a YAML 1.2 parser and emitter. It fully conforms to the YAML 1.2 specification, passes the entire YAML test suite, and allows you to preserve comments when loading and dumping YAML documents. This post explains how and why.
Motivation
First, let’s talk about YAML. YAML is a surprisingly complex data serialization format. It supports a wide variety of data types and syntactic structures, making it both powerful and a huge pain to implement correctly. If you check out matrix.yaml.info you’ll see that very few of the YAML parsers in use fully conform to the YAML 1.2 spec.
Notably, the one used by Ruby — libyaml — errors out…
Happy Holidays, this is Claudio, Emmanuel, Greg, Vipul, Wojciech, and Zzak, bringing you the summary of what happened with Rails in the past year. It was a busy year with close to 2700 commits from 430 contributors and 14 releases, including Rails 8.1! The Rails Foundation also released a wrap up of 2025, and here are the most noteworthy changes landed in Rails this year.
Fix inconsistency between “delete_all” & “update_all” allowed methods
After this change, trying to call update_all with distinct or a CTE (with, with_recursive) is deprecated and will raise an error in Rails 8.2. This is consistent with the behavior of delete_all.
Ruby Upgrades & RAM Shortages
Chris, Andrew, and David are back together, and the conversation starts out with TV talk, Fallout hype, why some shows overstay their welcome (Prison Break), and the “season one magic” problem (Reacher). Then there’s a big shoutout to Marco’s Rails Luminary win, and a deep dive into AI rabbit holes: self-hosting LLMs, Mac minis, and the looming reality of both token costs and RAM shortages. They discuss the Ruby releases (3.4.8 + Ruby 4.0 preview3), highlighting practical fixes, previewing features like Ruby:: Box, new syntax tweaks, and core classes updates they’re excited about. Hit download now!
Links
Rails 6 is a major milestone that modernizes Rails for the 2020s. The biggest change? Zeitwerk autoloader replaces the classic autoloader, requiring careful attention to file naming conventions.
Plus: Webpacker as default, multiple database support, parallel testing, Action Mailbox, and Action Text.
Note: This is Part 3 of our Rails Upgrade Series. Read Part 1: Planning and Part 2: Rails 4.2 to 5 first.
Before We Start
Expected Timeline: 2-4 weeks for medium sized applications
Medium-sized application: 20,000-50,000 lines of code, 30-100 models, moderate test coverage, 2-5 developers. Smaller apps may take 1-2 weeks, larger enterprise apps 6-12 weeks.
Prerequisites:
- Current…
Ruby 4.0
Highlights:
Note: As Ruby doesn’t follow SemVer, the 4.0 version marks not some significant change/set of changes, but was chosen by Matz to celebrate Ruby’s 30s birthday.
- Support for line breaks before logical operators
-
Setreimplemented efficiently -
Pathnamebecame a core class Ruby::Box-
Ractor: ports
What's New in RubyGems/Bundler 4
Ruby 4.0.0 was released on December 25, 2025, and RubyGems/Bundler 4.0.3 is now bundled with Ruby 4.0.0.
Since my previous post focused on migration and compatibility concerns, I’d like to highlight some of the exciting new features in this release.
Parallelization of C-extension Gem Builds
Add MAKEFLAGS=-j by default before compiling
When installing gems with C extensions (such as mysql2 or pg), RubyGems now automatically adds MAKEFLAGS=-j to the make command for parallel execution. Users previously had to manually configure this themselves. By leveraging multi-core CPUs by default, installation times are significantly reduced.
By default, RubyGems uses Etc.nprocessors + 1, fully…
Why have lower bounds on generics?
Merry Christmas! I made a little present for any of my fellow Japanese learners out there. 🎁
Today I'm pleased to share this ChatGPT-powered Shortcut for Apple platforms I've been working on with you.
Here are its headlining features of the Ingest Japanese shortcut:
-
Render Furigana - ChatGPT tokenizes words and produces readings for kanji and okurigana, which are then assembled into an HTML page with proper
<ruby>and<rt>tags (copyable as an HTML file) - Show Kana Reading - ChatGPT tokenizes the words and converts them their kana pronunciations, separating each word with a space, so you can understand word boundaries at a glance
- Translate to English - Uses whatever additional context has…
It also exposes these utilities:
- Copy Input - copy whatever input…
Ruby 4.0.0
Happy Holidays! ❄️☃️❄️
Ruby 4.0.0 is here along with several enhancements over last year’s Ruby 3.4.0 release. The following highlights the changes in this release. Definitely dig into the release notes for complete details.
Array
Array gains two new methods:
-
#find: Provides an efficient implementation overEnumerable#find(what was previously used). -
#rfind: Allows you to find the last element matching a specific condition which provides a performance improvement overArray#reverse_each.findby avoiding array allocation when messagingEnumerable…
[1, 2, 3].rfind(&:even?) # 2
Binding
Methods such as local_variables, local_variable_get, and local_variable_set no longer handle numbered parameters.
Created by Yukihiro “Matz” Matsumoto and first released in 1995, Ruby arrived with a purpose that was simple but profound: to make coding more human, more intuitive, and more enjoyable. Its object-oriented model, dynamic typing, and elegant syntax offered a fresh alternative to the heavier and more complex languages of that era.
As Ruby marks its 30th anniversary alongside the release of Ruby 4.0, we on the RubyMine team want to reflect on the path that led the language to where it is today and honor this remarkable milestone.
This year, with Ruby turning 30, we’re making RubyMine free for non-commercial use, helping nurture the next generation of Ruby developers and supporting a…
Click here to try Ruby 4.0 in…
It’s (for a few in this world) Christmas day. And also, again for a bit more than a few, the end of 2025. That means things slow down and thus a perfect opportunity to read up on what was happening and published on Rails Designer. Last year I also published a “best of” list (for 2024). And looking at it, things have not slowed down much. Next to Rails Designer’s UI Components Library being steady (about ~1.2k total in 2025), I also published a few new OSS projects (some on this list will be officially launched next year; so you read about them first here; unless you read my newsletter—those were truly the first! 🤫).
- Courrier is one I am really happy about (and use in all my projects)…
Ruby 4.0.0 Released
We are pleased to announce the release of Ruby 4.0.0. Ruby 4.0 introduces “Ruby Box” and “ZJIT”, and adds many improvements.
Ruby Box
Ruby Box is a new (experimental) feature to provide separation about definitions. Ruby Box is enabled when an environment variable RUBY_BOX=1 is specified. The class is Ruby::Box.
Definitions loaded in a box are isolated in the box. Ruby Box can isolate/separate monkey patches, changes of global/class variables, class/module definitions, and loaded native/ruby libraries from other boxes.
Expected use cases are:
- Run test cases in box to protect other tests when the test case uses monkey patches to override something
- Run web app boxes in parallel to…
India after Gandhi
My first and longest read of 2025.
What Is New In Ruby 4.0
Ruby 4.0 is here, releasing on Christmas Day 2025, marking 30 years since Ruby’s first public release. This release packs some genuinely exciting features.
Let’s explore the most impactful changes in Ruby 4.0.
ZJIT - A New JIT Compiler
Ruby 4.0 introduces ZJIT, a new just in time compiler built by the same team behind YJIT. Unlike YJIT’s lazy basic block versioning approach, ZJIT uses a more traditional method based compilation strategy.
The key difference? ZJIT is designed to be more accessible to contributors. It follows a “textbook” compiler architecture that’s easier to understand and modify.
To enable ZJIT, we can use the --zjit flag:
ruby --zjit my_script.rb
While ZJIT is…
I'm working on an inadvisably complex Apple Shortcuts widget for studying Japanese language, and just realized two things that may save you some time in the future:
- If statements are expressions: the value of the "If Result" is available and evaluates to the final value of whatever branch was traveled at runtime
- Repeat blocks may say "each" but actually double as map functions: they return a "Repeat Results" value, which evaluates to a List of the final value of each iteration
Because Shortcuts exposes such a gobsmackingly-frustrating UI for actually building programs, it's easy to assume that you're hobbled by the conventions of something like BASIC, but there are some surprisingly…
So many, many times this past year, I’ve thought to myself, ‘Holy cow, things are moving so fast.’ This is as true in the wider tech world, as it is in the Ruby community. These are exciting times.
Ruby 4.0.0 is days away, the Ruby website and documentation just got awesome new rebrands, and there are constant updates to the Rails framework.
But we’ve also watched this year as companies built on Rails grow and adapt to a new (and constantly shifting) AI landscape in fascinating ways. There are new startups choosing Rails every day, new projects and gems taking shape, new folks joining the community, new conversations, new collaborations, new books being published, new events popping up…
Running Ruby 4 with Ruby::BOX inside Docker (Alpine)
Ruby 4 with Ruby::BOX December 24, 2025 Ruby 4 introduces one of the most important runtime features in the history of the language: Ruby::BOX. It allows Ruby to execute multiple isolated class worlds inside the same process, finally making it possible to load conflicting libraries, plugins, and user code safely. In this guide we will … Continue reading Running Ruby 4 with Ruby::BOX inside Docker (Alpine)
We dig into Valentino’s experimental Ruby gem, agentic, and talk about plan-and-execute workflows, self-assembling agents, and how modern LLMs are reshaping everything from local development to production systems. Along the way, we zoom out to ask bigger questions about learning, career longevity, and what Ruby developers should really be focusing on as AI continues to accelerate.
AI isn’t eliminating the…
A New Look for Ruby's Documentation
Following the ruby-lang.org redesign, we have more news to celebrate Ruby’s 30th anniversary: docs.ruby-lang.org has a completely new look with Aliki—RDoc’s new default theme.
A Fresh Look for Ruby Documentation
Ruby has always been a joy to write, and now reading Ruby documentation can match that experience. Aliki brings a modern, clean design to docs.ruby-lang.org and any gem that generates documentation with RDoc v7.0+.
Key Features
- Improved search: Case-aware ranking, fuzzy matching, and support for searching constants
- Dark mode: Respects your OS preference with a manual toggle
- Three-column layout: Left sidebar for navigation, center for content, right sidebar for table of…
- Code block…
Passenger 6.1.1

Version 6.1.1 of the Passenger application server has been released. This release adds packages for Ubuntu 25.10 "questing", and removes packages for Ubuntu 25.04 "plucky". Compatibility with the upcoming Ruby 4 is also improved.
Passenger 6 introduced Generic Language Support, or: the ability to support any and all arbitrary apps.
Nginx Uploads Bug
Passenger 6.1.1 includes a fix for a bug where if Passenger was loaded via the Nginx module, and had passenger_request_buffering off; then any request body larger than the client_body_buffer_size would be corrupted.
Future Ruby Versions
Passenger 6.1.1 has improved support for Ruby 4 and Frozen String Literals.
Updates & improvements
- [Ubuntu] Add…
Ruby has always been a joy to write. But for a long time, reading Ruby documentation on docs.ruby-lang.org hasn’t really matched that experience.
Last year, I brought a new look to the Darkfish theme by updating its visuals and improving mobile support. It was a visible improvement, but it wasn’t enough.
So this year, I built something new from the ground up. Starting with RDoc 7.0.0, Aliki is now the default theme for RDoc.
This release also coincides with Ruby’s 30th anniversary and the redesign of ruby-lang.org—a great moment to give Ruby’s documentation a fresh look as we head into the next chapter with Ruby 4.0.

Why a New Theme?
Even after last year’s improvements, I still…
Each morning I open four tabs: Calendar, Gmail, Jira, and Obsidian. I read all, discard low priority emails or calendar events, and start building a mental picture of what I’ll do that day, and when exactly. For each piece of data I decide whether it’s time sensitive or not, whether I need to prepare beforehand, and whether I should tackle it later (or never). After warming up my brain, I kick off the actual work.
I decided an LLM should do that pre-work instead of my well-rested brain. To build such automation I’d practice Claude Code subagents and local MCP servers setup,
a good exercise for my new startup, RailsPilot.ai. So I started creating my /today Claude Code command.
/today…
Rewrite with Confidence: Validating Business Rules Through Isolated Testing
Rewrite with Confidence: Validating Business Rules Through Isolated Testing
A few months back, our team at Arkency faced a challenge that many Rails developers might recognize. We needed to implement a new flow at Lemonade that would eventually replace a legacy process — but with three major constraints that couldn’t be compromised: user experience, cost efficiency, and avoiding technical debt.
The stakes were high. Any discrepancies between systems would impact customers and potentially create legal issues in the insurance domain. We had just three months to understand, replicate, and improve a complex flow that had evolved organically over years. And we needed to break free from…
486: ActiveModel Everywhere
Aji and Sally join forces to discuss the different ways they utilise active models in their workflows.
Aji describes a new system for working with active models they’ve been using recently, Sally recalls a project where active models could have saved her a lot of time, before putting their heads together to think of new creative ways to utilise rails’ tools toolset to build other active models.
—
Discover more of The Magic of Rails through Eileen Uchitelle’s Keynote, or check out the GitHub repo mentioned in this episode.
Thanks to our sponsors for this episode Judoscale - Autoscale the Right Way (check the link for your free gift!), and Scout Monitoring.
Your hosts for this…
4.0.3 Released
RubyGems 4.0.3 includes enhancements and documentation and Bundler 4.0.3 includes enhancements.
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.3
RubyGems Release Notes
Enhancements:
- Installs bundler 4.0.3 as a default gem.
Documentation:
- Fix broken documentation links. Pull request #9208 by eileencodes
Bundler Release Notes
Enhancements:
- Fall back to ruby platform gem when precompiled variant is incompatible #9211
Manual Installation
To install RubyGems by hand see the Download RubyGems page.
SHA256 Checksums:
- rubygems-4.0.3.tgz
f5f…
✉️ Merry Divestmas
This is a copy of the Searls of Wisdom newsletter delivered to subscribers on December 20, 2025.
Hey everybody, we've almost survived another year! Just ten days to go—I hope we all make it!
Looking back on the home stretch of 2025, this is all I have to report since our last issue:
- I built a sexy new gaming PC over 3 days, 120 teeny-tiny M3 screws, and at least ten cups of coffee
- I got my first nose job. I've always had a huge fucking nose, and I'm relieved to finally be able to breathe out of it
- I talked about both of the above on my podcast
- I'm so sick of bracing for the AI bubble to pop, that I've decided to look forward to it instead. Buy popcorn futures, everyone 🍿
- I released…
T…
Happy Holidays

Happy holidays everyone! Have a great rest of the year!

While going through recently merged PRs in Rails, I came across a new feature from DHH, that handles a common concern in app configuration: managing credentials across different configuration backends in a single, consistent manner.
When you're going through the PR, I highly recommend you also read Jean's (byroot) code review comments and how DHH addresses them…
Ruby at 30: A Community Built from Imperfection
December 22, 2025 Reflections from RubyRelease30th and Matz’s Keynote As 2025 comes to an end and Ruby moves closer to the long-awaited release of Ruby 4, the Ruby Release 30th Anniversary Party, held on December 20, felt like more than a commemorative event. It was a moment of reflection—about history, values, and why Ruby continues … Continue reading Ruby at 30: A Community Built from Imperfection
State of Hanami, December 2025
State of Hanami, December 2025
I’m very pleased to share our State of Hanami update for 2025! We’re back for our second time. If you want to get caught up, check out our update from last year.
This has been a pivotal year for Hanami, our first steps into a new era: we made a substantial new release, began unifying our ecosystem, expanded our team, launched our sponsorship program, and saw a real uptick in community activity.
I’ll go into all these highlights below, before leaving you with some plans for 2026.
Our biggest release yet
In November we released Hanami 2.3. This was our first major release in a year, and it…
![[7/4] Speak to LLMs with voice-to-text](https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2025/12/christmas-llm-post-7-4-1.png)
This small practice made me more productive and happy as a software engineer. If you chat with LLMs && you are in a room where you can speak to your computer && you are not speaking to your computer, you might be missing out.
Using a voice-to-text tool is excellent for software engineering and knowledge work for several reasons. Let's check those reasons with examples and look at the tools I used to give myself some engineering boosts.
Brain dump LLMs
War story: Once, we forgot to record or transcribe a meeting where we discussed a bunch of action points and a summary we needed to forward to the CEO. The CTO brain-dumped everything he remembered from the convo to ChatGPT and asked it to…
Redesign our Site Identity
We are excited to announce a comprehensive redesign of our site. The design for this update was created by Taeko Akatsuka.
As part of this update, we have redesigned the site’s identity as “A language where people gather, a site where people are visible.”
Ruby has been a language centered on “programmer happiness” for 30 years. The new key visual expresses the presence of people surrounding Ruby.
The composition features diverse hand-drawn illustrated characters radiating outward from the central Ruby logo, representing developers around the world connecting through Ruby, creating value in their respective fields, and enjoying Ruby alongside familiar motifs.
While conveying Ruby’s…
Week 50/51 - Happy Holidays
Welcome to Hotwire Weekly!
Welcome to a double-week, holiday special edition of Hotwire Weekly! Thanks for reading, and Merry Christmas! 🎄🚀
📚 Articles, Tutorials, and Videos
Articles
Tricks to work around nested <form> elements, for Rails - Ben Sheldon shares practical tricks for handling tricky nested <form> markup in Rails, such as wrapping inputs to avoid invalid HTML, using Turbo Frames for partial form updates, and ensuring accessible label/input associations without breaking Stimulus behavior.
AnyCable, Rails, and the pitfalls of LLM-streaming - Vladimir Dementyev on the Evil Martians blog explores why streaming large-language model (LLM) responses in Rails apps isn’t as simple as…
Continuations 2025/51: Break ground
This week I released my Hanami Router Rack environment fixes as v2.3.1, the Dry Logger threadsafety fix as v1.2.1, and the Hanami Webconsole Ruby 4 compatibility fix as v2.3.1.
After manually sharing those releases in our Discord, I decided it was time to break ground on our next system for release automation. What we have currently works only for the Dry gems, and it works via a bigger custom CLI that we no longer use. It also uses a saved token for publishing the gems. So I created a new release-machine repo and got a workflow built using RubyGems trusted publishing, including tag signature checks to verify approved releasers.
Everything worked nicely, but the downside of using a…
Mike McQuaid recently blogged that he's joined the POSSE Party. He reached out a couple times to say he was scraping my own site to figure out how I accomplished certain things (like the iMessage previews for my takes section, but in general it must have been straightforward enough, because he didn't need me at all to get up and running. Kind of cool to see that he can teach his 20 year old blog new tricks.
In his LinkedIn post sharing it:
In practice, this looks like building your own version of a single-serving social network on your own site and exposing RSS/Atom feeds to other services to consume. Justin recently released POSSE Party which makes this easier by cross-posting to various…
I recently migrated GoodJob’s Dashboard from Rails UJS (“Unobtrusive Javascript”) to Turbo. One of the most significant changes for me of moving from UJS to Turbo is that UJS’s data-method is not functionally replaceable with Turbo’s data-turbo-method. This -method attribute allows you to make a button or link act like a form submission without using a<form> element.
I learned some stuff, but first let’s back up even further
HTML <forms> are hard
There’s three practical things, and one conceptual, that are going to challenge us here
You cannot nest a <form> element within another <form> element. When rendering the page, the browser will remove it, or ignore it;…
In the last few weeks I’ve been writing here about my work on UringMachine, a Ruby gem for doing I/O with io_uring. Before I talk about my work this week, I’d like to address something that is important to me.
Maybe, We’ll See…
I usually share my blog posts in a few different places on the internet, and sometime people write their reactions. Last week, on Reddit, someone didn’t like the title (of all things… 🙂) I gave my last blog post, and made the following remark:
When a project or people aren’t open on what their tech is good for, and what it’s not good for, it really drives me away…
To which I replied:
I try to be as open as possible, and the thing is I don’t yet know what…
Now that programmers are at war with the robots (Gen AI) for our jobs, we need to lean into the things that they cannot do. Today, I’m going to be talking about how to be a human and communicate with other humans in the most hostile of scenarios, “in conflict (drama).”
TLDR: Be clear in your communications what you support and “whose side are you on.” There’s a bullet point list of suggestions at the bottom.
Knot-quite-right help
Before connecting my thoughts back to tech and to “drama”, I’m going to start with a made-up example: Imagine you’re at school and a classmate comes to you and says:
“Hey idiot, tie your shoes.”
What do you do next? Do you say, “Hey, thanks! I…
Can you tell me how to test
Testing server-rendered HTML:
- Make a request, look at the result.
Testing React et al:
- Make a request.
- Receive HTML.
- Ignore it!
- It also contains a string.
- The string is attached to a bird
- The bird speaks latin
- Find an antiquities professor
- He can distract the bird
- While you build a fake browser
With apologies to Penny Arcade
Writing Code Is Fun
I became a software engineer because writing code is fun. Thinking through hard problems, designing elegant solutions, seeing the things you’ve built working for the first time… these moments are all deeply satisfying, so why in the world would I ever surrender them to AI?
I know the arguments for using AI to write code; I hear them constantly from all levels of the tech industry. I’m told that it’ll make me more productive. I could use Copilot to write boilerplate or unit tests for me so I can focus on more creative work. I could use Claude Code as a sounding board or planning tool for complex features, refactors, or other projects. I could run and coordinate multiple concurrent…
The Rails Delegated Type Pattern
Here on the 37signals developer blog, we go deep into technical topics, but some ideas are easier to explain through conversation, a little back-and-forth, and an occasional screen share. That’s why we’re launching RECORDABLES, a new video series hosted by Kimberly Rhodes, who you may know from The REWORK podcast, alongside Fernando Olivares, Lead Programmer on our Mobile Team.
We couldn’t think of a better way to kickoff RECORDABLES than exploring recordables! We’ve had many requests over the years to explain how and why we use the delegated types pattern from Rails in our products and we’re finally explaining it in-depth.
Kimberly and Fernando sit down with Principal Programmer Jeffrey…
CVE-2025-14762 (aws-sdk-s3): AWS SDK for Ruby's S3 Encryption Client has a Key Commitment Issue
Ever felt like a superhero after solving a tricky bug or implementing a complex feature in your Rails application? What if you could capture that moment with your own custom superhero card?
We’re immortalizing those heroic coding moments with our new Rails Superhero Card Generator! This AI-powered tool creates personalized superhero cards featuring your photo and a catchy superhero name that reflects your coding prowess.
Navigate to the Rails Superhero Card Generator, tell it your superhero skills, upload a picture and generate your custom hero card!
How it Works
The Rails Superhero Card Generator combines the power of large language models (LLMs) and image generation models to create…
The Rails Recordables Pattern
Here on the 37signals developer blog, we go deep into technical topics, but some ideas are easier to explain through conversation, a little back-and-forth, and an occasional screen share. That’s why we’re launching RECORDABLES, a new video series hosted by Kimberly Rhodes, who you may know from The REWORK podcast, alongside Fernando Olivares, Lead Programmer on our Mobile Team.
We couldn’t think of a better way to kickoff RECORDABLES than exploring recordables! We’ve had many requests over the years to explain how and why we use the delegated types pattern from Rails in our products and we’re finally explaining it in-depth.
Kimberly and Fernando sit down with Principal Programmer Jeffrey…
Dialog Animation Gotchas
I spent way too long getting the animations right for my dialog post. Chrome’s documentation on entry/exit animations made it look simple—define your open state, your starting state, your closed state. Three blocks of CSS. Done.
The entry animation worked immediately. The exit was a disaster. The dialog snapped to full width mid-animation, jumped around, then vanished. The backdrop lingered after close, or disappeared instantly while the dialog was still fading. Nothing synced up.
I want to walk through each problem I hit and how I fixed it, partly as documentation for my future self, partly because I suspect these same issues will bite anyone trying to animate native dialogs.
My…
Update: This article originally concluded that Eisel-Lemire wasn't worth it for Ruby. I was wrong. After revisiting the problem, I found a way to make it work - and submitted a PR to Ruby. Read the full update at the end.
Recently, I submitted a PR to Ruby that optimizes Float#to_s using the Ryu algorithm, achieving 2-4x performance improvements for float-to-string conversion. While that work deserves its own article, this article is about what happened when I tried to optimize the other direction: string-to-float parsing.
String-to-float seemed like an equally promising target. It's a fundamental operation used everywhere - parsing JSON, reading configuration files, processing CSV data,…
Jumpstart Pro Evolution - Streamlining Rails Development
In this episode, Chris and David Hill catch up on wild winter temperature swings, then dive into what Chris has been refactoring in Jumpstart to reduce merge pain, cut dependencies, and make upgrades smoother. The conversation branches into AI-assisted coding pitfalls and where AI shines, new web security headers that could simplify CSRF handling, and a promising new “old school Heroku on steroids” platform from Evan Phoenix called Miren, plus a few Hatchbox deployment learnings along the way. Hit download now to hear more!
Links
- Chris Oliver X
- Andrew Mason Bluesky
- Judoscale- Remote Ruby listener gift
- David Hill LinkedIn
- Blastoff Rails (submit a talk)
- RBQ Conf (submit a talk)
- Why GitHub Why?…
Hi, Wojtek here. The Rails Community is not slowing down giving us another week of great news and features.
Ruby turns 30. Happy anniversary to the language that made Rails possible!
Marco Roth as 2025 Rails Luminary
If you attended any Ruby/Rails conference this year, there are high chances you met Marco in person sharing his passion and if you didn’t try his excellent herb gem yet, then install it and run in your Rails app: herb analyze app/views - for sure it will find a bunch of small HTML mistakes for you.
Congratulations Marco, well deserved!
Use a modern approach for cross-site request forgery protection
Modern browsers send the Sec-Fetch-Site header to indicate the relationship…
Rails 5 brought major improvements: ActionCable for WebSockets, API mode, Turbolinks 5, and ActiveJob integration. But it also introduced breaking changes that require careful migration.
If we’re still on Rails 4.2 (EOL since 2016), this upgrade is critical for security and performance. Let’s walk through the key changes and how to handle them.
Note: This is Part 2 of our Rails Upgrade Series. Read Part 1: Planning Rails Upgrade for strategic planning guidance.
Before We Start
Expected Timeline: 2-4 weeks for medium-sized applications
Medium-sized application: 20,000-50,000 lines of code, 30-100 models, moderate test coverage, 2-5 developers. Smaller apps may take 1-2 weeks,…
Design Previews for Ruby on Rails
Here is the problem: every time you make a change, you overwrite the last version.
Designing directly in code has become incredibly fast with LLMs. You describe what you want, you get working HTML and CSS back in seconds. But the speed creates a new problem. You generate version one, tweak the prompt, generate version two, and now version one is gone. You want to compare them. You want to send both to your designer or PM and ask which one feels better. You want to open…

Real-time LLM streaming sounds simple—until it isn’t. A Rails-focused look at hidden pitfalls, AnyCable’s fixes, and the future of durable streams.
By the end of 2025, it's hard to find a web application that doesn't have AI-powered features (or that hasn't tried to incorporate them). And when reflecting AI-generated content in a UI, LLM response streaming capabilities are essential. They enable us to provide feedback quickly, reduce the perceived slowness of AI, and thus improve the UX. But even though frameworks and…
Introduction
Modern observability platforms thrive on structured data.
They can parse JSON, extract fields, build dashboards,
and alert on specific conditions.
But Rails has traditionally given us Rails.logger,
which produces human readable but unstructured log lines.
Parsing these logs for analytics is painful. We end up writing regex patterns, hoping the log format doesn’t change, and losing valuable context along the way.
Rails 8.1 introduces a first class solution:
the Structured Event Reporter,
accessible via Rails.event.
Before
Before this change, logging in Rails meant working with unstructured text.
Rails.logger.info("User created: id=#{user.id}, name=#{user.name}")
This…
It's the final issue of 2025 - maybe!
#780 — December 18, 2025
Ruby Weekly
What's New in Ruby 4.0 — It’s exactly a week till Ruby 4.0 is expected to land (on Christmas Day!) and while the official release notes will be the eventual ‘go to’ for discovering everything that’s new, Nithin has done a good job of rounding up the headline changes here.
Nithin Bekal
Ruby 4.0.0 Preview 3 Released — Can't wait for Christmas Day to unwrap 4.0? The latest preview is out along with a thorough set of notes on what’s new. There are hundreds of minor changes since preview 2, but notably bundle gem now has an --ext=go option to scaffold a…
Yui Naruse
Add snow to your app with Stimulus
With the end of 2025 near, let’s build something fun: a snow effect for your (Rails) app or site (built with Perron?) using one Stimulus controller. Snow will fall from the top of the viewport, pile up at the bottom and you can sweep it away by dragging your mouse. Give it a try on this page! 😊☃️
Creating the basic controller
Start with the controller structure and lifecycle methods. Create a new Stimulus controller:
// app/javascript/controllers/let_it_snow_controller.js
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
connect() {
this.#startSnow()
}
disconnect() {
this.#stopSnow()
this.#meltSnow()
}
// private
#star…Ruby 4.0.0 preview3 Released
We are pleased to announce the release of Ruby 4.0.0-preview3. Ruby 4.0 introduces Ruby::Box and “ZJIT”, and adds many improvements.
Ruby::Box
A new (experimental) feature to provide separation about definitions. For the detail of “Ruby Box”, see doc/language/box.md. [Feature #21311] [Misc #21385]
Language changes
-
*nilno longer callsnil.to_a, similar to how**nildoes not callnil.to_hash. [Feature #21047] -
Logical binary operators (
||,&&,andandor) at the beginning of a line continue the previous line, like fluent dot. The following two code are equal:if condition1 && condition2 ... end…if condition1 && condition2 ... end
Core classes updates
Note: We’re only listing outstanding class updates.
-
Kernel
-
Kernel#inspectnow checks for the existence of a#instance_variables_to_inspectmethod, allowing control over which instance variables are displayed in the#inspectstring:class DatabaseConfig def ini…
-
Stylish <dialog>s
Campsite has some of my favorite UI styling on the web. Naturally, I cracked open their source hoping to learn something. What I found: React components rendering <div>s inside <div>s, with piles of JavaScript doing what <dialog> does for free.
So I borrowed their visual design and rebuilt it with semantic HTML and CSS using affordance classes. I want to walk you through all of the choices I’ve made and how it all comes together.
The HTML
Here’s the markup structure I use for a full-featured dialog:
<dialog id="example-dialog" class="ui/dialog"
aria-labelledby="example-dialog-title"
aria-describedby="example-dialog-desc"
closedby="any">
<header>
…2025 Year-End Review
This isn’t a “real” post. This is a summary of all the things that made up my year in 2025 (almost all in a professional context). Thanks to all who were a part of it.
Writing 🔗
I published 8 articles about Ruby or software development in general this year. The first was about it. My last post of the year was a highly-nuanced take on reviewing AI PRs.
In between, I wrote about REST, flash messages, and more.
I continue sending my posts to newsletter subscribers. You can still subscribe via RSS or try to keep up wherever I post on social media.
My most-read posts are those that end up in other newsletters. This year, my writing appeared in Ruby Weekly 6 times and Short Ruby Newsletter 6 times.
I…
We are stoked to share that the Rails Core team has announced Marco Roth as the 2025 Rails Luminary.
The Rails Luminary Awards exist to celebrate those in the community who have significantly advanced Rails for the benefit of all, through contributions, gems, ideas, or knowledge-sharing, and Marco ticked all of those boxes this year.
From Rails Core member Xavier Noria:
Marco has been a prolific Open Source author for many years, and is now doing outstanding work on Herb, ReActionView, and his vision for improving the tooling and user experience around the Rails view layer. He travels the world sharing his work and knowledge at conferences and, if you have met him, you know he is as…
Rails 8.1 introduces
bin/ci to standardize CI workflows based on a new domain specific language (DSL)
in config/ci.rb making it easier to define,
run and maintain the CI pipelines.
Understanding the DSL in config/ci.rb
The new DSL allows us to define CI steps in a structured and readable way.
-
step: Defines a single step in the workflow. The first argument is the step’s name and the remaining arguments form the command to execute. -
success?: Returns true if all previous steps passed, allowing conditional logic. -
failure: Displays a failure message with a description when the workflow fails. Takes two arguments: the message and a description.
CI.run do
step "Setup", "bin/setup…How to review AI generated PRs
This is (mostly) parody This started as a parody of thoughtbot's recent article on the same subject, but grew from there.
While I take issue with the angle from which the author of that article attacks this problem, we ultimately do agree on the nature of the problem, so you'll find some earnest discussion in the final section.
Does your team use AI a lot? Maybe too much? Are you feeling overwhelmed by the firehose of bad code you’re having to review? I feel you. Here are some techniques and strategies I’ve adopted, as a reasonable human, which have made reviewing AI generated code feel less taxing and more productive.
What’s the same?
Before we dive into the differences between human…
Turbo’s data-turbo-confirm attribute is convenient for quick confirmation dialogs, but the native confirm() prompt it triggers looks dated and out of place. If you want a styled confirmation dialog that matches your app’s design, the traditional approach recommends a lot of JavaScript—a Stimulus controller to open and close the dialog, event listeners for keyboard handling, and coordination between the trigger and the modal.
But, recent browser updates have changed the game. Invoker Commands landed in Chrome 131 and Safari 18.4, giving us declarative dialog control. Combined with @starting-style for animations, we can now build beautiful, animated confirmation dialogs without writing any…
From Reading to Mastery: Turning Metaprogramming Ruby into a Hands-On Learning Platform
December 17, 2025 Metaprogramming has always been one of Ruby’s most powerful — and most intimidating — features. While the book Metaprogramming Ruby by Paolo Perrotta is widely regarded as a classic, many developers share the same experience: it’s brilliant, but hard to truly internalize by just reading it. In a talk presented at RubyWorld … Continue reading From Reading to Mastery: Turning Metaprogramming Ruby into a Hands-On Learning Platform
As the year comes to a close, we’re thrilled to highlight our top five most-read Ruby articles of 2025:
Top 5 Ruby Blog Posts in 2025 💎
An Introduction to Solid Queue for Ruby on Rails
In part one of our two-part series, we explored Solid Queue's internals, discovered what makes it unique, and learned more about why it was created in the first place.
A Deep Dive into Solid Queue for Ruby on Rails
In the second part of our series, we dove deeper into some of Solid Queue's more advanced features.
Advanced Queries in ActiveRecord for Ruby on Rails
We got to grips with advanced ActiveRecord queries, shining a spotlight on more complex joins, custom SQL, and strategic employment of…
What’s new in Ruby 4.0
Ruby 4.0 will be released next week on Christmas day. This release brings a new JIT compiler, improvements to Ractors, a new mechanism to define namespaces called Ruby::Box, and a whole lot of other changes.
Although it’s a major version bump, there shouldn’t be any serious breaking changes. This version bump is to celebrate 30 years since the first public release of Ruby.
Ruby::Box
Ruby::Box is an experimental feature that brings isolated namespaces to Ruby. This can be enabled by setting the RUBY_BOX=1 environment variable. This can allow you to do things like loading two versions of a library at the same time like this:
# foo_v1.rb
class Foo
def hello
"Foo version 1"
end
end
…Seattle Waterfront






Went to the Seattle waterfront over the weekend to watch the sunset (at like 4pm lol). Unfortunately it was pretty cloudy out, but I had a good time.
Ruby 3.4.8 Released
Ruby 3.4.8 has been released.
This is a routine update that includes bug fixes. Please refer to the release notes on GitHub for further details.
Release Schedule
We intend to release the latest stable Ruby version (currently Ruby 3.4) every two months following the most recent release. Ruby 3.4.9 is scheduled for February.
If a change arises that significantly affects users, a release may occur earlier than planned, and the subsequent schedule may shift accordingly.
Download
-
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.8.tar.gz
SIZE: 23288284 SHA1: 4474a53941ca3c8bb38a3e5cf458305660037a70 SHA256:…
4.0.2 Released
RubyGems 4.0.2 includes enhancements and Bundler 4.0.2 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.2
RubyGems Release Notes
Enhancements:
- Pass down value of
BUNDLE_JOBSto RubyGems before compiling & introduce a newgem install -jflag. Pull request #9171 by Edouard-chin - Installs bundler 4.0.2 as a default gem.
Bundler Release Notes
Enhancements:
- Support single quotes in mise format ruby version #9183
- Tweak the Bundler’s “X gems now installed message”: #9194
Bug fixes:
- Allow to show cli_help with
…
CVE-2025-68113 (altcha): ALTCHA Proof-of-Work Vulnerable to Challenge Splicing and Replay
485: HTTP Basic Auth
Joël and Aji kick off a new season by discussing the best use cases for HTTP basic auth and talking all things security.
The pair ask when and why you would use basic auth over standard HTTPS, it’s pros, cons and vulnerabilities over other forms of security, and provide some advice to help decide on what form of security you could implement on your site.
—
Thanks to our sponsors for this episode Judoscale - Autoscale the Right Way (check the link for your free gift!), and Scout Monitoring.
Check out these links for more information on some of the topics covered in today’s episode - Cross-Origin Resource Sharing - Cross-site request forgery (CSRF) - The Universe is Hostile to…
Arrange/Act/Assert is a name for a sequence of steps which most of your tests already perform. By recognizing this implicit pattern, and organizing your test code around it, you can make your tests easier to read and understand.
What is it?
- Arrange: Setup objects, the database, or anything else.
- Act: Exercise the system under test.
- Assert: Verify the result.
Here’s a simple example:
describe "#add_tag" do
it "adds the tag to the user" do
tag = create(:tag)
user = create(:user, tags: [])
user.add_tag(tag)
expect(user.tags).to eq([tag])
end
end
Each of the Arrange/Act/Assert steps are separated by newlines. This makes it easy to tell them apart, so…
Enter animations are easy with @starting-style, but exit animations need transition-behavior: allow-discrete to work. Most CSS properties are continuous—opacity can be 0.5, colors can blend. But display is discrete: it’s either none or block, with no intermediate values.
The allow-discrete keyword tells the browser to apply transition timing even for discrete properties. For closing animations, the browser keeps the element visible, runs the exit transition, then flips to display: none only after the transition completes.
dialog {
opacity: 1;
scale: 1;
transition:
opacity 0.2s ease-out,
scale 0.2s ease-out,
overlay 0.2s ease-out allow-discrete,
display 0.2s ease-out…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.
Buckle 🔗
Just get the new album. And all the prior albums. You’re welcome.
I’m much too old for this
But I’m not over it‘Cause I’m stupid and I’m damaged and you’re a disaster
When you walk into the room, oh, none of it matters
Oh, baby, I just buckle my resolution in tatters
‘Cause I know it won’t work, but make it ache, make it hurt
I’m not better than this, show me what I’m worthKeep me a secret, choose someone else
I’ll still be here hanging off, I’m hanging off
The…
Painkillers 🔗
Yup, Brian Fallon again. I don’t have very varied musical tastes.
And we want love like it was a drug
Yeah, all we wanted was a little relief
And every heart I held in between
Well, they were painkillers to me
Yeah, they were painkillers to me
Come get your…
Beautiful Rails confirmation dialogs (with zero JavaScript)
This is a guest collaboration with Stephen Margheim, creator of High Leverage Rails, a video course on building high-quality Rails applications with the power and simplicity of SQLite, HTML, and CSS.
Turbo’s data-turbo-confirm attribute is convenient for quick confirmation dialogs, but the native confirm() prompt it triggers looks dated and out of place. If you want a styled confirmation dialog that matches your app’s design, the traditional approach recommends a lot of JavaScript — a Stimulus controller to open and close the dialog, event listeners for keyboard handling, and coordination between the trigger and the modal.
But, recent browser updates have changed the game. Invoker Commands…
Continuations 2025/50: Egregious hack
This week I submitted my application to the gem fellowship. Fingers crossed!
I spent a good amount of time in bug fixing mode. The first fix was to Dry Logger, making sure its context and tagged logging are threadsafe. Thanks to Armin and Rob for their great bug report! We got there in the end.
After that, I made two related fixes to Hanami Router. Both of these came via wonderful reports from Andreas Haller. First, we set the Rack SCRIPT_NAME correctly for dynamic scope prefixes, and second, we preserve an empty Rack PATH_INFO when a prefixed mount is accessed by its exact prefix. I’ll be making patch releases for both Hanami Router and Dry Logger in the coming week.
What I love about…
Why are exec and run so confusing?
Originally posted on the Spinel blog.
While working on rv, there’s a specific question that has come up over and over again, in many different forms. In the simplest possible form, it boils down to:
What is the difference between
rv execandrv run? Why have both?
We haven’t finished implementing either rv exec or rv run yet, but every time one or the other comes up in a conversation, everything instantly becomes more confusing.
This post will summarize the history of exec and run in Bundler, npm, Cargo, and uv. Once we have the history laid out, we can take a look at what we plan to do in rv, and you can give us your feedback.
Bundler exec
Bundler manages project-specific packages, but…
In the last few days I’ve managed to finalize work on the UringMachine fiber scheduler. Beyond making sure the fiber scheduler is feature complete, that is, it implements all the different Fiber Scheduler hooks and their expected behaviour. To make sure of this, I also spent a couple of days writing test cases, not only of the fiber scheduler, but also of UM’s low-level API.
Beyond the tests, I wrote a series of benchmarks to have an idea of how UringMachine compares to other concurrency solutions:

You can consult the full results here. I’ll refrain from making overly generalized statements about what these benchmark results mean, but I think they demonstrate the promise of working…
Hi, it’s Claudio Baccigalupo. So many improvements to the Rails codebase this week!
If you are also looking to contribute, there are several documentation PRs open for community review. Oh and we also have some Rails World 2026 updates! And now, let’s get to the PR-esents 🎁
ActiveStorage immediate variants
Attachment variants gain the process: :immediately option:
has_one_attached :avatar_with_immediate do |attachable|
attachable.variant :thumb, resize_to_limit: [4, 4], process: :immediately
end
Attachments with process: :immediately variants now eagerly analyze during validation, making metadata like image dimensions available for custom validations:
def validate_avatar_dimensions
…CVE-2025-66567 (ruby-saml): Ruby-saml has a SAML authentication bypass due to namespace handling (parser differential)
CVE-2025-66568 (ruby-saml): Ruby-saml allows a Libxml2 Canonicalization error to bypass Digest/Signature validation
We were gone most of the day so I told Codex CLI to migrate Better with Becky to my searls-auth gem and to commit & push regularly to a PR so I could review remotely. Just noticed that it must have looked through the git history in order to write commit messages that match my own. Seriously thought I wrote half of these before I realized as much.
Uncanny, but appreciated.
If you don't count Halo LAN parties, I probably sank more time into Knights of the Old Republic on the original Xbox than any other game. By taking the classic tabletop mechanics they were known for and theming it with a setting that didn't bore me to tears, Bioware really hooked me. I even played through every campaign quest of the middling The Old Republic MMO, which are hundreds of hours I'll never get back.
Last night, this announcement just dropped, as reported by Jordan Miller at VGC:
Announced at The Game Awards, the game is being directed by Casey Hudson, the director of the original Knights of the Old Republic game.
"Developed by Arcanaut Studios in collaboration with Lucasfilm…
Want smooth fade-in animations when your <dialog> opens? The @starting-style CSS rule defines the initial state when an element first appears—no JavaScript needed.
dialog {
opacity: 1;
scale: 1;
transition: opacity 0.2s ease-out, scale 0.2s ease-out;
@starting-style {
opacity: 0;
scale: 0.95;
}
}
Without @starting-style, the browser renders the dialog immediately in its final state. With it, the browser starts from opacity: 0; scale: 0.95 and transitions to opacity: 1; scale: 1.
You can animate the backdrop too:
dialog::backdrop {
background-color: rgb(0 0 0 / 0.5);
transition: background-color 0.2s ease-out;
@starting-style {
background-color: rgb(0 0 0 /…Joined by David Hill
Chris and Andrew kick things off with some weather whiplash and snowblower talk before introducing a new guest on the show, long-time Rubyist David Hill. They chat about fast food and favorite shows, David’s accidental path into Ruby and Rails, and various projects he’s worked on, including an AED management application. The discussion also touches on the new open-source release of Basecamp's Kanban board, Fizzy, and some innovative CSS techniques used in the project. The conversation wraps up with upcoming Ruby conferences in 2026 and how Claude's AI assistance is helping with coding tasks. Hit download now to hear more!
Links
