Rubyland

news, opinion, tutorials, about ruby, aggregated
Sources About
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 – Ruby Stack News 

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…

Weelkly Article – Ruby Stack News 

Why Now Is the Right Time for PicoRuby

December 10, 2025 Based on the presentation script from RubyWorld Conference 2025 This article is based on the script of the presentation “Why Now Is the Right Time for PicoRuby”, delivered by Hitoshi Hasumi (ANDPAD Inc.) at RubyWorld Conference 2025. The original session was a 30-minute conference talk, and this text adapts its core ideas, … Continue reading Why Now Is the Right Time for PicoRuby

Ruby Magic by AppSignal 

Create a Markdown Editor in Ruby on Rails

In recent years, Markdown has become the lingua franca of plain-text files on the web. If you're a developer, you have read — and maybe even written — hundreds of Markdown documents over the course of your career.

GitHub repositories use README files written in Markdown. Stack Overflow and Reddit use it to format posts. Technical documentation, blog posts, and entire books are written in Markdown. And it's not just for humans either! AI tools such as Claude Code and Cursor use Markdown documents to improve the effectiveness of AI agents. This article you are reading is — you guessed it — written in Markdown!

Ruby on Rails, of course, has its own tooling around Markdown, and in this post,…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Ruby Class Variables vs Instance Variables Explained

In Ruby development—especially within Ruby on Rails applications—understanding how data is stored, accessed, and shared forms the foundation of clean, scalable code. Two of the most commonly used variables in Ruby’s object-oriented structure are class variables and instance variables. At first glance, they may seem similar, but the differences between them can significantly impact application behavior, debugging, and scalability. This article breaks down how each works, when to use them, and the pitfalls developers should avoid.

What Are Instance Variables in Ruby?

An instance variable in Ruby always belongs to a specific object (instance of a…

hexdevs 

Higher-order procedures in Ruby

Exploring higher-order procedures in Ruby through a Scheme's example.
Fractaled Mind 

Avoid layout shift with scrollbar-gutter: stable

Want to avoid layout shift when you remove scrolling on popover or dialog opening? Use the scrollbar-gutter: stable CSS rule on your scroll container (likely <body>).

body {
  scrollbar-gutter: stable;

  &:has(:popover-open) {
    overflow: hidden;
  }
}

The problem: when a popover opens and you hide the scrollbar with overflow: hidden, the content shifts horizontally to fill the space where the scrollbar was.

A popover opening causes the page content to shift horizontally as the scrollbar disappears

The solution: scrollbar-gutter: stable reserves space for the scrollbar even when it’s not visible, preventing the jarring horizontal shift.

With scrollbar-gutter stable, the page content stays in place when the popover opens


All posts in this series

Fractaled Mind 

Prevent Scrolling when a Dialog is open

Want to prevent scrolling when a modal dialog is open? Use the :modal pseudo-class with body:has() to disable scrolling purely in CSS—no JavaScript needed.

body:has(dialog:modal) {
  overflow: hidden;
}

Demo:

A modal dialog opens and the page behind it cannot be scrolled

The :modal pseudo-class matches elements that are in a state where they exclude all interaction with elements outside of it until the interaction has been dismissed. This includes dialogs opened with showModal().


All posts in this series

Fractaled Mind 

Anchor Popovers without distinct Anchor Names

Double-dashed IDs and the enhanced attr() CSS function allow us to bind popovertargets with their popovers without having to create distinct anchor-names.

<button popovertarget="--dropdown-example"></button>
<div id="--dropdown-example" popover></div>
[popovertarget] {
  /* Dynamically generate anchor-name from the popovertarget attribute value */
  anchor-name: attr(popovertarget type(<custom-ident>));
}

[popover] {
  /* Dynamically bind to anchor using the menu's id attribute */
  position-anchor: attr(id type(<custom-ident>));

  /* Position at bottom of anchor, aligned to left edge */
  top: anchor(bottom);
  left: anchor(left);
}

The key insight is using attr() with type(<custom-…

Fractaled Mind 

De-emphasize scrollbars in small containers

Have a small scroll container where you want to de-emphasize the scrollbar, like in a popover? Say hello to scrollbar-color and scrollbar-width.

::picker(select) {
  scrollbar-color: lightgray transparent;
  scrollbar-width: thin;
}

The scrollbar-color property sets the thumb and track colors (here, light gray on transparent), while scrollbar-width can be set to thin for a more subtle appearance.

Demo:

A select dropdown with a subtle, thin scrollbar


All posts in this series

Fractaled Mind 

Auto-growing textareas with field-sizing: content

Coming in the next version of Safari, and already in Chrome and Edge, you can now create <textarea>s that auto-grow with the field-sizing: content rule.

textarea {
  field-sizing: content;
  min-block-size: attr(rows rlh);
}

The min-block-size: attr(rows rlh) ensures the textarea still respects its rows attribute as a minimum height, using the rlh unit (root line height).

Demo:

A textarea that automatically grows as the user types more content


All posts in this series

Fractaled Mind 

Dialog cancel buttons with formmethod="dialog"

<dialog>s with forms have a simple HTML-only way to implement “Cancel” buttons. In addition to POST and GET, <form>s inside of <dialog>s can make use of the dialog method. This allows the submit button to close the dialog without submitting the form to the backend.

<dialog id="example-dialog">
  <form method="POST" action="/confirmations">
    <footer>
      <button type="submit" formmethod="dialog" formnovalidate value="cancel">
        Cancel
      </button>
      <button type="submit">
        Confirm
      </button>
    </footer>
  </form>
</dialog>

The formmethod="dialog" attribute on the cancel button overrides the form’s method, closing the dialog instead of submitting. The formno…

Fractaled Mind 

Dialog close buttons with command="close"

Continuing with closing <dialog>s, in addition to formmethod="dialog" you can also implement a dialog close button in the header with an invoker command="close". Perfect way to close a dialog without a <form>.

<dialog id="example-dialog" aria-labelledby="dialog-title" aria-describedby="dialog-desc">
  <header>
    <hgroup>
      <h2 id="dialog-title">Refund payment</h2>
      <p id="dialog-desc">
        Are you sure you want to refund this payment?
        The funds will be returned to the customer's account.
      </p>
    </hgroup>
    <button
      type="button"
      commandfor="example-dialog"
      command="close"
      aria-label="Close dialog"
    >&times;</button>
 …
Aha! Engineering Blog 

Going beyond Ruby: Writing a simple C extension

Ruby is a high-level language with elegant syntax. But sometimes, performance-critical tasks can be slow in pure Ruby. Writing a C extension lets us move performance-critical code into native C for speed while also tapping into existing C libraries.
Radan Skorić's website 

Why frozen test fixtures are a problem on large projects and how to avoid them

Tests grow to thousands All make their claim on fixtures Frozen by demands An ancient Japanese Haiku about a common problem with software test fixtures Act 1: The problem, frozen fixtures Fixtures have a lot going for them: super fast, clearly structured, reusable across tests … That last one is also the source of a common problem in large test suites. Every time you change fixtures you ...
Short Ruby Newsletter 

Short Ruby Newsletter - edition 160

37 Signals launches Fizzy, Bridgetown announces 2.1 beta 1, Bundle 4.0 is released, Wired wrote a strange article about Ruby, and Errol Schmidt published their Survey Results with Ruby/Rails leaders.
RubyMine : Intelligent Ruby and Rails IDE | The JetBrains Blog 

Join the RubyMine Team on Reddit AMA Session

The RubyMine team will be stopping by r/jetbrains on December 11 from 1–5 pm CET and doing an Ask Me Anything (AMA) thread. You’re invited to join us!

This isn’t a product launch or a marketing campaign – it’s a chance to have an open conversation about RubyMine and the challenges you face as a Ruby and Rails developer. 

How to Participate

When: December 11, 1:00–5:00 pm CET (7:00–11:00 am EST)

Where: r/jetbrains

Format:Drop your questions in the AMA thread anytime during the session.
We’ll be online responding in real time, but if you can’t make it live, you can post your questions early. This AMA is your chance to tell us what matters most, what’s working well, what’s not,…

Avo's Publication Feed 

Building an Audio Player with StimulusJS

Let's learn how to build a custom audio player with Stimulus that you can use and customize for your next application
RubyGems Blog 

4.0.1 Released

RubyGems 4.0.1 includes enhancements, bug fixes and documentation and Bundler 4.0.1 includes performance, 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.1

RubyGems Release Notes

Enhancements:

  • Installs bundler 4.0.1 as a default gem.

Bug fixes:

  • Fixed unexpected default bundler installation. Pull request #9167 by hsbt

Documentation:

  • Update contributing docs with RGV. Pull request #9155 by eileencodes

Bundler Release Notes

Performance:

  • Increase connection pool to allow for up to 70% speed increase on bundle…
justin․searls․co - Digest 

📄 ChatGPT 5.1 explains why it hallucinates

Because I'm a glutton for punishment, from time to time I'll, "rub an LLM's nose in it," when it fucks up a task. I know the chatbot can't learn from this, and I know I'm just wasting 8¢ of some idiot investor's money, but I do it anyway.

Today, I asked:

in photos app for mac, i have an album. i want to export everything int the album into a directory that is organized yyyy/mm/dd subdirectories -- how?

ChatGPT 5.1 (Auto) replied with a long, mostly useless screed that started with:

macOS Finder has a hidden but fully working "Create folders from date" automation via Quick Actions or Shortcuts.

Immediately recognizing that statement as bullshit of the too-good-to-be-true variety, I pushed…

Planet Argon Blog 

More than Metrics: A Marketing Coordinator's Look at 2025

More than Metrics: A Marketing Coordinator's Look at 2025

In marketing, the metrics guide us, but connection is what gives the work its purpose.

Continue Reading

Rails at Scale 

Rails’s Swappable Migration Backend for Schema Changes at Scale

This post explores Rails’s swappable migration backend, a little-known feature that lets applications customize how migrations run. At Shopify, we relied on monkey patches and a brittle SQL parser to make Rails migrations work with our Schema Migrations Service. We developed the swappable backend feature to more simply adapt Rails’s migration runner to our needs. We’ll cover why and how we built this, and how Shopify uses it to power database migrations at scale.


At Shopify, we run hundreds of database migrations across many Rails applications every week. Each migration needs to be vetted for safety and executed in a way that doesn’t cause downtime for our merchants. For years, we relied…

Gusto Engineering - Medium 

Is Traditional Machine Learning Dead? Comparing LLMs and Gradient Boosting

Tools on a wall

Introduction

Large Language Models (LLMs) have gained significant traction recently due to their flexibility, ease of setup, and continuous improvement in performance and cost-efficiency. Meanwhile, other powerful machine learning algorithms have been established for decades. This article investigates whether these long-standing algorithms remain relevant for ranking tasks or if LLMs can effectively replace them.

Background

At Gusto, we offer a range of bookkeeping integrations, allowing companies to smoothly export data from Gusto to accounting platforms. This process requires mapping internal Gusto categories to external bookkeeping accounts. Accountants typically spend a considerable amount…

Fullstack Ruby 

The “rv” Tool is Making Swift Progress, Becoming a Must-Have for Rubyists

Back in the mists of time, I used a tool called rvm. It was more than just a Ruby version manager, it was also a gemset manager: instead of using bundle exec or a binstub, you could just type a command and it would “work” because every version+gemset was a pristine environment. Cool in a way, but also very complicated.

I eventually migrated to the simpler rbenv and have used that for years now. It only manages Ruby versions and expects you to make use of Bundler to keep gems and executables in line. Y’know. Modern Ruby.

But what if you could use something even more modern than rbenv? Enter rv.

Inspired by uv in the Python ecosystem, rv aims to become your singular solution for total…

RubyMine : Intelligent Ruby and Rails IDE | The JetBrains Blog 

RubyMine 2025.3: Multi-Agent AI Chat, Rails-Aware MCP Server, Faster Multi-Module Projects Startup, and More

RubyMine 2025.3 is out!

This blog post briefly goes over the highlights of the latest release. For a detailed description, check out our What’s New page. 

You can get the new build from our website or via the free Toolbox App.

AI Assistant

Multi-agent experience: Junie and Claude Agent

With the addition of Claude Agent, the first third-party AI agent fully integrated into JetBrains IDEs, your development workflow becomes more flexible and powerful.

Both Claude Agent and Junie are now accessible from the same chat interface, allowing you to seamlessly switch between them and get the right kind of assistance for every task, whether it’s code generation, debugging, or…

Hotwire Weekly 

Week 49 - Vanilla CSS, Fizzy, UI Affordances, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

Welcome to another, issue of Hotwire Weekly! Happy reading! 🚀✨


📚 Articles, Tutorials, and Videos

Vanilla CSS is all you need - Rob Zolkos makes the case for skipping heavy CSS frameworks and leaning on modern, plain CSS instead, with examples from Fizzy.

DriftingRuby: Cool Things in Fizzy - David Kimura published a new episode that highlights neat Ruby- and Rails-related tricks in Fizzy. It walks through features and patterns, showing how you can use it to clean up code and improve maintainability in Rails apps.

37 Signals Fizzy Kanban board - Similarly, Brad Gessler shared a video-walkthrough of the Fizzy source code.

Instant Drag&Drop in Fizzy - Jorge Manrubia

Weelkly Article – Ruby Stack News 

RubyWorld Conference 2025: PicoRuby, mruby Girls, and the Future of Embedded Ruby

December 8, 2025 The RubyWorld Conference 2025, held in Matsue, Japan, showcased an unexpected star of the ecosystem: Ruby running on microcontrollers. While the event traditionally focuses on Ruby in web, enterprise, or academic settings, this year a significant amount of attention shifted toward embedded systems, thanks to PicoRuby and the community project mruby Girls. … Continue reading RubyWorld Conference 2025: PicoRuby, mruby Girls, and the Future of Embedded Ruby

justin․searls․co - Digest 

🔗 The AI Wildfire Is Coming

Dion Lim wrote a pretty good angle on what the market correction will actually do:

The first web cycle burned through dot-com exuberance and left behind Google, Amazon, eBay, and PayPal: the hardy survivors of Web 1.0. The next cycle, driven by social and mobile, burned again in 2008–2009, clearing the underbrush for Facebook, Airbnb, Uber, and the offspring of Y Combinator. Both fires followed the same pattern: excessive growth, sudden correction, then renaissance.

Now, with AI, we are once again surrounded by dry brush.

I think in one of our discussions before our Hot Fix episode, Scott Werner and I used the same analogy—that a recessionary fire will be necessary to clear the overgrowth…

Drifting Ruby Screencasts 

Cool Things in Fizzy

In this episode, we look deploying Fizzy to a server and look at some of the notable practices found in the code.
Tim Riley 

Continuations 2025/49: Fit of procrastivity

  • My goal for this week was to rewrite our new landing page copy in a friendlier, more conversational tone. And I got half of it done! One more solid session should do it. Max has been continuing to iterate on the design for these pages, and I think we have a visual approach that will work a treat with this kind of voice.

    Jojo has also been chipping away at the site, recently fixing most of our 404s. Having everything in one place is going to make this kind of maintenance so much easier in the future!

  • Website writing wasn’t the only writing I did this week. I also drafted up a submission for the gem fellowship, which I’ll submit this coming week. Regardless of the outcome for my…

justin․searls․co - Digest 

🎙️ Breaking Change podcast v48 - Coil Whine

Direct link to podcast audio file

I'm experiencing what breathing out of my nose properly feels like for the first time. Everything is new and wondrous and I've never felt so optimistic. This sensation lasted for two days and now I'm used to it and existence is once again pain.

Share your existential musings at podcast@searls.co and I'll nod and sigh along. I might even nod and sigh performatively for you on the show!

Important ground covered in this episode:

Noteflakes 

OSS Friday Update - The Shape of Ruby I/O to Come

I’m currently doing grant work for the Japanese Ruby Association on UringMachine, a new Ruby gem that provides a low-level API for working with io_uring. As part of my work I’ll be providing weekly updates on this website. Here’s what I did this week:

  • Last week I wrote about the work I did under the guidance of Samuel Williams to improve the behavior of fiber schedulers when forking. After some discussing the issues around forking with Samuel, we decided that the best course of action would be to remove the fiber scheduler after a fork. Samuel did work around cleaning up schedulers in threads that terminate on fork, and I submitted a PR for removing the scheduler from the active…

Ruby on Rails: Compress the complexity of modern web apps 

Schema-Enforced JSON Access, Postgres Type Decoding, and more!

Hi, it’s Emmanuel Hayford. Here’s a look at the highlights from this week’s updates to the Rails codebase.

Add schematized json for has_json
Provides a schema-enforced access object for a JSON attribute. This allows you to assign values directly from the UI as strings, and still have them set with the correct JSON type in the database.

Only the three basic JSON types are supported: boolean, integer, and string. No nesting either. These types can either be set by referring to them by their symbol or by setting a default value. Default values are set when a new model is instantiated and on before_save (if defined).

Examples:

class Account < ApplicationRecord
  has_json :settings, restrict…
Jardo.dev: Blog 

Advent of Eternal Champions I

Snow was falling hard across the arctic hillside. The wind was biting. No trees offered shelter. Our hero was laying in the snow, barely conscious. His gear was strewn about him. His memories were a blur. He had known many names, but he knew not what they called him in this realm. This realm felt unfamiliar.

He struggled to his feet. The wind whipped snow into his eyes as he attempted to orient himself. He made out a faint glow in the distance and began to gather his gear.

Among his usual equipment were some items that seemed out of place. The first was a box made of a smooth, white, metallic material. It seemed to be designed to collect something, but he did not know what.

def…
Remote Ruby 

Docker Disasters and Dev Container Journeys

Andrew kicks off at 8 a.m. with six Docker containers running, and he and Chris dive into what modern Rails development looks like inside dev containers—covering Rails’ own images and features, using Mise and Playwright instead of Selenium, and why OrbStack has replaced Docker Desktop on their Macs. They talk through the trade-offs of running services in containers, the quirks of Kamal’s new local registry, and how Chris is turning all of this into a practical SaaS building series that shows real-world deployment and scaling with tools like JudoScale. Along the way, they weave in life updates about new babies, daycare costs, and even the power needs of AI data centers and nuclear energy. …

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Ruby Inject and Ruby Reduce: Aliases for Powerful Enumeration

Ruby’s Enumerable module provides a suite of methods for working with collections like arrays, hashes, and ranges. Among the most versatile are inject and reduce. If you’re coming from languages like JavaScript or Python, these might remind you of the reduce() function— and for good reason. In Ruby, inject and reduce are exact aliases for the same method, meaning they execute identical code with no performance difference. The choice between them often boils down to personal or team preference, readability, or convention.

In this article, we’ll dive deep into what these methods do, how they work under the hood, common use cases, pitfalls to…

Tejas' Blog 

Rails pluralization with translations

A short blog on some tips to cleanly pluralize and translate content in Rails.

Evil Martians 

Vibe coding in style.md

Authors: Irina Nazarova, CEO, Vladimir Dementyev, Principal Backend Engineer, and Travis Turner, Tech EditorTopics: DX, AI, Design for devtools

We've experimented putting the essence of a Martian engineer into AGENTS.md. Learn the story, then try it on your next AI-assisted project!

Founders, designers, PMs, marketers—technical at different levels, but not engineers—use code generation tools heavily now. It feels liberating. It’s also incredibly addictive. But the reality check begins when an engineer opens your repo and (despite their best effort to make things work) must throw away everything you vibe coded and rewrite it from scratch. If you want to prevent that, this post is for you. This…

Rails at Scale 

Adding Iongraph support to ZJIT

ZJIT adds support for Iongraph, which offers a web-based, pass-by-pass viewer with a stable layout, better navigation, and quality-of-life features like labeled backedges and clickable operands.

Prelude

I’m an intern on the ZJIT team for the fall term. I also have a rather bad habit of being chronically on lobste.rs.

While idly browsing, I spotted an article by Ben Visness titled Who needs Graphviz when you can build it yourself?, which covers his work on creating a novel graph viewer called Iongraph.

Iongraph used to visualize an IR graph for the SpiderMonkey JIT inside Firefox.

Immediately, I was intrigued. I like looking at new technology and I wondered what it might be like to integrate the work done in Iongraph with ZJIT, getting all sorts of novel and…

Ruby Weekly 

37signals releases the source for another SaaS app

#​778 — December 4, 2025

Read on the Web

Ruby Weekly

RubyGems and Bundler 4.0 Released — If you want to get ahead of any potential issues the Ruby 4.0 upgrade may surface, the early release of RubyGems 4.0 and Bundler 4.0 could help you get started. There's many tweaks and minor improvements, like -j being set by default to speed up compilation of native extensions, cache_all true by default, and the ability to specify custom lockfile locations. There are some potentially breaking changes too, though, like the removal of support for multiple global sources in Gemfiles.

Hiroshi Shibata

💡 If sifting through a…

ruby – Bibliographic Wilderness 

Help fund attorney for artist charged with transporting zines(?!?)

i know Des Revol, and know them to be an incredibly kind, solid, reliable person.

For real he’s facing federal charges and threat of deportation because of subversive political pamphlets found in his trunk.

Des was not at the Prairieland demonstration. Instead, on July 6, after receiving a phone call from his wife in jail (one of the initial ten), Des was followed by Federal Bureau of Investigation (“FBI”) agents in Denton, Texas. They pretextually pulled him over due to a minor traffic violation and quickly arrested him at gunpoint. He was later charged with alleged “evidence tampering and obstruction of justice” based on a box of political pamphlets that he purportedly moved…

Hashrocket - Ruby Posts 

Creating a Custom Mobile Integration for a Board Game Using Ruby on Rails

Picture this: you find a charming old board game at a garage sale, bring it home, gather some friends—and snap. The 50-year-old plastic components break instantly. You search the web for help to replace this fun and unique game mechanic but there’s nothing to be found. So naturally, you roll up your sleeves and build your own mobile version. No one else does this? Just me? Well, in case you ever find yourself in a similar boat, I figured I would walk you through what I did when building my own mobile integration to the 1973 Parker Brothers classic Billionare.

As I said, right when I went to try out this cool "new" board game for the first time, the plastic ends of the Analyzer

Saeloun Blog 

A Guide to Web Application Monitoring

Web application monitoring is the nervous system for our software—continuously listening, collecting signals, and analyzing them to catch problems before they become outages. A one-hour outage can cost millions. Amazon lost an estimated USD 34 million in 2021, while Meta lost close to USD 100 million in a similar incident. Effective monitoring moves our team from reactive firefighting to proactive fire prevention.

The Four Pillars of Telemetry

Modern applications are complex, distributed systems with dozens of moving parts. Without visibility into what’s happening inside, we’re flying blind. Monitoring solves this by collecting four types of telemetry data:

1. Metrics: The Vital Signs

M…

Rails Designer 

Building optimistic UI in Rails (and learn custom elements)

Custom elements are one of those web platform features that sound complicated but turn out to be surprisingly simple. If you have used Hotwire in Rails, you have already used them. Both <turbo-frame> and <turbo-stream> are custom elements. They are just HTML tags with JavaScript behavior attached.

This article walks through what custom elements are, how they compare to Stimulus controllers and how to build them yourself! Starting with a simple counter and ending with an optimistic form that updates instantly without waiting for the server. 🤯

The code is available on GitHub.

What are custom elements?

Custom elements let you define your own HTML tags with custom behavior. They fall under…

Charles Oliver Nutter 

Non-null variable declaration in Java using instanceof patterns

Ever since JRuby 10 upgraded to Java 21, I’ve been re-learning Java with all the excellent language enhancements of the past decade. One of my favorites has to be the instanceof pattern matching features added in Java 16. Today I also realized I can use an instanceof pattern to null-check and assign a variable at the same time.

Using instanceof to null-check

When checking if a value in Java is instanceof some type, we can get a false result in two cases:

  • The value is an instance of a type not equal to or descended from the specified type.
  • The value is null.

This second property turns instanceof into a weird sort of null-check when applied to a variable or method that matches the i…

The Rails Tech Debt Blog 

Hacktoberfest 2025: Our Team’s Open Source Contributions in AI and Technical Debt Management

At OmbuLabs, open source has always been at the core of our values. This year, for Hacktoberfest 2025, our team took the opportunity to give back to the communities that power our daily work, from Ruby developers tackling technical debt to those building the next generation of AI tools. Throughout October, we dedicated focused internal time to open source contributions. Our goal was twofold:

  1. Strengthen and maintain the tools that power our work at FastRuby.io, helping teams manage technical debt and improve code quality.
  2. Advance Ruby’s presence in artificial intelligence, contributing to libraries and frameworks that integrate Ruby with modern AI technologies. By aligning…
Depfu 

Package groups, but better

Packages, especially in node/JavaScript land, have been used to modularize software for some time now. The monorepo as a structure that defines a flurry of packages under a common namespace and released with the same version number at the same time has become somewhat popular in the last few years, with popular packages such as Babel leaning heavily into that.

We have, if a bit crudely, supported these monorepo-packages for quite some time. In the beginning via Greenkeeper’s monorepo definitions, then, after Greenkeeper became part of Snyk and the list was no longer maintained, with a private list that we updated whenever a client mentioned something missing.

We’ve decided to finally…

Weelkly Article – Ruby Stack News 

The Ruby Bindings Every Rails Developer Should Know

December 3, 2025 By Germán Silva Bindings are one of the most underrated yet critical pieces of the Ruby ecosystem. They are the bridges that connect Ruby to native libraries, databases, protocols, and even hardware. Bring Your Next Project to Life with High-Quality Development Don’t miss the opportunity to take your project to the next … Continue reading The Ruby Bindings Every Rails Developer Should Know

Saeloun Blog 

Non‑Blocking IO.select in Ruby: Introduction to Fiber::Scheduler#io_select

Introduction

Ruby 3.1 introduced Fiber::Scheduler#io_select, making IO.select work seamlessly with fiber-based concurrency. Before diving in, let’s clarify some key concepts.

What’s a Fiber?

A fiber is a lightweight, pausable unit of execution in Ruby. Unlike threads, fibers don’t run in parallel—they cooperatively yield control to each other, making them predictable and efficient for I/O-bound tasks.

fiber = Fiber.new do
  puts "Starting"
  Fiber.yield  # Pause here
  puts "Resuming"
end

fiber.resume  # => "Starting"
fiber.resume  # => "Resuming"

What’s a Scheduler?

A scheduler manages when fibers run. When a fiber performs I/O (like reading from a socket), the scheduler pauses it…

RubyGems Blog 

Upgrading to RubyGems/Bundler 4

We introduced breaking changes in RubyGems/Bundler 4 in order to improve usability, security, and maintainability of the tool. This document describes the changes that you will find when upgrading to RubyGems 4 and Bundler 4, and how to prepare for them while still using Bundler 2.7.

RubyGems 4: CLI behavior changes

Removed gem query command

Please use gem search or gem list instead.

Completely removed gem install --default feature

The --default option was confusing for RubyGems users and caused broken installs.

This was an unfinished feature originally intended to install gems directly into the Ruby standard library location, but it only generated executables without properly copying…

RubyGems Blog 

4.0.0 Released

RubyGems 4.0.0 includes features, performance, enhancements, bug fixes, security, breaking changes, deprecations and documentation and Bundler 4.0.0 includes features, performance, enhancements, bug fixes, security, breaking changes and documentation.

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

RubyGems Release Notes

Features:

  • Undeprecate Gem::Version.new(nil). Pull request #9086 by tenderlove
  • Add pattern matching support to Gem::NameTuple. Pull request #9064 by baweaver
  • Add pattern matching support to Gem::Platform. Pull request #9062 by…

Performance:

  • Add MAKEFLAGS=-j by default before compiling. Pull request #9131 by Edouard-chin
  • Remove some memoization. Pull request #9017
SINAPTIA 

la_plata.rb November meetup

On November 27th, 2025, the la_plata.rb community came together at Calle Uno for what became the first and last meetup of the year in the city. More than 30 Ruby developers gathered together to share knowledge, experiences, and drinks.

The meetup was made possible thanks to the support of RubyCentral, GitHub, SINAPTIA, and Unagi. Many thanks to our sponsors; this wouldn’t have been possible without them.

Observability en la era de AI

The first talk was presented by Patricio Mac Adden from SINAPTIA, who shared his team’s journey combining observability tools with LLMs to tackle real-world Rails application problems. With an upfront disclaimer that this wasn’t “the definitive solution” but…

Hashrocket - Ruby Posts 

Why Ruby is the Best Language for Advent of Code

It's the most wonderful time of the year - Christmas Advent of Code time! Advent of Code is an Advent Calendar style series of programming puzzles put out each year, starting on December 1st leading up to Christmas. The puzzles are super festive and ramp up in difficulty over the course of the month. Programmers of every level can participate, and in researching some of the more difficult problems you'll probably learn something cool! It's a great way to finish out the year.

I've been taking part in Advent of Code since 2019 (I've never completed a full year - and that's ok! You can participate for as long as it's fun and have the time) and have tried solving in multiple different…

DotRuby - Things we have to say. 

How to Expose Your Rails Localhost Securely Using Cloudflare Tunnel

Expose your local Rails app to the internet with a secure, stable, and free Cloudflare Tunnel — perfect for webhooks, client demos, and remote testing.
Short Ruby Newsletter 

Short Ruby Newsletter - edition 159

The one with BFCM deals, where Xavier Noria and Kevin Newton shared insights about how constants work in Ruby and where Alessandro Rodi introduced DevToolsController for Rails.
Gusto Engineering - Medium 

Gusto Eng Spotlight Series: Maria Gorkovenko

This blog series is dedicated to celebrating our Black, Latinx, and Women Engineers who are making an impact in the lives of our Gusties and Gustomers (Gusto customers) every day.

Today, we’re spotlighting Masha (Maria) Gorkovenko, who has been with Gusto for 1 year, working on enabling lower-cost health insurance offerings and creating an Agentic Benefits Advisor for the Benefits team.

Kevin: How did you join Gusto?

Maria: I joined Gusto last October, so it’s been almost exactly a year now. Before that, I was a founder at my own startup where we built AI agents. Joining Gusto felt like a natural continuation of that work — I’m now part of the Benefits team, focusing on our Generative…

Kevi…

Robby on Rails 

Why So Serious?

The question Sheon Han poses — “Is Ruby a serious programming language?” — says a lot about what someone thinks programming is supposed to feel like. For some folks, if a tool feels good to use… that must mean it isn’t “serious.”

Ruby never agreed to that definition. If it did, I missed the memo.

If you arrived late, you missed a chapter when the language felt like a quiet rebellion. The community was small. The energy was playful. Ruby tapped you on the shoulder and asked what would happen if programming didn’t have to feel intimidating… what might be possible if clarity and joy were allowed.

The early skeptics were predictable. Java architects. Enterprise traditionalists. Anyone whose…

Fractaled Mind 

Affordances: The Missing Layer in Frontend Architecture

I was building a form with a file input. Nothing fancy—just a place for users to upload a document. I wanted the trigger to look like the other buttons on the page: the same subtle shadows, the same hover effects, the same spacing. I was using Catalyst, the component kit from Tailwind Labs, so I had a <Button> component with all those styles baked in.

But I couldn’t use it.

A file input needs a <label> as its clickable element—that’s how you style file inputs without fighting the browser’s native UI. But Catalyst’s <Button> component only renders as a <button> element or a <Link>. There’s no way to apply those styles to a <label>.

Some component libraries offer escape hatches—props like

Hotwire Weekly 

Week 48 - Invokers API, From ERB to JavaScript, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

Welcome to another, issue of Hotwire Weekly! Happy reading! 🚀✨


📚 Articles, Tutorials, and Videos

GoRails: Rails new with TailwindCSS - Chris Oliver published a new video as part of the "Domain Monitoring SaaS product" series on GoRails, where he sets up Tailwind CSS in a new Rails project.

What Are Invokers? Interactivity Without JavaScript - Scott Tolinski published a new video on the Syntax FM YouTube channel, in which he talks about the new-ish Invoker Commands API in HTML and JavaScript.

From ERB to JavaScript - Server Computes, Hydration Joins, Templates Filter - Sam Ruby shares the final architecture of an offline-first Rails app built using ERB templates…

Alchemists: Articles 

Hanami with Sidekiq

Cover
Hanami with Sidekiq

As your Hanami application grows, you might want to add asynchronous background processing. A good gem to handle this for you is Sidekiq. You might also want Sidekiq Scheduler for dealing with scheduled jobs that repeat on a specific schedule. This is especially important if you are in a situation where you can’t upgrade to Sidekiq Pro which includes this feature by default. Let’s look at both gems and how you can wire them up in your application.

Setup

To get started, add both the Sidekiq and Sidekiq Scheduler gems as follows:

bundle add sidekiq
bundle add…
Weelkly Article – Ruby Stack News 

Debugging in Real Life: How I Use Rails.logger and Docker Logs in My Daily Workflow

December 1, 2025 Debugging is one of those tasks that quietly shapes a developer’s day. It’s not flashy, it’s not glamorous, but it’s the difference between smooth development and losing an afternoon wondering why a request refuses to behave. Over the years working with Ruby and Rails, one of the tools I’ve learned to appreciate … Continue reading Debugging in Real Life: How I Use Rails.logger and Docker Logs in My Daily Workflow

Tim Riley 

Continuations 2025/48: More conversational

  • Pinch, punch, it’s December! But only because I’m writing this a day later than usual. Either way: this month we’re going to launch a new site!

  • My biggest area of work this week was preparing copy and code samples for our home and landing pages. I got it all completed, but instantly hated everything I wrote. This is good, though. It was a process I knew I had to go through. I’m excited for my next pass: I’m going to make everything a lot more informal, more conversational. Less hard sell, more sharing what excites us. This is the voice I want us to have, and it should be instilled across all our communications avenues. Our new site can set the tone for the future.

  • Alongside this, I’ve…

Greg Molnar 

Customizing Omarchy with Ruby

Typecraft made a really good video about how he customizes Omarchy with a set of bash scripts, so he can replicate his setup easily on new machines. While his approach is good, I chose a different one to achieve the same goal. Bash is fine, but let’s be honest, Ruby is a much better language to work with, and since Ruby is installed on Omarchy anyways, I decided to script my setup with Ruby.

Tenderlove Making 

Seattle Downtown Library

Blue chair, red tableOverhead view of a library floor with wooden shelving units displaying books arranged horizontally and vertically.Library lobby with geometric glass and metal architecture features. Purple seating below dramatic angular skylights casting geometric shadows on the floor.Two people stand in a dimly lit corridor with green vertical panels on the left and glowing red light on the right, viewed from behind.A pair of bright yellow escalators with numbered indicators dimly lit

I want to try posting more images to my blog, so here’s my first try. Instagram doesn’t really seem like a good place to post photos anymore, so I figured I’d try on my blog. I’d like to get my blog working with Posse Party at some point, I just need to figure out the API keys, and then I can cross post this to Instagram anyway.

Recently I went on a photo walk to the Seattle downtown public library. These images are from that photo walk! I’ve been living in Seattle since before the library was built, and I never took the chance to actually go visit, so this was a good opportunity. I feel like when you live somewhere, you don’t take the opportunity to visit all of the cool stuff there, and…

Ryan Bigg Blog 

Triaging bugs

At Fat Zebra, one of my duties as a team lead is managing the workloads of those I work with and falling into that ambit is bug triaging. We have a dedicated support channel where people can tag all leads and then the responsible leads can triage those issues. All leads get tagged as it’s sometimes unclear who is responsible for an issue, and it helps with the “pinball effect” that can go on for tickets in their early stages.

Another rule of thumb is that when I can see a ticket is about my team’s work is that I’ll assign it to the on-call person for the team to investigate. This helps spread the load away from myself, and trains up the rest of the team on how to investigate all sorts of…

justin․searls․co - Digest 

✂️ Fit a 5090 gaming rig in a backpack

Your browser does not support the video tag.

I spent my holiday weekend gaining massive respect for the small-form factor (SFF) PC gaming community. Holy shit, was this a pain in the ass. BUT, it's a fraction the size, way faster, and whisper quiet compared to my outgoing build. Glad I did it.

😮‍💨

Noteflakes 

OSS Friday Update - The Fiber Scheduler is Taking Shape

This week I made substantial progress on the UringMachine fiber scheduler implementation, and also learned quite a bit about the inner workings of the Ruby I/O layer. Following is my weekly report:

  • I added some benchmarks measuring how the UringMachine mutex performs against the stock Ruby Mutex class. It turns out the UM#synchronize was much slower than core Ruby Mutex#synchronize. This was because the UM version was always performing a futex wake before returning, even if no fiber was waiting to lock the mutex. I rectified this by adding a num_waiters field to struct um_mutex, which indicates the number of fibers currently waiting to lock the mutex, and avoiding calling um_futex_…

  • I also noticed that the UM::Mut…

Ruby on Rails: Compress the complexity of modern web apps 

Active Support Instrumentation Documentation, QueryIntent#execute! and more!

Hi, it’s Vipul. Let’s explore this week’s changes in the Rails codebase.

Active Support Instrumentation Documentation
This Pull Request updates the Active Support Instrumentation documentation to receive various additions, improvements and more. It is now open for review and feedback from the community!

Ensure TimeWithZone#as_json always returns a UTF-8 string
This PR addresses a regression in Rails 8.1.0 where ActiveSupport::TimeWithZone#as_json was returning strings with incorrect encoding. Since Time#xmlschema returns a US-ASCII encoded string, as_json was returning US-ASCII instead of UTF-8. The fix ensures that the JSON representation always returns a properly encoded UTF-8 string.

Remote Ruby 

San Francisco Ruby Conference Recap

Andrew returns from SF Ruby with a lot more than conference swag! He brings a clear snapshot of where Ruby, Rails, and AI are headed right now. In this episode, he and Chris walk through the most impactful talks from SF Ruby, share highlights of engaging discussions with other developers and friends, reminisces about nostalgic tech items, and explores insightful conversations on the future of Rails, startup culture, AI's impact on programming, developer anxiety, and they share product ideas from Chris new SaaS series on GoRails to Andrew’s concept for a serious GitHub Actions monitoring tool. Hit download now to hear more! 

Links

Saeloun Blog 

UI/UX Audit Checklist Before Redesigning a Site

Before jumping into a website redesign, it’s worth taking a step back to see what’s actually working and what’s not. A proper UI/UX audit helps you understand your current website from both a design and user perspective. It’s like a health check before surgery — it saves time, money, and effort later.

Why a UI/UX Audit Matters

A redesign without an audit often leads to repeating old mistakes. Instead of guessing what needs improvement, a UI/UX audit gives you a clear roadmap. It helps you see how real users experience the site and what’s stopping them from reaching their goals.

An audit helps you:

  • Identify design inconsistencies and outdated visuals
  • Find usability issues that…
Saeloun Blog 

Customizing Rails Migrations with Execution Strategies

Introduction

Rails migrations are powerful tools for managing database schema changes. However, there are scenarios where we need more control over how these migrations execute.

We might need to log every schema change for audit purposes. We might want to prevent dangerous operations in production environments. Or we might need to route migrations through an external service for distributed systems.

Rails 7.1 introduced Execution Strategies to address these needs. This feature provides a way to customize the entire migration execution layer. Rails 8.1 further enhanced this by allowing per-adapter strategy configuration.

This post explores how Execution Strategies work and demonstrates…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Setting Up Rails 8 with MongoDB and Mongoid: Guide for 2026

As Ruby on Rails continues to evolve, the release of Rails 8 has brought modern performance improvements, a cleaner asset pipeline, and better support for API-driven applications. While Rails has traditionally been paired with relational databases such as PostgreSQL or MySQL, many modern applications—especially those requiring flexible schemas, high scalability, or document-based storage—benefit from using MongoDB, the world’s most popular NoSQL database.

To integrate MongoDB seamlessly with a Rails application, developers use Mongoid, a mature and fully-featured Object-Document Mapper (ODM). Mongoid replaces ActiveRecord, allowing Rails apps…

justin․searls․co - Digest 

✉️ I'd do it all again

This is a copy of the Searls of Wisdom newsletter delivered to subscribers on November 25, 2025.

Hello! We're all busy, so I'm going to try my hand at writing less this time. Glance over at your scrollbar now to see how I did. Since we last corresponded:

Ruby Weekly 

A modern Web-based Ruby regular expression editor

#​777 — November 27, 2025

Read on the Web

Ruby Weekly

Unparser: Real Life Lessons Migrating Ruby Tools to Prism — Ruby 3.4 ships with a new built-in parser called Prism. This post is a good introduction to why Prism exists, what it does, as well as some Ruby quirks it needs to deal with. Beyond that, if you’re working with tools that use the old parser, you’ll need to put your code through the.. prism of new classes, tips, and tricks to transition.

Yaroslav Kurbatov (Evil Martians)

♥️ Thankful for the Ruby Open Source Contributors — Open source makes everything we do possible. This Thanksgiving, we’re…