Rubyland

news, opinion, tutorials, about ruby, aggregated
Sources About
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 as 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. Technically you register the right to useit for a…

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…

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…
Ruby on Rails: Compress the complexity of modern web apps 

This Week in Rails: January 2, 2026

Hi, it’s zzak. Hope everyone had a great holiday season and a happy new year! 🎊
Let’s explore this week’s changes in the Rails codebase.

Add Rails.app.revision
Add Rails.app.revision to provide a version identifier for error reporting, monitoring, cache keys, etc.

Add ActionDispatch::Request#bearer_token
Add ActionDispatch::Request#bearer_token to extract the bearer token from the Authorization header. Bearer tokens are commonly used for API and MCP requests.

Allow Rails.app.creds to access .env values in dev
In addition to ENV and the encrypted file, Rails.app.creds can now access values from .env files in development mode.

Fixed bin/rails notes command to work with CSS comments
This…

Jake Zimmerman 

Mechanical tips to improve shipped emails

I end up giving the same mechanical feedback on ~every shipped email draft I read. These are some simple tips for making a shipped email useful to busy readers.
Tenderlove Making 

Pixoo64 Ruby Client

I bought a Pixoo64 LED Display to play around with, and I love it! It connects to WiFi and has an on-board HTTP API so you can program it. I made a Ruby client for it that even includes code to convert PNG files to the binary format the sign wants.

One cool thing is that the display can be configured to fetch data from a remote server, so I configured mine to fetch PM2.5 and CO2 data for my office.

Here’s what it’s looking like so far:

LED sign that has a cat and PM2.5 data on it

Yes, this is how I discovered I need to open a window 😂

Fractaled Mind 

Writing Tailwind-compatible Semantic CSS

Building HTML UI forced me to figure out how to write reusable CSS classes that play nice with Tailwind. Along the way, I looked at how other libraries tackle this. Spoiler: most of them get it wrong.


Let me show you two approaches I found, then I’ll show you what I landed on.

Here’s how Basecoat defines a badge:

@layer components {
  .badge,
  .badge-primary,
  .badge-secondary,
  .badge-destructive,
  .badge-outline {
    @apply inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]…
danielabaron.me RSS Feed 

Slowing Down AI On Purpose

Why I deliberately slow AI down to reason about design, context, and incremental change before writing code.
Andy Croll 

Year in Review 2025

House moves, robot armies, and scratching itches.

January—February

Ten years ago, I was looking at the prices of T-shirt printing machines and figuring out the best way to manage stock and postal services. I’ve always wanted to have a place to exercise my design eye and this year I launched Ruby T-shirts.

I use a mix of Shopify and Printful and add designs whenever they come to me. I don’t have the headspace to manage stock and posting things myself, so this setup “just” (read mostly) works. From a financial perspective it just about breaks even: I’ve had over 100 orders this year and the relatively low cost cost of running a Shopify store combined with the low margins means it’s…

Olivier Lacan 

Zoé

While 2022 was all about joins, this year we made a whole new record.

Her name is Zoé and she’s wonderful. I can’t wait for her to meet the world in spite of its flaws.

Le meilleur sandwich du monde

Along the way, Zoé helped me refocus on what really matters:

  • getting lost in that afternoon shine
  • holding hands (or fingers)
  • ~naps~
  • the percussive pleasure of deep farts 💨
  • improvising harmonies to soothing songs
  • watching sunrises and sunsets like movie premieres
  • singing and walking (at the same time)
  • feelings within & without
  • blissful abandon

Merci Zouzou et à demain matin ☺️

Nithin Bekal | Ruby 

Favorite books of 2025

35 books, 17,000 pages. That fell short of the 50 books target I set for myself, but there were quite a few great books in there. Most of my “reading” this year was through audiobooks, so I ended up listening to 240 hours (that’s 10 whole days!) worth of books.

Non fiction

A Random Walk Down Wall Street (Burton G Malkiel)

Malkiel is one of the earliest advocates for index funds, so a lot of today’s personal finance wisdom comes from this book. Originally written in the 1970s, but regularly updated, it has remained relevant through half a century. He also weaves the narrative much better than most personal finance writers, so it is a delightfully engaging read. He can easily jump from the…

justin․searls․co - Digest 

🔗 This Ball x Pit trailer

Becky gave me a $100 gift card to Steam for Christmas, so for the first time in a decade I endeavored to hunt for some hidden gems in the Steam Winter Sale. I haven't even booted it up yet, but this trailer immediately convinced me to instabuy Ball x Pit.

I'm sure the game is great, but I wish more trailers were this stupid and irreverent. Gaming is a silly hobby and the best favorite game marketing isn't afraid to embrace that fact.

🔗 youtube.com

🧂 justin.searls.co

justin․searls․co - Digest 

📺 This Ball x Pit trailer

Becky gave me a $100 gift card to Steam for Christmas, so for the first time in a decade I endeavored to hunt for some hidden gems in the Steam Winter Sale. I haven't even booted it up yet, but this trailer immediately convinced me to instabuy Ball x Pit.

I'm sure the game is great, but I wish more trailers were this stupid and irreverent. Gaming is a silly hobby and the best favorite game marketing isn't afraid to embrace that fact.

Watch on YouTube

Fractaled Mind 

2025 in review

On September 23rd, 2025, in a Berlin hospital room, I became a dad. Emma Elanor Margheim entered the world and promptly rearranged every priority I thought I had.

She’s currently asleep, so let me tell you about the rest of the year.


Becoming a Family

The year began with a milestone: on January 13th, Geniya became a German citizen. After oodles of paperwork and appointments and waiting, she walked out of the Ausländerbehörde as a dual citizen. We celebrated with sushi.

Young woman standing between European Union, German, and Berlin flags holding a Berlin certificate, smiling in an official setting.

By spring, we knew Emma was on the way. In June, we escaped to Südtirol for a babymoon—a last hurrah of lazy mornings and mountain views before our family of 2 become a family of 3. We hiked (more like…

Josh Software 

Why AI-Driven Intelligent Automation Matters More Than Workflow Automation

Automation without intelligence doesn’t remove work. It just moves it.  Many investment platforms automate surface-level workflows: file ingestion, reporting jobs, scheduled tasks while leaving the hardest problems untouched. Exceptions are still handled manually. Errors are discovered after impact. Risk is reviewed after exposure. This creates a dangerous illusion of efficiency.  In a high-volume investment system we worked on, operational teams were … Continue reading Why AI-Driven Intelligent Automation Matters More Than Workflow Automation
Josh Software 

Why Report-Driven Analytics Fail: The Case for Real-Time Analytics for Investment Platforms

In investment systems, delayed insight is often mistaken for acceptable latency. Reports arrive an hour later. Reconciliations happen end of day. Risk is reviewed after execution. On paper, nothing looks wrong. In reality, decisions are already behind the market.  In one regulated investment environment we worked with, investment performance analytics across asset classes: shares, funds, cash deals, and loans relied on manual or … Continue reading Why Report-Driven Analytics Fail: The Case for Real-Time Analytics for Investment Platforms
Josh Software 

Why Independence Matters More Than Scale in Investment Software Architecture

Most investment platforms don’t fail because they can’t scale. They fail because everything scales together.  In regulated investment environments, scale doesn’t arrive neatly. It comes in bursts: market volatility, reporting deadlines, compliance reviews, portfolio queries; all hitting the system at once. When architecture is tightly coupled, these spikes don’t just slow one function down. They slow everything.  This is where many systems begin … Continue reading Why Independence Matters More Than Scale in Investment Software Architecture
Hi, we're Arkency 

Adding multi-tenancy to a DDD Rails app

Adding multi-tenancy to a DDD Rails app

Many businesses when they set out to create some software they need, don’t know that one day, they might need multi-tenancy.

This is one of the features, that is not easy for programmers to add later easily. It might take months or even years.

Let me describe how I approached this in an ecommerce app. Essentially, the idea is to allow to create multiple stores, where previously it was one (or actually lack of any, all resources were global).

The ecommerce project

The project I am talking about is called ecommerce and it is part of the RailsEventStore (RES) organization on github. It started as a sample application for RES but over the last 10…

Tenderlove Making 

Cat Pics

An orange cat peeks out from inside a light blue felt cat bed with a circular entrance opening.An orange cat with bright green eyes peers out from inside a blue felted cat tunnel.An orange cat with wide green eyes peeks out from inside a blue felted cat tunnel.

Did a few cat pics tonight!

RubySec 

GHSA-g9jg-w8vm-g96v (action_text-trix): Trix has a stored XSS vulnerability through its attachment attribute

### Impact The Trix editor, in versions prior to 2.1.16, is vulnerable to XSS attacks through attachment payloads. An attacker could inject malicious code into a data-trix-attachment attribute that, when rendered as HTML and clicked on, could execute arbitrary JavaScript code within the context of the user's session, potentially leading to unauthorized actions being performed or sensitive information being disclosed. ### Patches Update Recommendation: Users should upgrade to Trix editor version 2.1.16 or later. ### Resources The XSS vulnerability was reported by HackerOne researcher [michaelcheers](https://hackerone.com/michaelcheers?type=user).
justin․searls․co - Digest 

🎙️ Breaking Change podcast v48.1 - 2nd Annual Punsort

Direct link to podcast audio file

During the end-of-year podcasting doldrums, I'm pleased to bring you this Feature Release, in which I eschew my tradition of eschewing traditions and present a second annual sorting of the puns. As 2025 (a.k.a. Season 2) of Breaking Change comes to a close, Aaron Patterson once again joins the show to execute our latest iteration of the punsort algorithm.

Following along at home? Here's a spoiler-free link to the original Season 2 rankings.

Ready to be spoiled? Visit /puns for the final pun rankings of 2025.

If you agree, disagree, or are indifferent about where things landed, feel free to get it off your chest at podcast@searls.co.

Write Software, Well 

You Can Now Access Bearer Tokens Directly from Request

You Can Now Access Bearer Tokens Directly from Request

Two days ago, Rails added a new feature that makes working with bearer tokens easier. Before, you had to parse the Authorization header to extract them. Now, there's a dedicated bearer_token method on the request object that handles this for you.

Add `ActionDispatch::Request#bearer_token` to extract the bearer token by dhh · Pull Request #56474 · rails/rails
Add ActionDispatch::Request#bearer_token to extract the bearer token from the Authorization header. Bearer tokens are commonly used for API and MCP requests.
You Can Now Access Bearer Tokens Directly from Request

When building APIs that use bearer token authentication (OAuth 2.0 and JWT-based authentication), you typically receive tokens from the client in the Authorization header…

Saeloun Blog 

Rails 7.1 allows passing validate(_check)_constraint through change_table

When we are running Rails migrations, it’s common to combine multiple changes into a single change_table block especially when we want to keep database schema in sync.

Before Rails 7.1

Previously, validate_constraint and validate_check_constraint had to be called outside the change_table block, requiring constraint creation and validation to be handled as two separate steps.

For example:

class AddNameColumnsAndConstraintToUser < ActiveRecord::Migration[7.0]
  def change
    change_table :user, bulk: true do |t|
      t.string :first_name
      t.string :last_name
      t.check_constraint "first_name IS NOT NULL AND last_name IS NOT NULL",
        name: "name_not_null", validate: false

After

With the enhancement introduced in Rails 7.1, we can now create cleaner migrations by combining column additions and constraint validations within a single change_table

def validate_constr…
The Bike Shed 

487: ActiveModel custom attributes

Joël contributes some thoughts on working with custom attributes as he follows up on last week’s discussion about ActiveModels with Sally.

Joël breaks down how he transforms various strings and objects when working with ActiveModels to simplify more advance workloads, as Sally queries their different use cases and how best to utilise them for her own workflow.

Catch up on Sally and Aji’s episode from last week on ActiveModels before diving into this discussion!

If you’d like to give some of the gems mentioned in this episode a try for yourself they can be found here - phonelib - money-rails - astronoby

Thanks to our sponsors for this episode Judoscale - Autoscale the Right…

Tenderlove Making 

Can Bundler Be as Fast as uv?

At RailsWorld earlier this year, I got nerd sniped by someone. They asked “why can’t Bundler be as fast as uv?” Immediately my inner voice said “YA, WHY CAN’T IT BE AS FAST AS UV????”

My inner voice likes to shout at me, especially when someone asks a question so obvious I should have thought of it myself. Since then I’ve been thinking about and investigating this problem, going so far as to give a presentation at XO Ruby Portland about Bundler performance. I firmly believe the answer is “Bundler can be as fast as uv” (where “as fast” has a margin of error lol).

Fortunately, Andrew Nesbitt recently wrote a post called “How uv got so fast”, and I thought I would take this opportunity to…

Saeloun Blog 

Rails 8.1 now sorts table columns alphabetically when dumping the schema

schema.rb documents the database structure in a database-agnostic way, providing a Ruby representation of the schema within the limits of what Active Record can express.

Before

When running migrations, Rails generates the schema.rb file by dumping the current database structure. However, the order of columns in schema.rb reflects the physical column order in the database, which typically follows migration history.

Imagine you have a posts table:

create_table "posts", force: :cascade do |t|
  t.string "title"
  t.boolean "published"
  t.text "summary"
end

After applying different migrations, the order of columns may differ on other machines:

create_table "posts", force: :cascade do |t|
Ruby Weekly 

Ruby 4.0 released, with a roundup of what's new

#​781 — December 29, 2025

Read on the Web

Ruby Weekly

Ruby 4.0.0 Released — Yui Naruse of the core team took the helm for this year’s big, and extra special, Ruby release post where we celebrate 30 years of Ruby with the big v4.0! We’re listing a few of the most notable updates below, but it’s worth checking out the post, if only to enjoy the Ruby blog’s new theme.

Yui Naruse

A New Design for the Official Ruby Site — Unveiled a few days before v4.0, Ruby’s official web site has received more than a lick of paint, with a complete, modern redesign. It’s really well put together and gives off more of Ruby’s…

justin․searls․co - Digest 

📸 Meta's algorithm has me nailed

If you look closely, you'll spot that the Instagram algorithm has successfully identified my absolute number-one-with-a-bullet favorite topic. How on earth did it figure that out? My phone must be listening to me.

Weelkly Article – Now open for 2026 sponsorships 

How RIZAP Technologies Turns Junior Developers Into Senior Ruby Engineers

How RIZAP Technologies Turns Junior Developers Into Senior Ruby Engineers December 29, 2025 At RubyWorld Conference 2025 and Kaigi on Rails 2025, a talk by Tomohiro Umeda from RIZAP Technologies quietly delivered one of the most important messages for the future of Ruby engineering. Most companies would love to hire senior engineers. But in reality … Continue reading How RIZAP Technologies Turns Junior Developers Into Senior Ruby Engineers

Tim Riley 

Continuations 2025/52: Do what you love

  • Happy holidays, and happy last week of the year!

    If you haven’t yet, now is a great time to check our State of Hanami, December 2025, which I posted earlier this week. It’s a great snapshot of everything we achieved this year, and it ends with some of our goals for the year to come.

  • I wasn’t sure if I’d end up writing one of these this week, since I’ve been off enjoying some family time by the coast. They say to do what you love while on holiday, so I’ve read a novella (Slow Bullets by Alastair Reynolds), done some retro gaming (The Legend of Zelda: The Minish Cap on my recently-acquired RG40XXV), done some beach swimming, and as it turns out, a bunch of Ruby open source. So here we are,…

  • After Ruby…

Closer to Code 

Shoryuken Has a New Maintainer, and v7.0.0 Is Almost There

After a decade under Pablo Cantero's stewardship, Shoryuken has a new maintainer - me. I'm grateful for his graceful handoff of this Ruby SQS library, and I'm picking up where he left off: v7.0.0.rc1 is out now, with the stable release close behind.

What's in v7.0.0

This release modernizes the codebase substantially. It brings several improvements including:

  • Rails 8.1+ features:

    • ActiveJob Continuations let jobs checkpoint progress during shutdown and resume after restart.
    • Bulk enqueuing via enqueue_all now uses SQS batch API.
    • CurrentAttributes automatically flow from enqueue to execution.
  • Dependency reduction:

    • myumura removed concurrent-ruby entirely, replacing it with pure Ruby…
    • Co…
justin․searls․co - Digest 

📸 Doordash Couture

Who is this for? STEM majors realizing they're better off running Uber Eats?

RichStone Input Output 

[8/4] How a Scotsman saved hours of my time by turning an LLM into my virtual assistant

[8/4] How a Scotsman saved hours of my time by turning an LLM into my virtual assistant

Sometimes you get stuck thinking about less-than-ideal solutions, missing the big green elephant staring right at you. I had a nice win in a short time that I didn't want to leave unshared.

I had used a bookkeeping app for several years to file my taxes. Once I decided to switch accountants, I found that this application isn't very interested in you leaving, so it doesn't offer an "export all functionality" option. (a black-hat churn buster right there for you SaaS builders!)

Here are a couple of these screens:

[8/4] How a Scotsman saved hours of my time by turning an LLM into my virtual assistant[8/4] How a Scotsman saved hours of my time by turning an LLM into my virtual assistant

Basically, I stood before a gigantic mechanical task: clicking through dozens of pages and downloading hundreds of invoices I had uploaded manually for the past years.

My first thought…

Kevin Newton 

A Ruby YAML parser

Recently I built the psych-pure gem, a pure-Ruby implementation of a YAML 1.2 parser and emitter. It fully conforms to the YAML 1.2 specification, passes the entire YAML test suite, and allows you to preserve comments when loading and dumping YAML documents. This post explains how and why.

Motivation

First, let’s talk about YAML. YAML is a surprisingly complex data serialization format. It supports a wide variety of data types and syntactic structures, making it both powerful and a huge pain to implement correctly. If you check out matrix.yaml.info you’ll see that very few of the YAML parsers in use fully conform to the YAML 1.2 spec.

Notably, the one used by Ruby — libyaml — errors out…

Ruby on Rails: Compress the complexity of modern web apps 

This Year in Rails

Happy Holidays, this is Claudio, Emmanuel, Greg, Vipul, Wojciech, and Zzak, bringing you the summary of what happened with Rails in the past year. It was a busy year with close to 2700 commits from 430 contributors and 14 releases, including Rails 8.1! The Rails Foundation also released a wrap up of 2025, and here are the most noteworthy changes landed in Rails this year.

Fix inconsistency between “delete_all” & “update_all” allowed methods
After this change, trying to call update_all with distinct or a CTE (with, with_recursive) is deprecated and will raise an error in Rails 8.2. This is consistent with the behavior of delete_all.

Add a script for using dev containers outside VSCode
I…

Remote Ruby 

Ruby Upgrades & RAM Shortages

Chris, Andrew, and David are back together, and the conversation starts out with TV talk, Fallout hype, why some shows overstay their welcome (Prison Break), and the “season one magic” problem (Reacher). Then there’s a big shoutout to Marco’s Rails Luminary win, and a deep dive into AI rabbit holes: self-hosting LLMs, Mac minis, and the looming reality of both token costs and RAM shortages. They discuss the Ruby releases (3.4.8 + Ruby 4.0 preview3), highlighting practical fixes, previewing features like Ruby:: Box, new syntax tweaks, and core classes updates they’re excited about.  Hit download now! 

Links

Saeloun Blog 

Upgrading from Rails 5.2 to Rails 6 - Modern Rails Features

Rails 6 is a major milestone that modernizes Rails for the 2020s. The biggest change? Zeitwerk autoloader replaces the classic autoloader, requiring careful attention to file naming conventions.

Plus: Webpacker as default, multiple database support, parallel testing, Action Mailbox, and Action Text.

Note: This is Part 3 of our Rails Upgrade Series. Read Part 1: Planning and Part 2: Rails 4.2 to 5 first.

Before We Start

Expected Timeline: 2-4 weeks for medium sized applications

Medium-sized application: 20,000-50,000 lines of code, 30-100 models, moderate test coverage, 2-5 developers. Smaller apps may take 1-2 weeks, larger enterprise apps 6-12 weeks.

Prerequisites:

  • Current…
Ruby Changes 

Ruby 4.0

Highlights:

Note: As Ruby doesn’t follow SemVer, the 4.0 version marks not some significant change/set of changes, but was chosen by Matz to celebrate Ruby’s 30s birthday.

  • Support for line breaks before logical operators
  • Set reimplemented efficiently
  • Pathname became a core class
  • Ruby::Box
  • Ractor: ports

Read more »

RubyGems Blog 

What's New in RubyGems/Bundler 4

Ruby 4.0.0 was released on December 25, 2025, and RubyGems/Bundler 4.0.3 is now bundled with Ruby 4.0.0.

Since my previous post focused on migration and compatibility concerns, I’d like to highlight some of the exciting new features in this release.

Parallelization of C-extension Gem Builds

Add MAKEFLAGS=-j by default before compiling

When installing gems with C extensions (such as mysql2 or pg), RubyGems now automatically adds MAKEFLAGS=-j to the make command for parallel execution. Users previously had to manually configure this themselves. By leveraging multi-core CPUs by default, installation times are significantly reduced.

By default, RubyGems uses Etc.nprocessors + 1, fully…

Jake Zimmerman 

Why have lower bounds on generics?

Lower bounds expand the list of ways to create a value of that type. They behave similar to union types in that regard, but they fill a particular niche that only they can fill, relating to subtyping.