Rubyland

news, opinion, tutorials, about ruby, aggregated
Sources About
justin․searls․co - Digest 

📍 Tabelogged: 本格板前居酒屋 お魚総本家 アスティ静岡店

I visited 本格板前居酒屋 お魚総本家 アスティ静岡店 on January 21, 2026. I gave it a 3.5 on Tabelog.

「特大」というホッケ開き焼きは嘘ではない!まじでデカい

Giant Robots Smashing Into Other Giant Robots 

A JavaScript developer's guide to Rails: Where Does Everything Come From?

As a senior JavaScript developer learning Rails, you’ve probably felt this frustration: you’re reading Rails code and suddenly come across a method like current_user, redirect_to, or belongs_to, and you have no idea where it originated. There’s no import statement. No require. It’s just… there.

Coming from JavaScript’s explicit world of imports and modules, Rails can feel like programming in a house of mirrors. Everything seems to appear out of thin air. This magical appearance was one of my biggest struggles too, so I want to demystify where everything actually comes from.

The Fundamental Difference: JavaScript vs Rails

In modern JavaScript, if you want to use something, you…

justin․searls․co - Digest 

📸 A better macOS Globe key

The Globe key on macOS is a strange key.

Ostensibly, Apple added it so users could easily change keyboard layouts to switch between different languages. In practice, however, the vast majority of users only need two "languages": their mother tongue and the emoji keyboard. The same key also serves as an underutilized fn button—a role that has become ubiquitous on Windows and Linux keyboards, but which has seen relatively little use on macOS.

By having two jobs, the Globe key ends up being bad at both. And when it comes to changing languages, it fails because it introduces a 300–500 ms delay while the system waits to see whether the user intends to press and hold the key as part of…

Robby on Rails 

Humans in the Loop

The Oh My Zsh core team recently met up in person at GitHub Universe in San Francisco. Getting the maintainers into the same room matters more than most people realize. It strips away the abstractions and forces the conversation back to reality… what’s working, what’s breaking, what’s quietly draining energy, and what’s worth protecting long term.

We spent a good amount of time talking about AI. Not as a culture war or a prediction exercise, but as something already embedded in our day-to-day work. It shows up in our jobs, our creative projects, our personal workflows, and increasingly, in open source contributions to projects like Oh My Zsh. We don’t all share the same worldview on AI…

SINAPTIA 

RubyLLM::Instrumentation: The foundation for RubyLLM monitoring

In our last post, we introduced RubyLLM::Monitoring, a Rails engine that captures every LLM request your application makes and provides a dashboard where you can see cost, throughput, response time, and error aggregations, and lets you set up alerts so that when something interesting to you happens, you receive an email or a Slack notification.

But how did we do it? What mechanism does RubyLLM provide that we can use to capture all LLM requests? Or did we use something else?

RubyLLM event handlers

RubyLLM provides event handlers out of the box. You can use them to capture an event when a message is sent to the LLM and, for example, calculate its cost. This is how you’d use them:

#…
Julik Tarkhanov 

On the way to step functions: the two worlds

This is the next article in the series On the Way to Step Functions - you will find the other articles linked below:

We have highlighted that DAGs are actually the underpinning of any workflow/durable computation engine (barring serializable continuations). I would like to highlight another aspect of that reality: that there are two worlds.

TL;DR - if you are a Rails user and that topic interests you, skip away to geneva_drive which is pretty much how I feel we “should do it” in Rails-land.


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


The…

The Rails Tech Debt Blog 

Getting Started with Vite on Rails

A few months ago, we were working on a Rails 7 app using Webpack 5. One of the main problems we had was that making a small change in the Javascript took around 39 seconds to recompile. You can imagine how much productivity we lost just waiting, and honestly, I personally remember getting really distracted during that dead time, just sitting there.

At that point, Webpacker had been retired, so we checked the official migration guide and found several options: the first was jsbundling-rails, the second was Shakapacker, another was Importmaps, and finally, we knew we had the option to try Vite.

We finally went with Vite, which (as noted on GitHub) is named after the French word for “quick”

The Bike Shed 

490: Large Language Misadventure

Our hosts discuss the pros of AI and where they find the tool genuinely useful, it’s limitations, downsides and where it’s causing harm, the differences between bad AI code and human code, before asking the question of where this AI boom could be leading us.

To get more of an insight into today’s episode consider watching Sandi Metz's RubyConf talk to learn more about red-lighting, or read the article Aji mentioned about running out of ideas.

Thanks to our sponsor for this episode Scout Monitoring.

Your hosts for this episode have been thoughtbot’s own Sally Hall and Aji Slater.

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

Hashrocket - Ruby Posts 

Crafting Code: Building a Ruby Pattern Generator for a Crochet Circle

In my time as a developer, I have noticed that one of the most common ways my coworkers spend time coding outside of work is by developing little code snippets or apps that solve problems in their everyday lives. From household budgeting, to managing workouts on rowing machines, to generating a Taco Bell order, these projects allow devs to explore different coding styles and learn new technologies.

For a long time, most of my side projects have been for the sole purpose of learning a new technology. When I wanted to start building mobile apps with React Native, I wrote a small to-do app that, once finished, I abandoned. The same thing happened when I wanted to try to use PostgreSQL's…

BigBinary Blog 

How to analyze Playwright traces

Playwright traces are like flight recorders for your tests - they capture everyaction, network request, DOM snapshot, and console log during test execution.When a test fails, especially in CI environments, traces become the mostpowerful debugging tool, providing a complete timeline of what happened and why.

What are Playwright traces?

Playwright traces are compressed archives (.zip files) that contain:

  • Complete DOM snapshots before, during, and after each action
  • Screenshots of the browser state at every step
  • Network activity, including all HTTP requests and responses
  • Console logs from both the browser and your test
  • Action timeline showing what your test did and when
  • Source code mapping actions back…

Think of traces as a time machine for test execution - you can pause at anymoment and see exactly what the browser looked like, what network calls were inflight, and what your code was doing.

Wh…

Tim Riley 

Continuations 2026/03: Bonus weekend

  • This edition is going out a couple days later than usual, because I had Bonus Weekend of open source work, and I wanted to be able to share everything with you all at once!

  • Here’s the background: one of our ambitions for 2026 is to begin a twice-yearly release cadence for Hanami. Since our last release was November, I chose May and November as a starting point. Right now, we’re now getting close to the end of January. We have a new site to ship in February sometime. I’m taking a family trip in April. The team overall has been pretty quiet for the last couple of months. So all of this has had me a bit worried that we wouldn’t have much to share come May.

    This weekend the rest of my family…

Tenderlove Making 

Bainbridge Island Mochi Tsuki

Seattle waterfront skyline featuring the Space Needle and Great Wheel ferris wheel, viewed through a ferry window across Elliott Bay.A group of people gathered outdoors watching a young man wearing a headband demonstrate mochi pounding with large wooden mallets (kine) at what appears to be a traditional mochitsuki event.A man wearing a headband pours water into a traditional stone mortar (usu) during a mochi-pounding demonstration as a crowd watches outdoors.A taiko drummer in a red and black vest performs with large wooden bachi sticks on a traditional Japanese drum during a group performance.A taiko drummer wearing traditional black and bronze performance attire plays a large wooden drum with wooden bachi sticks during a performance.

Last weekend we took the ferry to Bainbridge Island to see a Mochi Tsuki event. I read about the history of Japanese immigrants on Bainbridge island. I saw people making mochi, a taiko drummer group, and traditional dances. It was a lot of fun, and I learned a lot. Definitely recommend this event!

justin․searls․co - Digest 

✂️ Shenmue was educational software

Your browser does not support the video tag.

Everything I needed to know I learned as a 16 year old playing Shenmue on Dreamcast

Code With Rails 

Building Smart Retry Strategies in Rails with Error-Aware Delays

Use the new retry_on error argument to build intelligent retry strategies that respect rate limits, handle transient failures, and fail fast on unrecoverable errors.
Weelkly Article – Now open for 2026 sponsorships 

Now Ruby GIS Rendering: Stabilizing the libgd-gis Rendering API

Stabilizing the libgd-gis Rendering API January 19, 2026 This article documents the current state of libgd-gis following a significant internal update: the stabilization and freeze of its core rendering API. The update consolidates the project’s primary responsibilities—static GIS rendering, layered composition, and post-render image manipulation—into a stable and documented surface. Alongside this milestone, comprehensive documentation … Continue reading Now Ruby GIS Rendering: Stabilizing the libgd-gis Rendering API

Short Ruby Newsletter 

Short Ruby Newsletter - edition 164

The one where Ruby 4.0.1 is released, TruffleRuby 33 is released, Programming Ruby 4 enters beta, Google Summer of Code invites for Ruby projecs and where we found Ruby is token efficient
Ryan Bigg Blog 

Beware grpc gem and Ruby 4.0

Finally got to the bottom of ridiculously slow build times on one of my applications. I’m talking 30+ minute builds, all without sassc!

We use a gem in the app called newrelic-infinite_tracing, which has a dependency on another gem called grpc. This gem has native extensions that are pre-built. You’ll see these listed on RubyGems as lists like:

  • 1.76.0 October 24, 2025 x86-linux-gnu (22.5 MB)
  • 1.76.0 October 24, 2025 x86_64-linux-gnu (19.8 MB)
  • 1.76.0 October 24, 2025 x86_64-linux-musl (18.8 MB)

These list the version, architecture and platform that you’re going to be installing these gems on. These gems can also be locked to specific Ruby versions, and these 1.76.0 gems are…

Hotwire Weekly 

Hotwire Weekly - Happy 2026

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

Happy New Year, and welcome to the first 2026 edition of Hotwire Weekly! We took a short break over the New Year, but we’re excited to be back and kicking things off for 2026. Happy reading! 🚀


📚 Articles, Tutorials, and Videos

jQuery 4.0.0 released - The jQuery Team shipped jQuery 4.0.0, marking a major release more than 20 years after the project’s original launch. It dropped Internet Explorer support and migrated its code to modern ES Modules.

Introducing CSS Grid Lanes - The WebKit Team announces CSS Grid Lanes, a new grid layout feature that lets you define named lanes between tracks and place items relative to those lanes. This makes complex grid layouts…

zverok's space 

It is 2026; where were we?

Most of the time, I try to keep this blog/mailing list to thoroughly thought-through articles about software development: mostly, programming languages in general and Ruby in particular.

But after it was dormant for quite some time, this one will be a bit more personal. And a lot less coherent.

For those who just wandered into this blog post on my site, or those who have subscribed to my mailing list and forgot what that was about (I get it! I wasn’t writing anything for months!), just a quick reminder: I am a software developer and writer from Ukraine, currently serving in the military. You can look up my personal site for some of my writing, projects, and talk recordings.

This…

danielabaron.me RSS Feed 

What AI-Assisted Coding Feels Like in Early 2026

Exploring the pace, responsibility, and understanding required when AI enables faster-than-ever coding in real-world systems.
justin․searls․co - Digest 

📍 Tabelogged: どんぶりハウス

I visited どんぶりハウス on January 18, 2026. I gave it a 3.4 on Tabelog.

生しらすは苦手ですがら美味しいと思いました。マグロ漬けは本当に美味しかった!朝にはとても良い雰囲気

RichStone Input Output 

What to expect from your blog & how to close it gracefully in the end

Yesterday, I saw in my inbox that richstone.io is expiring. So I did what any reasonable person would do in 2026: I talked to Claude Desktop about it.

After a good chat, we decided not to pay €60 for the next season of the richstone.io domain, nor the €13/month in hosting costs. But money isn't really the reason. It's more about the cost of focus and doubling down on impacting what already works.

If you think about starting a blog, here's a little recap of the past 5 years I hope you can learn from. If you are in the closing stage of a blog that served you and others, there will be a how-to on archiving your treasures gracefully at the end of it.

The Journey

RichStone I/O was born in February…

justin․searls․co - Digest 

📍 Tabelogged: エル・ポジート

I visited エル・ポジート on January 17, 2026. I gave it a 3.5 on Tabelog.

とても本格的!

Julik Tarkhanov 

On the way to step functions: it is actually a DAG

This is the next article in the series On the Way to Step Functions — you can find the first article in the series here. Previously, I have outlined the ambient desire in the field (marshalable stacks) and described why that is largely unachievable. But if imperative invocations can’t bid us consolation, what could?

DAGs, in fact.

If you are impatient (and a Rails user) - just head to the geneva_drive repo for the grand reveal.


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


DAGs, DAGs everywhere

I love DAGs (directed acyclic graphs). DAGs are everywhere.

Having worked in visual effects for a while, I know first hand…

Posts on Kevin Murphy 

Frequently Played January 2026

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.

Downbound Train 🔗

In a debate about the most underrated Springsteen song, this would be high on my list.

Full Lyrics

Last night, I heard your voice
You were crying, crying, you were so alone
You said your love had never died
You were waiting for me at home

Feel The Pain 🔗

Although I expect my ears will need a week to readjust, even with hearing protection, I’d like to see J Mascis and crew live.

Full Lyrics

I feel the pain of everyone
Then I feel nothing

Posts on Kevin Murphy 

How I Read A Pull Request

An episode of the Bike Shed podcast convinced me to dig this out of my drafts. Thanks Stephanie and Joël.

I read a lot of pull requests (PRs) for work. It’s been a huge accelerator for my growth. It helps push work towards production. Work that’s in a pull request is likely closer to completion than what I’m working on. Alternatively, the PR may exist because the author is stuck. That also deserves my attention. I hope my reviews help share knowledge and provoke thought from time to time.

I’ve developed a bit of a system to work through it. I’m going to share that with some help from the reporters’ questions. Note that this is not going to focus on how I comment on changes. Only the mechanic…

W…

Write Software, Well 

Understanding How Active Storage Variants Transform Images

💡
This post is part of a series on Active Storage internals. See also: Understanding the Active Storage Domain Model and How has_one_attached Works in Rails.
Understanding How Active Storage Variants Transform Images

Disclaimer: I used Claude Code to trace through the Rails codebase and explain how various parts of it are related to each other. Lately, I've found it an excellent tool to navigate the parts of the codebase that I don't understand and to get a deeper understanding of how things work. It's such a fun process to come across some obscure Rails method, ask Claude (or Cursor) to explain exactly how it works, and learn a few new things in the way. In the past, I would have likely skimmed past it or ignored it altogether.

It's so easy to…

Ruby on Rails: Compress the complexity of modern web apps 

Error-aware retry_on, PostgreSQL type mappings, and more!

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

Allow retry_on wait procs to accept error as a second argument
This PR adds support for retry_on wait procs to optionally receive the error as a second argument, enabling dynamic retry strategies based on error properties.

class RemoteServiceJob < ActiveJob::Base
  retry_on CustomError, wait: ->(executions, error) { error.retry_after || executions * 2 }

  def perform
    # ...
  end
end

Procs with arity 0 or 1 continue to receive only the execution count, maintaining backwards compatibility.

Make CSRF header-only protection compatible with local installs using HTTP
This change…

Ruby Weekly 

TruffleRuby 33, Ruby 4.0.1, and Ruby 3.2.10

#​783 — January 15, 2026

Read on the Web

Ruby Weekly

TruffleRuby 33: The High Performance, GraalVM-Based Ruby Implementation — Healthy languages have multiple implementations, and TruffleRuby, originally created by the late Chris Seaton, is celebrating its 13th birthday with both a major release and new web site. v33 boasts it's ‘the fastest and easiest Ruby to install' – a claim I just successfully tested.

The TruffleRuby Team

Start Fixing Bugs Faster with AppSignal — AppSignal gives Ruby developers the tools they need to fix bugs, track performance issues, and ship with confidence. Easy to set up, a…

Island94.org 

GoodJob, Solid Queue, Sidekiq, Active Job, in 2026

Hey, I’m Ben, the author of GoodJob. Last year at RailsConf I hosted a panel discussion between myself, Solid Queue’s Rosa Gutiérrez, Sidekiq’s Mike Perham, and Karafka and Shoryuken’s Maciej Mensfield called “The Past Present and Future of Background Jobs”. You can watch that video here.

In this post, I’m writing my personal perspective on how you, dear developer, might decide what background job backend to choose for Rails and Active Job. But everything in context. And oh boy, it’s all context.

A sober look at how technical decisions are actually made

I’ve worked in software engineering a long time and seen a lot of bullshit justifications for… doing stuff.

  • It…
Remote Ruby 

Tech Resolutions and Tailwind Troubles

In this episode of Remote Ruby, Chris, Andrew, and David have conversations from New Year's resolutions and monitor specifications, to the sustainability challenges of open source projects like Tailwind CSS. They discuss the pros and cons of various hardware, upgrading to Ruby 4.0, recent issues in software projects, and the evolving landscape of AI's impact on productivity tools. They also touch on gaming experiences with Arc Raiders and the never-ending monitor hunt. Hit download now to hear more! 

Links

Honeybad…
Julik Tarkhanov 

On the way to step functions: dreams of marshalable stacks

Lately, it has been a great challenge to get into the world of durable execution. Granted, in the world of web applications we often do not need it. However, anyone who has come in contact with electronic payments, money orders, verifications - will likely encounter a need for durable execution.

The juggernauts in the space are, of course, Temporal.io - with the recently emerging contender restate following in its footsteps. Both are based on the premise of sagas, controlled by a separate service.

There is also DBOS and now there is also absurd and the Vercel Workflow.

As it happens, meeting Bouke when I joined Cheddar has spurred my interest in Temporal. I knew someone who did work on…

justin․searls․co - Digest 

📍 Tabelogged: とんかつ ひな太

I visited とんかつ ひな太 on January 15, 2026. I gave it a 3.6 on Tabelog.

特上ロースはとても柔らかくてすごくジューシーです。旬の広島産牡蠣も美味しかった!

code.dblock.org | tech blog 

Serving Markdown for AI Agents in Jekyll

Dries Buytaert recently wrote about The Third Audience. For decades, websites have targeted two audiences: humans and search engines. AI agents are now the third audience, and most websites aren’t optimized for them yet.

AI agents prefer clean, structured content over HTML. Markdown is ideal - it’s readable, semantic, and free of navigation chrome. So I made this blog serve its source markdown files alongside the HTML.

How It Works

For every post like /2026/01/15/serving-markdown-for-ai-agents.html, you can now fetch the source at /2026/01/15/serving-markdown-for-ai-agents.md.

AI agents can discover this via a <link> tag in the HTML head:

<link href="serving-markdown-for-ai-agents.md"
Glauco Custodio 

A Neat Trick for Splitting Strings

You probably needed to split a full name into first and last name at some point.

How would you split the string Ayrton Senna da Silva into Ayrton as the first name and Senna da Silva as the last name?

What if the name contains inconsistent amounts of whitespace in between the words? Eg: Ayrton Senna da Silva.

"Ayrton Senna da  Silva".split(" ")
# => ["Ayrton", "Senna", "da", "Silva"]

Splitting by space is a good start, but it doesn't finish the job.

Solution

I learned recently we can pass a second argument to split specifying the maximum number of splits:

"Ayrton Senna da  Silva".split(" ", 2)
# => ["Ayrton", "Senna da  Silva"]

That almost worked, but we still have an extra space…

Hi, we're Arkency 

Stop using DateTime in 2026 (unless you work for UNESCO)

Stop using DateTime in 2026 (unless you work for UNESCO)

DateTime has been considered deprecated in Ruby since 3.0. It’s 2026. Why are people still using it?

During a recent code review, we found this:

whatever.starts_at = DateTime.now

When asked why DateTime instead of Time, the response was: “DateTime handles a wider range of dates.”

That was partially true. In 2008. On 32-bit systems.

DateTime’s range advantage died in Ruby 1.9.2

Before Ruby 1.9.2 (released in 2010), Time was limited by the system’s time_t type — typically 32-bit signed integer covering 1901-2038. DateTime had a much wider range.

Ruby 1.9.2 changed this. Time started using a signed 63-bit integer representing…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Rails Generate Model: Beginner’s Guide to Database Models

In the fast-evolving world of web development in 2026, where new JavaScript frameworks, AI-assisted coding tools, and serverless architectures dominate headlines, one technology quietly continues to thrive: Ruby on Rails.

Far from being a relic of the past, Rails in 2026 is a mature, battle-tested powerhouse — refined over more than two decades into a framework that prioritizes developer happiness, rapid productivity, and long-term maintainability. Major platforms like Shopify, GitHub (in its early days), Basecamp, and countless startups and enterprises still rely on Rails to ship features quickly and reliably.

The secret sauce? Rails’…

Rails Designer 

Nested forms without `accepts_nested_attributes_for` in Rails

Recently I had to build a form builder again. You know the one: update some attributes for the form and then a customizable set of form fields, like text fields, email fields and text areas. All with their own validations, settings and so on. It turned out like this:

Initially I thought of building it using Rails’ accepts_nested_attributes_for (like I wrote about here), but I quickly opted out of that and instead had a simpler idea for it. Some ideas are so simple that I feel almost embarrassed to publish about it. But over the years I’ve found that the most simple ideas will still delight plenty of people.

So here is a way to have “nested forms” in Rails without accepts_nested_attribut…

RubyGems Blog 

4.0.4 Released

RubyGems 4.0.4 includes enhancements and bug fixes and Bundler 4.0.4 includes enhancements and bug fixes.

To update to the latest RubyGems you can run:

gem update --system [--pre]

To update to the latest Bundler you can run:

gem install bundler [--pre]
bundle update --bundler=4.0.4

RubyGems Release Notes

Enhancements:

  • Remove date require from rebuild command. Pull request #9232 by jeremyevans
  • Installs bundler 4.0.4 as a default gem.

Bug fixes:

  • Add a missing “require ‘etc’” statement:. Pull request #9242 by Edouard-chin

Bundler Release Notes

Enhancements:

  • Validate more options for add sub-command #5905
  • Support Ruby 4.1 #9219

Bug fixes:

  • Fix dependency source…
RubySec 

CVE-2025-68271 (openc3): openc3-api Vulnerable to Unauthenticated Remote Code Execution

### Summary OpenC3 COSMOS contains a critical remote code execution vulnerability reachable through the JSON-RPC API. When a JSON-RPC request uses the string form of certain APIs, attacker-controlled parameter text is parsed into values using String#convert_to_value. For array-like inputs, convert_to_value executes eval(). Because the cmd code path parses the command string before calling authorize(), an unauthenticated attacker can trigger Ruby code execution even though the request ultimately fails authorization (401).
Code With Rails 

Build a File Deduplication System with ActiveStorage

Stop storing duplicate files. Learn how to detect identical uploads and reuse existing blobs to save storage costs and speed up uploads.
SINAPTIA 

Monitoring LLM usage in Rails with RubyLLM::Monitoring

You’ve built an AI-powered feature into your Rails application using LLMs. You’ve built an evaluation set to test different prompts and model combinations, compared them, and improved them1 so you could get the best bang for the buck out of your LLM usage. You aimed for the highest accuracy at the lowest possible cost. You deployed it to production. And now?

Unlike most APIs, LLM APIs calls have variable costs. They are usage-based, so the price depends on input and output tokens consumed. So, how do you know how your users are using it? Or, how much will it cost you monthly? Is it what you estimated, and are the usage limits you designed ok? Are they needed at all?

Why monitoring LLM…

Closer to Code 

Claude on Incus – All the autonomy, securely

Here's claude-on-incus (or coi for short) - a tool for running Claude Code freely in isolated Incus containers.

If it's useful to you, a star helps.

Note: I'm also working on "code-on-incus" - a generalized version for running any AI coding assistant in isolated containers.

Why?

Three reasons: security, a clean host, and full contextual environments.

Security

Claude Code inherits your entire shell environment. Your SSH keys, git credentials, .env files with API tokens - everything. You either click "Allow" hundreds of times per session, or use --dangerously-skip-permissions and hope nothing goes wrong.

With coi, Claude runs in complete isolation. Your host credentials stay on the host.…

Ruby News 

Ruby 3.2.10 Released

Ruby 3.2.10 has been released.

Please see the GitHub releases for further details.

Download

Planet Argon Blog 

Ruby 4.0 and Ruby Box: What Changed and How to Upgrade Safely

Ruby 4.0 and Ruby Box: What Changed and How to Upgrade Safely

Ruby 4 just dropped! Here’s a rundown of the new features, as well as a basic upgrade plan you can use to get to 4.0 greatness.

Continue Reading

Saeloun Blog 

Rails 8.1 introduced except_on option for validations and callbacks

Rails 8.1.0 introduces the except_on option for validations and validation callbacks, making it easier to skip them in specific contexts.

In Rails, we can conditionally run validations. For example, we can run validations in certain contexts by using the on option.

Validations

Before

There was no direct way to exclude validations based on context (e.g., skipping validations during an update). We had to rely on custom conditional logic.

  • The on: option had limited scope, allowing validations only during create or update.
class Client < ApplicationRecord
  validates :name, presence: true, on: [:create]
end
Client.create!(name: "")
`<main>': Validation failed: Name can't be blank…
The Bike Shed 

489: What makes a codebase welcoming

Joël and Sally tidy up the place as they discuss the different ways a new codebase and team can feel welcoming to them.

Together they break down the things that help them ingrate into a new project more easily, explain why the lore of a project can be sacred to some, what you can do in the present to make things easier for a developer down the road, and why communication is crucial for keeping everyone on the same page even long after you’ve moved on.

Check out these resources for a deeper dive into some of the topics mentioned in this week’s episode - Fixtures - Hierarchy of Documentation - Domain Modelling 1 - Domain Modelling 2

Thanks to our sponsor for this episode Scou…

Ruby News 

Ruby 4.0.1 Released

Ruby 4.0.1 has been released.

This release includes a bugfix for spurious wakeup from Kernel#sleep when subprocess exits in another thread, along with other bugfixes. Please see the GitHub releases for further details.

Release Schedule

We intend to release the latest stable Ruby version (currently Ruby 4.0) every two months following the most recent release. Ruby 4.0.2 will be released in March, 4.0.3 in May, 4.0.4 in July, 4.0.5 in September, and 4.0.6 in November.

If a change arises that significantly affects users, a release may occur earlier than planned, and the subsequent schedule may shift accordingly.

Download

Gusto Engineering - Medium 

How to Write an Oscar-Worthy LLM Prompt: Your Guide to the Prompt-Chaining Framework

We’ve all been there. You type a question into your favorite AI chatbot, excited for a smart, helpful response, and… you get something generic, off-topic, or just plain wrong. It feels like a lottery, right? One day you get Shakespeare, and the next, you get a robot struggling to understand basic instructions.

The problem isn’t the AI’s talent; it’s your direction.

Organize your contexts and improve your prompt engineering with prompt-chaining.

Think of an LLM, a Large Language Model, as an incredibly talented, but slightly unfocused, actor. If you walk onto the set and simply say, “Do something good,” you’ll get chaos. But if you step into the role of a director and give clear, structured…

Weelkly Article – Now open for 2026 sponsorships 

libgd-gis continues to grow — now with styles and more

January 12, 2026 Real-world cartography in pure Ruby RubyStackNews — January 2026 From geometry to cities Until recently, libgd-gis could render raw GeoJSON. Now it renders cities. Over the last development cycle, libgd-gis evolved from a low-level geometry renderer into a style-aware, layered GIS engine capable of producing publication-quality maps — directly from Ruby. With … Continue reading libgd-gis continues to grow — now with styles and more

Short Ruby Newsletter 

Short Ruby Newsletter - edition 163

The first edition of 2026: Where we look at Ruby 4.0, mruby announced the major release this year v4.0, Rails launched 8.1.2 and two old (pre Ruby 1.0) and stable gems were updated
Andy Croll 

Find the Last Matching Element with rfind

Ruby 4.0 landed during Christmas 2025 with a bunch of new features. One small but useful addition is Array#rfind, which finds the last element in an array that matches a condition.

Instead of…

…reversing the array or using reverse_each to find from the end:

numbers = [2, 2, 3, 4, 6, 7, 8]

numbers.reverse.find(&:odd?)
#=> 7

# or
numbers.reverse_each.find(&:even?)
#=> 8

Use…

…Ruby 4.0’s rfind method:

numbers = [2, 2, 3, 4, 6, 7, 8]

numbers.rfind(&:odd?)
#=> 7

# with a block
numbers.rfind { it.even? }
#=> 8

Why?

The rfind method iterates backwards from the last element, returning the first element that matches the given condition. It’s the reverse of find, which starts from the…

Giant Robots Smashing Into Other Giant Robots 

Prevent the Robocalypse with Claude Code and TDD

When you’re working with an agent like Claude Code, working in a solid TDD cycle will help prevent downsides that AI-assisted development can lead to, including:

  • So many changes all at once that you can’t tell what to commit
  • Code that does nothing
  • Code that doesn’t do what you think it does
  • Insidious bugs that will haunt your dreams in three months
  • The end of the world

But first, we need a credo

Before we go down this path, we need a statement of belief. My statement is this:

Own your commits.

This is the single most important thing that you must do as a person working with an AI agent. The code is not Claude’s. The tests are not Claude’s. The responsibility is…

justin․searls․co - Digest 

📸 PSA: iPhone Air MagSafe Battery can charge your AirPods

One of the many subtle frustrations I have with the Airpods Pro 3 is that the redesigned case actually results in a slightly-askew magnet alignment, which results in several (official!) MagSafe chargers failing to charge the case. Well, while the iPhone Air MagSafe Battery may not fit any other model iPhone particularly well, it's actually a super handy way to recharge your AirPods! Just plop the fucker on the back and twist until you hear that familiar ding and see the light turn on.

Might come in handy on a long flight.

Secondary PSA: engraving is free and AirPods are disposable: put your e-mail address on your AirPods.

Tim Riley 

Continuations 2026/02: Community-provided

RubySec 

CVE-2026-22588 (spree_api): Spree API has Authenticated Insecure Direct Object Reference (IDOR) via Order Modification

### Summary An Authenticated Insecure Direct Object Reference (IDOR) vulnerability was identified that allows an authenticated user to retrieve other users’ address information by modifying an existing order. By editing an order they legitimately own and manipulating address identifiers in the request, the backend server accepts and processes references to addresses belonging to other users, subsequently associating those addresses with the attacker’s order and returning them in the response. ### Details Affected Component(s) - Authenticated user order management - Address association logic - Order update endpoint(s) Affected Endpoint(s): - `/api/v2/storefront/checkout` The…
RubySec 

CVE-2026-22589 (spree_core): Spree API has Unauthenticated IDOR - Guest Address

### Summary An Unauthenticated Insecure Direct Object Reference (IDOR) vulnerability was identified that allows an unauthenticated attacker to access guest address information without supplying valid credentials or session cookies. ### Details During testing, it was observed that all guest users can make an unauthenticated request to retrieve address data belonging to other guest users by manipulating object identifiers. The attacker would need to know the storefront URL structure to perform this attack (which can be learnt after creating a registered user account). Affected Component(s) * Address Edit endpoint: `/addresses/{addressId}/edit` Root Cause - Faulty authorization check in…
RubySec 

GHSA-96qw-h329-v5rg (shakapacker): Shakapacker has environment variable leak via EnvironmentPlugin that exposes secrets to client-side bundles

### Summary Since 2017, the default webpack plugins have passed the entire `process.env` to `EnvironmentPlugin`. This pattern exposed ALL build environment variables to client-side JavaScript bundles whenever application code (or any dependency) referenced `process.env.VARIABLE_NAME`. This is not a regression - the vulnerable code has existed since the original Webpacker implementation. No recent code change in Shakapacker triggered this issue. ### Impact Any environment variable in the build environment that is referenced in client-side code (including third-party dependencies) is embedded directly into the JavaScript bundle. This includes: - `DATABASE_URL` - Database credentials -…
justin․searls․co - Digest 

🎙️ Breaking Change podcast v49 - Saving Face Oil

Direct link to podcast audio file

I'm about to get on a plane and will be gone for a couple weeks, but didn't want to leave you Breaking Changeless so I did the thing where I stand up in front of a microphone and talked at you. Again. Like I do.

Fun fact: this is the first and only time I've taken a phone call live, on-air! I was just too lazy to edit that out gracefully.

Whenever I go to Japan solo, I experience moments of loneliness, so I'd really appreciate it if you sent me some praise or complaints or ideas to podcast@searls.co and I'll feel comforted by the knowledge that you exist. Your engagement sustains me.

Lotta weird and dumb links this go-round:

Weelkly Article – Now open for 2026 sponsorships 

Ruby Can Draw Cities Now

January 9, 2026 How I built a pure-Ruby GIS engine that renders Paris, Tokyo, New York, and more Most people don’t think of Ruby when they think about maps, GIS, or visual computing. If you want to draw a real city, the standard stack usually looks like: QGIS PostGIS Mapnik Mapbox or a heavy JavaScript … Continue reading Ruby Can Draw Cities Now

Code With Rails 

Build a Feature Flag System in 50 Lines with Rails.app.creds

Skip the SaaS subscription. Rails 8.2's credentials system is all you need for feature flags - version controlled, environment-overridable, and free.
37signals Dev 

Moving Mountains of Data off S3

In this episode of RECORDABLES, we talk through the final and most nerve-racking part of our cloud exit — moving massive amounts of data out of Amazon S3. Principal Programmer Jeremy Daer shares how we moved billions of files with no downtime. He covers everything from dealing with bandwidth limits and AWS constraints to building custom tooling when off-the-shelf options won’t work.

The conversation gets into the human side of a project like this, including verification, anxiety, and the moment you finally hit delete. You’ll also hear how long it actually takes to move that much data and the tools we used to make it happen seamlessly.

Watch the full video episode on YouTube.


Timestam…

Julia Evans 

A data model for Git (and other docs updates)

Hello! This past fall, I decided to take some time to work on Git’s documentation. I’ve been thinking about working on open source docs for a long time – usually if I think the documentation for something could be improved, I’ll write a blog post or a zine or something. But this time I wondered: could I instead make a few improvements to the official documentation?

So Marie and I made a few changes to the Git documentation!

a data model for Git

After a while working on the documentation, we noticed that Git uses the terms “object”, “reference”, or “index” in its documentation a lot, but that it didn’t have a great explanation of what those terms mean or how they relate to other core…

Ruby Weekly 

Examples of language changes in Ruby 4.0

#​782 — January 8, 2026

Read on the Web

Ruby Weekly

Zverok's Guide to Language Changes in Ruby 4.0 — Each year, Victor produces a mammoth roundup of changes introduced in the latest Ruby release (Ruby 4.0, in this case). For a release that doesn’t have a huge amount of changes at the language level, he’s come up with some fantastic examples and this is a must-read, as always.

Victor Shepelev

😱 Rails 7.1 Security Support Ended in '25. Need to Upgrade?No more security updates for Rails 7.1. Get a free Automated Roadmap in minutes. Know what it takes before you start. Need help executing the plan? Our 🌳…

FastRuby.io | Upgrade…

justin․searls․co - Digest 

📸 Peter Campbell's giraffe art

Becky and I are wrapping up a rewatch of Mad Men this week, and throughout the first several seasons, she'd point out the artwork hanging near the entrance of Peter Campbell's apartment, a screenshot of which I shall now hotlink from Blogger's CDN like it's 1959:

Peter Campbell's giraffe art

(Of course, Pete Campbell is so classless that in my head canon, Trudy must have picked this out.)

Anyway, every time the giraffes would show up, Becky would snap her fingers and point at the TV like Leo in Once Upon a Time in Hollywood before commenting on how much she loved the piece. We are not art people, and I can take a hint, so I ordered a recreation made by this guy on Etsy and hid it in a closet for a few…

Well, I finally got…

Saeloun Blog 

Mobile First Design | Why It Matters for Consultancies

When we design websites for consultancies, one question always comes up: where do most people actually view the site? The answer is clear. Most visitors are on their phones. Whether it’s a potential client checking services between meetings or a business partner reviewing your work on the go, mobile is where that first impression happens. That’s why mobile first design has become essential, not optional.

What Mobile First Design Means

Mobile first design means creating a website for smaller screens before adapting it for larger ones. Instead of shrinking a desktop site down, we start by designing what users truly need on their phones. The goal is to make everything simple, readable, and…

Rails Designer 

Use native dialog with Turbo (and no extra JavaScript)

Building modals and sliders previously meant reaching for a Stimulus controller. But what if you could create them without writing any JavaScript at all? Like none, zip, nada, nothing. Something that looks like this:

This article shows how to use the native <dialog> element combined with Attractive.js (a JS-free JS library I published recently) to build modals and sliders that work together with Turbo Frames. No custom JavaScript required. 🤯

As always the code can be found on GitHub.

The basics

The foundation is a single <dialog> element in your layout. Start by adding it to your application.html.erb:

<dialog
  id="overlay"
  closedby="any"
  class="
    px-3 py-4 max-w-md w-full
   …
The Rails Tech Debt Blog 

How We Fix the Broken Build During a Rails Upgrade

After we’ve addressed all the deprecation warnings and successfully dual-booted an application, the next step in a Rails upgrade is often the most challenging: fixing the broken build.

At this point, the test suite is red, and our job is to bring it back to green. This phase can feel chaotic, but over the years at FastRuby.io, we’ve developed a process that makes it systematic and (relatively) predictable.

In this post, I’ll break down how we approach this step, what patterns we’ve noticed, and how we debug the trickiest failures.

Our “Fix Broken Build” Process

Attack errors before failures

When a test suite runs, errors (exceptions, missing methods, or crashes) block progress. They…

Mike Coutermarsh 

Automating with Cursor commands

I've been very interested lately in how I can use AI to take care of tasks for me. Here is one use case we've found that has been successful so far.

New post over on the PlanetScale blog.

Read here: Automating our changelog with Cursor commands

Planet Argon Blog 

Don't Rush the Redesign: Start with Strategy

Don't Rush the Redesign: Start with Strategy

A flashy homepage means nothing without clear goals. Here’s how to make the right things matter first.

Continue Reading

justin․searls․co - Digest 

📄 Weekstart

The curse of productivity is that it's self-perpetuating. Respond to e-mails with lightning speed and you just get more replies. Demonstrate your reliability to others long enough, and they'll just bring you more shit to do. Develop productive routines and habits and—before you know it—your natural disposition will shift towards being done with things and away from actually doing things.

Left unconstrained, optimizing for a productive life can diminish the joys of living. Many of us who opt into the lifestyle of "staying on top of shit" do so, ostensibly, to maximize time for creative work, or for leisure, or for family. That's the spirit with which I first discovered Getting Things Done

Evil Martians 

What devtools founders making $100M+ ARR told me in San Francisco

Authors: Victoria Melnikova, Head of New Business, and Travis Turner, Tech EditorTopics: Developer Products, AI, Devtools startup advisory

I spent the year in San Francisco, having face-to-face conversations with founders you already follow. Here are the top pieces of advice to take into 2026.

I spent 2025 sitting across from the founders of Sentry, WorkOS, Resend, PlanetScale, Chroma and Mastra in San Francisco. Face-to-face. They've built unicorns, category-defining devtools, and they told me what actually works.

Weelkly Article – Now open for 2026 sponsorships 

Ruby Can Now Draw Maps — And I Started With Ice Cream

January 7, 2026 How libgd-gis turns Ruby into a real GIS engine For many years, Ruby quietly missed something important. Yes, Ruby is amazing at APIs, data processing, background jobs, and web platforms — but when it came to maps, graphics, and spatial data, Ruby was forced to step aside and let other languages do … Continue reading Ruby Can Now Draw Maps — And I Started With Ice Cream

Carmine Paolino 

Dictation Is the New Prompt (Voxtype on Omarchy)

Typing every prompt with your fingers feels backwards in 2026. We can speak faster than we can type, and it feels more natural. Hold a hotkey, speak, and your OS types it for you. If you care about flow, dictation is the most underrated AI upgrade you can make.

In the Omarchy world, Hyprwhspr is getting a lot of attention after a recent DHH tweet:

He’s right: local dictation is shockingly good now. The catch is Hyprwhspr uses Python virtual…

Ruby Magic by AppSignal 

An Introduction to Ruby Parsing with Prism

You might have heard about Prism, the new Ruby parser. Perhaps you've heard it's faster, more reliable, and more powerful than what we had before. Or maybe you never took a compilers class and aren't sure about what this actually means.

I'm here to tell you all about it, and how it's changing our lives as Ruby developers. Today, I want to take you from square one to writing your first transpiler.

Interpreters 101

Before we begin our journey, let's start with the basics of how an interpreter works, so we're all on the same page. Interpreting a programming language usually involves three main steps:

  1. Tokenizing input (a.k.a. lexing): Breaking the input text into a list of meaningful tokens.…
Mintbit 

ActiveRecord: Consistent delete_all and update_all

ActiveRecord excels at providing methods that balance convenience and performance. Among the most powerful are delete_all and update_all, which execute bulk operations directly in SQL. However, until recently, they behaved inconsistently when used with certain query methods like limit or distinct.

With the introduction of PR #54231, Rails has unified how these methods validate queries before execution, putting an end to this long-standing inconsistency.

The Problem: Different Rules for Similar Operations

Even though both methods operate on Relations, Rails used to impose different restrictions on each.

For instance, if you tried to use update_all on a query containing a limit or an offs…

Mintbit 

ActiveRecord: Understanding CurrentAttributes

current_user is a daily companion in Controllers and Views. However, the moment you need that information inside a Model to validate a business rule, things get tricky. Many developers end up passing the user as a parameter everywhere. But did you know Rails has a native solution for this?

CurrentAttributes is the official bridge to carry context from the Controller to the Model cleanly and safely.

The Problem: Argument Pollution

Imagine a method in your model that checks if a user can edit a record. Currently, it likely needs to receive the user as an argument:

1
2
3
def editable_by?(user)
  self.author == user || user.admin?
end

While this works, if you have a call chain (Controller …

André Arko 

Announcing rv clean-install

Originally posted on the Spinel blog.

As part of our quest to build a fast Ruby project tool, we’ve been hard at work on the next step of project management: installing gems. As we’ve learned over the last 15 years of working on Bundler and RubyGems, package managers are really complicated! It’s too much to try to copy all of rbenv, and ruby-build, and RubyGems, and Bundler, all at the same time.

Since we can’t ship everything at once, we spent some time discussing the first project management feature we should add after Ruby versions. Inspired by npm and orogene, we decided to build clean-install. Today, we’re releasing the rv clean-install command as part of rv version 0.4.

So, what is a…

Kevin Newton 

A Ruby Regular Expression Engine

Recently I put some finishing touches on the exreg gem, a pure-Ruby implementation of a Unicode regular expression engine. It supports nearly all of the same functionality as Onigmo, the Ruby regular expression engine, with caveats listed in the README. Importantly however, it uses a Thompson-style NFA virtual machine, meaning it is immune to ReDoS caused by catastrophic backtracking.

Background

Most of the technical background for this can be found in Russ Cox’s excellent series of blog posts entitled Regular Expression Matching Can Be Simple And Fast. In short, traditional backtracking regular expression engines (like Onigmo) can be tricked into taking exponential time on certain…

Tosbourn – Belfast based Ruby developers 

Set Dependabot to run only specific dependency types

We have a Ruby on Rails project that we are sunsetting and we want to tell Dependabot to only update minor versions of Gems as we don’t want to introduce any potential breaking changes to the project.

We can specify this in the Dependabot configuration file like so:

.github/dependabot.yml

version: 2

updates:
  - package-ecosystem: bundler
    directory: "/"
    schedule:
      interval: weekly
    open-pull-requests-limit: 10
    groups:
      security-updates:
        applies-to: security-updates
        patterns:
          - '*'
        update-types:
          - 'minor'
          - 'patch'
      version-updates:
        applies-to: version-updates
        patterns:
          - '*'

This will sit within the groups section.

  • security-updates: tells Dependabot the type of update
  • version-updates: tells Dependabot the type of update
  • patterns: specifies what Gems to apply this to, I have put '…
Evil Martians 

6 things developer tools must have in 2026 to earn trust and adoption

Authors: Evgeniy Valyaev, Frontend Engineer, and Travis Turner, Tech EditorTopics: Developer Products, AI, DX, Performance, Design, JavaScript, Accessibility, LLMs

Developers don’t need more tools—they need fewer, higher-quality ones. This piece distills research and field evidence into six principles for faster, calmer, trustworthy devtools in 2026.

When it comes to developer tools, the same six principles come up time after time. This post is our field-tested playbook for implementing them in the tools you’ll ship in 2026.

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

How To Read and Write Files in Ruby (With Examples)

Ruby provides simple, elegant, and powerful ways to read from and write to files. The language emphasizes readability and developer happiness, making file I/O operations straightforward. This guide covers the most common and idiomatic approaches with practical examples.

Basic Concepts

In Ruby, file operations are typically performed using the File class or the shorter File.open method. Most file operations use blocks to ensure files are properly closed after use, preventing resource leaks.

Opening a File

The recommended way is to use a block form:

ruby
File.open("filename.txt", "r") do |file|
  # work with the file
end
# file is automatically…

Without a…

BigBinary Blog 

DNS basics and how DNS works in Neeto

This blog started with an explanation of how DNS works in Neeto. However wecovered a lot of ground about how DNS actually works.

The Basics of DNS Records

A Domain Name System (DNS) is a hierarchical and decentralized naming system forcomputers and servers connected to the Internet. It essentially translateshuman-readable domain names into machine-readable IP addresses.

What is a Domain Name?

A Domain Name is a unique, human-friendly label used to identify one or more IPaddresses. It's what people type into a web browser to visit a website. Forexample, google.com and wikipedia.org are domain names.

Purchasing a New Domain Name

You don't buy a domain name outright. Technicall,y you register the…

The Bike Shed 

488: The Playful Portland Programming Paradigm

Aji and Joël talk all things hackerthons and why taking the time to have a little having fun with your work every now and then is important for developers.

Our hosts reflect on their shared experience at a previous RailsConf where they entered a mini hackerthon, why playing around in a creative sandbox is crucial to honing your skills as a dev, and how programming on the fly can teach you a lot about your own strengths and weaknesses.

Read more about Joël’s entry in Rails Rumble, as well as their participation in the RailsConf 2022 mini Hackerthon.

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

Your hosts for this…

Code With Rails 

Multi-tenant Configuration with Rails.app.creds

Build a per-tenant configuration system using Rails 8.2's CombinedConfiguration. Let tenants override API keys, feature flags, and limits without code changes.
Tejas' Blog 

Year in Books 2025

I got back into a regular reading habit after few years. Here are the books I read:

Ruby Central 

The Ruby Central README: December 2025 + Annual Report

The Ruby Central README: December 2025 + Annual Report

Happy New Year to the Ruby Community and wishing you all a safe and gentler 2026.

December 2025 README

In case it was missed, we released our December 2025 README Newsletter at the end of the year. It includes highlights from our 2022–2024 Annual Report, Ruby 4.0’s launch (and a lovely message from Matz), new local regionals, and more. You can view the newsletter here.


Annual Report

Included in the latest README, we've included information about our Annual Report release.

This Annual Report covers 2022–2024 and has been in the works since early 2024. Our goal is straightforward: put three years of work, funding, and decisions in one place so the community can see what Ruby Central has actually…

Ruby Central 

The Ruby Central README: December 2025 + Annual Report

The Ruby Central README: December 2025 + Annual Report

Happy New Year to the Ruby Community and wishing you all a safe and gentler 2026.

December 2025 README

In case it was missed, we released our December 2025 README Newsletter at the end of the year. It includes highlights from our 2022–2024 Annual Report, Ruby 4.0’s launch (and a lovely message from Matz), new local regionals, and more. You can view the newsletter here.


Annual Report

Included in the latest README, we've included information about our Annual Report release.

This Annual Report covers 2022–2024 and has been in the works since early 2024. Our goal is straightforward: put three years of work, funding, and decisions in one place so the community can see what Ruby Central has actually…

Ruby Central 

The Ruby Central README: December 2025 + Annual Report

The Ruby Central README: December 2025 + Annual Report

Happy New Year to the Ruby Community and wishing you all a safe and gentler 2026.

December 2025 README

In case it was missed, we released our December 2025 README Newsletter at the end of the year. It includes highlights from our 2022–2024 Annual Report, Ruby 4.0’s launch (and a lovely message from Matz), new local regionals, and more. You can view the newsletter here.


Annual Report

Included in the latest README, we've included information about our Annual Report release.

This Annual Report covers 2022–2024 and has been in the works since early 2024. Our goal is straightforward: put three years of work, funding, and decisions in one place so the community can see what Ruby Central has actually…

Code With Rails 

5 Unexpected Ways to Use Rails.app.creds

Rails 8.2's new credentials API isn't just for secrets - it's a composable configuration system. Here are 5 patterns you haven't considered.
Weelkly Article – Now open for 2026 sponsorships 

Ruby Can Create Images Again

January 5, 2026 How ruby-libgd brings a real raster engine back to Ruby For many years, Ruby quietly lost something fundamental: The ability to generate images natively, fast, and with full control. Yes, RMagick and MiniMagick exist. But they depend on external binaries, are slow, fragile in production, and unsuitable for things like: map tile … Continue reading Ruby Can Create Images Again

Judoscale Dev Blog 

Choosing the Right Node.js Job Queue

Modern Node.js apps often need to perform background jobs. Offloading to a job queue is a great way to preserve web performance when faced with sections of code that are too slow or resource-intensive to handle during an HTTP request. If your app needs to send emails, generate PDFs, process images, or aggregate data, you probably need background jobs.

Offloading these jobs (sometimes called tasks) to a job queue ensures your web process remains responsive and keeps latency down. A typical setup is to have your web processes enqueue jobs to an external system, and one or more worker processes consume and execute those jobs asynchronously.

Node job queues

This works well for keeping your…

katafrakt’s garden 

Portable mruby binaries with Cosmopolitan

One of my main interests with mruby is its ability to create standalone executables. As explored in this post, this is absolutely possible and works well. However, there is a classic issue of most standalone binaries: they can only be run on the same, or very similar, system as the one they were built on.

For example, if I take an executable from my mruby Hello World project, built on amd64 Linux, it won’t work on Silicon Mac:

$ ./hello
exec: Failed to execute process: './hello' the file could not be run by the operating system.
exec: Maybe the interpreter directive (#! line) is broken?

Mruby does have some cross-compilation capabilities, but I’ll be honest: it always felt intimidating,…

Code With Rails 

Live Countdowns Without JavaScript: Turbo Streams + relative_time_in_words

Build server-rendered countdown timers that update in real-time using Rails 8's new relative_time_in_words helper and Turbo Streams.
Drifting Ruby Screencasts 

Self Hosted App

In this episode, we'll go from a fresh Rails 8 application and a newly provisioned Raspberry Pi to deploying the application on the PI. We'll also set up a domain to point to this application and put in place geo restrictions to help prevent unwanted access.
lucas.dohmen.io 

Big Tech Exit

At 39c3, Marc-Uwe Kling, together with the CCC, called for the Digital Independence Day: The idea is to use the first Sunday every month to reduce your personal dependence on big tech and billionaires.

What I like about this approach is that it acknowledges that this is a process of many tiny steps and that a lot of people will need support. Hackerspaces in Germany will offer help to those who require it. I also really liked the idea of the “plus one rule”. Let’s take the example of WhatsApp, the quasi-standard messenger in Germany. Instead of telling people to uninstall WhatsApp, which they will likely be unable to do, ask them to add Signal. This starts a network effect for Signal,…

Tim Riley 

Continuations 2026/01: Release machinery

  • Happy new year! I started the year by finishing most of our new automated release machinery: check out Release Machine. There’s not a lot to it, but it’s exactly what we need for the future: a signed push triggers release publishing using RubyGems.org trusted publishing (no more credential sharing!), configuration to allow specific sets of releasers per-gem (this is new!), automatic parsing of  CHANGELOG.md files (using Andrew’s new changelog-parser gem, just in time!) creation of GitHub release entries, even publishing of releases to our forum (also new!), which will also come into our Discord thanks to our forum feed.

    All that’s left is to sweep through the Dry gems to make sure their…

justin․searls․co - Digest 

✉️ 100% Oyster Meat

This is a copy of the Searls of Wisdom newsletter delivered to subscribers on January 1, 2026.

As promised last month, this issue is just oyster meat. It's a new year and as good a time as any to hit reset and get this monthly newsletter back on its preordained beginning-of-the-month-ish delivery cadence. That makes this a quick turnaround after our last issue, so there's not much new to report. Good thing I asked you all to lower your expectations!

Let's see, since we last corresponded:

Code With Rails 

Rails 7.2 Connection Pool Changes May Slow Down Your App

Rails 7.2 changed how database connections are managed, causing a 5-6% performance regression for some apps. Here's why it happens and how to fix it.
katafrakt’s garden 

Using Elixir head version with Mise

In 2025 I followed the direction many people headed in and switched my version manager to mise-en-place. It has been going really well for me, but recently I came across a problem which took me a bit to figure out (and few very frustrating conversations with LLM, which did not lead to anything). I wanted to test some code with unreleased version 1.20 of Elixir, straight from git.

How to do it? It’s really simple in retrospect. Here are the steps:

1. Build Elixir

$ git clone https://github.com/elixir-lang/elixir.git 
$ cd elixir
$ make

Verify it’s built correctly:

$ bin/elixir --version
> Elixir 1.20.0-dev (88cbabf) (compiled with Erlang/OTP 28)

2. Link it in mise

mise link…
justin․searls․co - Digest 

🔗 Clicks Power Keyboard is a Headless Blackberry

My most-used display has been Vision Pro ever since it launched in February 2024, but it's been used exclusively as a Mac Virtual Display. This is not only because the Mac is a real computer and visionOS is an IMAX-sized iPad, but because its software keyboard is worse than the worst iPhone keyboard to ever be released. And while I'd be happy to pack a travel keyboard, Vision Pro is already too bulky to fit in my bag. As a result, I may as well lug a real computer around with me and just use Vision Pro as a dumb display.

My second most-used display is an iPad mini, which essentially replaces my iPhone when I'm at home. It's set up to be more book-like: an iPhone stripped of any way to…

Code With Rails 

Extract Bearer Tokens with Request#bearer_token

Rails adds a convenient method to extract bearer tokens from the Authorization header in API requests.
Code With Rails 

Track Deployments with Rails.app.revision

Rails 8.2 adds Rails.app.revision for deployment tracking, error reporting, and cache busting.
justin․searls․co - Digest 

📸 Shovelware: pdf2web pipeline

Problem: I have hundreds of pages of PDF catalogs in Japanese and no great way to translate them while retaining visual anchors. I like how Safari's built-in translate tool handles images, but it doesn't support PDFs

Solution: point Codex CLI at the directory of PDFs, tell it to rasterize every page of every doc into high-resolution images, then throw together a local webapp to navigate documents and pages. Now I can toggle Safari's built-in translation wherever I want.

Result: I'm no longer worried the curtains won't match the drapes. 💁‍♂️

This is the golden age of custom software if you've got an ounce of creativity in your bones.

Weelkly Article – Now open for 2026 sponsorships 

Rebuilding Ruby’s Image Processing Layer: Why ruby-libgd Matters for GIS and the Future of Ruby

Ruby on Rails Developer | Ruby, Backend January 2, 2026 In late 2025, during a RubyConf presentation about disaster-response systems, an uncomfortable truth was stated publicly: Generating map tiles and images on the server is difficult in Ruby. RMagick and MiniMagick were too slow. ruby-gd is used, but it is poorly maintained. This was not … Continue reading Rebuilding Ruby’s Image Processing Layer: Why ruby-libgd Matters for GIS and the Future of Ruby

Judoscale Dev Blog 

Black Box Hosting vs. Glass Box Hosting: An Interview With Judoscale's Adam

Greetings, Judoscale readers! While we usually write our posts as a team, I (Jon) wanted to take a novel approach this time around. I wanted to interview Adam, Judoscale’s founder and still the head of our tiny team, to get his outlook on the marketplace of hosting as we begin 2026.

The goal here wasn’t to host a cage match between the various PaaS vendors currently on the market. It was to setup a scenario:

Let’s frame this conversation as a thought experiment: if you were starting a new startup today — something like Judoscale, but fresh — would you still choose Heroku? We’ll look at that decision through the lens of a founder building a real business, not a hobby app — meaning…

Glauco Custodio 

RSpec Satisfy Matcher

I've recently discovered (or at least found a good use case for it) the satisfy matcher in RSpec.

My intention was to ensure an attribute contained a string and not another string (within have_attributes).

I tried a few variations of the code below, but none of them worked:

message = Message.first
expect(message).to have_attributes(
  conversation_id: conversation.id,
  customer: "customer@example.com",
  response: include("Hello, world!").and(not_to(include("Subject:")))
)

While inspecting rspec-expectations's source code in search of an exclude matcher or something similar, the satisfy matcher stood out as a good fit:

expect(message).to have_attributes(
  conversation_id: conversation
RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

React on Rails Explained: Modern Frontend Development with Rails 8

As of early 2026, Ruby on Rails (commonly called Rails) continues to be a leading framework for building robust, convention-driven web applications. Rails 8.0, released in November 2024, introduced significant simplifications with features like Kamal for deployment, Solid Cache/Queue/Cable for built-in alternatives to external services, Propshaft as the default asset pipeline, and a native authentication generator. Rails 8.1, released in October 2025, added further enhancements such as Active Job Continuations and Local CI.

Rails’ default frontend stack emphasizes Hotwire (Turbo and Stimulus), delivering highly interactive experiences through…

Remote Ruby 

Remote Ruby Wrapped

In this episode of Remote Ruby, Chris, Andrew, and David humorously discuss the rapid increase of 'wrapped' features in various apps, recount personal experiences with food apps, and then dive into their favorite conference moments of the year. They also explore the concept of UI affordances and its importance in web design and give a preview of upcoming conferences in 2026, and a brief discussion on modern CSS and JavaScript elements. Hit download now to hear much more! 

Links

Saeloun Blog 

Rails 8.1 introduces support for joins in update_all for Postgresql and SQLite.

ActiveRecord joins is used to combine records from multiple tables based on associations, generating an SQL INNER JOIN.

With update_all, we can update multiple records quickly without triggering model validations, callbacks, or modifying timestamps.

Combining these two methods is useful when we need to perform bulk updates based on data from associated tables. For example, syncing a column value from a parent record to all its children in a single query.

Before

When we use update_all together with joins, Rails generates a subquery that prevents referencing joined tables in the SET clause, which results in an ActiveRecord::StatementInvalid error.

For example:

class Client < Application…