Rubyland

news, opinion, tutorials, about ruby, aggregated
Sources About
Passenger - Phusion Blog 

Passenger 6.0.25

Passenger 6.0.25

Version 6.0.25 of the Passenger application server has been released. This release fixes an issue where Bundler would try to re-exec the process name instead of the script, and adds a config option to allow reverting to previous routing behaviour, in order to mitigate possible performance regressions.

Passenger 6 introduced Generic Language Support, or: the ability to support any and all arbitrary apps.

Allow using old routing algorithm

Passenger 6.0.25 adds a config option to allow reverting to previous routing behaviour, in order to mitigate possible performance regressions. This flag is temporary and will become a no-op and will eventually be removed once the routing performance…

JRuby.org News 

JRuby 9.4.12.0 Released

The JRuby community is pleased to announce the release of JRuby 9.4.12.0.

JRuby 9.4.12.x targets Ruby 3.1 compatibility.

Thank you to our contributors this release, you help keep JRuby moving forward!

Critical Fixes

  • Added additional locking to the new Class#subclasses implementation to fix a concurrent modification error. #8602, #8603

Standard Library

  • jar-dependencies upgraded to 0.5.4 to fix an issue parsing Maven output on Java versions 9 and higher. #8606, #8615

4 Issues and PRs resolved for 9.4.12.0

RubySec 

CVE-2025-25186 (net-imap): Possible DoS by memory exhaustion in net-imap

### Summary There is a possibility for denial of service by memory exhaustion in `net-imap`'s response parser. At any time while the client is connected, a malicious server can send can send highly compressed `uid-set` data which is automatically read by the client's receiver thread. The response parser uses `Range#to_a` to convert the `uid-set` data into arrays of integers, with no limitation on the expanded size of the ranges. ### Details IMAP's `uid-set` and `sequence-set` formats can compress ranges of numbers, for example: `"1,2,3,4,5"` and `"1:5"` both represent the same set. When `Net::IMAP::ResponseParser` receives `APPENDUID` or `COPYUID` response codes, it expands each…
Pat Shaughnessy 

Using Different Size Pools

I've started working on a new edition of Ruby Under a Microscope that covers Ruby 3.x. I'm working on this in my spare time, so it will take a while. Leave a comment or drop me a line and I'll email you when it's finished.

The Ruby team has done a tremendous amount of work over the past decade on Ruby's garbage collection (GC) implementation. In fact, Ruby's new GC is one of the key reasons Ruby 3 is so much faster than Ruby 2. To bring all of this work to light, I decided to rewrite Chapter 12 from scratch, covering garbage collection in Ruby more accurately and in more depth. But then, after a few months, I realized I had gotten carried away and wrote too much material for one chapter.…

Weelkly Article – Ruby Stack News 

Mastering Control Flow in Ruby: Beyond the Basics

February 11, 2025 Control flow is at the heart of every programming language, dictating how code executes based on conditions, loops, and exceptions. While most Ruby developers are familiar with if, case, while, and until, the language offers several advanced constructs that can make your code more expressive and efficient. Let's dive into some lesser-known … Continue reading Mastering Control Flow in Ruby: Beyond the Basics

Ruby News 

CVE-2025-25186: DoS vulnerability in net-imap

There is a possibility for DoS by in the net-imap gem. This vulnerability has been assigned the CVE identifier CVE-2025-25186. We recommend upgrading the net-imap gem.

Details

A malicious server can send highly compressed uid-set data which is automatically read by the client’s receiver thread. The response parser uses Range#to_a to convert the uid-set data into arrays of integers, with no limitation on the expanded size of the ranges.

Please update net-imap gem to version 0.3.8, 0.4.19, 0.5.6, or later.

Affected versions

  • net-imap gem versions 0.3.2 to 0.3.7, 0.4.0 to 0.4.18, and 0.5.0 to 0.5.5 (inclusive).

Credits

Thanks to manun for discovering this issue.

History

  • Origi…
Ryan Bigg's Blog 

Ghosts 'n' Stuff

Being a lead developer is an interesting time. I’d write a lot more blog posts if I wasn’t so busy, sure, but mostly I’d write them if I was allowed to write them. So many times I think “this’d make an interesting blog post” right before the thought of “imagine how much shit you’d be in if you told a soul”. There’s a lot about being a lead that’s interesting but also highly confidential. I’d love to share those stories one day, perhaps a long way down the track.

But today I want to talk about ghosts.

The apps I’m working on have the lucky advantage of being around a decade and a half old. They also have the unlucky disadvantage of being a decade and a half old. Ruby and to a larger extent…

Planet Argon Blog 

End-to-End SEO Testing with Playwright and Lighthouse

End-to-End SEO Testing with Playwright and Lighthouse

SEO isn’t just about keywords—it’s about ensuring your site is structured for search engines and users alike. Here’s how to automate that process with end-to-end testing using Playwright and Lighthouse.

Continue Reading

Gusto Engineering - Medium 

Secure and Customize Rails Logs with Ease

Mastering Rails Filter Parameters

Detailed image of a Rails view with multiple stylesheet and javascript file tags

Introduction

Logs are an invaluable resource for improving your application from tuning performance to debugging errors. However, logs can reveal more than intended or needed such as a user’s password or credit card number. Thankfully, Rails makes securing your logs easy by not only offering a robust mechanism for filtering, but also providing sensible defaults. In this post, we’ll dive into that mechanism, explore its customizable features, and provide actionable tips to tailor it to your application’s needs.

Default Behavior

Rails provides parameter filtering through an initializer located at config/initializers/filter_parameter_logging.rb. This feature has…

code.dblock.org | tech blog 

Leaving Amazon

Friday, February 14th is my last day at Amazon.

I’ve been at Amazon for over 5½ half years, and it’s been a great run. I came from 8 years of leading technology at Artsy, and wanted to go back to coding. I found a Principal Engineer role to help launch the new AWS Data Exchange service. I was excited to work on a marketplace (Artsy is a marketplace for fine art), and the idea of a service that could connect data providers and data consumers at Amazon scale was big. Plus, I was finally going to learn how Amazon, and especially AWS, was so relentlessly successful, from within.

I half-jokingly talked of this as semi-retirement, because being an individual contributor at a F.A.A.N.G. seemed a…

Felipe Vogel 

How I use MacOS, Linux, Windows, iOS, Android

Over the past few years I’ve hopped across several devices and operating systems. Along the way, I’ve collected a list of my favorite apps and extensions for each OS. This post is that list.

This post is also a snapshot of how I use my computer and phone regardless of what OS happens to be on them. I still have my preferences, of course, but I’ve reached a point where I care less about which OS I’m using, thanks to this set of UI enhancements.

Here…

justin․searls․co - Digest 

✂️ The Startup Shell Game

Your browser does not support the video tag.
justin․searls․co - Digest 

📺 Should you bring your whole self to work?

…the answer usually depends on everything OTHER than whether you're good at your job.

This clip is from v30 of Breaking Change.

Watch on YouTube

Saeloun Blog 

Rails 8 Adds A New Script Folder By Default And Scripts Generator.

In Rails there is no official way to organize one-off scripts. Unlike recurring tasks, which are automated or scheduled to run at regular intervals (e.g., cron jobs or background workers), these scripts are standalone, ad-hoc scripts that are intended to be run only once or on rare occasions.

Before

Before Rails 8, managing one-off or custom scripts was often chaotic because there was no dedicated folder for scripts that didn’t fit standard Rake tasks or background jobs. This lack of organization made it harder to keep track of these scripts.

As a result, we had to create our own ad-hoc methods for storing and running these scripts. This lead to inconsistent and cluttered solutions.

Alchemists: Articles 

RSpec Configuration

Cover
RSpec Configuration

Let’s learn how to configure RSpec with solid defaults so you can test with confidence.

Table of Contents

Quick Start

Here’s a recommended configuration — as generated by Rubysmith — when working in new or existing projects:

RSpec.configure do |config|
  config.color = true
  config.disable_monkey_patching!
  config.example_status_persistence_file_path = "./tmp/rspec-examples.txt"
  config.filter_run_when_matching :focus
  config.formatter = ENV.fetch("CI", false) == "true" ? :progress : :documentation
  config.order = :random
  config.shared_context_metadata_behavior = :apply_to_host_groups
  config.warnings = true

  config.expect…

The above is all you need to properly configure RSpec. Congrats! …​but…

Breakdown

Some of the above configuration might not make sense or be…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 122

The one with a new markdown editor for Rails, benchmarks caching solutions for Rails and 18 inspiring Ruby and Rails code samples
RichStone Input Output 

Setting yourself up for intentional hyperfocus

Setting yourself up for intentional hyperfocus

I just underwent a 9+ hyperfocus session, during which I finished reading the last 125 pages of Layered Design for Ruby on Rails Applications. So, I wanted to share some patterns I noticed when going deep into an activity like coding or reading for longer hours and staying there. 

I consider a hyperfocus session anything that lasts more than 1.5-2 hours. In this session, the focus is on one task, and time and space are forgotten. While 3-4 hour sessions occur frequently for me, a 9+ hour session is extremely rare, so I wanted to capture its details while it's still fresh to see whether this is purposefully reproducible in the future.

First of all, I was on a plane without Internet. This helps…

Rémi Mercier 

How I use git add –patch for reviewing my work

When working on features, I strive to preserve my flow, which means, that after a few hours, I’ll have a bunch of untracked files waiting for me in git. Since I like to make atomic changes, I need to remember which files go hand-in-hand to bundle them up in meaningful separate commits.

git add --patch to the rescue

You probably already use git add to add files to your staging area. Well, git add --patch adds a few fancies to this process:

  • Interactively review your additions.
  • Select those you want to add to your staging area.
  • Control the granularity with which you can do the above.

Let’s take this website repository as an example (#meta)!

First, let’s run git status.

Giant Robots Smashing Into Other Giant Robots 

How to customize ids in URLs in your Rails app

Rails’ URL helpers allow you to pass in an Active Record object and it will automatically infer the proper URL including the id (e.g. link_to "Profile", @user). How can we get this behavior for custom objects?

Custom objects

Consider a custom Image class. We want URLs to look like /images/cat.gif.

Rails relies on the to_param method to generate identifiers in URLs. If we define it on our custom object it can now be used with link_to just like ActiveRecord objects can.

class Image
  attr_reader :filename

  def to_param
    filename
  end
end
<%= link_to "Details", @image %>
<%# will generate <a href="/images/cat.gif">Details</a> %>

Slugs

Because Rails URL-helpers…

Petr Hlavicka 

Flexible API versioning with Rails

A well-defined API versioning strategy is crucial for any API expected to evolve. Let's explore the most common API versioning strategies and develop a flexible one in Rails.
Hotwire Weekly 

Week 06 - Avoid Turbo Morphing Pitfalls, New Markdown Editor, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

📚 Articles

How to avoid problems with Turbo morphing - Radan Skorić iscusses common pitfalls when using Turbo 8's morphing feature, such as losing initialized DOM elements or resetting UI states. He outlines key strategies to mitigate these issues.

Marksmith - a GitHub-style markdown editor for Ruby on Rails - Adrian Marin introduces Marksmith, a lightweight Markdown editor designed specifically for Rails applications. Marksmith provides an intuitive WYSIWYG editing experience while maintaining the flexibility of Markdown. It supports Active Storage out of the box and…

Build…

Petr Hlavicka 

Flexible API versioning with Rails

A well-defined API versioning strategy is crucial for any expected evolving API.
justin․searls․co - Digest 

📸 Ultra Narrow View

Vertical monitors for folks working on documents have been a thing for decades — now that Apple Vision Pro supports an 8K-ish ultra wide screen orientation for Mac Virtual Display, I’d love to see custom aspect ratios that allow you to create only as big of a Mac window as you need.

byroot’s blog 

Guardrails Are Not Code Smells

I want to write a post about Pitchfork, explaining where it comes from, why it is like it is, and how I see its future. But before I can get to that, I think I need to share my mental model on a few things, in this case, resiliency.

A few years ago, I read a tweet calling out unicorn-worker-killer as a major code smell. I don’t quite remember who or when it was, it doesn’t matter anyway, but I think it is an interesting topic because, depending on how that gem is used, I can either strongly agree with or vehemently oppose this tweet.

What Does It Do?

unicorn-worker-killer provides two optional features for Unicorn.

The first one allows to set a number of requests after which a Unicorn…

justin․searls․co - Digest 

📺 Why Sam Altman is the wrong man for the job

This is the first of what I hope will become a habit of long-form video excerpts from the podcast. This one comes from a section in v30 about DeepSeek and the ramifications it may have for OpenAI and the extent to which it condemns Sam Altman's ideology on how to run a startup.

Watch on YouTube

justin․searls․co - Digest 

📸 20%? Sign me up!

Why freak out about tariffs and the economy when random signs on the side of the highways in Florida are able to offer such amazing investment returns?

Write Software, Well 

Working with the Rails Instrumentation API

Working with the Rails Instrumentation API

The observer design pattern (also called pub-sub) allows one or more subscribers to register with and receive notifications from a publisher. It's great for scenarios that need push-based notifications, instead of continuous polling. A real-world example is this blog. Whenever a new post is published, it sends an email to all the subscribers of the blog. As a result, the readers don't have to constantly refresh the blog to see if a new post was published.

The pattern defines a publisher (also known as a provider or an observable) and zero or more subscribers (also known as observers or listeners). Subscribers register with the publisher, and whenever a predefined condition, event, or state…

justin․searls․co - Digest 

✂️ The Baby Store

Your browser does not support the video tag.

Why I didn't have kids, despite the fact a lot of men seem weirdly OK with pretending they have zero regrets.

This clip is from v30 of Breaking Change.

Posts on Kevin Murphy 

Frequently Played Feb 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.

Valentine’s Day 🔗

‘Tis the season. I listen to the Tunnel of Love album throughout February everyyear.

Full Lyrics

So hold me close, honey, say you’re forever mine
And tell me you’ll be my lonely valentine

I Don’t Mind (If I’m with You) 🔗

It’s interesting what people say they can endure for others. Even the wind.

Full Lyrics

Never had a good friend, no one like you
But I spent a lotta time on my own
And they set me on fire and I did a lot of burning
They told me I didn’t know things…

Remote Ruby 

High Leverage Rails & SQLite with Stephen Margheim

In this episode, Chris and Andrew welcome guest Stephen Margheim to discuss his specialization in Ruby and SQLite. Stephen shares his journey of improving the
developer experience with SQLite by addressing various pain points and adapting it for production in the Rails ecosystem. He talks about his contributions to Rails 8, making it the first fully production ready SQLite compatible web application framework. The conversation also covers the importance of leveraging these tools to build high-quality applications quickly and efficiently. Also, Stephen announces his upcoming course "High Leverage Rails" which focuses on maximizing the potential of Rails and SQLite for rapid, reliable…

Ruby on Rails 

Support joins in update_all for PG and SQLite and more

Hi, Wojtek here presenting you this week’s changes in the Rails codebase.

Clio joins the Rails Foundation
We’re excited to welcome Clio as the newest Contributing Member of the Rails Foundation.

Support joins in update_all for Postgresql and SQlite
Previously when generating update queries with one or more JOIN clauses, Active Record would use a sub query which would prevent to reference the joined tables in the SET clause, for instance:

Comment.joins(:post).update_all("title = posts.title")

This is now supported as long as the relation doesn’t also use a LIMIT, ORDER or GROUP BY clause. This was supported by the MySQL adapter for a long time.

Rate limit password resets in auth…

Hi, we're Arkency 

Improve your user experience with Turbo Frames

Improve your user experience with Turbo Frames

I’ve spent a good chunk of my career optimizing performance in web apps — mostly from the frontend perspective. Recently, I stumbled upon a simple trick with Turbo Frames that can improve the user experience when a particular part of the page is painfully slow to load.

When Slow Pages Hurt UX

Imagine you have a view that shows a giant, complex list of data. Maybe it involves heavy database queries, advanced filtering, or complicated logic that can take a couple of seconds to finish. Traditionally, the user is stuck watching a blank or previous page until everything completes.

That’s obviously subpar for UX. The user might think the page is…

Fullstack Ruby 

Finding My Happy Place with Hanami and Serbea Templates

It sure seems like the Hanami web framework has been in the news lately, most notably the announcement that Mike Perham of Sidekiq fame has provided a $10,000 grant to Hanami to keep building off the success of version 2.2. I also deeply appreciate Hanami’s commitment to fostering a welcoming and inclusive community.

Thus I figured it was high time I took Hanami for a spin, so after running gem install hanami, along with a few setup commands and a few files to edit, I had a working Ruby-powered website running with Hanami! Yay!! 🎉

But then I started to miss the familiar comforts of Serbea, a Ruby template language based on ERB but with a few extra tricks up its sleeve to make it feel more…

Ruby Rogues 

Rails Developers Survey: Continuous Deployment Trends and Emerging Tools - RUBY 670

Welcome back to another episode of the Top End Devs podcast! Today, we have an exciting lineup featuring our host Charles Max Wood and special guests Robbie Russell from Planet Argon, along with panelists Ayush Nawatia and Valentino Stoll. This episode dives deep into the insights from the latest Ruby community survey conducted by Robbie Russell. We explore topics such as the rise of Stimulus JS in the Rails community, trends in deployment practices, popular tools and services in the software ecosystem, and the everlasting debate between monoliths and microservices. Robbie also shares the fascinating history and evolution of his widely-used open source project, Oh My Z Shell, and gives us a…
Awesome Ruby Newsletter 

💎 Issue 455 - Ruby "Thread Contention" is simply GVL Queuing | Island94.org

Ruby Weekly 

Ruby on Rails on WebAssembly

#​737 — February 6, 2025

Read on the Web

🙏 I wouldn't usually say 'please read this issue' but this is one of the most densely packed ones in a while. There's a real buzz around the Ruby ecosystem right now as demonstrated by the great articles and projects coming out every day. Long may it last!
__
Peter Cooper, your editor

Ruby Weekly

Ruby on Rails on WebAssembly: The Full-Stack In-Browser Journey — This post takes DHH’s famous “build a blog in 15 minutes” tutorial and embeds it in the browser using WebAssembly. While this is a bit of a parlor trick, it shows the possibilities of WASM. The author goes on to show…

Rails Designer 

Build a Notion-like editor with Rails

Notion had for a long-time a neat block-based editor. It allows you to type away with a paragraph-element by default, but allows you to choose other block elements, like h1, ul and so on. This allows you to style the elements inline as well, keeping things super clear.

This article shows you the basic data modeling and logic to set up. Enhancing it with JavaScript (Stimulus) and making things pretty will happen in a following article. Exactly how I would do it in real apps too.

Data model

I am keeping this set up basic, with just a page model to hold the blocks, but in a real application a page might belong to something like a Collection. I am also not adding all possible blocks, but fee…

Tim Riley 

New chapters for 2025

Thank you to everyone who reached out during my recent job hunt. I’m very happy to report that I’ve found a new gig!

More on the gig later. For now I want to share two big things arising from it: I have a full six weeks off, and afterwards I’ll be working four days a week.

This four day workweek opens up—for the first time ever—the chance to put meaningful, sustainable ongoing time into Hanami, to take it to the next level after all the effort we’ve put into building our foundation over the last several years. (Also positive: maybe I won’t burn out! 😅)

My availability is the first step. Next, Hanami needs to raise funds to make it viable. You’ve already seen the beginnings of this, with

katafrakt’s garden 

On validations and the nature of commands

Recently I took part in a discussion about where to put validations. What jarred me was how some people inadvertently try to get all the validation in a one fell swoop, even though the things they validate are clearly not one family of problems. This led me to think about different kinds of validation and how does that relate to the nature of a command.

When talking about commands, I don’t mean any particular pattern in code. Throughout this article a command means an intent for some change to happen. In fact, let’s eject ourselves from the web app world for a little while and talk about commands in the situation when one person tells another to do something.

Say, Alice is telling Bob:…

Julia Evans 

Some terminal frustrations

A few weeks ago I ran a terminal survey (you can read the results here) and at the end I asked:

What’s the most frustrating thing about using the terminal for you?

1600 people answered, and I decided to spend a few days categorizing all the responses. Along the way I learned that classifying qualitative data is not easy but I gave it my best shot. I ended up building a custom tool to make it faster to categorize everything.

As with all of my surveys the methodology isn’t particularly scientific. I just posted the survey to Mastodon and Twitter, ran it for a couple of days, and got answers from whoever happened to see it and felt like responding.

Here are the top categories of frustrations!

Radan Skorić's website 

How to avoid problems with Turbo morphing

A beautiful UI Morphed into existence Suddenly broken A Haiku about Turbo Morphing, by me (just me, no AI) The problem with morphing Turbo 8 debuted a new page refresh approach: morphing. For the rest of the article I’m going to assume you are familiar with it. Like other Rails “magic”, morphing delights when it works and frustrates when it interferes. And its interference can be extreme...
Andy Croll 

Ordinal Numbers in Rails: 1st, 2nd, 3rd, 4th

When developing Rails applications, you often need to present numbers in a more human-readable format. For instance, you might want to display “1st” and “42nd” instead of just “1” or “42”. Rails provides a neat solution for this through Active Support’s Core extensions.

Instead of…

…avoiding ordinals altogether or using basic string interpolation:

position = 1
"You finished in position #{position}"
# => "You finished in position 1"
position = 32
"You finished in position #{position}"
# => "You finished in position 1"

Use…

…Rails’s built-in ordinal and ordinalize methods:

position = 1
"You finished in #{position.ordinalize} place"
# => "You finished in 1st place"
position = 11
"You…
The Rails Tech Debt Blog 

WAVE Accessibility Report

figcaption { text-align: center; font-size: 0.75rem; font-style: italic; line-height: 1.5; }

Aysan recently wrote about accessibility testing in Rails applications using your test suite to ensure that your application is accessible to all users.

However, you may not have a test suite in place or you may not have a Rails application, but you still want to test the accessibility of your web application, right? So, we discovered the WAVE Web Accessibility Evaluation Tools that can help you test the accessibility of your web application, regardless of the technology stack you are using.

Does this sound interesting to you? Let’s dive in!

What is WAVE?

WAVE is a suite of…

Pat Shaughnessy 

Inserting One New Element into Hashes of Varying Sizes

I've started working on a new edition of Ruby Under a Microscope that covers Ruby 3.x. I'm working on this in my spare time, so it will take a while. Leave a comment or drop me a line and I'll email you when it's finished.

RUM includes a series of “experiments:” simple code snippets that show evidence the book’s explanations are accurate. One of the first experiments I wrote back in 2013, Experiment 7-2 is a fun way to see exactly when Ruby increases the number of bins in a hash table. The experiments in RUM are a great way to see for yourself how Ruby works. They also keep me honest; in fact, I ran this code again recently using Ruby 3.4.1 and saw different results than what I expected!

Ch…

BigBinary Blog 

Benchmarking caching in Rails with Redis vs the alternatives

Recently, we have seen the rise of Redis alternatives. Some of them claimedsubstantial performance gains. We did this benchmarking to see how muchperformance gain one would get by switching from Redis to one of thealternatives.

We explored several new contenders like Valkey,DragonflyDB, and DiceDB,which serve as drop-in Redis replacements. We also looked at Rails' ownSolidCache, which challenges in-memorystorage by favoring database-based approach. For this comparison, we included atuned SolidCache for PostgreSQL,as suggested by Andrew Atkinson. We also includedSolidCache with sqlite3,inspired by Stephen Margheim, who claims to offer significant performance gains.Finally, we added litecache…

Although SolidCache brings various advantages to…

Hashrocket - Ruby Posts 

Broadcasting User Specific Turbo Content

A fantastic feature of Turbo Rails is the ability to broadcast changes to a page. Each connected client can receive changes in real-time. However, it's a common problem to update content that is shown to many users, but the rendering of items is affected by user context. A recommendation to get around this is to only broadcast things that don't require that user context. Because we have Turbo, we can serve user-specific content in other ways.

Let's examine our setup, and I'll explain how we can accomplish our goal.

Premise

We have a scheduling dashboard with appointments, and all users of this system can view it. If one of the appointments is updated by another user, we want to…

Ruby News 

Ruby 3.2.7 Released

Ruby 3.2.7 has been released.

Please see the GitHub releases for further details.

Download

The Bike Shed 

454: Workshop design with Aji Slater

Joël is joined by fellow thoughtboter Aji Slater as they discuss their previous experiences in designing content for workshops.

Learn how to best structure your workshop for an audience, the benefits of a workshop over a talk and vice versa, as well as how to tackle the different hurdles your audience might face when working through your presentation.

Try your hand at Joël’s recommendation of visualising your Git Branching.

You can watch Ali’s Enigma Machine workshop here, Or connect with him via LinkedIn

Your host for this episode has been Joël Quenneville.

If you would like to support the show, head over to our GitHub page, or check out our website.

Got a question or…

Planet Argon Blog 

How to Manage an End-of-Day Client Emergency

How to Manage an End-of-Day Client Emergency

Learn how to confidently handle end-of-day client emergencies using a real-life example from one of our team members.

Continue Reading

RoRvsWild's blog 

Optimize Pagination Speed with Asynchronous Queries in Ruby on Rails

To contextualize the following deliberations, we are going to assume that we are dealing a real world, complex use case that requires:

  • the actual grouping of records,
  • the ability to jump forward and backward between pages, or to a particular one,
  • and an overview of the pagination metadata, including the count of records and pages.

The last requirement in particular rules out simpler, more efficient pagination techniques such as:

  • Countless pagination, where calculating a total count is left out completely in favor of discovering new pages on the fly by requesting one additional record exceeding the current window (like with infinite scrolling). Thus each page only knows whether it has…
Ruby on Rails 

Clio joins the Rails Foundation as a Contributing member

We’re excited to welcome Clio as the newest Contributing Member of the Rails Foundation. Since its founding in 2008, Clio has relied on Rails to build tools that empower legal professionals to manage their practices more efficiently.

Today, Clio’s product suite is the largest and most sophisticated Rails-based system in the legal industry. The platform supports over 150,000 legal professionals globally, processing millions of transactions daily, and Rails remains at the heart of it all.

From the very beginning, the Ruby and Rails community’s commitment to learning and open-source innovation has aligned with Clio’s own mission: to transform the legal industry for all. This is largely…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 121

The one about where Ufuk Kayserilioglu does a deep dive into how singleton classes work and where Jean Boussier explores what happens when removing GVL
danielabaron.me RSS Feed 

How a Ruby Upgrade Broke MS Edge Support in a Rails App

Discover how upgrading Ruby unexpectedly caused compatibility issues with Microsoft Edge in our Rails app, and learn the debugging steps we took to resolve it.
DotRuby - Things we have to say. 

Enhancing Esbuild Error Handling in a Rails App

When working on a Rails app using esbuild, encountering build errors can be frustrating — especially when they don’t surface in a way that makes debugging easier. To improve the developer experience, I implemented an automatic error rendering system that displays esbuild errors directly in the browser during development.
Drifting Ruby Screencasts 

Outlets and Permanent Tags

In this episode, we'll explore how we can add a "global" music player that will persist across different pages. Our approach will be unobtrusive and implemented in a maintainable way.
RichStone Input Output 

Setting up your Mac to make you 1% better (as a developeur)

Setting up your Mac to make you 1% better (as a developeur)

While setting up my new Mac M4 for a good month, I talked to good Ruby people about their setups and learned a few new tweaks that I didn't want to go unshared. I think we should make your setup 1% better.

I will ramble here for a bit about my history of setting up Macs and dev envs and how great the M4 is. But you, feel free to jump down to "the list" at the bottom, to see what you can do on your own Mac to become the top 1% of productive Mac Ruby developeurs.

When I had just started as a young developeur and computer science student, I sometimes liked to procrastinate at coding. I happily took any challenge and rabbit hole that my computer, IDE or whatever new tool (all tools were new to…

Hotwire Weekly 

Week 05 - Monitoring ActionCable, back to jQuery in 2025, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

📚 Articles

Monitoring ActionCable - Stanko Krtalic shares a guide on monitoring ActionCable connections in production. The article covers key considerations, such as tracking the number of connected users, detecting connection failures, and ensuring smooth real-time functionality.

Build Rails Apps with Components - Brad Gessler introduces Superview on the Terminalwire blog, a gem designed to streamline the integration of component-based views in Rails applications. Superview enables automatic rendering of components like Phlex and ViewComponent by mapping controller…

Ryan Bigg's Blog 

Rails tagged logging

A feature within Rails is that it allows us to add data to our application’s log lines for tagging those lines. We can then use these tags for aggregating them together into a bunch. I’ll show you how to do this here. I used this in a Rails app that acts purely as an API, so there is only ever one request at a time I care about, in this case.

We can configure this in config/environments/development.rb:

config.log_tags = [lambda {|r| Time.now.iso8601(4) }, :request_id]

This sets up two tags, one of a timestamp with millisecond precision, and another with the request ID. The symbol :request_id maps to a method on ActionDispatch::Request, and we can use any methods from that class in these…

This log line…

justin․searls․co - Digest 

🎙️ Breaking Change podcast v30 - Mall of the Gulf of America

Direct link to podcast audio file

If you're here for the spicy, good news: you're gettin' it spicy.

I am usually joking, but I mean it this time: I'm going to stop doing this podcast if you don't write in to podcast@searls.co. Give me proof of life, that's all I need. I won't even read it on air if you don't want!

If you're not bored yet, click the links:

🌶️

Alchemists: Articles 

Ruby Source Parsing

Cover
Ruby Source Parsing

One powerful tool in your debugging arsenal is the ability to quickly obtain an object’s source location and/or the original source code itself. This journey begins by using the #source_location method as found via these objects:

Typically, when using Method for example, you can obtain the source location by getting an instance of your method and asking for location information as shown below:

module Demo
  module_function

  def echo(text = "hi") = puts text
end

Demo.method(:echo).source_location
# ["/$HOME/Engineering/Misc/demo", 18]

The above tells us that the source code of the #echo method can be found in…

Ruby on Rails 

Minimal apps, reply_to address, rotate secrets, podman support

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

Extend –minimal option
rails new --minimal allows to create a basic Rails app, but recent additions to Rails were still included. Moving forward, this option will also skip Brakeman, CI, Docker, Kamal, Rubocop, Solid trifecta, and Thruster.

Add reply_to_address to Mail::Message
When using Action Mailer you can now specify a reply_to: email address in addition to the to: recipient.

Load the routes in the console when calling app
Have you ever needed to see what route helpers are available inside an IRB session? Moving forward they will be loaded in the app IRB helper.

$ bin/rails c
$ > app.root_path #…
a-chacon 

Running LLM Locally: DeepSeek R1 and Open WebUI with Docker Compose.

Assuming you use ChatGPT regularly and have probably heard about some of the latest open-source language models (LLMs), such as Llama 3.1, Gemma 2, Mistral, or DeepSeek, I’m going to show you how to run the latter on your local machine using Docker and Docker Compose.

DeepSeek is an open-source artificial intelligence language model developed by a Chinese company. It is a transparent and accessible alternative to other private LLMs, allowing its use and modification for both research and commercial applications.

I won’t deny it, I’m enjoying watching the monopoly of OpenAI and its closed-source LLM crumble in the face of an open-source and much more economical alternative, both in terms…

Remote Ruby 

Hotwire Native with Joe Masilotti

In this episode of Remote Ruby, Chris and Andrew discuss the complexities and evolutions of developing mobile applications using Hotwire Native with guest Joe Masilotti. The conversation delves into the history, challenges, and features of Hotwire, highlighting its origins from Turbolinks to Hotwire Native. Joe shares insights from his upcoming book, which aims to guide Rails developers through building iOS and Android applications. They cover a range of topics, including authentication, push notifications, and the benefits of keeping most logic on the server. Joe also explains his writing process, and the practicalities of maintaining the book, given the ever-evolving nature of software…

Tejas' Blog 

Arbitrary handling of mock arguments in RSpec

Testing mock arguments with ease in RSpec.

Notes to self 

Setting up Cloudflare R2 buckets for Active Storage

Rails comes with a built-in support for saving and uploading files to S3 and S3-compatible storage services in Active Storage. Here’s how to set up Cloudflare R2.

Cloudflare R2

To start using Cloudflare R2, select R2 Object Storage from the menu on the left navbar. If you are on free plan you’ll need to subscribe first.

Then you can click + Create bucket and give your bucket a name. Choose meaningful names for your buckets. I usually append the environment to the name.

Cloudflare will auto assign your bucket location based on your actual location and providing a hint might not work. Not great doing this on holidays.

TIP: If you are hosting in EU, you can at least choose Specify…

justin․searls․co - Digest 

📸 How to build a podcasting platform in under 8 hours

Last year at Rails World, I indulged in some horn tooting and victory-lap taking when I showed off the publishing platform and strength-training app I built to support Becky's business.

The paper-thin pretense of my talk was, "wow, look at how incredible Ruby on Rails is for empowering developers—even solo acts—to build ambitious products." And don't get me wrong, that was the main thesis. But the presentation was also an opportunity to show off my work and drop the mic.

As a consultant, I spent my entire career hearing how hard it is to build a real product. That as a Johnny-come-lately contractor, I could never know why things had to be slow. Or complicated. Or buggy. I lost track of…

Island94.org 

Ruby "Thread Contention" is simply GVL Queuing

There’s been a ton of fantastic posts from Jean Boussier recently explaining application shapes, instrumenting the GVL (Global VM Lock), and thoughts on removing the GVL. They’re great reads!

For the longest time, I’ve misunderstood the phrase “thread contention”. It’s a little embarrassing that given I’m the author of GoodJob (👍) and a maintainer of Concurrent Ruby and have been doing Ruby and Rails stuff for more than a decade. But true.

I’ve been reading about thread contention for quite a while.

  • I was probably initially introduced to thread contention in Nate Berkopec’s Speedshop blog.
  • Thread contention came to the front of my mind from Maciej Mensfeld’s…
Awesome Ruby Newsletter 

💎 Issue 454 - Supercharge SQLite with Ruby Functions

Mike Perham 

Conventional Commits

Conventional Commits is a defacto standard for writing commit messages in a manner more useful for both humans and machines. Examples:

feat(batches): adjust callback data model to conform to naming standards
ci: add ruby 3.4 to matrix
style: upgrade standard formatting

I learned of conventional commits recently and like the simplicity and ease of use. I want to use this standard going forward for all of my projects but I had one problem: how do I train myself to use this every time? It’s too easy to forget or skip without some sort of prompt or cheatsheet so that’s exactly what I did!

Ruby Weekly 

Getting rid of Ruby's global VM lock

#​736 — January 30, 2025

Read on the Web

Ruby Weekly

So You Want to Remove Ruby's GVL? — The GVL is a CRuby implementation detail that prevents Ruby code from running in parallel across multiple threads, and there have been many calls over the years to get rid of it in order to improve concurrency and performance. Is it that easy? And would it make much difference? Ruby committer Jean Boussier digs in..

Jean Boussier

Updating Ruby Under a Microscope: A Look into Hashes — Pat is updating his highly successful 2013 book that digs into Ruby’s internals to meet the modern reality of Ruby 3.x and its many…

Josh Software 

Code Push for Flutter with Shorebird: A Hotfix Hero’s Tale

If you’ve ever launched a mobile app, you’ve probably been haunted by these dreaded thoughts: What if there’s a bug? or Did I just ship a typo to production? Don’t worry, we’ve all been there — crying over coffee, wishing for a time machine. Enter Code Push, the magical unicorn that lets you release quick fixes without going through the … Continue reading Code Push for Flutter with Shorebird: A Hotfix Hero’s Tale
Rails Designer 

Multiple component variants with Tailwind

One thing vanilla CSS does really well is extensibility. A good, and common, example of this is a button. With plain CSS you can build a base btn class and then a modifier btn-primary (or btn--primary to be BEM-like).

With Tailwind this is less easy to do, unless you use some sort of component system, like ViewComponent. Let’s build just that today, so in your app you can write render ButtonComponent.new.with_content "Save" or render ButtonComponent.new(variant: "danger").with_content "Delete". No dependencies needed, only what Rails gives you.

Let’s set up the basics:

class ButtonComponent < ApplicationComponent
  def initialize(variant: "primary")
    @variant = variant
  end

  def ca…
JRuby.org News 

JRuby 9.4.11.0 Released

The JRuby community is pleased to announce the release of JRuby 9.4.11.0.

JRuby 9.4.11.x targets Ruby 3.1 compatibility. This release fixes two critical bugs in JRuby 9.4.10.0 and we recommend users skip that version when upgrading.

Thank you to our contributors this release, you help keep JRuby moving forward!

Critical Fixes

  • Fixed an issue where Mutex lock acquisition may leave the Mutex locked if an asynchronous Thread interrupt happens at the same time. #8585, #8586
  • Fixed a memory leak where singleton classes would leave behind bookkeeping objects that accumulated over time.

Standard Library

  • rubygems been updated to version 3.6.3 to fix an incompatibility with bundler 2.6. #8590, #8596
  • bundler has…
Ruby Central 

January 2025 Newsletter

January 2025 Newsletter

Welcome to the January newsletter. Read on for announcements from Ruby Central and a report of the OSS work we’ve done from the previous month.

Ruby Central Updates

Chris Oliver Joining Ufuk Kayserilioglu as RailsConf 2025 Co-Chair

🚨Big news for RailsConf 2025! 🚨 We’re thrilled to announce that Chris Oliver (CEO of GoRails) will be joining Ufuk Kayserilioglu (Engineering Manager at Shopify) as our Co-Chairs for the final RailsConf in Philadelphia, PA. 🎉

Chris has been a cornerstone of the Rails community for over a decade. As CEO of GoRails, he has created essential tutorials to help Ruby and Rails developers grow in their careers. With his dedication to education and enhancing the ecosystem,…

The Rails Tech Debt Blog 

Rails database migrations best practices

Have you ever found yourself wondering how to best manage your database migrations in Rails? Migrations are a powerful tool for evolving your database schema, but without proper practices, they can become difficult to manage and even lead to inconsistencies between environments. In this post, we’ll cover essential strategies for keeping your migrations organized, efficient, and in sync across development, staging, and production, helping you avoid common pitfalls and maintain a clean, up-to-date database.

Meant to be Deleted

Database migrations are designed to be temporary. They serve as a bridge to implement incremental changes but aren’t meant to stick around indefinitely. Once they’re…

Jekyll • Simple, blog-aware, static sites 

Jekyll 4.4.1 Released

Publishing a patch release to restore existing behavior around defining front matter defaults where a scope with path containing glob patterns are lax in matching paths on disk.

SINAPTIA 

Let’s talk about GraphQL

For the past few months, we have been working on a project for a hotel management system. Their stack consisted of a Ruby on Rails backend and a Typescript and React frontend. Their API, instead of a traditional RESTful approach, was implemented with GraphQL.

What’s GraphQL?

GraphQL was created as an alternative to REST to address common challenges like data over- and under-fetching. It originated from Facebook’s need to enhance performance and flexibility in its applications. GraphQL allows client applications to precisely request the data they need without being constrained by pre-defined server endpoints. This allows developers to build customized queries, optimize data retrieval, and…

DEV Community: Doctolib 

Beyond Barnum: crafting meaningful requirements in System Design

Make it scalable, but not too complex. And of course, everything needs to be secured and compliant.

— Every System Design Ever

If you've ever participated in a system design interview – whether as an interviewer or candidate – these words probably sound familiar. They're the software engineering equivalent of a horoscope: vague enough to apply to any system, yet specific enough to feel meaningful. Just as horoscopes tell you that you're "sometimes outgoing but also enjoy quiet time alone" (who doesn't?), these requirements seem to provide guidance while actually saying very little.

Welcome to the Barnum effect in system design.

As a staff engineer at Doctolib who has been conducting…

byroot’s blog 

So You Want To Remove The GVL?

I want to write a post about Pitchfork, explaining where it comes from, why it is like it is, and how I see its future. But before I can get to that, I think I need to share my mental model on a few things, in this case, Ruby’s GVL.

For quite a long time, it has been said that Rails applications are mostly IO-bound, hence Ruby’s GVL isn’t that big of a deal and that has influenced the design of some cornerstone pieces of Ruby infrastructure like Puma and Sidekiq. As I explained in a previous post, I don’t think it’s quite true for most Rails applications. Regardless, the existence of the GVL still requires these threaded systems to use fork(2) in order to exploit all the cores of a server:…

But is it that simple?

GVL and Thread Safety

If you read…

Gusto Engineering - Medium 

Gusto Eng Spotlight Series: Komaron James

Today, we’re spotlighting Komaron James, who has been with Gusto for one and a half years as the PE (People Empowerer or People leader) for Gusto Embedded API infra team.

Abby: How did you join Gusto?

Komaron: My journey began as a software engineer fresh out of college. Like many new grads, I was eager to move fast and work with the latest technologies. I accepted an offer from a large company and soon learned from my future manager that, while big companies provide consistency and structure, they also tend to move at a slower pace.

Although I valued the experience and the opportunities it offered, I quickly realized that this wasn’t the long-term path I wanted to follow. Instead, I decided…

Super Good Blog 

Pairing with Intention: A Guide for Mentors

Pair programming is invaluable when helping someone learn and grow as a developer, but too often we don’t take the time to think about how we go about it. The little decisions we make along the way can make a big difference to the effectiveness of our mentorship. In my recent talk at RailsConf 2024 in Detroit, I explored my experience mentoring and being mentored and took a closer look at how the decisions we made affected the outcome.

Start with a plan

Many mentor/mentee pairs start off without thinking too hard about exactly how to pair together. It’s common to take most convenient path without considering whether it’s the best one. Instead, start by making a plan. This puts you on a…

Pat Shaughnessy 

Updating Ruby Under a Microscope


Ruby stores much of its own internal data in hash tables.

I've started working on a new edition of Ruby Under a Microscope that covers Ruby 3.x. I'm working on this in my spare time, so it will take a while to finish. Leave a comment or drop me a line and I'll email you when it's finished.

In the meantime, here’s an excerpt from a rewrite of Chapter 7 about hash tables. Vladimir Makarov and the Ruby team redesigned Ruby’s hash table implementation back in 2015 to use open addressing, shortly after I published the first edition of RUM. This seemed like a good place to start.

Chapter 7: The Hash Table: The Workhorse Of Ruby Internals

Hash Tables in Ruby3 Saving a Value in…
Evil Martians 

3 smart ways to highlight features for landing pages or launch weeks

Authors: Roman Shamin, Head of Design, and Travis Turner, Tech EditorTopics: Design, Martian Design Sprint, Product Launch

Explore three expert (and underutilized) methods to showcase features on landing pages or during launch weeks, enhance engagement, and boost conversions!

We can highlight our software's value in a number of ways: images, interactive widgets, motion graphics, talking-head walkthroughs, and live product demos—and I believe we’re really underutilizing the latter three. Because in my experience, these methods are incredibly effective at showcasing software features and helping users vividly understand their worth. Let’s explore some inspiring real-life cases to see how you…

zverok's space 

Seven things I know after 25 years of development

This is a loose transcript of a keynote I gave at the EuRuKo conference in September 2024. The video of the talk is here. Unfortunately, I only could talk in recording, but it was a great honor nevertheless. The topic is pretty important to me, so I decided to share a slightly edited transcript for those who prefer text form.

I have been writing software for about ~25 years. For 20 of those, I have been using Ruby as my primary language. I’ve made some contributions to the language and other open source. I write a lot about Ruby, and I maintain the Ruby Changes project, which some of you probably heard of.

I am kind of principal engineer in the US company Hubstaff, but only “kind…

Gusto Engineering - Medium 

API Versioning at Gusto

API Versioning At Gusto

An abstract photograph with layers (metaphor for API versions).

Introduction

Just over two years ago, we introduced date-based versioning to the Gusto API. Since then, we’ve released over ten(!) versions of our public API. And over the past half year, our engineering and technical solutions teams have collaborated closely with our partners to deprecate our ten oldest versions, migrating the majority of our integrations to leverage our latest stable API versions — the most performant, secure, and developer-friendly evolution of our API.

In the changing landscape of payroll and compliance, especially at scale, we future-proof our API by versioning it.

In this post, we’ll share more about our API versioning approach, how we continue to…

Jekyll • Simple, blog-aware, static sites 

Jekyll 4.4.0 Released

Greetings Jekyllers, Jekyll v4.4.0 has been published!

This release comes with the following notable changes since v4.3.x:

  • Liquid tag highlight now allows marking specific lines in the code-block.
  • Allow customizing the port that the vendored livereload script listens to, either via command-line flag --livereload-port NUM or via setting desired value to key livereload_port in configuration file.
  • Acknowledge paths passed to CLI flag --livereload-ignore or list of paths defined under configuration key livereload_ignore in order prevent automatic browser-refreshes on change to those paths.
  • Support for Ruby versions older than Ruby 2.7.0 has been dropped. Regardless, we recommend…
Short Ruby Newsletter 

Short Ruby Newsletter - edition 120

The one about the mythical IO-bound Rails app and where the community debates again the usefulness of Service Objects
Stanko Krtalic Rusendic 

Monitoring ActionCable

A few weeks ago I was woken up with the following message "Hey, devices are randomly disconnecting from WebSockets can you come online and help?".

Usually, when a widespread problem like this occurs out of the blue, my first goal is to make the app mostly operational again and my second goal is to fix the cause of the problem. To do that I usually go over each component that could be causing this to check if it's functioning correctly and then drill down on any components that aren't.

Step one, identify which components could be at fault.

We use Rails' ActionCable for WebSockets. I've done a deep dive into ActionCable in a previous article if you'd like to read more about it.

ActionCabl…
Rails Designer 

Rails link_to_if and link_to_unless

Rails is packed with nifty, small helpers that help you not reinvent the wheel. Every once in a while you remember one that you are sure some of you are not known with.

Today and I want to quickly go over: link_to_if and link_to_unless.

They both act the same as the, probably, known link_to helper, but, as you guessed, allow a conditional.

Basics

The syntax for link_to_if looks like this:

link_to_if(condition, name, options = {}, html_options = {}, &block)

Or with actual values:

<%= link_to_if(Current.user.present?, "Profile", profile_path) %>

This will, if Current.user.present? returns true, render a typical link_to, but if it returns false it will return just the text Profile.

Hotwire Weekly 

Week 04 - Hotwire Native Environment Switching, Stimulus Autocomplete, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

Welcome to this week's edition of Hotwire Weekly! It's been a productive week in the Hotwire community, with plenty of new articles, tutorials, and updates to explore. Dive in and enjoy! 🚀✨


📚 Articles, Tutorials, and Videos

📱 Hotwire Native

Hotwire Native - Switch Environments without having to rebuild the app - Leon Vogt published a first blog post on Hotwire Native and talks about an approach to dynamically switch between different environments (e.g., staging, production) in Hotwire Native applications without rebuilding the app. For both iOS and Android.

Render Devise Forms Natively With This one Neat Hotwire Native Trick - Jess Waites wrote a blog post about…

Closer to Code 

Breaking the Rules: RPC Pattern with Apache Kafka and Karafka

Introduction

Using Kafka for Remote Procedure Calls (RPC) might raise eyebrows among seasoned developers. At its core, RPC is a programming technique that creates the illusion of running a function on a local machine when it executes on a remote server. When you make an RPC call, your application sends a request to a remote service, waits for it to execute some code, and then receives the results - all while making it feel like a regular function call in your code.

Apache Kafka, however, was designed as an event log, optimizing for throughput over latency. Yet, sometimes unconventional approaches yield surprising results. This article explores implementing RPC patterns with Kafka using the

byroot’s blog 

Why Does Everyone Hate fork(2)?

I want to write a post about Pitchfork, explaining where it comes from, why it is like it is, and how I see its future. But before I can get to that, I think I need to explain a few things, namely why in many circles fork is seen as a relic of the past, if not outright the devil’s creation. And yet, it’s ubiquitous in the Ruby ecosystem.

Note that if you have some system programming experience, you probably won’t learn much here.

If you’ve ever deployed a Ruby application to production, it is almost certain you’ve interacted with fork(2) whether you realize it or not. Have you configured Puma’s worker setting? Well, Puma uses fork(2) to spawn these workers, more accurately the Ruby Proces…

RubyGems Blog 

December 2024 RubyGems Updates

Welcome to the RubyGems monthly update! As part of our efforts at Ruby Central, we publish a recap of the work that we’ve done the previous month. Read on to find out what updates were made to RubyGems and RubyGems.org in December. Although December was a slower month as the team enjoyed time off during the holiday season, but we’re happy to share the progress we made nonetheless. Read on for a report of the OSS work we did last month.

Monthly Update changes

We’ll be cutting our reporting on the monthly RubyGems and RubyGems.org GitHub repo summary, in favor of quarterly and annual reports published separately by Ruby Central. These reports will allow us to provide a more expansive view…

Ruby on Rails 

Devcontainers without VSCode, a deprecation and more!

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

Eliminate queries loading dumped model schema on Postgres
This pull request improves resiliency by avoiding the need to open a database connection to load the type map, while defining attribute methods at boot, when a schema cache file is configured on PostgreSQL databases.

Allow passing in a date or time to ActiveSupport::Testing::TimeHelpers#freeze_time
This change allows the #freeze_time testing helper to accept a date or time argument.

    Time.current # => Sun, 09 Jul 2024 15:34:49 EST -05:00
    freeze_time Time.current + 1.day
    sleep 1
    Time.current # => Mon, 10 Jul 2024 15:34:49 EST -05:00

Make column…

SINAPTIA 

This week in #devs - Issue #5

Our #devs channel is a cross-project, shared space where the entire dev team of SINAPTIA can ask questions, share opinions, and discuss interesting articles or tech they come across. The idea is to post a curated extract of what happens there every week.

Rails scaffold generator and admin interfaces

Patricio asked the team:

What do you do immediately after running rails g scaffold ...?

His idea was to challenge the team to think about what a basic scaffold needs to be completely functional without many modifications. Although the scaffold generator is a very powerful tool for admin pages (although a lot of work is needed), most devs tend to use Rails admin generators to do the job.

Remote Ruby 

Sin City Ruby & Testing with Jason Swett

In this episode, Jason, Chris, and Andrew catch up with each other before diving into a conversation with Jason Swett. Jason, an author, speaker, and creator, discusses his monthly snail mail newsletter "Nonsense Monthly" and the upcoming Sin City Ruby conference scheduled for April 2025 in Vegas, Baby! The discussion then shifts to various topics surrounding software testing, including the challenges of test setup, duplication in tests, and the philosophical aspects of tests as specifications. Jason also talks about his latest book, "Professional Rails Testing" and his experiences and insights on consulting and improving technical leaders. Hit download now to hear more!

Honeybadger
Honeybadg…
Rails Designer 

Free Icon Libraries for Rails Apps

Icons are a must in any software app. They will help guide your users quicker through your app. They also might help clean up your UI. Instead of “Open Menu” and “Close Menu” you can use ≡ and × (the “hamburger” is probably the most-known icon on the internet).

Luckily, in 2025, you don’t have to create any icons yourself anymore, because along side many great, commercial libraries there are some truly amazing libraries that are completely free.

I want to list some of them here to list, highlight, and thank them for their existence. Our apps look and work better because of them.

Hericons (300+ icons)

A carefully crafted icon set, with variants from outline to mini and even micro.…

Ruby Rogues 

Exploring Tech Choices and Team Dynamics with Jesse Spivak - RUBY 669

In this episode of Top End Devs, host David Camira is joined by panelists Luke Stutters and John Epperson, along with special guest Jesse Spivak, a senior engineer at Ibotta. Jesse shares his experiences and insights from a challenging project at Ibotta, where he navigated through four critical mistakes. These included choosing the wrong technology, siloing work, falling into premature optimization, and making too many changes at once. Jesse explains how these mistakes jeopardized the project but ultimately led to valuable learning experiences. The conversation also touches on the importance of discussing and learning from mistakes openly, the complexities of transitioning to new…
Giant Robots Smashing Into Other Giant Robots 

Introducing the Noisy Animals kata

The Noisy Animals code kata is a programming exercise designed to teach principles of improving bad code. The exercise consists of:

  • around one page of bad code that generates animal noises (dogs go “woof”, cats go “meow”, etc)
  • tests that verify the behaviour of the code for every supported animal
  • some reflection questions for before and after attempting to improve the code
  • some new requirements to be implemented that affect how the reader might want to organise the code
  • hints for making progress when stuck
  • discussion of ideas in the refactoring community

It is written in Ruby. The code and instructions are all in the github repository.

Inspiration

The exercise owes a…

The Rails Changelog 

029: Tuning Ruby on Rails App Performance with Jean Boussier

In this episode, Jean Boussier and I dive deep into performance optimisation for Ruby on Rails applications. From diagnosing common bottlenecks and mastering advanced caching techniques to leveraging YJIT, jemalloc, and server concurrency models, we explore practical strategies for scaling apps efficiently. We also discuss key metrics for monitoring production performance, cost-effective observability, and modern Rails patterns to embrace or avoid. Perfect for developers looking to take their Rails performance game to the next level!

Ruby and Rails Conference: wroclove.rb 11–13.04.2025 Wrocław, Poland

Try Mailtrap for free
Rails Guide: Tuning Performance for Deployment
Nate Berkopec:…

Awesome Ruby Newsletter 

💎 Issue 453 - Adding button loader to Turbo-powered forms

byroot’s blog 

Instrumenting Thread Stalling in Ruby Applications

In my previous post about how IO-bound Rails applications really are, I pointed at a common pitfall, how CPU starvation can look like slow IOs.

start = Time.now
database_connection.execute("SELECT ...")
query_duration = (Time.now - start) * 1000.0
puts "Query took: #{query_duration.round(2)}ms"

In the above example, the instrumentation tells you how long it took for the database to answer your query, but may also include the time needed for the Ruby thread to re-acquire the GVL, or perhaps the Ruby GC to run, or even the operating system’s scheduler to resume the process.

Thankfully, in recent years Ruby added some new APIs that help measure these things.

GC.total_time

Database…

Ruby Weekly 

Jean's epic journey to optimize Ruby's JSON parsing

#​735 — January 23, 2025

Read on the Web

Ruby Weekly

Ruby Next: Transpile Modern Ruby Code to Run on Older Versions — An interesting way to get Ruby code written with the latest syntax to run on older versions or alternative implementations (like mruby or Opal, say). This playground shows off the basic idea, and this could be useful for library maintainers or anyone who wants to experiment. GitHub repo.

Vladimir Dementyev

Optimizing Ruby’s JSON — Rails core team member Jean concludes a seven-part series going super deep into efforts made to significantly boost the performance of Ruby’s json library,…

byroot’s blog 

The Mythical IO-Bound Rails App

I want to write a post about Pitchfork, explaining where it comes from, why it is like it is, and how I see its future. But before I can get to that, I think I need to explain a few things.

When the topic of Rails performance comes up, it is commonplace to hear that the database is the bottleneck, so Rails applications are IO-bound anyway, hence Ruby performance doesn’t matter that much, and all you need is a healthy dose of concurrency to make your service scale.

But how true is this in general?

Conflating scale and performance

First, it is true that when scaling a Rails application, the first major bottleneck you will encounter will generally be the database.

Rails, like the…

Benito Serna 

Fixing a bug in my lateral joins queries with rails

I have some posts about using lateral joins in rails to fetch the “top N” of each record. Some months ago Ben Sheldon helped me see a performance problem on the queries that I was using.

Here I try to explain the problem, the solution proposed by him, and also an introduction about a tool he published to build this kind of “top N” queries using lateral joins.

The problem

In his words, “The outermost condition of the association (e.g. WHERE user_id IN ($1, ...)) doesn’t get pushed down in the current query. This leads to the lateral join being applied to all records before the condition is applied.”

The EXPLAIN helps to see this problem. This is the example that has the problem:

class Us…
John Nunemaker 

Ruby on Rails Podcast: Taking over Fireside.fm

I was stoked when I discovered that the Ruby on Rails podcast is hosted on our platform – fireside.fm. So I reached out to Elise for feedback and to volunteer Garrett and I for an episode.

We recorded last week and its already live today. Our chat covered taking over an outdated Rails app and all the progress we've made modernizing it the past few months. We even threw in a few stories of battle scars earned.

Enjoy!

P.S. It's been 5 years since I was last on the rails pod (Brittany Martin was the host).

Ruby Central 

Ruby Central Welcomes New Board Members & Announces Officer Appointments

Ruby Central Welcomes New Board Members & Announces Officer Appointments

Ruby Central is excited to announce the appointment of two new board members and the election of four new officers to our Board of Directors. These appointments come at a pivotal time for the organization as we embark on the search for a new Executive Director and continue to expand both our Open Source Program and community development initiatives.

Our new board members include Freedom Dumlao and Naijeria Toweett.

Freedom Dumlao is a seasoned technology executive with experience at leading companies like Vestmark, Flexcar, Zipcar, Wayfair, and Amazon. Currently the CTO of Vestmark, Freedom brings strategic insights that will help drive Ruby Central’s efforts to expand the Ruby ecosystem and…

Evil Martians 

Martian Kubernetes Kit: running apps—and running them well

Authors: Ilya Cherepanov, Site Reliability Engineer, Kirill Kuznetsov, Head of SRE, and Travis Turner, Tech EditorTopics: Ops, Site Reliability Engineering, Full Cycle Software Development, Backend Development, Kubernetes, Prometheus, Docker, Amazon Web Services, Google Cloud Platform, Continuous Integration, Grafana, Heroku, Terraform, Helm

In this article, we’ll talk about the process of deploying and managing a real-world application on a Kubernetes cluster using the Martian Kubernetes Kit

This is part 3 of the “Martian Kubernetes Kit” series, our Kubernetes-based infrastructure we developed for our clients drawn from years of experience. Now, it’s time for stuff to get real, for the…

The Ruby on Rails Podcast 

Episode 531: Taking Over Fireside with John Nunemaker & Garrett Dimon

This year, I want to expand the show in a new direction. I want to hear from startups and companies that are building with Rails. Today's episode feature John Nunemaker and Garrett Dimon who recently acquired Fireside.fm, the podcast hosting platform we use for this show. We talk about what it's like taking over a Rails app that was under different ownership!

Show Notes

  • [p3.dev](op3.dev)
  • [verygoodsoftware.company](verygoodsoftware.company )
  • [flippercloud.io](flippercloud.io)
  • [John's Website](johnnunemaker.com)
  • [Garrett's Website](garrettdimon.com)
justin․searls․co - Digest 

📸 New paper answers whether ChatGPT makes you lazier

Apple Intelligence summary of the abstract, which I couldn't be bothered to read:

A study comparing learners' motivations, self-regulated learning processes, and performance with different support agents (AI, human expert, writing analytics, or none) found no difference in motivation but significant differences in learning processes and performance. While AI support improved essay scores, it may also promote dependence and "metacognitive laziness."