Rubyland

news, opinion, tutorials, about ruby, aggregated
Sources About
All about coding 

More about how to create a Data class in Ruby

If you have not yet read my previous articles about Data class in Ruby, I invite you to read them first:

Here, I will talk about the two ways you can create Data classes and compare them:

  • Using the block

  • Using the inheritance

How to create a Data class

You can define a new Data class using the block syntax:

Response = Data.define(:body, :status)

Looking at the current Ruby docs for Ruby version 3.4 this seems to be the way to do it or at least the documentation is using this way of creating a new Data class. If I dont miss anything all examples there are using this syntax.

You can also define a…

Josh Software 

Non-Functional Testing: The Key to Robust Software Performance

In today’s fast-paced software development landscape, developers and testers not only focus on ensuring that the application performs the intended functionality but also strive to guarantee its reliability under various conditions. This is where non-functional testing comes in. Non-functional testing focuses on assessing aspects of software that are not related to specific functionalities but are equally crucial … Continue reading Non-Functional Testing: The Key to Robust Software Performance
Mike Perham 

Sidekiq 8.0: Improvements to the Web UI

Since its release last month, Sidekiq 8.0 has been very smooth with few reported issues. I’ve been quite happy with the rollout and wanted to provide a little more context about the changes. My goals for any user-friendly, high quality software is to reduce dependencies and keep it simple. Sidekiq 8.0 brings a significant overhaul to its Web UI and these changes further those goals.

The Web UI was introduced in 2012 in Sidekiq 0.9 and used Sinatra for its framework along with Twitter Bootstrap for CSS. Sidekiq 4.2 removed the Sinatra dependency (thanks @badosu!) and made the Web UI a plain Rack app with no framework.

justin․searls․co - Digest 

🤖 How can I ensure e-mail delivery?

My prompt:

A customer of betterwithbecky.com has reported that they aren't receiving authentication e-mails, and therefore cannot access their account. The customer's e-mail address uses a custom domain but is hosted by Google. The app sends e-mail from app-mail.betterwithbecky.com via Amazon SES, which reports everything is configured correctly.

Attached are the complete DNS Zone records for betterwithbecky.com as well as the headers of a raw e-mail message I just received after attempting to log in via Gmail.

AI-generated response:
Island94.org 

Wide Models and Active Record custom validation contexts

This post is a brief description of a pattern I use a lot using when building features in Ruby on Rails apps and that I think needed a name:

Wide Models have many attributes (columns in the database) that are updated in multiple places in the application, but not always all at once i.e. different forms will update different subsets of attributes on the same model.

How is that not a “fat model”?

As you add more intrinsic complexity (read: features!) to your application, the goal is to spread it across a coordinated set of small, encapsulated objects (and, at a higher level, modules) just as you might spread cake batter across the bottom of a pan. Fat models are…

Graceful.Dev 

Site News #25: Filter Map and Snippets

Hi there, graceful devs! Here’s what’s new in the garden…

Content Updates

There’s been just one new addition to the library since the last newsletter: a quick video on Ruby’s filter_map method.

Filter Map in Ruby - Ep. 711

We’ve also released a new freebie into the wild: Pay it Forward, originally published as RubyTapas #17 back in 2012. It’s free to all now, so tell your friends about it!

Other Updates

Recently I’ve started publishing little visual snippets of code on Graceful.Dev’s social media accounts. Here are some samples:

Prefer and to Ternary contact[:blocked] ? contact[:email] : nil # Vs: contact[:blocked] and contact[:email] If the else-case is false-y, an and or 86 is simpler! #ruby Prefer Spies to Mocks gateway = instance_double(BrevoGateway) expect(gateway ) .to receiveC:create_contact) adapter.add_as_contact(user :) # Vs: gateway = instance_spy(BrevoGateway) adapter.add_as_contact(user :) expect ( gateway ) .to have_received( : create_contact) Most mock objects an be replaced with spy objects. They read better and often require less setup. #ruby #rspec Quick Method Forwarding class CardHand include Enumerable def initialize (.player, cards') @player = player @cards = cards end def eachf ... ) = @cards.each( ... ) end hand = CardHand. new "Avdi" , ["2 ", "Ko"] hand, grep /&/ # => [‘K@"] With Ruby 3's "endless methods" and ellipsis ( ... ) operator, forwarding methods is easier than ever.

So far they’ve just been going out to social media, but I’m thinking of also publishing them to the site forums, or the blog. I could also keep rounding…

Evil Martians 

Attention: An Important Brand Update From The Evil Martians Blog

Author: Travis Turner, Tech EditorTopic: AI

Has the quest for a definitive visual identity for the Evil Martians blog finally ended?

We've long sought an artistic direction that would solidify our standing as the go-to consultancy for developer tools. But how!? Then, a few years ago, it hit me: this quest was completely and totally misguided from the start. But there was nothing I could do… until now.

Ruby Central 

The Ruby Central README: March 2025

The Ruby Central README: March 2025

Welcome to The Ruby Central README! 🎉

As we announced last month, we’ve revamped our newsletters to better serve the Ruby community! Instead of combining updates on our Open Source Program, conferences, and organizational news into one, The README will focus on Ruby Central as an organization, our events, and the broader community.

For Open Source Program news, check out our dedicated newsletter, The OSS Changelog, and subscribe here.

RailsConf Updates

This year’s RailsConf will take place July 8-10th in Philadelphia, PA. It will be the FINAL RailsConf and our ONLY conference this year (there will be no RubyConf until Spring 2026).

The Ruby Central README: March 2025

RailsConf Tickets NOW ON SALE (Early Bird Sold Out)

Tickets for…

Drifting Ruby Screencasts 

Vibe Coding

Time to stop hiring $100k/year developers and hire an intern for $10k/year and pay $100/year for an AI Agent. The intern doesn't even need to understand the code it is generating and just help guide it to the solution. Sadly, this has to be said because people do not watch the content. This is satire.
Alchemists: Articles 

Hanami Assets

Cover
Hanami Assets

The Hanami Assets (gem) and corresponding Hanami Assets (library) provide the core functionality for dynamically or statically compiling all assets. The goal of this article is to delve deeper into what both the gem and library can do for your Hanami application. You’ll learn how assets are managed both inside and outside of a Hanami application. Let’s get started!

Structure

The following is an example of what your asset structure might look like:

.
├── app
│   ├── assets
│   │   ├── css
│   │   │   └── app.css
│   │   ├── images
│   │   │   └── icon.svg
│   │   ├── js
│   │   │   └── app.js
│   │   └── pwa
│   │      …
justin․searls․co - Digest 

🔗 Dear Lean people, words from non-English languages have meanings!

I don't mean to pick on Pawel Brodzinski in this blog post, but I stopped reading right at the top:

In its original meaning, Kanban represented a visual signal. The thing that communicated, well, something. It might have been a need, option, availability, capacity, request, etc.

I hate to come off as a pedant here, but something that's always annoyed me about the entire family of Lean practices in the Western world is the community's penchant for its uncritical adoption of regular-ass nouns and verbs from Japanese. Lean consultants have spent literal decades assigning highly-specific nuanced meanings to random words, and if you actually listen to anyone introducing Lean, it's hard to go 5…

avdi.codes 

https://avdi.codes/36354-2/?utm_source=rss&utm_medium=rss&utm_campaign=36354-2

It’s that time of the month when I note that the next SIGAVDI email is going out in a couple hours, and that I don’t publish them online. If you like what I write about, you might like my newsletter. https://avdi.codes/sigavdi/

avdi.codes 

jwz: Unpopularity Contest

Just a reminder, friends don’t let friends hang out on Hacker News.

HN is the fan club of a venture capital investment firm. It is your go-to spot to simp for billionaires. VCs are one of the focuses of evil in the modern world, but even if you don’t believe that, let me direct you to Y Combinator’s stochastic terrorist, cryptofascist, christofascist CEO Garry Tan.This — that attitude, and that piece-of-shit motherfucker in particular — is what you’re supporting every time you click on or share a Hacker News link.

Stop hanging out at the Nazi Bar.

Source: jwz: Unpopularity Contest

Judoscale Dev Blog 

Your Product Should Be Shiny. Your Stack Should Be Boring.

Picture this: it’s 2012 (the year the world ended! 🔥) and you’ve just lsaunched a brand new startup with an app built on a cutting-edge framework: Meteor.js. You’re feeling good. The framework is hot. It promises real-time everything, with a sleek frontend-backend combo that’s supposed to make your life easier. It’s the future. Investors are impressed. Engineers are thrilled. No-SQL is the way.

Now fast forward to today… Where’s Meteor now?

(Go ahead, I’ll wait while you Google it. Or just click here.)

.

.

Exactly.

(Sorry Meteor fans 😅)

Now imagine instead that back in 2012 you made a different choice. You went with Rails and Postgres.

Your stack wasn’t flashy. It didn’t…

Felipe Vogel 

Advent of Ruby

I’ve been working on Advent of Ruby, a CLI tool for doing Advent of Code in Ruby. Besides the usual features of such tools, it can also show other people’s solutions.

I heard about Advent of Code years ago, but I never had the guts to try it out because I knew I’d give up in the first week. December is stressful enough without 25 days of increasingly difficult code puzzles, where I would inevitably measure my self-worth by how pathetically soon I bail out. (Yeah, I should probably talk to my therapist about that.)

Then it dawned on me that I can ignore the new puzzles in December and simply…

Weelkly Article – Ruby Stack News 

🚀 Automating Ruby Gem Creation with Thor: A Guide to the Generator Script 🚀

March 28, 2025 Creating a Ruby gem from scratch often involves repetitive tasks such as setting up the gemspec, creating directories, and initializing version control. To simplify this process, I’ve written a Thor script that automates gem creation. In this post, I’ll walk you through the code behind the generator and explain how to use … Continue reading 🚀 Automating Ruby Gem Creation with Thor: A Guide to the Generator Script 🚀

Short Ruby Newsletter 

Short Ruby Newsletter - edition 129

The one where Ruby 3.1.7 and 3.2.8 are released, Joe Masilotti published Bridge components for Hotwire Native, and two new projects about building or using MCP with Ruby and Rails, a new open source library
Ruby Central 

Company Spotlight: Power Home Remodeling Scales a $1B Business With Ruby on Rails

Company Spotlight: Power Home Remodeling Scales a $1B Business With Ruby on Rails

Power Home Remodeling isn’t your typical software company. It’s a $1B exterior renovation business with more than 4,000 employees across 24 U.S. cities, and at the heart of its operation is proprietary tech built almost entirely in Ruby on Rails.

“Power prefers to build our own custom software or use open source whenever possible," says Wade Winningham, Principal Developer at Power.

That philosophy has fueled Power’s transformation from a traditional remodeling business into a technology-led enterprise. Their internal platform, Nitro, was first developed in 2008 with a small team that had prior success with Ruby and Rails. V1 of Nitro offered sales reps a view of their sales and commissions,…

As Winningham says, “We haven’t stopped shipping since.”

Today, Nitro…

Hotwire Weekly 

Week 13 - Hotwire Native Bridge Components, Hotwire Cheatsheet, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

📝 Articles

Hotwire for Ruby on Rails Developers - Igor Kasyanchuk published a Hotwire Cheat Sheet for Rails Developers.

Touch Events (swipe) using Stimulus - Rails Designer explores implementing touch interactions, like carousels and swipeable cards, using Stimulus controllers.

A library of bridge components for Hotwire Native apps - Joe Masilotti introduces a Bridge Component Library for Hotwire Native applications, offering a collection of reusable components.

Rails 8 Assets: Combining importmaps - Radan Skorić explains how to merge importmaps in a Rails 8…

justin․searls․co - Digest 

📸 Ah yes, that magical trip through the foothills of Falkreath Hold

That Microsoft OneDrive still insists on sending me photo memory e-mails, despite the fact I’ve unsubscribed a dozen times, and even though literally every picture in my OneDrive is a screenshot from my gaming PC will never not be hilarious to me.

RubySec 

CVE-2024-39311 (publify_core): Publify Vulnerable To Cross-Site Scripting (XSS) Via Redirects Requiring User Interaction

### Summary A publisher on a `publify` application is able to perform a cross-site scripting attack on an administrator using the redirect functionality. ### Details A publisher on a `publify` application is able to perform a cross-site scripting attack on an administrator using the redirect functionality. The exploitation of this XSS vulnerability requires the administrator to click a malicious link. We can create a redirect to a `javascript:alert()` URL. Whilst the redirect itself doesn't work, on the administrative panel, an a tag is created with the payload as the URI. Upon clicking this link, the XSS is triggered. An attack could attempt to hide their payload by using HTML,…
André Arko 

Rust keeps parsing those logs faster

A few years ago, I wrote about parsing logs 230x faster with Rust, and then followed up with some improvements. Then computers got a lot faster.

Today, I re-ran all the same benchmarks that I’ve been running since 2018, and discovered that computers in 2025 are a silly amount faster than computers from 2021.

Specifically, on a MacBook Pro with an M4 Max processor (which has 12 performance cores and 4 efficiency cores), I am now able to process 983k records/second on a single core, and 13.1M r/s on all cores. Using the original numbers from the “230x faster” blog post, this M4 Max is 3,113x faster than the original 8 Python workers in AWS Glue were.

While talking about these benchmarks with…

justin․searls․co - Digest 

📄 Ruby makes advanced CLI options easy

If you're not a "UNIX person", the thought of writing a command line application can be scary and off-putting. People find the command line so intimidating that Ruby—which was initially populated by a swarm of Windows-to-Mac migrants—now boasts a crowded field of gems that purport to make CLI development easier, often at the cost of fine-grained control over basic process management, limited option parsing, and increased dependency risk (many Rails upgrades have been stalled by a project's inclusion of another CLI gem that was built with an old version of thor).

Good news, you probably don't need any of those gems!

See, every UNIX-flavored language ships with its own built-in tools for…

RubySec 

CVE-2025-30221 (pitchfork): Pitchfork HTTP Request/Response Splitting vulnerability

### Impact HTTP Response Header Injection in Pitchfork Versions < 0.11.0 when used in conjunction with Rack 3 ### Patches The issue was fixed in Pitchfork release 0.11.0 ### Workarounds There are no known work arounds. Users must upgrade.
Remote Ruby 

The Learn Hotwire Course, GitHub Sign-off for CI and Yarn versions

In this episode of Remote Ruby, Andrew and Chris discuss a variety of topics, including their experiences with the podcast, the upcoming milestones for Remote Ruby and Go Rails, and their plans for future content. Chris dives into their recent work on the ‘Learn Hotwire’ course, explaining its extensive coverage of technologies like iOS, Kotlin, Swift, and Android. Additionally, they talk about team licenses for the course and early access availability. The discussion also touches upon CI workflows, the GitHub signoff process for local testing, and various technical challenges they encountered with tools like Yarn and asdf. The episode concludes with reflections on running linters in CI and…

Hi, we're Arkency 

Implementing an Inventory Module in Ruby on Rails: Handling Concurrency with Database Locks and SKIP LOCKED

Implementing an Inventory Module in Ruby on Rails: Handling Concurrency with Database Locks and SKIP LOCKED

When implementing an inventory module in a Ruby on Rails application, ensuring consistency in stock levels is crucial. If multiple users try to purchase the same item simultaneously, concurrency issues can lead to overselling.

In this post, we’ll explore two approaches to handling inventory management:

  • Using a simple counter with database locks to prevent race conditions.
  • Improving performance using SKIP LOCKED for efficient inventory allocation.

Basic Inventory Management with Row Locks

A straightforward approach to managing inventory is using database locks to prevent…

Ruby on Rails 

Capturing error reports in tests and more

Hi, Wojtek here. Let’s explore last 2 week’s changes in the Rails codebase.

Add capture_error_reports
Captures all reported errors from within the block that match the given error class.

reports = capture_error_reports(IOError) do
  Rails.error.report(IOError.new("What a Terrible Failure"))
  Rails.error.report(StandardError.new)
end
assert_equal 1, reports.size
assert_equal "What a Terrible Failure", reports.first.error.message

Don’t always escape JSON when rendering from controller
The JSON renderer doesn’t escape HTML entities or Unicode line separators anymore. Since the renderer is used to return a JSON document as application/json, it’s typically not necessary to escape those…

You can use the escape: true

Giant Robots Smashing Into Other Giant Robots 

Ruby on Rails agency in London

Everyone’s talking about AI replacing developers these days… but where can you find a good old Ruby on Rails agency in London with Ruby on Rails developers in flesh and bones* these days?

(*) plant-based version also available in selected locations, like the UK, for instance.

Do you need top-notch developers who have extensive experience with code, architecture, design, UI/UX, SRE, applications scalability, major versions upgrades, draining rivers of tech debt, as well as forward-minded individuals, savvy with AI applications and what current and future technologies will bring us?

I hear you, you still need human-centred solutions for your coding problems, AI or not.

Well, look no…

Awesome Ruby Newsletter 

💎 Issue 462 - The future of AI is Ruby on Rails

Ruby Weekly 

How good different LLMs are at writing Ruby code

#​744 — March 27, 2025

Read on the Web

Ruby Weekly

Fast MCP: A Ruby Implementation of the Model Context Protocol — MCP (Model Context Protocol) servers enable certain LLM-based agents (such as Claude, Claude Code, and Cursor) to perform actions/call tools outside of their usual restricted environment. This library lets you build tools in Ruby which such agents can then reach out to and use.

Yorick Jacquin

💡 Interest in MCPs is taking off rapidly, with a Rails-focused MCP implementation also available. OpenAI is also beginning to show an interest in working with MCP, so it's becoming a bit of a standard now.

Ruby Central 

Ruby Central's OSS Changelog: March 2025

Ruby Central's OSS Changelog: March 2025

Hello! Welcome to the March newsletter—now known as Ruby Central’s OSS Changelog.

As mentioned in our previous newsletters, we will now be sending out separate updates for the Open Source Program and general Ruby Central organization and community news.

You can expect our general Ruby Central newsletter (the Ruby Central README) in your inbox later this month.

Letter From Our Open Source Director

RubyGems has grown significantly in recent years, with a greater focus on stability and security to ensure you have the tools you need to build with confidence.

As we continue to mature, we’re putting stronger foundations in place to support that growth over the long term. This includes creating clear…

Ruby – AWS Developer Tools Blog 

AWS SDK for Ruby: Deprecating Ruby 2.5 & 2.6 Runtime Supports and Future Compatibility

Effective June 2, 2025, AWS SDK for Ruby Version 3 will no longer support following end-of-life (EOL) Ruby runtime versions:

To ensure your applications and services remain secure, we strongly encourage you to upgrade to Ruby 2.7 or later.

Moving forward, AWS SDK for Ruby will proactively drop Ruby runtime versions 3 years after they have reached end-of-life. This approach ensures we provide up-to-date and secure libraries. Our deprecation strategy will follow from the official Ruby maintenance timeline, promoting a predictable and transparent support cycle for the SDK. It also lets us stay aligned with the AWS…

Rails Designer 

Touch Events (swipe) using Stimulus

The time you build and design web-apps for the desktop, without touch events, has been long gone. Users expect features to work on their touch devices (phones, tablets) just as well.

In this article I want to explore two features where touch events can be used:

  • (image) carousels;
  • tinder-like, left- and right card swipes.

Something like this:

(don’t hate for disliking the first cat!)

Because there is a lot of overlap with these two features I am also going to explore inheritance, meaning one Stimulus controller inherits functionality from another class (just like Ruby’s UsersController < ApplicationController).

As most of the time with such features, let’s start with the HTML…

justin․searls․co - Digest 

📄 Programming is about mental stack management

The performance of large language models is, in part, constrained by the maximum size "context window" they support. In the early days, if you had a long-running chat with ChatGPT, you'd eventually exceed its context window and it would "forget" details from earlier in the conversation. Additionally, the quality of an LLM's responses will decrease if you fill that context window with anything but the most relevant information. If you've ever had to repeat or rephrase yourself in a series of replies to clarify what you want from ChatGPT, it will eventually be so anchored by the irrelevant girth of the preceding conversation that its "cognitive ability" will fall off a cliff and you'll never…

Island94.org 

Recently, March 26, 2025

  • I am on a new work adventure. I gave my notice at GitHub and will be doing this full-time starting in April. The new job should be a nice combination of a cozy “this again” and some thrilling new.
  • I finished reading Careless People; recommend as a good sequence of business trainwrecks that will leave you wondering if this one is penultimate trainwreck (spoiler: it’s not). Now I’m reading Wicked; I didn’t really like the beginning but it’s gotten more interesting.
  • I finished Severance. Hopefully without spoilers, the consistent plot driver seems to be “Mark (yes) sucks”. So now just White Lotus and with palate cleansers of Say Yes to the Dress.
  • I have been…
Schneems - Programming Practices, Performance, and Pedantry 

A Daft proc-macro trick: How to Emit Partial-Code + Errors

A recent Oxide and Friends podcast episode, “A crate is born,” detailed the creation of a proc macro for deriving “diffable” data structures with a trick I want to tell you about. To help rust-analyzer as much as possible, @rain explained that the macro should always emit as much valid source code as possible, even when an error is emitted. They didn’t go into detail, so I looked into the internals that made this code + error emitting behavior possible and wanted to share.

Podcast link: A Crate is Born

This post covers:

  • Why does macro output matter to rust-analyzer ?
  • What mechanics are used to emit code + errors?
  • When does this macro emit code + errors versus when does it just…
Ruby Central 

Introducing New Policies to Support the Growth of RubyGems

Introducing New Policies to Support the Growth of RubyGems

RubyGems has grown significantly in recent years, with a greater focus on stability and security to ensure you have the tools you need to build with confidence.

As we continue to mature, we’re putting stronger foundations in place to support that growth over the long term. This includes creating clear standards and processes for how RubyGems.org is managed.

Within my first two months in this role overseeing RubyGems, we received a takedown request for a gem that potentially violated a trademark. As we looked into it, we realized we didn’t have a formal policy to guide our response. The team had a general sense of how such cases were handled in the past, but nothing was documented. That…

Evil Martians 

Hey developer tool teams, don’t copy these copywriting clichés!

Authors: Olga Rusakova, Head of Communications, and Travis Turner, Tech EditorTopics: Developer Products, Developer Marketing, Developer Community

Avoid common dev tool copywriting problems. Learn to spot errors, improve clarity, market better, and come up with messages that stick.

Ever been on the hunt for a tech solution, then turn to Google, Reddit, or your socials and punch in something like: “Where can I find an unprecedented, blazing-fast, innovative ecosystem with faster deployment for trailblazers?” No way! Yet, a lot of developer tool copy is riddled with phrases like this. In this post, we invite you to learn from our experience and avoid copy that is too market-y, vague, or poorly…

Radan Skorić's website 

Rails 8 Assets: Combining importmaps

This post is part of a mini series on Rails 8 asset pipeline. For the full picture, start with breakdown of how propshaft and importmap-rails work together and Propshaft deep dive. Recap of importmap-rails gem The import statement in JavaScript modules allows you to import functionality from other module files. However, this typically requires providing URLs to the other JavaScript module sou...
All about coding 

Example of value objects using Ruby's Data class

Last week, I wrote an article about how to create value objects in Ruby - the idiomatic way. This week, I will share some real examples of using the data object to show some real examples.

Remove boilerplate constructor code

If you are defining classes and expose the initializer parameters as getters and you plan to make them immutable, then I think you just found the most common case for using the Data class:

Instead of this:

class Link  attr_reader :url, :source  def initialize(url:, source:)    @url = url    @source = source  endend

I write this:

class Link < Data.define(:url, :source)end

You can of course also write the simple form, but I do recommend the the previous way with inheritance…

Ruby News 

Ruby 3.1.7 Released

Ruby 3.1.7 has been released. This release includes CVE-2025-27219, CVE-2025-27220 and CVE-2025-27221 fixes and update bundled REXML and RSS gems.

Please see the GitHub releases for further details.

This version is a final release of Ruby 3.1 series. We will not provide any further updates including security fixes for Ruby 3.1 series.

We recommend you to upgrade to Ruby 3.3 or 3.4 series.

Download

Ruby News 

Ruby 3.2.8 Released

Ruby 3.2.8 has been released. This release includes CVE-2025-27219, CVE-2025-27220 and CVE-2025-27221 fixes.

Please see the GitHub releases for further details.

This version is a last version of normal maintenance for Ruby 3.2 series. We will fix only security issues for Ruby 3.2 series until end of March 2026.

Please consider upgrading to Ruby 3.3 or 3.4 series.

Download

Weelkly Article – Ruby Stack News 

Creating Reusable code in Rails: Plugins, Metaprogramming, and Best Practices

March 25, 2025 Rails developers often face the challenge of writing clean, reusable, and maintainable code. Achieving this requires leveraging plugins, metaprogramming, and Ruby’s dynamic nature. In this article, we’ll explore practical ways to implement these techniques, ensuring your Rails code is DRY (Don’t Repeat Yourself) and efficient. 💡 Looking to improve your application's code … Continue reading Creating Reusable code in Rails: Plugins, Metaprogramming, and Best Practices

Tejas' Blog 

Using PostgreSQL database constraints

Effective use of database constraints can ensure data integrity.

Mintbit 

Hiding Unfinished Features in Rails

When working on a new feature that’s not quite ready for production, it’s helpful to hide it without introducing a bunch of complexity or new dependencies.

Here’s a tiny helper we’ve been using that lets us keep in-progress UI elements visible in development, but safely hidden in production:

1
2
3
4
5
6
7
8
# app/helpers/application_helper.rb
module ApplicationHelper
  def under_construction
    if Rails.env.development?
      yield
    end
  end
end

That’s it.

Now in your views, you can wrap anything that’s still baking:

1
2
3
4
5
<% under_construction do %>
  <div class="dev-banner">
    🚧 This feature is under construction
  </div>
<% end %>

In development, the block gets…

justin․searls․co - Digest 

📄 Announcing Merge Commits, my all-new podcast (sort of)

Okay, so hear me out. Last year, I started my first podcast: Breaking Change. It's a solo project that runs biweekly-ish with each episode running 2–3 hours. It's a low-stakes discussion meant to be digested in chunks—while you're in transit, doing chores, walking the dog, or trying to fall asleep. It covers the full gamut of my life and interests—from getting mad at technology in my personal life, to getting mad at technology in my work, to getting mad at technology during leisure activities. In its first 15 months, I've recorded 33 episodes and I'm approaching an impressive-sounding 100 hours of monologue content.

Today, I launched a more traditional, multi-human interview podcast… and dr…

Giant Robots Smashing Into Other Giant Robots 

Using the Presenter Pattern in Ruby on Rails

The presenter pattern is a handy design approach that sits between your views and models, helping you keep your code organized by handling view-specific logic in a clean and maintainable way. In a Rails app, it’s a great way to keep your views and controllers slim since the presenter takes care of preparing the data your views need. Sounds interesting, right? Let’s dive in!

What is the presenter pattern

The presenter pattern, sometimes called the “ViewModel” pattern, is essentially an intermediary between the model and the view. While the model handles core business logic and data, the presenter’s job is to prepare the model’s data specifically for display.

Setting Up a…

Gusto Engineering - Medium 

Our Super Power is Our Community and Our Standards

Securing Ruby’s Competitive Edge as LLM Code Gets Useful

Coding standards and code quality have always been a cornerstone of software engineering culture that supports efficiency, outcomes, and team happiness. As LLM generating tools like Cursor finally get useful, these tools become even more important. We discuss how Ruby shops and Rubocop have an edge, as human readability has been a community goal for 25 years, giving Ruby some of the highest quality training data and the most human-centered tools to work with.

Audience

This blog post is primarily aimed at software engineers and engineering leaders interested in embracing AI, celebrating code quality, and thinking about the long term…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 128

The one where TruffleRuby 24.2 is released, JRuby 10 is getting close, a Rails MCP server is introduced, and where Stan Lo shows a Ruby MCP server powered by Ruby LSP
justin․searls․co - Digest 

🔗 Real Agency and MyTerms

Doc Searls (no relation) writes over at searls.com (which is why this site's domain is searls.co) about how the concept of human agency is being lost in the "agentic" hype:

My concern with both agentic and agentic AI is that concentrating development on AI agents (and digital “twins”) alone may neglect, override, or obstruct the agency of human beings, rather than extending or enlarging it. (For more on this, read Agentic AI Is the Next Big Thing but I’m Not Sure It’s What, by Adam Davidson in How to Geek. Also check out my Personal AI series, which addresses this issue most directly in Personal vs. Personal AI.)

Particularly interesting is that he's doing something about it, by chairing a…

Tosbourn – Belfast based Ruby developers 

Belfast Rails Supper Club

I was recently invited to join some other senior Ruby folk for a dinner in Belfast.

I love Ruby, and I love dinners, win-win!

The Belfast Rails Super club was organised by Jade White, she has put on several over the last while.

I haven’t attended networking events in years, in fact I haven’t been to a conference or meet up in a very long time. Interestingly, some of the folk I spoke to at the Supper Club were in the same boat. So, why did we go?

I can only speak for myself, but there were a few reasons;

  • it is invite only, and it is nice to be invited to things, I’m unsure if it was my LinkedIn profile or our web presence, but good to get found
  • I knew the numbers would be limited,…
Saeloun Blog 

Rails 8 Removes Channels From Default App Structure.

ActionCable integrates websockets with our app which allows two-way communication between the server and client without the need for continuous page refreshes, making real-time updates possible.

Channels are similar to controllers in that we define methods for broadcasting or streaming data to connected clients.

Before

By default, Rails would create a channels folder in the app/ directory to store these channel definitions, allowing developers to easily set up real-time features.

# Before Rails 8 when we generate rails new app

# Rails app folder structure
/app
  /assets
  /channels
  /controllers
  /helpers
  /javascript
  /jobs
  /mailers
  /models
  /views

After

Rails 8 now remove…

Saeloun Blog 

React 19 Ref Updates - Prop Support & Cleanup Function!

React 19 makes ref easier – just pass it!

React 19 brings many exciting updates, and one of the simplest yet powerful change is how ref works. We no longer need forwardRef when passing ref to built-in elements like inputs. Cool, right?

This small update makes working with ref much simpler, especially in forms where smooth user interactions matter.

The problem with forwardRef

Before React 19, if a parent component wanted to interact with a child component using a ref, we had to wrap the child in forwardRef. Annoying, right? It made the code harder to read and maintain, especially in large projects.

Thankfully, React 19 makes ref handling much easier. Let’s check out why ref became…

Notes to self 

Running JavaScript after a Turbo Stream renders

Turbo comes with turbo:before-stream-render but unfortunately doesn’t ship with the equivalent turbo:after-stream-render. Here’s how to run JavaScript after the stream renders.

Why we need this

If you are building your application with Hotwire, your Turbo streams will likely add, remove, and replace some HTML nodes. This mostly works except when you want to add HTML that comes with some JavaScript. Like a file picker, Trix editor, and the like.

Turbo itself won’t do anything about this. It’s a rather simple tool with simple purpose. JavaScript initialization should come with the HTML Turbo is about to add. Hotwire solves this with Stimulus.

The Hotwire way

The Hotwire answer to the…

Giant Robots Smashing Into Other Giant Robots 

content_for -- What is it good_for?

Sometimes, you need to include HTML but you can’t figure out where to do it, especially if you’re trying to push something up the view hierarchy.

The answer to your challenge is often #content_for.

Content what?

As described in the Rails guides:

The content_for method allows you to insert content into a named yield block in your layout.

How does it work?

Step 1: A view has a #content_for line or block. This is the “input”.

<!-- app/views/posts/index.html.erb -->

<% content_for :title, "All the Posts" %>

<% content_for :something do %>
  <script>function hello() {}</script>
  <style>h1 {color: blue;}</style>
  I will appear in the :something block!
<% end %>

Step 2: The…

Hotwire Weekly 

Week 12 - AnyCable 1.6 is here, Turbo declarative presence tracking, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

AnyCable v1.6 with presence tracking support - Vladimir Dementyev released AnyCable v1.6.0 which adds presence tracking, token-based WebSocket authentication, and improved handling of slow clients via configurable message buffering.

Simple Declarative Presence for Hotwire apps with AnyCable - Following up, Vladimir Dementyev and Irina Nazarova posted an article about the new declarative presence tracking feature in AnyCable 1.6. It utilizes a <turbo-cable-presence-source> element to manage the presence of a user on a page or resource.

Translations in Stimulus…

RichStone Input Output 

DNS brain teaser for your engineering brain

DNS brain teaser for your engineering brain

I just spent a few weeks wrestling with a domain issue that could have been solved in a couple of hours max (not a literal few weeks, but half an hour here and an hour there over a few weeks). Let me walk you through what happened and the technical details I learned along the way about DNS and domains.

For context, I was trying to connect a subdomain of my primary domain (richstone.io) to my ClickFunnels account. I already have this blog here that you can navigate to with richstone.io and I wanted devs.richstone.io to point to ClickFunnels, which I currently basically use like TypeForm and sometimes like a Stripe Checkout.

The setup required verifying certain TXT records, and this is where…

justin․searls․co - Digest 

🎙️ Merge Commits podcast - Changelog: My Siri Theory

Direct link to podcast audio file

Had a blast, as usual, joining my Changelog friends for a vigorous discussion of Apple's Intelligence struggles and the tumultuous state of the software industry.

It's also on YouTube:

Appearing on: The Changelog
Recorded on: 2025-03-18
Original URL: https://changelog.com/friends/85

Comments? Questions? Suggestion of a podcast I should guest on? podcast@searls.co

Tim Riley 

Goodbye Pinboard, hello Linkding! (And the magic of getting here)

Let me tell you about one of the best software experiences I’ve had in recent times.

But first, some background. I’ve always been a bookmark collector. There are so many cool or informative things on the web, and I want to be able to find my way back to them. Since 2007 (18 years!), I’ve collected over 4,500 bookmarks.

I first captured these bookmarks on del.icio.us (RIP), then later on Pinboard. Both were good tools: fast, low fuss, and oriented around tags, for easy organisation and retrieval of links.

Then Pinboard guy turned out to be a transphobe, so I knew I had to switch.

The time finally came last week, when I had a spare hour at the computer one evening. The obvious commercial…

justin․searls․co - Digest 

🎙️ Merge Commits podcast v - Changelog: My Siri Theory

Direct link to podcast audio file

Had a blast, as usual, joining my Changelog friends for a vigorous discussion of Apple's Intelligence struggles and the tumultuous state of the software industry.

Appearing on: The Changelog
Recorded on: 2025-03-18
Original URL: https://changelog.com/friends/85

Comments? Questions? Suggestion of a podcast I should guest on? podcast@searls.co

byroot’s blog 

Database Protocols Are Underwhelming

If you’ve been in this trade for a while, you have probably seen dozens of debates on the merits and problems of SQL as a relational database query language. As an ORM maintainer, I have a few gripes with SQL, but overall it is workable, and anyway, it has so much inertia that there’s no point fantasizing about a replacement.

However one database-adjacent topic I don’t think I’ve ever seen any discussions about, and that I think could be improved, is the protocols exposed by these databases to execute queries. Relational databases are very impressive pieces of technology, but their client protocol makes me wonder if they ever considered being used by anything other than a human typing…

naildrivin5.com - David Bryant Copeland's Website 

One Week With Desktop Linux After a 20 Year Absence

I bought a Framework laptop a couple weeks ago, set it up with stock Ubuntu, and used it for my primary computer for a week. It’s the first time I’ve used Linux in earnest in 20 years. It’s amazing how much has changed and how much hasn’t.

The tl;dr for this post is that I don’t know if I could use Linux as my desktop full time for web development. While there are many papercuts, the three main issues I can’t see a way around are: lack of integrated API documentation lookup (e.g. Dash.app), inability to customize keyboard shortcuts consistently across all apps, and the absolute tire-fire of copy and paste.

Why Even Do This?

I actually grew up on UNIX and then Linux. All through…

Remote Ruby 

Mac Upgrades to Debugging Dilemmas

In this episode, Andrew and Chris discuss Chris's new hardware upgrade to a Mac Studio, diving into its benefits for video processing and development work. They share stories about troubleshooting a perplexing bug related to WebSockets and Cable Ready, and discuss the conference proposal process, offering insights into writing effective CFPs based on their experiences with RailsConf and Rails World. Additionally, Andrew shares a game update about Cyberpunk and Chris shares the inspiring success story of the game ‘Balatro,’ highlighting the developer’s journey from side project to commercial triumph. Hit the download button now!

Honeybadger
Honeybadger is an application health monitoring tool…
Notes to self 

Running interactive sessions with Kamal

How to connect to a container on a server managed by Kamal and run an interactive session?

Interactive server actions

Kamal comes with a kamal server exec to execute a single command on the server. If we pass the -i option, we’ll start the interactive session that doesn’t cancel the connection immediatelly.

Similarly, Docker comes with docker exec command with the -it options to run a container process interactively.

If we combine both of these we’ll get what we need. A single command to run something interactively out of a single container:

$ kamal server exec -i "docker exec -it [CONTAINER] [COMMAND]"

Example

Here’s an example with kamal-proxy:

$ kamal server exec -i "docker exec…
Awesome Ruby Newsletter 

💎 Issue 461 - The Ultimate Guide to Scaling Sidekiq

avdi.codes 

How did you know to do that?

I wrote the following in a SIGAVDI newsletter many years ago:


The other day I wrote some Ruby code to emulate the UNIX which command. Afterward, I started composing a RubyTapas episode explaining the implantation.

There were some points worth noting in the code, and I think it’ll make a solid episode. But as I was writing it, I realized that I was leaving out the parts that a lot of my viewers would probably most like to see.

Sometimes I watch videos of masters on tasks I have no skill at, like electronic music composition, or graphic design. The questions that are most often in my mind are not “how did you do that?”, but: “how did you know to do that?”

I can see (or hear)…

RubyGems Blog 

Introducing New Policies for RubyGems.org

We’re pleased to introduce several key policies for RubyGems.org for community review. These include a Terms of Service, Privacy Notice, Acceptable Use Policy, and Copyright Policy. While these policies align with how RubyGems has always operated, the absence of formal documentation created ambiguity around acceptable use. These new policies provide clarity and transparency regarding our operations, how we protect user data, and our commitment to maintaining a safe and respectful environment for all RubyGems users.

Terms of Service

The Terms of Service define the rules and guidelines for using RubyGems.org. They cover everything from account responsibilities to intellectual property…

Mintbit 

Clean Strings Efficiently with delete_suffix and delete_prefix

Ruby provides many powerful methods for string manipulation, and among them, delete_suffix and delete_prefix are particularly useful when dealing with structured text. These methods allow you to remove a specified suffix or prefix from a string if it exists, providing a clean and efficient way to handle text processing.

Basic Usage

The delete_suffix and delete_prefix methods help eliminate unwanted leading or trailing parts of a string without requiring complex regular expressions.

delete_suffix

The delete_suffix method removes a given suffix from the string if it ends with that suffix. If the string does not contain the suffix, it remains unchanged.

1
2
3
filename = "report_2025.pdf"
The Rails Tech Debt Blog 

Heroku & Ruby Compatibility Table

In this article we will present compatibility between Ruby and Heroku across different versions. In the process of upgrading really old applications to more modern versions of Ruby we have run into a lot of these combinations.

To find more information about Heroku Ruby support check out the Heroku Ruby Support Reference page. In general, however, we suggest you to follow the Ruby Core support policy.

Heroku Stacks and Ruby Versions

Heroku stacks are the underlying operating system (OS) environments that power your applications, built on Ubuntu LTS (Long-Term Support) versions. Each stack supports specific Ruby versions, and aligning your application with the correct stack and Ruby…

Ruby Weekly 

Ruby debugging tips for 2025

#​743 — March 20, 2025

Read on the Web

Ruby Weekly

Ruby Debugging Tips and Recommendations in 2025 — A brief piece but packed with advice from Stan (who knows a thing or two from all his work on debug.rb and modernizing IRB). Did you know you can use the Ruby LSP extension with debug.rb?

Stan Lo

Ruby, Ractors, and Lock-Free Data Structures — An extensive, multi-chapter article that goes into serious depth about Ractors, lock-free data structures and shared mutable global state in multi-threaded Ruby apps. There’s also code if you want to play along or experiment.

Ilya Bylich

Seamless Rails…

Weelkly Article – Ruby Stack News 

Handling File Transfers in a Heroku Environment with Net::SFTP

March 20, 2025 Daily readers, today’s article is a bit different. Usually, I dive into a specific Ruby or Ruby on Rails topic, but today, time is short, and I need to handle different tasks. So, I’ll share a quick but useful real-world problem I encountered. Need Help with a Heroku Project? Do you need … Continue reading Handling File Transfers in a Heroku Environment with Net::SFTP

justin․searls․co - Digest 

🔗 Very-nearly-free HTTPS redirects for Heroku and DNSimple

Tuesday, while recording an episode of The Changelog, Adam reminded me that my redirects from possyparty.com to posseparty.com didn't support HTTPS. Naturally, because this was caught live and on air and was my own damn fault, I immediately rushed to cover for the shame I felt by squirreling away and writing custom software. As we do.

See, if you're a cheapskate like me, you might have noticed that forwarding requests from one domain or subdomain to another while supporting HTTPS isn't particularly cheap with many DNS hosts. But the thing is, I am particularly cheap. So I built a cheap solution. It's called redirect-dingus:

What is it? It's a tiny Heroku nginx app that simply reads a…

Rails Designer 

Translations in Stimulus Controllers

This is a sneak peek from the upcoming book, JavaScript for Rails Developers. For this blog post, I’ve simplified some of the more detailed sections to better fit the blog.


Translations, or more broadly Internationalization (i18n; because there are 18 letters between “i” and “n”), is the process of preparing apps to support multiple languages and regional settings (i.e. “locale”) to accommodate a global user base. So it’s not just about translating words, but also about the formatting of dates, numbers and phone numbers.

It is one of those features product managers move back it to the backlog, because they know adding support for it is fairly easy (especially with Rails), but…

All about coding 

How to create value objects in Ruby - the idiomatic way

When writing Ruby OOP, a typical pattern might be to create an object to group multiple values together meaningfully and sometimes also add some extra methods (computed properties, predicates, representations, ) to allow the object to respond to various situations.

Here is an exploration of how to create value-alike objects in Ruby and what I think is the modern idiomatic way.

What is a value-alike object?

If you want to read an article about this concept, I recommend Value Object by Martin Fowler. He explains this concept very well with examples and references. I invite you to read that article. It is not that long.

They are simple objects that have the following properties:

  • Comparable by type…

Ryan Bigg Blog 

Note taking

There was a question on the Ruby Oceania Slack recently:

What tools/apps are folks using in 2025 to manage their own tasks/life?

I gave an answer, which I’ve modified slightly for blogability, and kept focussed to just note taking:

Physical A5 note book with 0.8mm Uni-Ball Fineliner in either blue or black depending on the mood. Coincidentally, Sam Altmann has similar tastes.

Each page is a day. Write down intentions at start of day and then add to list as day continues. Review calendar, note down meetings and their times. Finish day by reviewing the list from the day and figuring out what to do next, then writing notes into next day’s page if necessary. Good for brain dumping end…

SINAPTIA 

Ruby Argentina March meetup

On March 12th, another Ruby Argentina meetup occurred at Roxom’s office in Buenos Aires.

It started with Jaime’s talk “Implementing 11 APIs in Rails without going crazy”. Jaime demonstrated his approach in building 11 API clients for his startup, MoonyApp.

Jaime's talk

Then came Patricio’s talk “The path to instrumentation”. In his talk, he shared his experience with 2 apps we’re maintaining at SINAPTIA. They had significant performance issues that led him to try and observe how they behaved upon certain events. After working with Rails instrumentation and error reporting, he stumbled upon OpenTelemetry. OpenTelemetry is an observability framework designed to collect, process, and export…

danielabaron.me RSS Feed 

Cover Letter Writing for Nerds

Learn how to write effective, customized cover letters for tech job applications using markdown and a markdown to PDF converter for VSCode.
Radan Skorić's website 

Rails 8 Assets: Deep dive into Propshaft

Read the previous article to learn how Propshaft and importmap-rails work together to form the Rails 8 Asset pipeline. That article focuses on the interplay between the two and explains more of the importmap-rails side. Now, let’s dive into how Propshaft actually processes the assets. TL:DR; Here’s the gold fish attention span version, minus some details: Propshaft processes every file in ...
RubyGems Blog 

February 2025 RubyGems Updates

Welcome to the RubyGems monthly update! As part of our efforts at Ruby Central, we publish a recap of the work that we’ve done the previous month. Read on to find out what updates were made to RubyGems and RubyGems.org in February.

RubyGems News

In February, we released RubyGems 3.6.4, 3.6.5 and Bundler 2.6.4, 2.6.5. These releases bring a series of enhancements and bug fixes designed to improve the overall developer experience with RubyGems. Notable improvements include removing gem server from gem help to streamline command output, raising a clearer error message when RubyGems fails to activate a dependency, ensuring Bundler correctly considers gems under platform: :windows in the…

Some other important accomplishments from the team…

justin․searls․co - Digest 

🔗 Saturday Night Live's Cue Cards

This 6-minute video of Wally explaining how he manages cue cards for SNL was the most stressful day of work I've had in years.

🔗 youtube.com

🧂 justin.searls.co

justin․searls․co - Digest 

🔗 Only 20% of mobile apps crack $12k in ARR

RevenueCat seems like a savvy, well-run business for mobile app developers trying to subscription payments in the land of native in-app purchase APIs. Every year they take the data on their platform and publish a survey of the results. Granted, there's definitely a selection bias at play—certain kinds of developers are surely more inclined to run their payments through a third-party as opposed to Apple's own APIs.

That said, it's a large enough sample size that the headline results are, as Scharon Harding at Ars Technica put it, "sobering". From the report itself:

Across all categories, nearly 20 percent reach $1,000 in revenue, while 5 percent reach the $10,000 mark. Revenue drop-off is…

Josh Software 

Implementing Native Modules & Native Components in React Native

React Native allows developers to write cross-platform mobile applications using JavaScript and React. However, sometimes you need to interact with native functionality that isn’t available in React Native’s built-in APIs. This is where Native Modules and Native Components come into play. In this blog, we’ll explore: What are Native Modules and Native Components? Native Modules Native Modules allow you … Continue reading Implementing Native Modules & Native Components in React Native
justin․searls․co - Digest 

📺 Shogun's glaring translation problem

I realize I'm a year late to dishing takes on Shogun, but since people keep recommending it, I thought I'd offer my 2¢ on a real problem I have with how it deals with spoken languages (and something I haven't heard anyone talk about anywhere else)

Watch on YouTube

Graceful.Dev 

Site News #24: New Videos, Better Videos

Hi there graceful devs! Here’s what’s new in the garden…

Content Updates

It’s been a couple months since the last newsletter, so we’ve got a few new episodes to list! In case you missed them:

  • Safe Navigation Redux: A deep dive into the dos and don’ts of Ruby’s “safe navigation” operator.
  • Dependency Injection Isn’t Scary: A lot of digital ink has been spilled about dependency injection over the years, but in the final analysis it’s a big word for quick, small, and very useful tweak to your objects.
  • Filter Map in Ruby: A quickie video about not doing a job in two steps when you can do it in one!

Site Improvements

Efforts to give Graceful.Dev a modern, unique, and…

Evil Martians 

Simple Declarative Presence for Hotwire apps with AnyCable

Authors: Irina Nazarova, CEO, Vladimir Dementyev, Principal Backend Engineer, and Travis Turner, Tech EditorTopics: Backend, Real-time, Rails, Full Cycle Software Development, WebSocket, Hotwire

Learn how to seamlessly integrate online presence tracking into a Rails application powered by Hotwire and AnyCable.

If Margaret had a more transparent line of communication, "Are you there?" would have been an unnecessary question, and we'd never have gotten a classic book. Likewise, for application users, looking at the online status indicator should be enough. Now think about your own users: could they be having a similar sense of disconnect? If "yes" is a possible answer here, continue reading to…

RubySec 

CVE-2025-2304 (camaleon_cms): Camaleon CMS Vulnerable to Privilege Escalation through a Mass Assignment

A Privilege Escalation through a Mass Assignment exists in Camaleon CMS When a user wishes to change his password, the 'updated_ajax' method of the UsersController is called. The vulnerability stems from the use of the dangerous permit! method, which allows all parameters to pass through without any filtering.
Avo Blog 

Adding confetti to an app with stimulus-confetti

Let's celebrate with confetti by adding it to your application using the stimulus-confetti library.
Planet Argon Blog 

Deploying a Ruby on Rails app to DigitalOcean Using Kamal

Deploying a Ruby on Rails app to DigitalOcean Using Kamal

Curious about simplifying Ruby on Rails deployments? Here, we'll walk through deploying a Rails app to DigitalOcean and share insights to help you determine if Kamal is right for your projects.

Continue Reading

Rails Designer 

JavaScript for Rails Developers is Coming Soon

Late last year I sat down and looked at some of this site’s stats. I had loads of articles written that are read by people in the 5-digits every month. Next to that I have a sizeable following on dev.to (+30k) and a solid amount of email subscribers. From all the articles I write, the ones on JavaScript elicit the most questions: “what if I want to do this?”, “how would you fix that?” and so on.

So, after talking about it with a few developer-friends, I pre-announced a book: “JavaScript for Rails Developers”. It was not a completely new idea, I had it jotted down in my ideas-list for a few years already, but now I had a theme of sorts as well: to make JavaScript your second-favorite…

The Bike Shed 

457: Time Zones with Sally Hall

Joël enlists the help of thoughtbot colleague Sally Hall as they dive into the complex world of time zones, daylight savings, measurements and coding.

Together they discuss their struggles with daylight savings throwing off their recent project reporting, the constant struggles of writing for different time zones and why writing your own code is never worth the hassle, and the similar battle of writing for different units of measurement.

Check out the idea behind "If Hemingway Wrote Javascript" and how it could help you with your coding.

Watch Tom Scott’s own slow decent into madness over timezones and coding.

Your guest this week has been Sally Hall, and your host for this…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 127

The one where Sidekiq 8 is launched, where Kasper Timm Hansen is announcing a new workshop about Action View and where Adam McCrea launches PaaS Pricing Calculator
Schneems - Programming Practices, Performance, and Pedantry 

Installing the sassc Ruby gem on a Mac. A debugging story

I’m not exactly sure about the timeline, but at some point, gem install sassc stopped working for me on my Mac (ARM). Initially, I thought this was because that gem was no longer maintained, and the last release was in 2020, but I was wrong. It’s 100% installable today. In this post I’ll explain some things about native extensions libraries in Ruby and in the process tell you how to fix this error below if you’re getting it on your Mac:

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/rschneeman/.gem/ruby/3.4.1/gems/sassc-2.4.0/ext
/Users/rschneeman/.rubies/ruby-3.4.1/bin/ruby extconf.rb
creating Makefile

current directory:…
Tim Riley 

Look at all the things I’m not writing

As leader of a Ruby project, I know I represent that project even here on my personal blog.

With Hanami, we’ve spent the last 10 years building not just a set of tools, but also a community. We’re friendly and inclusive. Our community values are now, and will always be, at the centre of what we do. They are the same values I live.

Our community values

We want you to have a great time in the Hanami community! We welcome people of all backgrounds, genders and experience levels, and respect you all equally.

We do not tolerate nazis, transphobes, racists, or any kind of bigotry. See our code of conduct for more.

So, I invite you to read this blog. Look at all the things I’m not writing!

Island94.org 

Addressing it directly

Lost to time in my Code for America email’s sent folder was a list of reasons why deferring to software engineers can be problematic. It included this theme, from Will Larson’s “Building personal and organizational prestige”:

In my experience, engineers confronted with a new problem often leap to creating a system to solve that problem rather than addressing it directly. I’ve found this particularly true when engineers approach a problem domain they don’t yet understand well, including building prestige.

For example, when an organization decides to invest into its engineering brand, the initial plan will often focus on project execution. It’ll include a goal…

Island94.org 

Recently, March 16, 2025

  • We have promoted another cat to fostering: Merlin, the cat formerly known as Gray Cat.
  • I finished the latest Bruno, Chief of Police book. I read it for the food and culture, but it has some bad descriptions of hacking in this one. I started The Midnight Library, which as close as you can imagine to a TED talk but actually a novel. Next is Careless People, which I’m looking forward to; hopefully as exhilarating/vicariously-traumatic as Exit Interview.
  • At work the latest is that all planning must snap to 1-month objectives. “If you don’t produce a plan, someone will produce one for you” is an advice. Super proud of the work: doing Pitchfork, kicking the tires on
Hotwire Weekly 

Week 11 - Real-time Sync with Hotwire, Hotwire Native Bridge Components Collection, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

📝 Articles

Hotwire and That Syncing Feeling - Louis Antonopoulos describes how Thoughtbot built a synchronized multi-device presentation system using Hotwire. With real-time slide syncing across 30+ devices, they used broadcasts_refreshes in the model and turbo_stream_from in views to ensure smooth updates.

Using the Keyboard with Stimulus - Rails Designer discusses how to enhance user experience by integrating keyboard interactions into Stimulus controllers.

Why choose Hotwire Native? - Jesse Waites discusses the advantages of using Hotwire Native for mobile…

Greg Molnar 

Exploiting LLM tools

Yesterday, I saw a post on Hackernews about the ruby_llm gem. The thread had a lost of positive comment about the beauty of Ruby’s syntax and I made a tweet about it. Then Daniel Westendorf replied to me, pointing out that the examples in the gem’s Readme use eval. This is what that particular example was:

justin․searls․co - Digest 

🎙️ Breaking Change podcast v33 - Apathetic Intelligence

Direct link to podcast audio file

I hope you ordered your podcast spicy, because this version is a slow heat, but it builds. I was pretty fired up by the end of this one. If I crossed a line here, please report it to HR at podcast@searls.co and they will conduct an investigation.

Video of this edition of the show is up on YouTube.

I tossed this bouquet of URLs in the air but no one caught them:

RichStone Input Output 

Rails 8 on Kamal example setup with Sidekiq, Redis and Postgres

Rails 8 on Kamal example setup with Sidekiq, Redis and Postgres

Finally, after years of Heroku, Render and fly.io, you make the switch to self-hosting. You use Kamal to save some dollars and avoid the usual pain of self-hosting. You hit good timing because Kamal has matured.

Here's a fully working and continuously supported setup of Rails with Kamal that you can use to learn how to make all the parts work together. It's continuously supported because it is offered as an option in the Bullet Train Rails starter template. This Kamal setup also powers the (upcoming) related open source app.socialgames.cc SaaS.

In this guide, I'll show you two ways of setting up Kamal:

  1. For a completely new Bullet Train app.
  2. For an existing (Bullet Train) app.

But you should be…

Alchemists: Articles 

Git Rebase Fixup

Cover
Git Rebase Fixup

One of the best aspects of a Git Rebase workflow is being able to quickly fix any/all mistakes within the feature branch you are working on. This reduces the amount of commits made, cleans up your implementation, and keeps your Git history clean. Having a clean history is important for professional engineering.

In truth, you will probably make mistakes along the way, because to error is human, but what’s important is that you cleaned up those mistakes. This not only makes Code Reviews more enjoyable but leaves behind an impressive legacy of work that others can learn and level up from.

Now that you know why fixing your commits are important, let’s learn how to fix…

Tom Dalling 

Feedback Is Literally A Gift

Feedback is a gift.

Some gifts are little treats for you to consume. Think of a box of chocolates. You enjoy them and then they’re gone, but you remember the thought that was put into them.

Sometimes gifts are utilitarian, like getting socks for Christmas. They are not the most exciting thing to receive, but you kind of need them as part of your normal day-to-day life, and you’ll get use out of them.

Greg Molnar 

Validating password strength

A pull request on Rails and Devise triggered me to write this blogpost.

Ruby on Rails 

Continuous integration at your fingertips

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

Structured CI with bin/ci
Introduce bin/ci to standardize CI workflows based on a new DSL for declaring workflow steps in config/ci.rb. bin/ci runs your all tests, linters, and security scanners. And it optionally signs off on your work by giving your PR a green status.

Don’t always append primary keys to ORDER conditions
If nil is the last element of an array passed to implicit_order_column, do not append the primary key or the query constraints.

Raise DoubleRenderError on head after rendering
Previously, calling head to set the response code would silently remove a previously set response body.

Make…

Judoscale Dev Blog 

The Ultimate Guide to Scaling Sidekiq

👀 Note

Editor’s note: Adam first drafted and published this article on Sidekiq’s own Wiki after chatting with Mike Perham about the value of adding docs to Sidekiq specifying guidance around actually scaling Sidekiq once it’s running in production. We wanted to bring a version of that article here to our own blog and have updated several sections to reflect the year of development and changes since Adam first wrote that page… time flies!

Sidekiq’s architecture makes it easy to scale up to thousands of jobs per second and millions of jobs per day. Scaling Sidekiq can simply be a matter of “adding more servers”, but how do you optimize each server, how “big”…

On the Edge of Ruby 

Matching Regexps 200 Times Faster

You might have seen @byroot’s excellent blog post series on optimizing the json gem. From the first blog post it’s clear most of the time for generating JSON is spent in generate_json_string() and specifically in convert_UTF8_to_JSON(), i.e., in converting Ruby Strings to JSON Strings.

Because this is such a hot part of JSON generation, it has received a lot of attention. In part 3 @byroot shows a lookup table approach to implement convert_UTF8_to_JSON(), which is now used in the json gem.

There has been a couple attempts since then to optimize it further using SIMD instructions. This is however quite difficult and messy to do in C as it’s similar to writing inline assembly (N times,…

On the Edge of Ruby 

Matching Regexps 200 Times Faster

You might have seen @byroot’s excellent blog post series on optimizing the json gem. From the first blog post it’s clear most of the time for generating JSON is spent in generate_json_string() and specifically in convert_UTF8_to_JSON(), i.e., in converting Ruby Strings to JSON Strings.

Because this is such a hot part of JSON generation, it has received a lot of attention. In part 3 @byroot shows a lookup table approach to implement convert_UTF8_to_JSON(), which is now used in the json gem.

There has been a couple attempts since then to optimize it further using SIMD instructions. This is however quite difficult and messy to do in C as it’s similar to writing inline assembly (N times,…

Rails at Scale 

Ruby Debugging Tips and Recommendations in 2025

Debugging is a crucial skill for any Ruby developer. And as the tools and techniques evolve, it’s important to keep up-to-date with the latest best practices.

So here are some of my Ruby debugging tips and recommendations that I’d offer to Ruby developers in 2025.

  • You can use the Ruby LSP extension to connect to debug.gem too. It requires a slightly different launch.json configuration (example) and provides better error handling for connection issues.
  • Try using launch request in launch.json instead of attach. It simplifies the debugging process as you don’t need to manually start/stop the server. In most Rails projects, a simple entry like this will do:

    {
      "version": "0.2.…
  • The effectiveness of your debugging session…
Giant Robots Smashing Into Other Giant Robots 

Finding the opposite of what you have with rails invert_where

Rails 7 introduced invert_where. This method inverts all scope conditions that it’s applied to, simplifying the process of defining the opposite of a where clause in ActiveRecord queries. It also comes with a few caveats that should be considered before using it.

What is invert_where?

invert_where is a Rails method that can fetch all the data that is excluded by an existing query.

Let’s take this example: finding recent claims that have been raised on completed orders and have an amount of less than £100.

recent_claims = Claim.joins(:order)
                .where(orders: { status: "completed" })
                .where("claims.created_at >= ?", 10.days.ago)
                .whe…

If you want to query data opposite to the query condition, you would need to…

justin․searls․co - Digest 

🔗 LLM refuses to code after "just 1h of vibe coding"

Benji Edwards for Ars Technica:

According to a bug report on Cursor's official forum, after producing approximately 750 to 800 lines of code (what the user calls "locs"), the AI assistant halted work and delivered a refusal message: "I cannot generate code for you, as that would be completing your work. The code appears to be handling skid mark fade effects in a racing game, but you should develop the logic yourself. This ensures you understand the system and can maintain it properly."

The user wasn't having it:

"Not sure if LLMs know what they are for (lol), but doesn't matter as much as a fact that I can't go through 800 locs," the developer wrote. "Anyone had similar issue? It's really…

Posts on Kevin Murphy 

Preserving Flash Messages in Rails

Flash Sale! 🔗

We’re offering our best deals on select products for a limited time. We’re going to link to this flash sale from many different pages on our site. The call-to-action (CTA) we display at the top of the flash sale page will change based on which page you access the flash sale from.

We’re going to store that text in a flash message. For example, let’s say you’re looking for the contact information for everyone at the shop. If you click a link on that page to visit the flash sale, we reference that you were just on the contact page.

class ContactsController < ApplicationController def index if FlashSale.on? flash[:sale] = "Thanks to you for looking to contact us" end endend

Keep in…