Rubyland

news, opinion, tutorials, about ruby, aggregated
Sources About
Kevin Newton 

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…

Ruby on Rails: Compress the complexity of modern web apps 

This Year in Rails

Happy Holidays, this is 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.

Add a script for using dev containers outside VSCode
I you want to…

Remote Ruby 

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

Saeloun Blog 

Upgrading from Rails 5.2 to Rails 6 - Modern Rails Features

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 Changes 

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
  • Set reimplemented efficiently
  • Pathname became a core class
  • Ruby::Box
  • Ractor: ports

Read more »

RubyGems Blog 

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…

Jake Zimmerman 

Why have lower bounds on generics?

Lower bounds expand the list of ways to create a value of that type. They behave similar to union types in that regard, but they fill a particular niche that only they can fill, relating to subtyping.
justin․searls․co - Digest 

📺 The Ultimate Siri Shortcut for Japanese Learners

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…
Alchemists: Articles 

Ruby 4.0.0

Cover
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 over Enumerable#find (what was previously used).

  • #rfind: Allows you to find the last element matching a specific condition which provides a performance improvement over Array#reverse_each.find by avoiding array allocation when messaging Enumerable…

[1, 2, 3].rfind(&:even?) # 2

Binding

Methods such as local_variables, local_variable_get, and local_variable_set no longer handle numbered parameters.

RubyMine : Intelligent Ruby and Rails IDE | The JetBrains Blog 

Ruby Turns 30: A Celebration of Code, Community, and Creativity

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…

Rails Designer 

The Best of 2025 from Rails Designer

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 News 

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…
Tejas' Blog 

India after Gandhi

My first and longest read of 2025.

Saeloun Blog 

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…

justin․searls․co - Digest 

📸 Is Apple Shortcuts functional programming?

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:

  1. 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
  2. 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…

Ruby on Rails: Compress the complexity of modern web apps 

2025 Wrap Up from the Rails Foundation

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…

Weelkly Article – Now open for 2026 sponsorships 

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)

Ruby Rogues 

Autogenetic AI Agents and the Future of Ruby Development - RUBY 682

AI agents are no longer just tools we manually wire together—they’re starting to build themselves. In this episode of Ruby Rogues, I caught up with Valentino Stoll to explore a fascinating idea: autogenetic (self-generating) AI agents and what they mean for how we write software in Ruby.

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…
RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Top 10 Software Design Patterns in Rails Every Developer Should Know

Ruby on Rails is loved for its beautiful syntax, and everything is built around this, thanks to the power of Ruby code. It allows teams to create applications quickly while keeping code clean and easy to read. But Rails applications grow more complex over time, and developers often face architectural challenges that can’t be addressed by conventions alone. This is precisely where Design Patterns in software come in handy.

Design patterns are proven solutions to common design issues in a given context. They bring structure, clarity, and scalability to the world of Rails without squashing a lot of its magic. When used appropriately, design…

Ruby News 

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 - Phusion Blog 

Passenger 6.1.1

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…
Rails at Scale 

Introducing Aliki: A Modern Theme for Ruby Documentation

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.

Screenshot of docs.ruby-lang.org with Aliki theme - desktop view

Why a New Theme?

Even after last year’s improvements, I still…

With a Twist 

Claude, tell me what needs my attention today

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

Hi, we're Arkency 

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…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 162

The one where Ruby gets a new homepage, Ruby 4.0.preview3 and Ruby 3.4.8 are released, Ryan Davis announced Minitest 6.0 and where Marco Roth gets the Rails Luminary award
RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Hire Nearshore Ruby on Rails Developers

In a world where digital is becoming the default, the success (or failure) of any software product can boil down to having the right development team. Organizations around the world are looking for a development model that optimizes cost, technical capability, communications, and speed. Nearshore Ruby on Rails Development. In a world filled with endless engagement models to choose from, nearshore Ruby on Rails development is a stand-out strategy for companies that require active commitment but not the accompanying costs of hiring locally.

Building scalable, secure, and high-performance-oriented web applications, Ruby on Rails is still a choice…

The Bike Shed 

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…

RubyGems Blog 

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…
RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Benefits of Offshore Ruby on Rails Consulting

In this fast-paced, digital economy, businesses are challenged to deliver high-quality software faster, more efficiently, and cost-effectively. Web apps are not support tools anymore; they’re the core of customer engagement, operations, and growth plans. Although there are various options in the market, Ruby on Rails is still one of the powerful frameworks for developing scalable, secure, high-performing web applications. But making the most of its potential, you will need expert Rails support, long-term planning, and ongoing development.

This is where offshore Ruby on Rails consulting has come as a relief for global companies. Offshore…

justin․searls․co - Digest 

✉️ 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…

Tenderlove Making 

Happy Holidays

A man wearing a Santa hat and festive red sweater holds an orange cat against a teal background with 'Happy Holidays' text above.

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

Write Software, Well 

Combined Credentials in Rails 8.2

Combined Credentials in Rails 8.2

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.

Add Rails.app.creds to provide combined credentials lookup in ENV and encrypted file by dhh · Pull Request #56404 · rails/rails
Many applications use a mix of ENV and encrypted keys to store cloud service keys and the like. Depending on the service, it might make sense only to inject the ENV during Docker boot or to keep it…
Combined Credentials in Rails 8.2

When you're going through the PR, I highly recommend you also read Jean's (byroot) code review comments and how DHH addresses them…

Weelkly Article – Now open for 2026 sponsorships 

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

Hanami 

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…

RichStone Input Output 

[7/4] Speak to LLMs with voice-to-text

[7/4] Speak to LLMs with voice-to-text

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…

Ruby News 

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…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

How to Use Byebug to Debug Ruby Code: A Step-by-Step Guide

Debugging is a critical skill for every Ruby developer, allowing you to inspect runtime behavior, track down elusive bugs, and understand complex code flows. Among the many tools available, Byebug stands out as a reliable, feature-rich command-line debugger.

As of December 2025, Byebug’s latest version is 12.0.0 (released March 25, 2025). While Ruby 3.1+ includes the modern debug gem as the standard (and Rails 7+ defaults to it), Byebug remains widely used in legacy projects, older Rails applications, and by developers who prefer its straightforward interface.

This guide covers everything you need: what Byebug is, its key features,…

Hotwire Weekly 

Week 50/51 - Happy Holidays

Hotwire Weekly Logo

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…

Tim Riley 

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…

justin․searls․co - Digest 

🔗 Mike McQuaid has joined the POSSE

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…

Island94.org 

Tricks to work around nested form elements, for Rails

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;…

Noteflakes 

Threads vs Fibers - Can't We Be Friends?

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…

Schneems - Programming Practices, Performance, and Pedantry 

Non-Violent Comments: Calling out or Calling in?

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…

avdi.codes 

Can you tell me how to test

Testing server-rendered HTML:

  1. Make a request, look at the result.

Testing React et al:

  1. Make a request.
  2. Receive HTML.
  3. Ignore it!
  4. It also contains a string.
  5. The string is attached to a bird
  6. The bird speaks latin
  7. Find an antiquities professor
  8. He can distract the bird
  9. While you build a fake browser

With apologies to Penny Arcade

davidcel.is 

Writing Code Is Fun

A snippet of Ruby code that powers my blog

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…

37signals Dev 

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…

RubySec 

CVE-2025-14762 (aws-sdk-s3): AWS SDK for Ruby's S3 Encryption Client has a Key Commitment Issue

## Summary S3 Encryption Client for Ruby is an open-source client-side encryption library used to facilitate writing and reading encrypted records to S3. When the encrypted data key (EDK) is stored in an "Instruction File" instead of S3's metadata record, the EDK is exposed to an "Invisible Salamanders" attack (https://eprint.iacr.org/2019/016), which could allow the EDK to be replaced with a new key. ## Impact ### Background - Key Commitment There is a cryptographic property whereby under certain conditions, a single ciphertext can be decrypted into 2 different plaintexts by using different encryption keys. To address this issue, strong encryption schemes use what is known as "key…
OmbuLabs Blog 

Introducing the Rails Superhero Card Generator

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…

37signals Dev 

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…

Fractaled Mind 

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…

Closer to Code 

Ruby Floats: When 2.6x Faster Is Actually Slower (and Then Faster Again)

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,…

Remote Ruby 

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


Honeybad…
Ruby on Rails: Compress the complexity of modern web apps 

Rails Luminary, modern approach to CSRF and more

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…

Saeloun Blog 

Upgrading from Rails 4.2 to Rails 5 - A Complete Guide

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,…

code.avi.nyc 

Design Previews for Ruby on Rails

You are iterating on a design. Maybe you are redesigning your dashboard. Maybe you are trying three different layouts for a landing page. Maybe Claude just gave you four variations of a pricing table and you need to pick one.

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…

Evil Martians 

AnyCable, Rails, and the pitfalls of LLM-streaming

Authors: Vladimir Dementyev, Principal Backend Engineer, and Travis Turner, Tech EditorTopics: Real-time, AI, Open Source, Real-time features, Ruby on Rails, Hotwire, WebSocket

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…

Saeloun Blog 

Rails 8.1 Introduces Structured Event Reporting with Rails.event

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…

Ruby Weekly 

It's the final issue of 2025 - maybe!

#​780 — December 18, 2025

Read on the Web

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

CERN Chooses TimescaleDB to Power…

Rails Designer 

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 News 

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

  • *nil no longer calls nil.to_a, similar to how **nil does not call nil.to_hash. [Feature #21047]

  • Logical binary operators (||, &&, and and or) 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#inspect now checks for the existence of a #instance_variables_to_inspect method, allowing control over which instance variables are displayed in the #inspect string:

        class DatabaseConfig
          def ini…
Fractaled Mind 

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>
   …
Posts on Kevin Murphy 

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…

Ruby on Rails: Compress the complexity of modern web apps 

Congrats Marco Roth: 2025 Rails Luminary

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…

Saeloun Blog 

Rails 8.1 introduces bin/ci to standardize CI workflows with a new DSL

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…
Jardo.dev: Blog 

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…

Fractaled Mind 

Confirmation dialogs with zero JavaScript

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…

Fe…
Weelkly Article – Now open for 2026 sponsorships 

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

Ruby Magic by AppSignal 

AppSignal’s Top 5 Ruby Posts in 2025

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…

Nithin Bekal 

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
Tenderlove Making 

Seattle Waterfront

A seagull perches on a rooftop overlooking Seattle's waterfront with the Great Wheel and Puget Sound in the background.A large Ferris wheel rises behind a waterfront building with 'Seattle Harbor Cruise' signage at dusk.A fire hazard warning sign in the foreground with shipping container cranes visible across the water under a cloudy sky at dusk.People and stairsPeople walk up and down a long outdoor staircase at dusk, with some figures motion-blurred while bright street lights glow above in the autumn trees.A brightly illuminated Ferris wheel on a waterfront pier glows with pink and purple lights against a dramatic sunset sky as a ferry passes by in the water.

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 News 

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

RubyGems Blog 

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_JOBS to RubyGems before compiling & introduce a new gem install -j flag. 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
RubySec 

CVE-2025-68113 (altcha): ALTCHA Proof-of-Work Vulnerable to Challenge Splicing and Replay

### Impact A cryptographic semantic binding flaw in ALTCHA libraries allows challenge payload splicing, which may enable replay attacks. The HMAC signature does not unambiguously bind challenge parameters to the nonce, allowing an attacker to reinterpret a valid proof-of-work submission with a modified expiration value. This may allow previously solved challenges to be reused beyond their intended lifetime, depending on server-side replay handling and deployment assumptions. The vulnerability primarily impacts abuse-prevention mechanisms such as rate limiting and bot mitigation. It does not directly affect data confidentiality or integrity. ### Patches This issue has been addressed by…
Short Ruby Newsletter 

Short Ruby Newsletter - edition 161

The one where the date was announced for Rails World 2026, where Aaron Patterson showcased the performance of object allocation in Rails 4.0, where Cookpad share how Rails help them scale, and Fizzy got API support
The Bike Shed 

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…

Giant Robots Smashing Into Other Giant Robots 

The Arrange/Act/Assert pattern

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…

Fractaled Mind 

Dialog exit animations with allow-discrete

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…
Posts on Kevin Murphy 

Frequently Played December 2025

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.

Full Lyrics

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 worth

Keep 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.

Full Lyrics

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…

Boring Rails: Skip the bullshit and ship fast |  

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

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Ruby Try Catch Explained: How Exception Handling Works in Ruby

Exception handling is a fundamental aspect of robust programming in any language, and Ruby is no exception—pun intended. In Ruby, exceptions represent errors or unexpected conditions that arise during program execution, such as dividing by zero, accessing undefined variables, or failing to open a file. Without proper handling, these exceptions can crash your program, leading to poor user experiences or system failures. This is where Ruby’s exception handling mechanism comes into play, allowing developers to gracefully manage errors, recover from them, or provide meaningful feedback.

It’s worth noting at the outset that Ruby doesn’t use the…

Tim Riley 

Continuations 2025/50: Egregious hack

André Arko 

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 exec and rv 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…

danielabaron.me RSS Feed 

Sustainable Feature Testing in Rails with Cucumber

A practical guide to feature testing in Rails with Cucumber, highlighting its readability, maintainability, and team-friendly syntax through a working demo project.
Noteflakes 

OSS Friday Update - Fibers are the Future of Ruby

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…

Ruby on Rails: Compress the complexity of modern web apps 

‘Tis the season for contributing to Rails

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
RubySec 

CVE-2025-66567 (ruby-saml): Ruby-saml has a SAML authentication bypass due to namespace handling (parser differential)

### Summary Ruby-saml up to and including 1.12.4, there is an authentication bypass vulnerability because of an incomplete fix for CVE-2025-25292. ReXML and Nokogiri parse XML differently, the parsers can generate entirely different document structures from the same XML input. That allows an attacker to be able to execute a Signature Wrapping attack. The vulnerability does not affect the version 1.18.0. ### Impact That allows an attacker to be able to execute a Signature Wrapping attack and bypass the authentication
RubySec 

CVE-2025-66568 (ruby-saml): Ruby-saml allows a Libxml2 Canonicalization error to bypass Digest/Signature validation

### Summary Ruby-saml up to and including 1.12.4, there is an authentication bypass vulnerability because of an issue at libxml2 canonicalization process used by Nokogiri for document transformation. That allows an attacker to be able to execute a Signature Wrapping attack. The vulnerability does not affect the version 1.18.0. ### Details When libxml2’s canonicalization is invoked on an invalid XML input, it may return an empty string rather than a canonicalized node. ruby-saml then proceeds to compute the DigestValue over this empty string, treating it as if canonicalization succeeded. ### Impact 1. Digest bypass: By crafting input that causes canonicalization to yield an empty…
justin․searls․co - Digest 

📸 That's a pretty good Searls impression

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.

Posts on Kevin Murphy 

How to review AI Generated PRs

Close them.

justin․searls․co - Digest 

🔗 A New Old Republic game? Hell yeah.

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…

Fractaled Mind 

Dialog enter animations with @starting-style

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 /…
Remote Ruby 

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

Weelkly Article – Now open for 2026 sponsorships 

Building LLM-Powered Applications in Ruby: A Practical Introduction

Building LLM-Powered Applications in Ruby: A Practical Introduction December 12, 2025 (Based on Koichi Ito’s “Ruby × LLM Ecosystem” presentation at Ruby World Conference 2025)** Large Language Models (LLMs) have rapidly evolved from experimental chatbots to foundational components of modern software. They now augment workflows in customer support, content generation, data analysis, and even development … Continue reading Building LLM-Powered Applications in Ruby: A Practical Introduction

Saeloun Blog 

Accessibility Best Practices for Consultancy Websites

A good website doesn’t just look nice, it works for everyone. Accessibility ensures that all users, including those with disabilities, can easily browse, understand, and interact with your site. For consultancy websites, accessibility also builds trust. It shows professionalism, attention to detail, and a genuine commitment to inclusivity.


Why Accessibility Matters

When a consultancy site is accessible, it sends a clear message: you care about people and their experience. It’s not only the right thing to do but also good for business.

Here’s why accessibility matters:

  • Wider reach. Millions of users rely on assistive technologies such as screen readers or voice navigation.
  • Better…
Saeloun Blog 

Planning Rails Upgrade - A Strategic Guide

Rails upgrades can feel daunting due to breaking changes, gem compatibility issues and potential downtime. But staying on outdated versions is riskier. Security vulnerabilities accumulate, performance suffers, and we miss powerful features that make development easier.

With proper planning, Rails upgrades can be smooth and predictable. This five part series shares proven strategies from dozens of successful upgrades.

Why Upgrade Now?

Let’s look at the current Rails ecosystem (as of December 2025):

  • Rails 8.x: Early adoption phase (~5% of applications)
  • Rails 7.x: ~40% of active applications
  • Rails 6.x: ~35% of applications
  • Rails 5.x and older: ~20% still running

Rails 8 was…

Ruby on Rails: Compress the complexity of modern web apps 

Rails World 2026 Update - Here’s what we know

Hi everyone!

Before the year wraps up, while everyone is planning their 2026, we wanted to share some quick information about Rails World 2026 in case that is on your conference wishlist next year (and we hope it is!).

Quick overview

  • Dates: September 23 & 24, 2026 (Wed & Thurs)
  • Location: Palmer Event Center (very central Austin)
  • CFP: open Q2/early spring 2026

Tickets

We adjust Rails World attendance to our chosen venue in each city, and since everything is bigger in Texas, that means we will have space for 1,200 attendees: the largest Rails World yet.

Tickets will be released in Q2 2026. We will have the same ticket tiers as before:

  • Corporate Tickets - pre-released; for…
Ruby Weekly 

Visualizing what ZJIT does when compiling Ruby

#​779 — December 11, 2025

Read on the Web

Ruby Weekly

Adding Iongraph Support to ZJIT — This is a very niche item to feature, but it’s a slow week (😅) and I found it interesting, given that the ZJIT compiler will be available in Ruby 4.0 later this month. Iongraph, a tool originally built to visualize JavaScript JIT compilation, can now be used to inspect optimizations made by ZJIT too. This is a truly ‘deep in the weeds’ post, but if it encourages you to work on, or experiment with, ZJIT, fantastic!

Aiden Fox Ivey

Stuck on Rails 4.2? Ready to Upgrade Rails with FastRuby.io? — Stop postponing your…

Fractaled Mind 

Light dismiss dialogs with closedby

The closedby attribute gives you declarative control over how users can dismiss a <dialog>. Want users to close by clicking outside? Set closedby="any". Need to force them through your buttons? Use closedby="none".

<!-- Light dismiss: Esc key OR clicking outside -->
<dialog id="light-dismiss-dialog" closedby="any">
  <p>Click outside or press Esc to close me.</p>
  <button type="button" commandfor="light-dismiss-dialog" command="close">
    Or close manually
  </button>
</dialog>

<!-- Platform dismiss only: Esc key, no clicking outside -->
<dialog id="platform-dismiss-dialog" closedby="closerequest">
  <p>Press Esc to close, but clicking outside won't work.</p>
  <button type="button"…
Fractaled Mind 

Open dialogs with command and commandfor

The command attribute lets you open <dialog>s declaratively—no JavaScript required. Use command="show-modal" for modal dialogs or command="show" for non-modal ones.

<!-- Modal dialog (with backdrop, traps focus) -->
<button type="button" commandfor="modal-dialog" command="show-modal">
  Open Modal
</button>

<!-- Non-modal dialog (no backdrop, doesn't trap focus) -->
<button type="button" commandfor="modeless-dialog" command="show">
  Open Dialog
</button>

<dialog id="modal-dialog">
  <p>I'm a modal dialog with a backdrop.</p>
  <button type="button" commandfor="modal-dialog" command="close">Close</button>
</dialog>

<dialog id="modeless-dialog">
  <p>I'm a non-modal dialog. You can still…
Evil Martians 

Why your vibe-coded project needs a developer

Authors: Pavel Grinchenko, Frontend Engineer, and Travis Turner, Tech EditorTopics: Design, DX, AI, Design for devtools, Vibe coding

After seeing dozens of vibe-coded projects up close, it's clear the gap between a prototype and product ready for users is wider than most expect. Eventually, progress becomes impossible without an experienced developer. We explore why that is, and I share a real-world case study to illustrate.

After seeing dozens of vibe-coded projects up close, it's clear the gap between prototype and production-ready product is wider than most think, and eventually impossible to ignore. Let's explore why that gap happens, how experienced developers are invaluable when closing…

justin․searls․co - Digest 

📸 Seems like nothing interesting happened

I turned on Ring's new AI description feature for its cameras a couple weeks ago. Opened my event history for the first time since then and was kind of impressed by the honest assessment of what goes on around here.

Rails Designer 

Requestkit: test and send webhooks and API requests in development

Requestkit is inspired by Stripe’s CLI to send payloads to your app, but it instead can send (and receive!) any payload. It runs entirely on your machine. It’s a local HTTP server that captures incoming HTTP requests (webhooks) and send outbound requests (API).

Requestkit is fast, requires zero configuration and configuration can be easily shared within projects. Install it as a Ruby gem, start the server and point your webhooks to localhost:4000.

⭐ Star the project on GitHub ⭐

Tell me more!

Requestkit is a local HTTP request toolkit for development. Sounds fancy, but what can you do with it?

  • See webhook payloads: view complete headers and body data for every request in a clean…
  • Send HTTP…
RichStone Input Output 

[6/4] git worktrees with parallel agents in practice

[6/4] git worktrees with parallel agents in practice

This is not a comprehensive guide to Git worktrees, but I wanted to share how I'm currently using them to help you work more effectively. I also want to have a snapshot to compare against in a year, when multi-agent workflows will become more critical.

If you want to know how worktrees work fundamentally, check out [4/4] Code with LLMs in parallel. It starts with the basics of how worktrees work at the Git level and walks through the tools I don't use and why. In this post, you will see what I use almost daily and how.

"State of the Art"

I'll be a bit of a downer here because I think there is currently a mismatch between the potential parallel-agent capabilities of AI, the skill development of…

Mintbit 

Match HTTP Methods with current_page?

When building a Rails app, you often need to create navigation links that highlight the current page. However, Rails’ default current_page? helper only works with GET and HEAD requests. This can be problematic when dealing with forms or actions that use other HTTP methods like POST, PUT, or PATCH. This feature was introduced in this PR

The Problem

For example, if you have a page for viewing posts and another for creating posts, both share the same URL (/posts). The only difference is the HTTP method used (GET for viewing and POST for creating). With the default current_page? helper, it’s difficult to highlight the correct navigation link when a user submits a form to create a post.

The…

Mintbit 

Send Emails in Bulk with deliver_all_later

This year, Rails introduced a new method for ActionMailer called deliver_all_later. This feature simplifies enqueuing multiple emails for delivery through Active Job. Instead of sending each email individually, you can now enqueue a batch of emails, allowing them to be sent asynchronously when their respective jobs run.

What is deliver_all_later?

deliver_all_later enqueues many emails at once. When each job is executed, it sends the email using deliver_now. This improves performance by reducing the number of round-trips to the queue datastore, especially when dealing with a large number of emails.

How Does It Work?

To use deliver_all_later, you can pass an array of email deliveries:

1
…
Rails at Scale 

ZJIT is now available in Ruby 4.0

ZJIT is a new just-in-time (JIT) Ruby compiler built into the reference Ruby implementation, YARV, by the same compiler group that brought you YJIT. We (Aaron Patterson, Aiden Fox Ivey, Alan Wu, Jacob Denbeaux, Kevin Menard, Max Bernstein, Maxime Chevalier-Boisvert, Randy Stauner, Stan Lo, and Takashi Kokubun) have been working on ZJIT since the beginning of this year.

In case you missed the last post, we’re building a new compiler for Ruby because we want to both raise the performance ceiling (bigger compilation unit size and SSA IR) and encourage more outside contribution (by becoming a more traditional method compiler).

It’s been a long time since we gave an official update on ZJIT.…

Julik Tarkhanov 

Making Rails Global IDs safer

The new LLM world is very exciting, and I try to experiment with the new tools when I can. This includes building agentic applications, one of which is my personal accounting and invoicing tool - that I wrote about previously

As part of that effort I started experimenting with RubyLLM to have some view into items in my system. And while I have used a neat pattern for referencing objects in the application from the tool calls - the Rails Global ID system - it turned out to be quite treacherous. So, let’s have a look at where GlobalID may bite you, and examine alternatives and tweaks we can do.

What are Rails GIDs?

The Rails global IDs (“GIDs”) are string handles to a particular model in a…

Evil Martians 

Why Evil Martians hosted a Ruby conference in San Francisco

Authors: Victoria Melnikova, Head of New Business, Irina Nazarova, CEO, and Travis Turner, Tech EditorTopics: Developer Community, Ruby

Here's why we scaled up our San Francisco Ruby meetups to SF Ruby Conf with 400+ Ruby engineers for three days of technical talks and startup demos.

Saeloun Blog 

Rails Native Composite Primary Keys: A Complete Evolution from Rails 3 to Rails 8

Introduction

Composite Primary Keys (CPKs) are one of those “real world engineering” features that frameworks eventually grow into. Many enterprise databases, analytics systems, geographic indexes, and ledger tables naturally model identity using more than one attribute.

For years, Rails avoided this space and assumed a single integer column called id, and our applications were expected to adapt with Rails 8, this is finally changing. The framework now understands identity that is multi column, not just “one number per record”.

Even more interesting: Rails does this without requiring external gems, and without asking us to break conventions everywhere. The feature is still maturing, but…

Ruby on Rails: Compress the complexity of modern web apps 

New Rails case study: Cookpad and Rails

Last year, we introduced case studies highlighting how companies use and build with Rails. Next up, we’re highlighting the story of Cookpad, the world’s largest recipe-sharing platform, and how Rails has powered their growth from a small startup in Japan to a global platform serving more than 100 million home cooks every month.

In this case study, you’ll read how and why Cookpad migrated from ColdFusion to Rails in 2007, and how Rails has supported their growth every day since, from their expansion to many more countries, all the way to their public offering on the Tokyo Stock Exchange.

Read the case study: The Secret Ingredient: How Rails Helps Cookpad Serve 100M+ Home Cooks

A huge…