Rubyland

news, opinion, tutorials, about ruby, aggregated
Sources About
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…

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…

Hashrocket - Ruby Posts 

How To Rev Up Your Rails Development with MCP

Shipping new features on legacy Rails applications requires deep codebase context. The rails-mcp-server gem closes the gap between AI agents and your Rails projects, enabling more relevant code analysis and context aware refactoring suggestions. Whether you're dealing with tech debt in a brownfield application or building new greenfield features, this tool can help you move faster with confidence.

The Model Context Protocol (MCP) is a way to allow LLM models to interact with development environments and external tools. The rails-mcp-server gem is a Ruby implementation that enables LLMs to interact directly with Rails projects through MCP; Once you have it set up with an agent like…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Top Open Source Rails CRM Solutions for Businesses 2026

Customer Relationship Management (CRM) systems are the lifeblood of modern businesses. They consolidate customer data, track interaction patterns, automate workflows, and convert everyday touchpoints into meaningful growth opportunities. For companies looking to scale sustainably while staying in control of their data and customisation, open-source CRMs built on Ruby on Rails offer a compelling balance of flexibility, developer friendliness, and long-term cost efficiency.

This guide highlights the leading open-source Rails CRM platforms of 2025, outlines the pros and cons for businesses, and provides practical advice for organisations…

Why Open Source Rails CRM…

Saeloun Blog 

How to Clean Up Your Rails Logs: Ignoring Benign SQL Warnings

Introduction

Database warnings are a fact of life in production systems. They’re not errors—the query executes successfully—but they signal something worth investigating. The problem is that when warnings accumulate, they become noise. We end up ignoring them entirely, which defeats the purpose. Rails 7.1 introduces a pragmatic solution: the ability to selectively ignore SQL warnings using error codes.

The Problem

Before this change, Rails treated SQL warnings as a binary concern i.e either we saw them all, or we didn’t.

Consider a typical production scenario: we’re running an upsert operation that occasionally triggers a duplicate key warning. It’s expected behavior and the application…

Ruby Magic by AppSignal 

Completing, Integrating, and Publishing Our Game with DragonRuby

In part one of this series, we started developing a simple Flappy Bird clone game using the DragonRuby game development toolkit. We didn't come very far, though — we stopped after integrating player input to keep our plane afloat.

In this second and concluding part, we'll implement the remaining simple game mechanics. We'll also take a brief look at interfacing with an HTTP server and publishing our game on itch.io.

Scene Management

Let's continue developing the game by adding a condition for terminating it ("game over"). Whenever the plane collides with an obstacle or drops out of the bottom of the screen, the game should abort and give feedback to the player.

For simplicity, let's start…

RubyGems Blog 

4.0.0.beta2 Released

RubyGems 4.0.0.beta2 includes deprecations, enhancements and bug fixes and Bundler 4.0.0.beta2 includes features, 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.0.beta2

RubyGems Release Notes

Deprecations:

  • Deprecate comparing Gem::Version objects with strings. Pull request #9085 by tenderlove

Enhancements:

  • Undeprecate Gem::Version#<=> against strings. Pull request #9110 by byroot
  • Installs bundler 4.0.0.beta2 as a default gem.

Bug fixes:

  • Respect BUNDLE_VERSION config at Gem::BundlerVersionFinder.…
BigBinary Blog 

Debugging a Stack Overflow in Rails 7.2.1.1

A few weeks ago, after upgrading NeetoCal fromRails 7.1.5.2 to Rails 7.2.1.1, we started seeing mysterious crashes inproduction with the error message SystemStackError: stack level too deep.

Identifying the problem

The crash happened inside Slots::SyncAllCalendarsService, a service that syncsmultiple calendars concurrently using the Async gem. What made it particularlypuzzling was that switching from Async::Barrier to Thread.new made the errordisappear. This led us down a rabbit hole thinking it was an Async-specificissue.

The stack trace pointed to a strange location:

activerecord (7.2.1.1) lib/arel/visitors/to_sql.rb:898:in `each'  from lib/arel/visitors/to_sql.rb:898:in `each_with_index' …
Fullstack Ruby 

Don’t Make Me Think Principle, Testing, and Intuitive Expectations

A new extension to Minitest Expectations by yours truly is the perfect illustration for this philosophy of programming.

A shorthand for how I think about the design of new APIs, whether I’m working on the Bridgetown web framework or another library, is a principle I’ve come to call Don’t Make Me Think. (DMMT)

DMMT plays out in many ways. Sometimes you might compare it to the Principle of Least Astonishment (or Surprise), but ultimately I think it’s more about the vibes, man and taste born of experience than any pat technical explanation. The aforementioned Wikipedia article also links to some other interesting and related principles such as Do What I Mean (DWIM) and that old chestnut…

When it comes to…

BigBinary Blog 

Debugging a Stack Overflow in Rails 7.2.1.1

A few weeks ago, after upgrading NeetoCal fromRails 7.1.5.2 to Rails 7.2.1.1, we started seeing mysterious crashes inproduction with the error message SystemStackError: stack level too deep.

Identifying the problem

The crash happened inside Slots::SyncAllCalendarsService, a service that syncsmultiple calendars concurrently using the Async gem. What made it particularlypuzzling was that switching from Async::Barrier to Thread.new made the errordisappear. This led us down a rabbit hole thinking it was an Async-specificissue.

The stack trace pointed to a strange location:

activerecord (7.2.1.1) lib/arel/visitors/to_sql.rb:898:in `each'  from lib/arel/visitors/to_sql.rb:898:in `each_with_index' …
Judoscale Dev Blog 

Process Utilization: How We Actually Track That

Over the last few months we’ve published a couple of articles talking about our new “Utilization”-based autoscaling option. The first talked through the use-cases for this new option — when it’s useful and who it’s for (“Autoscaling: Proactive vs. Reactive”). The second was a bit more nitty-gritty, explaining the high-level concept for how we’re tracking this ‘utilization’ metric (“How Judoscale’s Utilization-Based Autoscaling Works”)…

This post is the nerdy sequel to the latter: the actual boots-on-the-ground / nuts-and-bolts of how we attempted to track process utilization, how that proved to be a bad setup, and the clever idea that lead us to a way better v2. This is the story…

Evil Martians 

Unparser: real life lessons migrating Ruby tools from Parser to Prism

Authors: Yaroslav Kurbatov, Backend Engineer, and Travis Turner, Tech EditorTopics: Open Source, DX, Ruby

A deep dive into Ruby parsing and unparsing, the transition from the Parser gem to Prism for Ruby 3.4 support, and how tooling adapts to evolving AST formats using Unparser as a case study.

Ruby 3.4 ships with Prism, a new built-in parser that’s faster, more portable, and designed to be the foundation for the coming generations of Ruby tooling. This shift affects everything that works with Ruby’s syntax: linters, formatters, IDEs, analyzers, and more. We’ll explore some weird Ruby, what Prism brings to the Ruby ecosystem, then use Unparser to show what the transition from Parser to Prism…

Saeloun Blog 

Rails 8 enhances ActiveStorage::Blob#open to work without a block

Rails applications frequently handle large files through ActiveStorage. These files could be CSVs exported from customer dashboards. They could be PDFs uploaded by support teams. They could be image files for generating thumbnails.

Effective management of these temporary files is essential. This is especially true when they need to remain available for extended periods. It is also important when they are used across multiple stages of an import process.

Until recently, ActiveStorage::Blob#open required a block. The temporary file would be automatically deleted once the block finished execution. While this ensured cleanup, it posed limitations for complex workflows.

A recent update to…

Rails Designer 

Black Friday/Cyber Monday deal 2025

This year, just like last year, I offer a nice 30% off on both Rails Designer’s UI Components and JavaScript For Rails Developers. 🤑

Enter BFCM2025 on check out to get a nice 30% off on both products! The coupon is valid until the 2nd of December.

Enjoy it! 🎉


While you are here, let me highlight some of the cool OSS projects I have been working on:

Perron

Static Site Generator for Ruby on Rails. It is pretty cool and already some good-looking websites are built with it. I recently added a feature to automate content generation using data files (like CSV and JSON) which is great for things like programmatic SEO (the secret of many SaaS companies out there).

Attractive.js

A…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 158

The one where Ruby releases 4.0.0.preview2, Maedi proposes a new supported syntax for defining types, and 12 podcast episodes are published
The Bike Shed 

484: The Season 1 Recap

Our Bike Shed trio check back in with one another to follow up on some topics that caught their attention over the course of season 1.

Sally covers her time working with React over the last few months and the challenges it still presents to her workflow, Joël goes back over typescripts and the benefits he’s found when debugging, and the cast reflect on the first season as a whole, what they liked, what went well and what they’d like to improve on for season 2.

You can read up on some of the topics mentioned in this episode here - Constructive vs Predictive Data - Aji’s Keynote - Aji’s Recommended Keynote from 2022

Your hosts for this episode have been thoughtbot’s own Joë…

Nithin Bekal 

Review: Airpods Pro 2 with Android

I’ve been using the Airpods Pro 2 with an Android phone for the past few months. Recently, I came across the Librepods project, which aims to unlock Apple exclusive features available for Android users. This requires rooting the phone, so I’m too keen on installing it, but I was curious about what I’m missing, which prompted this post.

This review is about 3 years too late, because the newer Airpods Pro 3 are already out. But most of these observations are about using the Airpods Pro 2 with Android, which should mostly also apply to the newer generation.

I’ve avoided the Airpods Pro 2 in the past because they have a reputation of not working too well with Android. But after using it for 3…

Blogs on Noel Rappin Writes Here 

Ruby And Its Neighbors: Lisp

So, after writing two articles basically assuming what Ruby’s influence are, it occurred to me to check the About Ruby page on the official Ruby site.

It says this:

Ruby is a language of careful balance. Its creator, Yukihiro “Matz” Matsumoto, blended parts of his favorite languages (Perl, Smalltalk, Eiffel, Ada, and Lisp) to form a new language that balanced functional programming with imperative programming.

We’ve already talked about Perl and Smalltalk. I don’t know much about Eiffel or Ada, though I assume Eiffel inspired some of Ruby’s object structure somehow. Ada is perhaps the most statically typed language in existence and it’s hard to see how it could have possibly influenced…

Giant Robots Smashing Into Other Giant Robots 

Querying encrypted data in Rails using Deterministic Encryption

Encrypting data is straightforward in most Rails apps; however, once it’s encrypted, querying it can be complex. Rails 7 introduced deterministic encryption, which addresses this problem by allowing you to query encrypted fields while still keeping data secure.

What is Deterministic Encryption?

Deterministic encryption is an encryption method that produces the same ciphertext for identical plaintext inputs when using the same key. This predictability enables querying encrypted data, unlike standard encryption, which produces different ciphertexts for the same input each time.

Why use Deterministic Encryption?

There are cases where you need to query encrypted data. Here are…

Weelkly Article – Ruby Stack News 

🚀 Ruby 4.0.0 Preview2 is Here!

November 24, 2025 Ruby keeps evolving, and the 4.0.0-preview2 release is packed with exciting changes. If you love clean code, emojis, and a little bit of magic in your programming, this one’s for you. What’s New? 💎 Nil Gets Smarter nil.to_a no longer surprises you, just like nil.to_hash. Less magic, more clarity. 🔗 Bindings Refined … Continue reading 🚀 Ruby 4.0.0 Preview2 is Here!

Hotwire Weekly 

Week 47 - Hotwire Native Deep Dive, Version Gates, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

SupeRails: CSS Container Queries. Breakpoints Based on Parent Container Width, Not Browser - Yaroslav Shmarov demonstrates how CSS container queries let components switch layouts based on the width of their parent element instead of the full browser.

Update Favicon with badge using Custom Turbo Streams in Rails - Rails Designer shows how to dynamically add a badge counter to your favicon via a custom update_favicon Turbo Stream action. When notifications arrive, the favicon changes e.g., from icon.svg to icon-unread.svg.

Hotwire Native deep dive: Push Notifications - …

Ruby Rogues 

The New Era of Rails: Markdown, Offline Mode, and Smarter Dev Tools - RUBY 681

In this solo episode, I sit down to unpack my thoughts on DHH’s RailsWorld keynote and what it means for those of us building modern Rails apps. There’s a lot to love about Rails right now — from the push toward simplicity and reducing needless complexity to powerful new features landing in Rails 8.1 like Markdown rendering, offline mode, structured events, push notifications, and more. I also dive into some of the deployment and infrastructure ideas DHH shared, including Kamal, Omarchi, and the “broad toolchain” philosophy that’s shaping the future of Rails.

I also share my own experiences with deploying Rails apps using Kamal, my thoughts on the microservices vs. monolith debate, and why…
Tim Riley 

Continuations 2025/47: Everything is a guide

  • One week since Hanami 2.3 and I’m already deep in the throes of site preparation, just as I hoped.

  • The biggest change I made this week was to streamline the documentation structure within the site.

    Previously we had separate concepts for “guides” vs “docs”, due to the different shapes of material we’ve been moving in from the Hanami and Dry sites. It was becoming clear this distinction wasn’t going to lead to a bad user experience, so now everything is a guide; some will be about higher-level concepts, while others will be focused on a single gem only.

    To make this work, I also finessed our versioning setup, allowing guides to be versioned by their overall project (like Hanami’s) or…

justin․searls․co - Digest 

✂️ The Software Project Lifecycle

Your browser does not support the video tag.

How it goes. How it always goes.

Sam Saffron's Blog - Latest posts 

The age of personalized software

Over the past few months, I have been struggling with the Hyprland screen‑share dialog (hyprland-share-picker via xdg-desktop-portal-hyprland).

Under the hood, Chromium / OBS talk to xdg-desktop-portal, which hands off to xdg-desktop-portal-hyprland. That launches hyprland-share-picker (a Qt dialog) which uses the hyprland-toplevel-export-v1 protocol to offer windows and screens.

When I am on a call with people I want to quickly share a screen with them, I am confronted with a rather confusing UI:

  • By default it selects the “Screen” tab, which I almost never want
  • On the “Window” tab I get a non-visual list of window names that are hard to decipher
  • There is this whole “restore token”…

The “old way” of dealing with this kind of pain was:

justin․searls․co - Digest 

🎙️ Breaking Change podcast v47 - Turbinately Ill

Direct link to podcast audio file

Had a little pep in my step this time. Maybe it's because I decided to start recording after 7 AM for once. Maybe it's because I can finally fucking breathe out of my nose holes.

Tell me about what you do while you continue to draw breath at podcast@searls.co.

Things you can read if you're bored:

Noteflakes 

OSS Friday Update

Note: while my schedule is quite hectic these last few weeks, I’ve taken the decision to dedicate at least one day per week for developing open-source tools, and henceforth I plan to post an update on my progress in this regard every Friday evening. Here’s the first update:

UringMachine Grant Work

As I wrote here previously, a few weeks ago I learned I’ve been selected as one of the recipients of a grant from the Ruby Association in Japan, for working on UringMachine, a new gem that brings low-level io_uring I/O to Ruby. For this project, I’ve been paired with a terrific mentor - Samuel Williams - who is the authority on all things related to Ruby fibers. We’ve had a talk about…

SINAPTIA 

Ruby Argentina November meetup

On November 13th, the Ruby Argentina community concluded the current year’s agenda of meetups. 2025 was an amazing year for the group, marked by the flow of speakers and sponsors, as well as the organization’s mechanics for each event. The 100% online events, which opened the field to speakers from around the world, such as Jason Swett and Rosa Gutierrez from Basecamp, are all remarkable achievements for the community. Props to the organization team and their fantastic work.

The main talk was given by Fernando E. Silva Jacquier, bringing his point of view about “Expressive coding”, the pros and cons of writing code in a more human way, and the importance of understanding what happens under…

Planet Argon Blog 

Introducing Commit Goods: Official Merch for the Open Source Community

Introducing Commit Goods: Official Merch for the Open Source Community

Hold on to your (open source-inspired) hats! A new merch shop celebrating your favorite tools is LIVE!

Continue Reading

Ruby on Rails: Compress the complexity of modern web apps 

This Week in Rails: November 21, 2025

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

Add support for per-adapter migration strategy
You can now set migration_strategy on individual adapter classes, overriding the global ActiveRecord.migration_strategy. This allows individual databases to customize migration execution logic:

class CustomPostgresStrategy < ActiveRecord::Migration::DefaultStrategy
  def drop_table(*)
    # Custom logic specific to PostgreSQL
  end
end

ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.migration_strategy = CustomPostgresStrategy

Make explain accept hash format syntax
This PR changes EXPLAIN clause building for MySQL and PostgreSQL adapters to accept options in hash…

Remote Ruby 

Rails Business with Brendan Buckingham and Ryan Frisch

In this episode of Remote Ruby, Chris and Andrew have a lively conversation with Brendan Buckingham and Ryan Frisch from the Rails Business Podcast. They discuss their experiences and journeys with Ruby on Rails, starting from their early encounters with the technology to hosting a specialized Rails podcast. Critical technical topics are covered, including managing Stripe API data integrity, upgrading Rails applications, and using modern JavaScript tools like Turbo Frames and Turbo Streams. Brendan and Ryan also share how and why they started the Rails Business Podcast, the power of small community events, and how following your own frustrations often leads to the best product ideas. Hit…

André Arko 

Operating Rails: what about after you deploy?

This post was originally given as a talk at Rocky Mountain Ruby. The slides are also available.

Welcome! This is meant to serve as an introduction to deployment and operations for newer developers, but it’s also a checklist that I refer back to even after 20 years of deploying Rails apps to production. What needs to be covered when going to production the first time? What needs to be covered when going to production for the 1000th time?

Before we get into those details, let me introduce myself. I’m André Arko, better known as @indirect on the internet. My biggest Ruby claim to fame is leading the Bundler and RubyGems OSS team for the last 15 years or so. Ruby Central recently kicked out…

Ruby Weekly 

An early look at Ruby 4.0 and RubyGems 4.0

#​776 — November 20, 2025

Read on the Web

Ruby Weekly

Ruby 4.0.0 Preview 2 Released — I never saw a preview 1, but following Matz’s announcement of Ruby 4.0 two weeks ago at RubyWorld, we get an early release to play with – here’s an initial set of release notes covering the changes introduced so far, which we'll focus on more in future issues.

Yui Naruse

💎 RubyGems 4.0.0 Beta 1 has also been released.

Active Maintenance: We Take Care of Your Rails App — With Rails LTS Active Maintenance we handle upgrades, tests, and performance so your team can focus on building. Reliable, secure, and always up to…

Ra…

Once a Maintainer 

Identifying unmaintained open source packages at scale

Open source software often comes out of a developer solving their own problem and giving the solution away to the community. Sometimes this surfaces as a one-time code dump, but more commonly the original developer sticks around to maintain their work, adding features and fixing bugs. Eventually the original developer may no longer be interested in continuing to maintain a package, at which point it is either taken over by other contributors or abandoned.

Detecting abandoned packages is important because an abandoned package may not receive security fixes. It also may not receive compatibility patches for new versions of the underlying language or other packages. Some packages are explicitly…

Saeloun Blog 

Rails makes error reporting tests easier in Rails 7.1

Introduction

Rails continues to refine its built-in error handling tools. Testing error reporting behavior has become more precise with new testing utilities introduced in Rails 7.1.

Rails 7.1 brought us assert_error_reported and assert_no_error_reported. These additions make our test suites more expressive and align better with Rails testing conventions.

Rails 8.1 takes this further with capture_error_reports. This latest addition gives us even more control when we need to verify error details like messages and context.

Before

Before this change, verifying that an error was reported through Rails.error.report was not straightforward.

We often relied on mocks or indirect test…

Glauco Custodio 

New in Rails 8.1: Bring Your Favorite Editor to Error Pages

Rails 8.1.0 (released on October 22, 2025) brings a new feature that allows you to open the file that caused the error in your favorite editor.

To enable this feature, you need to set either EDITOR or RAILS_EDITOR environment variable with the path to your editor, for example:

# .bashrc / .zshrc
export RAILS_EDITOR="cursor"

Then, when you are taken to the error page, click on the pencil icon to open it in your editor:

Demo: opening file from error page in Rails 8.1

A new ActiveSupport::Editor class has been added to handle the editor functionality, check the pull request for more details.

Saeloun Blog 

Building Personas for B2B Consultancy Websites

When we started designing for B2B consultancy websites, we realized one thing quickly: not every visitor is the same. Some people come to learn, others to compare options, and a few already know what they want. To design something that connects with all of them, we needed to understand who they are and what they care about. That’s where building personas comes in.


Why Personas Matter

A persona is a simple profile that represents a group of users with similar goals, needs, and behavior patterns. It helps you see your website through their eyes instead of your own.

For B2B consultancies, personas are especially important because the buying process is longer and more layered. There are…

Rails Designer 

Update favicon with badge using custom turbo streams in Rails

In a previous article I showed how to update the page title with a counter using custom Turbo Stream actions. That works great when you can see the tab. But what about when the tab is just one of many? Or pinned and showing only the favicon?

This article extends that solution by adding a visual badge to the favicon itself. Same approach, same clean API, just a different target.

As always the code can be found on GitHub. It will look something like this:

Creating the favicon update action

The favicon update follows the same pattern as the title counter. The view sets the initial favicon based on the message count:

 <% content_for :title, @count.positive? ? "#{@count} • Messages" :…
RubyGems Blog 

4.0.0.beta1 Released

RubyGems 4.0.0.beta1 includes security, breaking changes, deprecations, features, performance, enhancements and documentation.

To update to the latest RubyGems you can run:

gem update --system

To install RubyGems by hand see the Download RubyGems page.

Security:

  • Bump up vendored URI to 1.0.4. Pull request #9031 by hsbt

Breaking changes:

  • Removed deprecated -C option from gem build. Pull request #9088 by hsbt
  • Removed deprecated Gem::Specification#has_rdoc, has_rdoc= and has_rdoc?. Pull request #9084 by hsbt
  • Removed deprecated gem query command. Pull request #9083 by hsbt
  • Removed deprecated Gem::DependencyInstaller#find_gems_with_sources. Pull request #9082 by hsbt
  • Remov…
Schneems - Programming Practices, Performance, and Pedantry 

Disallow code usage with a custom `clippy.toml`

I recently discovered that adding a clippy.toml file to the root of a Rust project gives the ability to disallow a method or a type when running cargo clippy. This has been really useful. I want to share two quick ways that I’ve used it: Enhancing std::fs calls via fs_err and protecting CWD threadsafety in tests.

Update: you can also use this technique to disallow unwrap()! There’s also unwrap_used which you use by adding #![deny(clippy::unwrap_used)] to your main.rs.

std lib enhancer

I use the fs_err crate in my projects, which provides the same filesystem API as std::fs but with one crucial difference: error messages it produces have the name of the file you’re trying to…

Planet Argon Blog 

Team Favorites: Books That Inspired Us This Year

Team Favorites: Books That Inspired Us This Year

We collected a roundup of dev, design, leadership, and marketing books that inspired our work and challenged our thinking this year.

Continue Reading

Evil Martians 

Vibecoding tools can learn from design UX and win over everyone

Authors: Arthur Objartel, Product Designer, and Travis Turner, Tech EditorTopics: Design, DX, AI, Design for devtools

Tools like Bolt, Dazl, and Lovable are leading the charge with AI coding tools. But there are design patterns that can improve vibecoding workflows even more, reducing friction, and elevating AI tool UX into intuitive, creator-friendly experiences that appeal to users on a massive scale.

For developers working on vibecoding tools, the only way to become profitable is to actually ditch the "vibecoding" paradigm and refocus on developing "the ultimate creation tool", cracking open the mass consumer market in the process. We can look to the world of design for 5 insights and…

The Bike Shed 

483: Comparing notes on note-taking

Joël and Sally compare various note taking styles as they set out to find which ones work best for them.

The pair break down the different ways of formatting their notes and what they’re used for, Sally explains her struggles with note taking in general and the work arounds she’s found to achieve similar results instead, and Joël provides a small update on his book as he examines the different use cases for all his notes.

Thanks to our sponsors for this episode Judoscale - Autoscale the Right Way (check the link for your free gift!), and Scout Monitoring.

Read about Joël’s note taking in depth through his thoughtbot blog posts - Blog 1 - Blog 2

Your hosts for this episode…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

How to Create and Work With Date Objects in Ruby on Rails

Handling dates is one of the most essential tasks in any real-world Ruby on Rails application. From storing birthdays and appointment times to generating reports and scheduling automated jobs, date and time manipulation is everywhere. Fortunately, Rails provides a clean, developer-friendly interface for creating, formatting, manipulating, and storing Date, Time, and DateTime objects.

This article offers a complete, practical guide on how to create and work with date objects in Ruby on Rails. Whether you are a beginner building your first Rails project or an experienced developer looking to sharpen your date-handling skills, this guide covers…

Why Dates Matter in Rails Applications

Before diving into the how-to, it’s important to…

Giant Robots Smashing Into Other Giant Robots 

Presenting at tiny ruby on Friday, November 21, 2025!

This Friday, on November 21st, Sarah Lima and Louis Antonopoulos will be presenting at the tiny ruby conference in Helsinki, Finland.

If you’re attending, we’d love to talk to you about Ruby, Rails, what it’s like to work with (or at) thoughtbot, or, really, anything you like!

Presentations

Sarah

Revisiting Booleans in Ruby

Sarah will talk about how Ruby interprets truth, looking beneath the surface at how booleans are actually built inside the interpreter, and how these internals influence the way developers should model objects in real Ruby applications.

Louis

Unlocking the Rubetta Stones: Translating a Hoard of Ancient Tablets with Ractors and AI

justin․searls․co - Digest 

📄 TDD is more important than ever

Lately, I've been reminded of the heady days of my agile youth by how often I've found myself asking, "how will we test this?"

As I've mentioned frequently on podcasts and recent Q&As about AI, an odd paradox has emerged in the software industry:

  1. Developers experienced in agile engineering practices like test-driven development tend to be among the most skeptical of AI code generation, often citing fears that software quality is being thrown out the window
  2. Developers experienced in agile engineering practices like test-driven development tend to be among the most successful at building great software with coding agents, often citing creative techniques enabling agents to verify the…

In the late 2000s, I always knew I was talking to a solid programmer if their first question upon being handed a complex task was to ask, "how will we test this?" Agile developers learned back then that liter…

Weelkly Article – Ruby Stack News 

Mastering Ruby’s Object Model and Metaprogramming in Rails:

November 18, 2025 How to Build Flexible, Scalable, and Maintainable Systems** By Germán Alberto Silva (senior Rubyist since 2005) Ruby is often described as an elegant, expressive language—but few developers understand how deeply powerful its object model truly is. And nowhere does this power matter more than in Ruby on Rails applications operating at scale, … Continue reading Mastering Ruby’s Object Model and Metaprogramming in Rails:

Hashrocket - Ruby Posts 

Some Thoughts About Claude Code

Claude code is a powerful AI toolset that runs right in your terminal. While providing a lot of impressive utility, it also suffers from the issues that arise from similar AI toolings with the addition of an expensive pricing model.

Context is Important

To me, the main selling point for Claude Code is its ability to read through your entire codebase; a big shortcoming of many AI workflows is the model only partially understanding an issue due to it not having enough of the project's context and convention to be effective. Claude Code has the ability to access all of the files in the directory where you initiated the session, and can even ask for permission to search through extraneous…

justin․searls․co - Digest 

📸 Downdetector is down

When half the websites I visited wouldn't load this morning, I figured I'd check downdetector to see if Cloudflare was down, but I couldn't. Because Cloudflare was down.

Distributed systems sound great, but the way the industry rushed to crown a handful of winners like AWS and Cloudflare had the net effect of merely increasing the number of single points of failure in the chain.

Pat Shaughnessy 

Compiling Ruby To Machine Language

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.

Here’s an excerpt from the completely new content for Chapter 4, about YJIT and ZJIT. I’m still finishing this up… so this content is fresh off the page! It’s been a lot of fun for me to learn about how JIT compilers work and to brush up on my Rust skills as well. And it’s very exciting to see all the impressive work the Ruby team at Shopify and other contributors have done to improve Ruby’s runtime performance.

Chapter 4: Compiling Ruby To Machine Language

Interpre…
GoRails Screencasts 

Module extend self

Using extend self inside a Ruby module makes all of its instance methods callable directly on the module itself, which is useful when you want a collection of utility-style methods without needing to instantiate an object.
justin․searls․co - Digest 

📸 Live Captions for Audible books in iOS 26

I've wanted to start listening to books for Japanese practice in addition to just reading them, but the lack of an easy way to quickly understand a particular word always limited my ability to understand and enjoy it.

With iOS 26, the Live Captions Accessibility feature can be set to a number of languages (including Japanese) and routed to the system audio instead of the microphone. So while Amazon would be happy to sell you a "Whisper" license for both audiobook and ebook in order to get a less useful version of this functionality, your iOS device can just passively be building a transcript of the book for you to review as you listen. There's even a "Copy Transcript"…

justin․searls․co - Digest 

✂️ Creating static Instagram Stories as Wisps

Your browser does not support the video tag.

Fun little demo of this weekend's project. I recently shipped Becky a way to ship auto-expiring stories from Beckygram that would in turn syndicate to Instagram via POSSE Party, which was pretty straightforward since her site is an actual honest-to-god Rails app. But justin.searls.co is a static site with no backend component. I accomplished the same thing by creating a new media type for the blog called "wisps".

What you're looking at in this demo:

  • A new single-page app that takes S3 & GitHub API keys and uploads new posts from mobile
  • Uses Straight-to-Video to compress the story for Instagram and create a…
Ruby News 

Ruby 4.0.0 preview2 Released

We are pleased to announce the release of Ruby 4.0.0-preview2. Ruby 4.0 updates its Unicode version to 17,0.0, and so on.

Language changes

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

Core classes updates

Note: We’re only listing notable updates of Core class.

  • Binding

    • Binding#local_variables does no longer include numbered parameters. Also, Binding#local_variable_get and Binding#local_variable_set reject to handle numbered parameters. [Bug #21049]
  • IO

    • IO.select accepts +Float::INFINITY+ as a timeout argument. [Feature #20610]
  • String

    • Update Unicode to Version…

Standard Library updates

Note: We’re only listing notable updates of Standard librarires.

  • ostruct 0.6.1
  • pstore 0.2.0
  • benchmark 0.4.0
  • logger 1.7.0
  • rdoc 6.13.1
  • win32ole 1.9.2
  • irb 1.15.2
  • rel…

Compatibility issues

Note: Excluding…

Hotwire Weekly 

Week 46 - Herb v0.8, Inline Edit Custom Element, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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

The first San Francisco Ruby Conference 2025 is happening next week. It features some Hotwire-adjacent talks:

Marco will be attending, come say hi if you are attending as well!


📚 Articles, Tutorials, and Videos

Herb v0.8.0.pngHerb v0.8 Feature Summary

What's new in Herb v0.8 - Marco Roth published a post on the Herb Blog detailing the new features in Herb v0.8. It's a…

Tim Riley 

Continuations, 2025/46: Hanami 2.3!

  • This was release week! Last week I’d already prepared the changelogs, and over the weekend I made better progress with documentation than I expected, so I moved the release forward to this week.

    I spent Monday and Tuesday nights preparing the release announcement, Wednesday night powering through docs updates, and then (even later) on Wednesday night I shipped Hanami 2.3!

  • Thanks to our helpful early adopters, during the week I was able to squash a few more bugs: a circular require warning, some incorrect wording that made its way into the README, proper handling of large db structure dumps (this one arising due to our change to filter out variable lines from those dumps in memory), and d…

RubySec 

GHSA-4249-gjr8-jpq3 (prosemirror_to_html): ProsemirrorToHtml has a Cross-Site Scripting (XSS) vulnerability through unescaped HTML attribute values

### Impact The prosemirror_to_html gem is vulnerable to Cross-Site Scripting (XSS) attacks through malicious HTML attribute values. While tag content is properly escaped, attribute values are not, allowing attackers to inject arbitrary JavaScript code. **Who is impacted:** - Any application using prosemirror_to_html to convert ProseMirror documents to HTML - Applications that process user-generated ProseMirror content are at highest risk - End users viewing the rendered HTML output could have malicious JavaScript executed in their browsers **Attack vectors include:** - `href` attributes with `javascript:` protocol: `` - Event handlers: `
` - `onerror` attributes on images: `` -…
Posts on Kevin Murphy 

Don't REST on your Laurels

RESTful Routes 🔗

You can find many resources trumpeting the benefits of following RESTful routes in the context of a Rails application. I want to focus on my personal favorite benefit:

Adherence to the default RESTful actions creates a constraint, and is a noticeable heuristic, that aids in limiting the surface area of classes.

Planting an example 🔗

Let’s say we have an application that tracks people’s accomplishments. We call each instance of an accomplishment a laurel wreath. We love ourselves a metaphor.

class LaurelWreathsController < ApplicationController def show @laurel_wreath = LaurelWreath.find(params[:id]) endend

This is one of the mappings of HTTP verb and URL to controller action that…

danielabaron.me RSS Feed 

Pretty SQLite Output Persistently

Learn how to improve SQLite's default query output for better readability in Rails 8, where SQLite is now a serious option for production apps thanks to Solid Queue, Solid Cable, and Solid Cache.
Alchemists: Articles 

Git History

Cover
Git History

Other than your Git repository storing your source code, the second most valuable source of information is your commits which chronicle the evolution of your codebase. Your commits are a treasure trove of information — when well written — because they allow you to:

  • Achieve Second-Order Thinking by having the long tail of thought in order make forward thinking decisions.

  • Have well thought out Code Reviews. Even better, mentorship is built in by default because your code review’s Git history allows less experienced engineers have a chance to level up and learn from more experienced engineers.

  • Automate the generation of release notes and versions based on your curated…

This is made possible by using git log to view and search your commit history. So let’s learn more about the seemingly humble git log command.

Setup

To get started, copy and paste the following script in your console to…

Nithin Bekal 

Obsidian Bases: Formula for star ratings with half stars

I recently started using Obsidian and have been enjoying the Bases feature, which lets you create database-like views using structured notes.

I have a bunch of movie ratings in my notes, and I wanted to display them as stars rather than numbers. The ratings are stored as properties on the notes:

type: [[Movies]]
rating: 4

Now that I have this data, it’s easy to create a view by querying for notes of type: [[Movies]], and adding ratings as one of the properties.

Movie ratings table in Obsidian with numeric ratings

I wanted star ratings to make this easier to read. I came across this article by Tyler Sticka with a formula for star ratings:

'⭐⭐⭐⭐⭐'.slice(0, rating).split('').map(icon('star'))

Here’s how it looks:

Movie ratings table in Obsidian with star icons

This works for…

Ruby Central 

Ruby Central Weekly Update – Friday, November 14, 2025

As we head toward the end of the year, this will be our final weekly update before we return to our monthly newsletter cadence. This change allows our small but mighty team to focus time and attention on producing more in-depth, thoughtfully prepared communications.

A reminder that Board of Directors applications remain open through November 21, 2025. We encourage community members from all backgrounds to apply and take part in shaping Ruby Central’s future.

As a U.S.-based organization serving a global Ruby community, we welcome board applicants from anywhere in the world. Three of our six current board members are internationally based, and we remain committed to global representation.

Open…

Ruby on Rails: Compress the complexity of modern web apps 

Rails Luminary 2025, dynamic rate-limiting options, performance optimizations and more!

Happy Friday! This is Greg, bringing you the latest changes from the Rails codebase.

The 2025 Rails Luminary nominations are open.
If you know of someone who has consistently gone above and beyond to contribute to the framework, triaging bugs, improving performance, adding helpful features or documentation, creating or maintaining gems, etc. please nominate them for the 2025 Rails Luminary Award by Dec 3.

Remove explicit –config from RuboCop binstub templates
By removing the explicit config flag from the RuboCop binstub templates, this change allows RuboCop’s cascading config feature to work properly, enabling subdirectory-specific configurations.

Enhance rate limiting to support dynamic …

Ruby Rogues 

Keeping Ruby Welcoming: A Conversation We Need to Have - RUBY 680

In this solo episode, I open up about what’s been going on behind the scenes with Ruby Rogues and why you’ve been hearing more solo shows from me lately. Between new full-time work, family life, and shifting schedules among the panelists, it’s been a wild stretch — but I’m committed to keeping the show coming to you every week. From there, I dive into something that’s been on my mind for a while now: the health of the Ruby community and what Minaswan really means in 2024.

I reflect on the growing cultural and political tensions I’ve seen spill into technical spaces and why I believe our community is stronger when we focus on behavior, kindness, and collaboration rather than labels and…
honeyryder 

Context: the missing API in ruby logger

Over the last few years, I’ve spent quite a significant chunk of my “dayjob” time working on, and thinking about, observability in general, and logging in particular. After a lot of rewriting and overwriting, “don’t repeat yourself” and coping with ecosystem limitations, I figured it was time to write a blog post on the current state of the art of logging in ruby, what I think it’s missing and what I’m doing about it.

What is logging?

(skip this section if you’re above being lectured about what’s logging again).

Logging is one of those fundamental features of any type of program you use. At a high level, it keeps a record of what a program is and has been doing, be it error messages, or…

Ruby on Rails: Compress the complexity of modern web apps 

Nominate a 2025 Rails Luminary

Rails is the framework it is today thanks to the work of over 7,000 contributors who have shaped the framework through countless lines of code, features, fixes, and ideas.

The Rails Luminary Awards exist to celebrate those contributions, acknowledging those in the community who have significantly advanced Rails for the benefit of all.

If you know of someone who has consistently gone above and beyond to contribute to the framework, triaging bugs, improving performance, adding helpful features or documentation, creating or maintaining gems, etc. please nominate them for the 2025 Rails Luminary Award.

All nominations will be reviewed by Rails Core, and the final pick of Rails Luminaries…

Remote Ruby 

Managing Open Source with Nate Berkopec

In this episode, guest Nate Berkopec joins Chris and Andrew to discuss the current state and cultural controversies surrounding Ruby Gems, Bundler, and open-source projects in general. The conversation dives into the split within the Ruby community, the complexities of maintaining key projects, and the challenges of funding and sustaining open-source work. Nate shares his experiences with Puma and his philosophy on community-driven contributions and project ownership. The episode also explores broader issues such as the feasibility of getting paid for open-source work, the role of corporate sponsorship, and the need for more inclusive participation in maintaining and evolving open-source…

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. It has been available since Rails 7.1 and continues to work in Rails 8.x.

This post explores how Execution Strategies work and demonstrates…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Rails form_for vs form_with: Developer’s Complete Guide

For over a decade, form_for was the cornerstone of form-building in Ruby on Rails. Introduced in Rails 2.0, it offered a clean, model-centric API that automatically handled URLs, HTTP methods, and parameter scoping.

Then, in Rails 5.1, form_with arrived — not as a replacement, but as a unified evolution. By Rails 7.0, form_for and form_tag were officially deprecated.

Today, in 2025, form_with is the only supported form helper — and it’s more powerful, flexible, and future-ready than ever.

This is the complete guide every Rails developer needs to:

  • Understand the why behind the change
  • Migrate legacy form_for code safely
  • Master modern form patterns
  • Build production…

Understanding form_for in Ruby…

The form_for…