Rubyland

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

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…

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

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…

Compatibility issues

Not…

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…

Weelkly Article – Ruby Stack News 

💎 Unless: The Ruby Way to Not Say No

November 13, 2025 Sometimes, the smallest details in a language reveal the biggest lessons. Recently, during a code review, someone suggested I change this: if !name.nil? puts "Name exists" end to this: unless name.nil? puts "Name exists" end At first, it looked like a minor stylistic tweak. But in Ruby, style often carries philosophy. 🧠Continue reading 💎 Unless: The Ruby Way to Not Say No

Planet Argon Blog 

Reflections from LeadDev 2025: Power, Clarity, and the Future of Engineering Leadership

Reflections from LeadDev 2025: Power, Clarity, and the Future of Engineering Leadership

Our Engineering Manager brought back some delightful insights from LeadDev 2025. Here are the highlights and the lessons leaders can apply to working with their own teams.

Continue Reading

GoRails 

Black Friday 2025 Sale

I've been a bit quiet the last few months since we had our second baby on the way. Everyone's happy and healthy and I've been enjoying some time off with the family. 👨‍🍼

I wanted to share our Black Friday deals early this year since I've got my hands full with the new baby.

Here's what's on sale for 2025:

36% off the GoRails yearly plan ($144/year)

Stay up to date with Rails 8.1, Hotwire, and more with a GoRails subscription. This works out to only $12/mo to master Ruby on Rails which is a great deal.

$50 off the Learn Hotwire course

Early this year, we launched the Learn Hotwire course and it got some incredible feedback. It's the most comprehensive and up-to-date course on Hotwire…

Ruby Weekly 

Ruby 4.0 is on the way

#​775 — November 13, 2025

Read on the Web

Ruby Weekly

Photo used with the kind permission of Koichiro Ohba

Ruby 4.0 is arriving this year!

The RubyWorld conference took place in Japan last week and amongst all the fun and frivolity (photo above), Matz made a variety of statements (summarized in this X post) with the most interesting one being that earlier mentions of Ruby 4.0 weren't merely an April Fools joke: Ruby 4.0 will be released this year.

The imminent arrival of Ruby 4.0 (most likely at Christmas, as is the tradition) has been officially reflected by being announced in the latest docs, as well as yesterday's…

Leve…

Saeloun Blog 

Rails 8 adds conditional allow_nil and allow_blank in model validations

We often need validations that adapt dynamically to the state of a model. At the same time, we want to avoid duplication and keep our code DRY. Rails 8.1 introduced the ability to pass a callable to allow_nil and allow_blank, giving us exactly that: validations that are conditional and easy to maintain.

In this post, we’ll explore this feature through a book publishing workflow. Imagine a Book model with attributes like isbn and status. Draft books are treated differently from published ones, and we want a validation setup that is clear, concise, and maintained in a single place.

Before

In older Rails versions, allow_blank could not be conditional. We duplicated validations to express…

Closer to Code 

Announcing YARD-Lint: Keep Your Ruby Documentation Solid

TL;DR: YARD-Lint catches documentation issues, just like RuboCop for code. Star it and use it now.

I am happy to announce the release of YARD-Lint, a comprehensive linter designed for YARD documentation in Ruby and Rails projects. This gem is now available as open-source.

# In your Gemfile
gem 'yard-lint'

For those who are not familiar, YARD (Yet Another Ruby Documentation) is a documentation tool for Ruby that employs structured tags like @param, @return, @raise, and @example to describe methods with precision that machines can read.

Here's an example of linting in practice:

# Reverses the contents of a String or IO object.
#
# @param content [String, #read] the contents to reverse
#…
Rails Designer 

Inline editing with custom elements in Rails

How would you tackle this feature in a typical Hotwired Rails app: a HTML-element (like this h1) gets editable on click and when focus is removed, the record is updated.

Inline editing demo

How about I tell you, it is done using just this HTML:

<editable-content url="<%= post_path(@post) %>">
  <h1 name="post[title]">
    <%= @post.title %>
  </h1>
</editable-content>

<div>
  <%= simple_format @post.content %>
</div>

Yes! 🤯 It is made possible using a custom element: editable-content. It is part of a little experimentation phase of custom elements I am currently in.

In this article I want to show how you can create such a custom element. As always the code can be found here.

What are custom elements?

justin․searls․co - Digest 

📸 My lucky day

What are the odds?*

*The odds are 1 in 1.7 million

The Rails Tech Debt Blog 

The Hidden Dangers in Your Gemfile: Supply Chain Attacks in RubyGems

The beauty of Ruby’s open source ecosystem lies in its simplicity: add a gem, and you instantly gain powerful new features. But this same convenience can also expose your application to hidden threats. In recent years, attackers have increasingly targeted the supply chain, where dependencies, not code you write, become the weakest link. This post explores how supply chain attacks happen in RubyGems, gives real-world examples, and practical ways to protect your Rails projects.

What Is a Supply Chain Attack?

A supply chain attack occurs when malicious code is injected somewhere in your dependency tree, often through a gem you install, or a dependency of that gem. You trust your gems to…

Ruby Magic by AppSignal 

Rendering Samples with Showcase for Ruby on Rails

In parts one and two of this series, we familiarized ourselves with the ins and outs of Showcase.

Now, we'll dive into samples, Showcase's main feature. Samples show how a component can be used in a real application.

Samples in our Ruby App

In our case, we have two samples, one for a small button and one for a large button:

Showcase button samples

Let's look at how the samples are rendered. We'll add one sample back to our preview file:

<%# test/dummy/app/views/showcase/previews/components/_button.html.erb %>

<% showcase.badge :partial, :component %>
<% showcase.description "Button is our standard element for what to click on" %>

<% showcase.sample "Large", description: "This is our larger button" do %>
  <%=…
Hanami 

Hanami 2.3: Racked and Ready

Today we are excited to announce Hanami 2.3! With this release, we unlock Rack 3, introduce resource routes, and deliver dozens of quality-of-life improvements that make building with Hanami smoother than ever.

Built for Rack 3

We are excited to bring Rack 3 support to Hanami! We now support both versions 2 and 3, so you can use whichever version of Rack suits your situation. We encourage you to upgrade Rack when you can, and we’re happy that Hanami can help you on this path.

When you upgrade to Rack 3, check out the Rack 3 upgrade guide. Hanami already handles the essential changes for you, but you may need to update your app code if you’re working with…

Noteflakes 

You Win Some, You Lose Some: on Papercraft and more

In the last few weeks I’ve been busy with a few different projects, and I guess I’m not the only freelancer who has trouble finding their work-life balance. That is, in the last few weeks life has been hitting me in the face, and it was a bit overwhelming. But I still did manage to make some progress on my work, and thought I might share it here.

Papercraft Update

Since releasing Papercraft 3.0, I’ve been busy preparing a talk on Papercraft for Paris.rb. To me this was a major undertaking, since I’ve near-zero experience doing conference talks, and for me this was a test of my writing abilities, as well as my talking abilities. More on that in a moment.

I also managed to release a few…

Rails Blocks - Component Updates 

4 New Rails UI Components sets Released

Added banner, loading indicator, scroll area, and stepper components for multi-step forms.

Components in this release:

View full changelog →

Ruby on Rails: Compress the complexity of modern web apps 

SerpApi joins Rails Foundation as a Contributing member

Today we welcome a new Contributing member of the Rails Foundation: SerpApi.

Founded in 2017, SerpApi enables developers and companies to scrape search engine results from platforms like Google, Amazon, and others, returning structured data in a clean and easy-to-use JSON format.

We at SerpApi have used Rails since our earliest days. I’m grateful for how easy it is to maintain and improve our product with it. I’m also inspired by how Rails helped make the MVC pattern a global standard in web development.

Illia Zub, Operations Engineer, SerpApi

SerpApi’s API, frontend, and background jobs all run on Ruby on Rails. Their app is a majestic monolith, deployed on a cluster of AWS EC2…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 156

The one where Ruby 4.0 is announced, where Namespace is renamed to Ruby::Box and deep_freeze is under discussion
The Bike Shed 

482: Labels for our job

Joël and Sally analyse their job titles as they try to figure out exactly which borrowed labels best define their work at thoughtbot.

Together they break down the components of commonly used titles such as engineer, architect and consultant to see which element reflects their work best, how they would describe their roles at thoughtbot, which industries they’d draw from if they came up with their own titles, and what does Lil Wayne have to do with all this?

For a deeper dive into today’s episode consider checking out Hillel Wayne’s post “Are we really engineers?” and Henrik Kniberg’s article on Minimal Viable Products.

Thanks to our sponsors for this episode Judoscale -…

RubySec 

GHSA-vfpf-xmwh-8m65 (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: `` -…
justin․searls․co - Digest 

🔗 RIP iPhone 18 Air

Wayne Ma and Qianer Liu say we'll have to wait to see a sequel to iPhone Air, but The Information provides literally nothing beyond this headline outside their paywall:

Apple Delays Release of Next iPhone Air Amid Weak Sales

But does one truly need to fork over $399 to know exactly what the body of the article is going to say?

All you need to know is that Justin Searls loving an Apple product is effectively the kiss of death in the Tim Cook era:

2015: 12" MacBook, my all-time favorite Mac, cancelled after two revisions
2018: HomePod, of which I bought six at launch, never sold through its initial manufacturing run
2020: iPhone mini, my all-time favorite iPhone, cancelled after one revision…

Gusto Engineering - Medium 

The Tech Stack Behind Gusto’s Ruby on Rails Platform

Gusto with Ruby on Rails

At Gusto, Ruby on Rails has been the foundation of our platform since 2012. Rails doesn’t run alone, though. It’s supported by a rich ecosystem of tools and technologies that help us build, deploy, and scale reliably. This post takes you through the stack that powers our application and keeps Gusto running smoothly for millions of customers.

A diagram showing the tech stack of Gusto: Ruby since 2012, Rails, Sorbet, PackwerkA diagram showing the tech stack of Gusto: Karafka, Sidekiq, Ghost, Kafka, Redis, Postgres, MySQL, GraphQLA diagram showing the tech stack of Gusto: Cursor, Homebrew, Mise, Colima, Danger, Buildkite, Knapsack, Rubocop, AWS

Our stack has evolved over the years, but the core principle remains the same: choose technologies that help us move fast while maintaining reliability and quality. We hope this look inside our infrastructure gives you some insight into how we build and scale at Gusto. If this is exciting to you, we would love to hear from you!


The Tech Stack Behind…

SINAPTIA 

What’s actually slow? A practical guide to Rails performance

For the last couple of months, we’ve been building an observability tool that we intend to use internally in our AI-powered solutions. One of the features we wanted to work on was slow action detection, but… What makes an action slow? It’s one of those questions that sounds simple but gets interesting fast. Let’s break it down.

What users actually experience

When a request hits your Rails app and a response goes back, that total time is just a portion of what users experience. Server response time is crucial, but it’s only one piece of perceived performance:

  • Network round-trip matters. Your app might respond in 100ms, but if the user is on a slow connection or geographically far from…
Evil Martians 

Payment form best coding practices that don't drop sales

Authors: Evgeniy Valyaev, Frontend Engineer, and Travis Turner, Tech EditorTopics: Developer Products, JavaScript

Learn how to optimize payment forms with frontend techniques to reduce abandonment and increase conversion rates. From performance optimization to UX design, discover actionable strategies that can boost conversion by up to 35%.

Revenue is won or lost at checkout. Up to 70% of carts are abandoned, and every 100ms of latency can cut conversion by ~1%. That said, customers aren't abandoning payments, they're actually abandoning poor payment form design. In this post, (inspired by insights from our work with clients) we present an exhaustive guide to practical frontend improvements…

Pat Shaughnessy 

YARV’s Internal Stack and Your Ruby Stack

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 content of Chapter 3, about the YARV virtual machine, hasn't changed much since 2014. However, I did update all of the diagrams to account for some new values YARV now saves inside of each stack frame. And some of the common YARV instructions were renamed as well. I also moved some content that was previously part of Chapter 4 here into Chapter 3. Right now I'm rewriting Chapter 4 from scratch, describing Ruby's new JIT compilers.

Chapter 3: How Ruby Executes Your…

Mintbit 

ActiveJob Continuations: Handling Jobs in Rails

When building applications that require long-running background jobs, interruptions and restarts are inevitable. Whether due to server restarts, manual interventions, or just the natural limitations of background job queues, you need a way to make sure jobs can resume from where they left off.

Enter ActiveJob::Continuable — a module in Rails that provides a mechanism for interrupting and resuming jobs. By enabling continuations, you can ensure that long-running jobs continue to make progress even across application restarts.

What is ActiveJob Continuation?

ActiveJob’s continuations allow you to break a job into steps, each of which can be paused and resumed later. This is useful for jobs…

Nithin Bekal 

Moving form Logseq to Obsidian

I switched to Obsidian for note taking this week, after over 3 years of using Logseq. Despite loving Logseq’s outliner format, I’ve found the app, especially the mobile app, to be slow and frustrating to use. If you’re looking to choose between the two, I hope the notes below help you see some of the tradeoffs.

I considered Obsidian and Notion. I like Notion’s features and polish, but Obsidian won because it uses local markdown files, just like Logseq. If I decide to move to another app, the migration should be as easy as this one.!

My Obsidian layout

Migrating the notes

Logseq and Obsidian both use markdown files to store notes, so the migration isn’t particularly complicated. You can even point…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Top Ruby on Rails Hosting Providers for Your Apps in 2025

In 2025, Ruby on Rails remains one of the solid, scalable, and developer-friendly frameworks for ruby on rails application development. Its lean, convention-over-configuration approach and rapid development turn freelancer developers, startups, or enterprises into Backbone.js fans around the world.

But how fast and reliable an application is depends big time on where it is hosted. The hosting provider you opt for can be the reason behind the great speed of your application, its uptime, and scalability.

With the advancement of cloud, containerization, and DevOps, in 2025, it’s easier and more flexible than ever to host Ruby on Rails…

Tim Riley 

Continuations, 2025/45: Releasemas eve

Hotwire Weekly 

Week 45 - Debugging Hotwire Native, CSS Highlights API, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

Debugging Hotwire Native - Native Logging - William Kennedy walks through how to enable and investigate logging inside Hotwire Native iOS/Android apps, helping to trace web view visits, message sending, adapter lifecycle events.

High-Performance Syntax Highlighting with CSS Highlights API - Pavitra Golchha shows how to ditch token-wrapping <span>s and instead leverage the CSS Custom Highlight API to style code by creating Range objects and registering them with CSS.highlights. The result: far fewer DOM nodes, lower memory overhead, faster…

The Dark Art of Designing for Dark Mode - Glynnis Ritchie on the Flagrant Blog explores the subtle…

Left of the Dev 

My go-to prompt for legacy code exploration

Old software systems can be scary. Learn their quirks and conventions with some agentic assistance.
justin․searls․co - Digest 

🎙️ Breaking Change podcast v46 - Adjusted Gross Intelligence

Direct link to podcast audio file

I'm back and I'm angry. My power went out, which caused my Internet to go down, which broke my favorite mug. And that's just the shit that happened before 7 AM. By 9 AM my doorbell was continuously chiming for no fucking reason.

Join me in the struggle. We shall persevere. Tell me how your morning went by writing in to: podcast@searls.co.

Here 4 U:

okayfail.com (feed for #tech) 

In Praise of dhh

A reflection on Ruby’s past, present, and future.

This is a long essay. I strongly recommend you read it from the beginning, but to help navigate it I have created this table of contents.

Prologue

I never met him, but I liked him. He was cool.

He could be arrogant, and brash. He was maybe a little too self-satisfied. But on the whole I would say he was someone I admired, someone I looked up to. He was a role model.

David…

Ruby Central 

Ruby Central Update Friday 11/7/25

Thank you for staying engaged as we move forward together. We value your feedback and encourage your input at every step. Next week, we will share one more Friday update, after which our Open Source and README newsletters will resume on their previous schedule.

Your questions, submitted via the asynchronous Q&A form, will continue to guide our content and conversations. We are excited about next year’s live events and look forward to sharing all the details in the coming weeks.

Applications Open: Ruby Central Board of Directors

We are inviting applications for two open Board of Directors seats, starting with the new year. Our board guides the strategic direction of both Ruby Central and the…

Ruby on Rails: Compress the complexity of modern web apps 

Keep your passwords secure, one way or the other

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

Add :algorithm option to has_secure_password
Active Model’s has_secure_password now supports different password hashing algorithms.

Add built-in Argon2 support for has_secure_password
Building on top of the previous PR, you can now add gem "argon2" and then call has_secure_password algorithm: :argon2. Unlike BCrypt’s 72-byte restriction, Argon2 has no password length limit.

New guides for Rails Engines
After months of rewriting, the brand new Rails Engines guides are live!

Support international characters in humanize
Calling ActiveSupport::Inflector.humanize("аБВГДЕ") now correctly returns “Абвгде”.

RubySec 

CVE-2025-12790 (mqtt): MQTT does not validate hostnames

A flaw was found in Rubygem MQTT. By default, the package used to not have hostname validation, resulting in possible Man-in-the-Middle (MITM) attack.
RubySec 

GHSA-52c5-vh7f-26fx (prosemirror_to_html): 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: `` -…
Ruby Weekly 

Another epic bug hunt

#​774 — November 6, 2025

Read on the Web

Ruby Weekly

When Your Hash Becomes a String: Hunting Ruby's Million-to-One Memory Bug — This is genuinely a bug hunting epic that involves Ruby, C, the garbage collector, FFI, and a lot of perseverance. If you enjoy such quests, this is a worthy read that shows just how much timing and chance can contribute to a bug.

Maciej Mensfeld

Ruby and Its Neighbors: Smalltalk — Noel continues his tour of languages that influenced Ruby with what many consider the most influential: Smalltalk.

Noel Rappin

🤖 How Ready Is Your Team for AI-Assisted Development? — AI…

katafrakt’s garden 

Integrating Pagy with Hanami (2025 edition)

Back in 2018 I wrote a post about connecting Hanami (then 1.x) and Pagy gem together. My verdict was not that favorable. I had to write quite a lot of glue code to make it work and perhaps the worst thing was that I had to pass the request object to the template to make it work.

However, things have changed since then:

  1. Hanami is now 2.3, its persistence layer is more mature, based on ROM and allows to fall back to almost-bare-Sequel via relationsLooking back, perhaps it was already possible in 2018, but I took the wrong approach? Hard to tell now. I don’t want to go back to these old versions to verify..
  2. Pagy released version 43 this week. It’s advertised as a complete rewrite of its…

We needed a leap version to unequivocally signaling that it’s not just a major version: it’s a complete redesign of the legacy code at all levels, usage and API included.

There’s no better time to take it for another spin then!

The code

I quickly spun up a fresh Hanami app,…

Judoscale Dev Blog 

Scaling Sideways: Why You Might Want To Run Two Production Apps

We’re really trying to optimize for our public website’s performance for SEO reasons…

…was the core theme of our meetings with one of our customers a few weeks ago. They run a Rails application with several different ‘sectors’ — a public website, two different user portals, and an admin ‘backend’ with several internal tools. It’s not an extremely complex application, but it is diverse in its traffic. After chatting with them for a few hours, we had a great solution ready for them — one we use ourselves but feel isn’t talked about enough! Running a second prod app.

A simple diagram showing two boxes and an arrow between them, the first being “prod”, the second being labeled “Also prod?” And the title “Scaling Sideways” above both

👀 Note

Did you know that we love meeting and chatting performance, strategies, and…

Ruby Magic by AppSignal 

An Introduction to Game Development with DragonRuby

The DragonRuby Game Toolkit is a powerful, cross-platform 2D game engine that allows you to create fun game titles while staying in your favorite developer-friendly language. What's not to love?

In this post, we are going to cover the basics of game development with DragonRuby. We will use a "Flappy Bird" clone to explain the fundamental concepts.

But before we get started, let's address two initial concerns you might have about DragonRuby right off the bat.

Initial Concerns

First of all, DragonRuby is not free. Yes, that's correct, it costs money — at the time of writing, the standard license is a one-time purchase of $48. Given that you get a state-of-the-art 2D graphics engine boxed with…

Rails Designer 

Update page title counter with custom turbo streams in Rails

A few weeks ago I helped someone start their first SaaS. It was a really cool, small problem for a specific niche that would made for a great small business. They already are serving the first handful of customers. But I digress… The main view of the app was a list of records. And as the app would be perfect to have in your “pinned tabs”, a counter with new records was a good feature to add.

This article goes over how easy this can be done with a (custom) Turbo Stream in Rails. I have written about custom turbo streams before, but did not touch upon how to cleanly write them yourself.

It will look something like this:

Notice how the title updates with the message count?

As always the…

All about coding 

RSpec and `let!`: Understanding the Potential Pitfalls

This is not a new topic; various resources have addressed it in different ways. Here are my reasons and explanations for why I prefer not to use 'let!' in RSpec.

When I work on a project that uses RSpec, I prefer not to use let!. Instead, I call the let variable inside the before block.

RSpec.describe Thing do    let(:precondition) { create(:item) } before     precondition   end it 'returns that specific value' do     # do   # expect   end  end

Taking it a step further, if you do not need to reference precondition in your tests, you can do this instead:

RSpec.describe Thing do    before     create(:item)   end it 'returns that specific value' do     # do   # expect   end  end

First what does let!

Felipe Vogel 

My first Hacktoberfest

Until last month, I was a Hacktoberfest skeptic. Then, I did Hacktoberfest for the first time.

In past years, I stayed away from it because I didn’t see value (either for me or for maintainers) in contributing a few PRs to projects that I may never think about again once the month was over.

But this year, I took a completely different approach: I used the month to form a habit of open-source contributing.

How to start a habit with Hacktoberfest

  1. I looked through participating…

RubySec 

CVE-2025-64501 (prosemirror_to_html): 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: `` -…
naildrivin5.com - David Bryant Copeland's Website 

Discussing Brut on Dead Code Podcast

I recently got to chat with Jared Norman on the Dead Code Podcast. We talked mostly about Brut, but also a bit about hardware synthesizers and looptober.

If you want to know about more about why Brut exists or its philisophical underpinnings, check it out!

Blogs on Noel Rappin Writes Here 

Ruby And Its Neighbors: Smalltalk

Last time, we talked about Perl as an influence on Ruby, this time, we’ll talk about the other major influence on Ruby: Smalltalk.

Smalltalk had a different kind of influence, since almost nothing of Smalltalk’s syntax made into Ruby. But many of the details of how objects work are directly inspired by Smalltalk, including the idea that every piece of data is part of the object system.

Also unlike Perl, I spent a good couple of years working in Smalltalk, and it is one of my favorite languages that I’ll never likely use in anger again.

(A Personal) History of Smalltalk

Smalltalk originated in the same Xerox PARC team that invented the windowed interface, ethernet, and the laser printer, and…

Posts on Kevin Murphy 

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

Second Best 🔗

The “Live From The Pyre” videos they’ve been releasing to accompany the tracks on the new album have been treats.

Full Lyrics

What do I do to be better for you?
And your hands and tears are all lost, to the wind

Sympathy Magic 🔗

Florence’s voice is other-worldly. Powerful. Angelic. Haunting.

Full Lyrics

So I don’t have to be worthy
I no longer try to be good
It didn’t keep me safe
Like you told me that it would
So come on, tear me wide open
‘Til I’m losing my mind
‘Til I…

Schneems - Programming Practices, Performance, and Pedantry 

Upgrade to Puma 7 and Unlock the Power of Fair Scheduled Keep-alive

Puma 7 is here, and that means your Ruby app is now keep-alive ready. This bug, which existed in Puma for years, caused one out of every 10 requests to take 10x longer by unfairly “cutting in line.” In this post, I’ll cover how web servers work, what caused this bad behavior in Puma, and how it was fixed in Puma 7; specifically an architectural change recommended by MSP-Greg that was needed to address the issue.

Keep reading in the Heroku blog post.

justin․searls․co - Digest 

🔗 Software is supply-constrained (for now)

Fantastic write-up by Nowfal comparing AI's current moment to the Internet's dial-up era. This bit in particular points to a cleavage that far too few people understand:

Software presents an even more interesting question. How many apps do you need? What about software that generates applications on demand, that creates entire software ecosystems autonomously? Until now, handcrafted software was the constraint. Expensive software engineers and their our labor costs limited what companies could afford to build. Automation changes this equation by making those engineers far more productive. Both consumer and enterprise software markets suggest significant unmet demand because businesses have…

Planet Argon Blog 

Conversations Shaping Planet Argon's LIVE Webinar Series

Conversations Shaping Planet Argon's LIVE Webinar Series

Three short talks. Three clear lessons: monitor what matters, automate the tedious, and migrate without stress.

Continue Reading

katafrakt’s garden 

Eglot, Ruby LSP and StandardRB

I use Doom Emacs as my main coding editor, and eglot for language server shenanigans. My config is mainly optimized towards Elixir, so for Ruby I was mostly using the default Doom’s Ruby module. It worked pretty well for me.

The main hurdle was always projects not using Rubocop. I prefer StandardRB, because I don’t like bike-shedding, and their defaults are really good for me. But in the absence of .rubocop.yml file, Doom tried to use default Rubocop settings for linting, instead of detecting StandardRB. In the past, I worked around this by replacing rubocop-mode with standard-mode, but recently Doom’s maintainer decided to go full-on with Ruby LSP for formatting and linting, so I had to…

Fortunately, Ruby LSP supports…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 155

The one with Rails 8.1.1 release, where Jean Boussier does a deep dive into frozen string literals, where San Francisco Ruby is two weeks away, and Tropical On Rails launched the tickets.
The Bike Shed 

481: Dev Horror Stories

Joël and Sally grab a flashlight to share some scary dev stories with each other to celebrate spooky season.

Sally tales the tale of the missing production database, Joël flees from some corrupted data, and each recall instances of haunted code and heart stopping moments from projects gone wrong.

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

If you’re ever in Amsterdam consider checking out Joël’s museum recommendation.

Your hosts for this episode have been thoughtbot’s own Joël Quenneville and Sally Hall.

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

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Upgrading Ruby on Rails Applications: A Step-by-Step Guide

Upgrading Ruby on Rails applications – A step-by-step guide. It’s also one of the most impactful long-term investments your business can make to its web applications. Every new major Rails version brings meaningful improvements — performance, security, new features, developer productivity, and more. However, updating an existing Rails application is not always as simple as it sounds. Older dependencies, deprecated APIs, and complex business logic are a few of the reasons for this. However, upgrading your rails app does not have to be a pain, and with good preparation and attention to detail, the process might be reasonably easy. With this…

Schneems - Programming Practices, Performance, and Pedantry 

Learn How to Lower Heroku Dyno Latency through Persistent Connections (Keep-alive)

Before the latest improvements to the Heroku Router, every connection between the router and your application dyno risked incurring the latency penalty of a TCP slow start. To understand why this is a performance bottleneck for modern web applications, we must look at the fundamentals of the Transmission Control Protocol (TCP) and its history with HTTP.

Keep reading in the heroku blog post.

Pat Shaughnessy 

Compiling a Call to a Block

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.

This week's excerpt is from Chapter 2, about Ruby's compiler. Whenever I think about it, I'm always suprised that Ruby has a compiler like C, Java or any other programming language. The only difference is that we don't normally interact with Ruby's compiler directly.

The developers who contributed Ruby's new parser, Prism, also had to rewrite the Ruby compiler because Prism now produces a completely different, redesigned abstract syntax tree (AST). Chapter 2's outline is…

Closer to Code 

When Your Hash Becomes a String: Hunting Ruby’s Million-to-One Memory Bug

Every developer who maintains Ruby gems knows that sinking feeling when a user reports an error that shouldn't be possible. Not "difficult to reproduce", but truly impossible according to everything you know about how your code works.

That's exactly what hit me when Karafka user's error tracker logged 2,700 identical errors in a single incident:

NoMethodError: undefined method 'default' for an instance of String
vendor/bundle/ruby/3.4.0/gems/karafka-rdkafka-0.22.2-x86_64-linux-musl/lib/rdkafka/consumer/topic_partition_list.rb:112 FFI::Struct#[]

The error was because something was calling #default on a String. I had never used a #default method anywhere in Karafka or rdkafka-ruby. Suddenly,…

Gusto Engineering - Medium 

Designing for Flow: How Leaders Create the Conditions for Team Productivity

This post is part of our Engineering Productivity Series, where engineers and leaders from Gusto share how we approach productivity — not as working faster, but as creating the conditions for meaningful, sustainable work.

In this final installment, Tara explores how leadership can empower productivity — by building environments of clarity, trust, and alignment where teams can thrive together.

A group of hikers wearing backpacks climbs a steep, rocky mountain slope under a cloudy sky, moving together toward the summit.Photo by Mathias Jensen on Unsplash

As a People Empowerer (what we call Engineering Managers @ Gusto), I used to think productivity was about helping engineers work faster.
Now I see it’s about helping them work freer, reducing cognitive friction so energy goes where it matters most.

Leaders don’t write…

Avo's Publication Feed 

Deterministic Mesh Gradient Avatars in Rails

Let's learn how to add visually appealing deterministic mesh gradient avatars to Rails applications
Avo's Publication Feed 

Mesh Gradient Avatars in Rails

Let's learn how to add visually appealing mesh gradient avatars to Rails applications
Julik Tarkhanov 

What does “intuitive” even mean?

Two remarkable posts on HN today: the new release of Affinity is now free and Canva-subsidized and Free software scares normal people

There is a bit to unpack as to why these two are related: the first is about Affinity, which is a remarkable and very feature-complete suite of applications for graphics, and the other is about Handbrake having an “intimidating” UI. The two are in perfect connection, for an important reason: we often parade “intuitiveness” as a virtue, but with applications that are tools very few people take the effort to unpack what that coveted intuitiveness is. Or should be.


I am currently available for contract work. Hire meto help make your Rails app…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Master Ruby Enumerable: each, map, and select

Ruby’s Ruby Enumerable module is the powerhouse behind expressive, functional-style iteration. Mixed into Array, Hash, Range, Set, and custom collections, it enables clean, efficient data processing. Enhance your Ruby projects with expert Rails consulting services, optimizing each, map, and select for cleaner, high-performance code.

Ruby Enumerable: The Foundation

To use Ruby Enumerable, a class must define each:

ruby
class ShoppingList
  include Enumerable

  def initialize(*items)
    @items = items
  end

  def each(&block)
    @items.each(&block)
  end
end

Now ShoppingList supports all Ruby Enumerable methods.

Ruby Enumerable: e…

Hotwire Weekly 

Week 44 - Debugging Bridge Components, Rethinking CSS with Roux, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

Extending the Kanban board (using Rails and Hotwire) - Rails Designer outlines how to build a basic Kanban board by adding dynamic creation of cards and columns using Turbo Streams and a tiny Stimulus controller, making the board fully interactive without heavy JavaScript.

Debugging custom Bridge Components in Hotwire Native - Jesse Waites walks through how to diagnose issues in custom bridge components for Hotwire Native apps.

Rethinking CSS with Roux - debuting at thoughtbot Open Summit - Elaina Natario introduces Roux on the thoughtbot blog, a modern CSS…

Sam Saffron's Blog - Latest posts 

Your vibe coded slop PR is not welcome

This blog post did land on Hacker News at:

news.ycombinator.com

We need a clearer framework for AI-assisted contributions to open source

299 points153 commentskeybits11:03 AM - 28 Oct 2025

Thank you for the thoughtful discussion.

On proof of work, micro transaction and other ways of passing cost to contributors

There were a few ideas floated around introducing some cost to contributors on open source projects to protect maintainers time.

I think it is interesting as a thought experiment, but completely unworkable. The core of what makes open source “open” is that we are open to 3rd party contributions. A for-pay…

Drifting Ruby Screencasts 

Failover Requests

In this episode, we look at creating a failover mechanism for API requests. This can be a handy trick in situations where you want to add fault tolerance to an API request. We'll use the example of the Ollama Cloud as a failover to a locally hosted instance of Ollama.
RichStone Input Output 

[5/4] Code with LLMs and strong Success Criteria

[5/4] Code with LLMs and strong Success Criteria

A buddy of mine from some far cold coasts recently visited me in my hometown. He mentioned that he was using some bits from my [1/4] article on LLMs about coding with a PLAN.md. Which is fantastic, because that's what I'm writing this stuff for!

BUT. He also mentioned that he doesn't let Claude Code --very-dangerously-execute-tests, which is a pity because I find that this is where the whole Claude Code juice hides. It gives the LLM a chance to find its own bugs, which it will inevitably introduce. You know, those nifty LLM bugs that are extremely hard to notice and debug.

So I wanted to make this point again in its own post:

You gotta give the LLM an actionable Success Criteria that will…
Tim Riley 

Continuations, 2025/44: Resourceful return

  • I was a bit sick this week, but still managed to get some useful things done.

  • My big achievement was landing the return of resourceful routes into Hanami! This work was initiated by Andrea and then refined by the two of us. I’m really happy with how tidy we made it by the end.

    We also made it as “native” as possible to the core Hanami Router. This means you can add your own custom routes under resources using the ordinary routing DSL. It also means we pushed this very nice enhancement back into the router itself, allowing for routes to specify both names and name prefixes.

  • As is becoming usual, this week I had the pleasure of bringing a bunch of team and community contributions into…

Alchemists: Articles 

Hanami Logging

Cover
Hanami Logging

Hanami logging is one of the worst aspects of working with a Hanami application. This was hinted at when discussing Hanami Containers earlier so we’re going to learn why Hanami’s default logger is a problem and how you can fix so you can have sensible logging that works for you rather than against you.

Default

When you build a Hanami application, you’ll end up with Dry Logger as the default logger. This allows you to stay focused on implementing the specifics of your application but you’ll quickly…

Greg Molnar 

Ore, a Bundler-compatible gem manager

Since the Ruby Central drama, there are new tools popping up to manage Ruby versions and to install gems. Ore is one of these tools, but it is more of a bundler companion than replacement. It does one thing: downloading gems and installing them. It doesn’t manage rubies, it doesn’t even need Ruby to be installed. It is written in go and can be installed as a binary, let’s see what Ore does:

Ruby Rogues 

Inside the RubyGems Controversy: Transparency, Trust, and the Future of Ruby Central - RUBY 679

In this solo episode of Ruby Rogues, I’m unpacking one of the biggest stories in the Ruby world right now: the tension between Ruby Central and core RubyGems contributors. I share what I’ve learned from talking to people across the community and why this issue is more complex than it looks on social media. From the origins of Bundler and Ruby Together to the recent creation of gem.coop, I trace how we got here—and why both sides have valid points but also made serious missteps.

I also open up about what this means for the Ruby ecosystem going forward, why transparency and trust matter more than ever, and how we as a community can respond productively. Toward the end, I lighten things up with…
Ruby Central 

Ruby Central Update Friday 10/31/25

Rubyists, thank you for your continued engagement and patience as we move forward together. The pace of questions has steadied, and the tone across the community has shifted towards progress. Ruby Central remains focused on stability and stewardship, not only in operations but in how we communicate and collaborate. Our commitment remains the same, to keep the infrastructure secure. 

Since many of the earlier questions have now been addressed, we’re shifting to a more focused approach, answering a few questions each week over the next few weeks and then resuming our normal monthly newsletter cadence. 

Organizational Updates

As we return to our steady communication cadence, we are sharing a few…

Ruby on Rails: Compress the complexity of modern web apps 

Summary report on CI run and more

Hi, Wojtek here. 🎃 Let’s see if there are any spooky changes in Rails. 🎃

New Rails Releases and End of Support Announcement
Versions 7.0.10, 7.1.6, 7.2.3, 8.0.4, and 8.1.1 have been released. Rails 8.0 has received extended support.

Add a summary report at the end of Continous Integration run
The @results ivar is changed to hold the step title in addition to the success boolean, and any multi-step run or step block will print the failed steps. The output looks like:

❌ Continuous Integration failed in 0.02s
   ↳ Tests: Rails failed
   ↳ Tests: Engine failed

Add algorithm option to has_secure_password
To use a different password hashing algorithm, one can now implement a class that…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Understanding Ruby Present?, Blank?, Nil?, and Empty?

Ruby, with its elegant syntax and expressive nature, provides developers with powerful tools to handle the absence of data. Four methods — nil?, empty?, blank?, and present? — are fundamental to writing clean, safe, and idiomatic Ruby code. While they may seem similar at first glance, each serves a distinct purpose in the language’s philosophy of handling “nothingness.”

These methods are part of Ruby’s core and Rails’ Active Support extensions, and understanding their nuances is essential for writing robust applications, especially when dealing with user input, database queries, API responses, or configuration data.

Ruby Nil? — The Fundamental…

Judoscale Dev Blog 

Dealing With Heroku Memory Limits and Background Jobs

I added one background job and now I’m priced out of Heroku.

I’ve heard some variation of this too many times to count. Your app hums along fine on Standard dynos…until you add video encoding, giant imports, or some other memory‑hungry job. Suddenly your worker needs a bigger box, and upgrading every worker to Performance dynos feels like buying a school bus because you might carpool once.

There’s a simple pattern that keeps your bill sane and your architecture boring (the good kind): Put the heavy job on its own queue, give it a dedicated worker process, and autoscale that process to zero when it’s idle. The rest of your app stays on Standard dynos.

This post focuses on a real…

justin․searls․co - Digest 

📄 How to downgrade Vision Pro

For stupid reasons, I had to downgrade my Vision Pro from visionOS 26.1 to 26.0.1 today. Here's how to put Vision Pro into Device Firmware Update ("DFU") mode and downgrade.

Here's how to restore a Vision Pro in 9 easy steps:

  1. Buy a Developer Strap for $299
  2. Go to ipsw.me and do your best to dodge its shitty ads as you try to download the IPSW restore file for your model Vision Pro at the version you need (if you don't see that version, it's likely because Apple isn't signing it anymore and you're SOL)
  3. Install Apple Configurator to your Mac
  4. Connect the Developer Strap to your Mac via USB-C, and disconnect Vision Pro from power
  5. Get ready to press and hold the top button (not the digital…

Good luck, have fun. 🕶️

Hi, we're Arkency 

The Joy of a Single-Purpose Class: From String Mutation to Message Composition

The Joy of a Single-Purpose Class: From String Mutation to Message Composition

Recently I started the process of upgrading rather big Rails application to latest Ruby 3.4. I noticed a lot of warnings related to string literal mutation:

warning: literal string will be frozen in the future (run with --debug-frozen-string-literal for more information)

Ruby has both mutable and immutable strings

Let’s read fxn’s explanation on this:

In Ruby 3.4, by default, if a file does not have the magic comment and a string object that was instantiated with a literal gets mutated, Ruby still allows the mutation, but it now issues a warning

I was able to notice this early since my colleague Piotr took…