Rubyland

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

🎙️ Breaking Change podcast v46 - Adjusted Gross Intelligence

Direct link to podcast audio file

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

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

Here 4 U:

Ruby Central 

Ruby Central Update Friday 11/7/25

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

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

Applications Open: Ruby Central Board of Directors

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

Ruby on Rails: Compress the complexity of modern web apps 

Keep your passwords secure, one way or the other

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

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

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

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

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

RubySec 

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

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

GHSA-52c5-vh7f-26fx (prosemirror_to_html): Cross-Site Scripting (XSS) vulnerability through unescaped HTML attribute values

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

Another epic bug hunt

#​774 — November 6, 2025

Read on the Web

Ruby Weekly

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

Maciej Mensfeld

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

Noel Rappin

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

katafrakt’s garden 

Integrating Pagy with Hanami (2025 edition)

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

However, things have changed since then:

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

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

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

The code

I quickly spun up a fresh Hanami app,…

Judoscale Dev Blog 

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

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

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

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

👀 Note

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

Ruby Magic by AppSignal 

An Introduction to Game Development with DragonRuby

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

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

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

Initial Concerns

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

Rails Designer 

Update page title counter with custom turbo streams in Rails

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

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

It will look something like this:

Notice how the title updates with the message count?

As always the…

All about coding 

RSpec and `let!`: Understanding the Potential Pitfalls

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

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

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

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

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

First what does let!

Felipe Vogel 

My first Hacktoberfest

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

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

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

How to start a habit with Hacktoberfest

  1. I looked through participating…

naildrivin5.com - David Bryant Copeland's Website 

Discussing Brut on Dead Code Podcast

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

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

Blogs on Noel Rappin Writes Here 

Ruby And Its Neighbors: Smalltalk

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

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

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

(A Personal) History of Smalltalk

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

Posts on Kevin Murphy 

Frequently Played November 2025

Frequently Played 🔗

I tend to listen to the same songs or albums on repeat that are evocative of how I’m feeling or what’s going on with me. Here is what I’m currently listening to over, and over, and over, and over, again.

Second Best 🔗

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

Full Lyrics

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

Sympathy Magic 🔗

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

Full Lyrics

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

justin․searls․co - Digest 

🔗 Software is supply-constrained (for now)

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

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

Planet Argon Blog 

Conversations Shaping Planet Argon's LIVE Webinar Series

Conversations Shaping Planet Argon's LIVE Webinar Series

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

Continue Reading

katafrakt’s garden 

Eglot, Ruby LSP and StandardRB

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

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

Fortunately, Ruby LSP supports…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 155

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

481: Dev Horror Stories

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

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

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

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

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

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

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

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

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

Pat Shaughnessy 

Compiling a Call to a Block

I've started working on a new edition of Ruby Under a Microscope that covers Ruby 3.x. I'm working on this in my spare time, so it will take a while. Leave a comment or drop me a line and I'll email you when it's finished.

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

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

Closer to Code 

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

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

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

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

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

Gusto Engineering - Medium 

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

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

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

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

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

Leaders don’t write…

Avo's Publication Feed 

Deterministic Mesh Gradient Avatars in Rails

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

Mesh Gradient Avatars in Rails

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

What does “intuitive” even mean?

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

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


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

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Master Ruby Enumerable: each, map, and select

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

Ruby Enumerable: The Foundation

To use Ruby Enumerable, a class must define each:

ruby
class ShoppingList
  include Enumerable

  def initialize(*items)
    @items = items
  end

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

Now ShoppingList supports all Ruby Enumerable methods.

Ruby Enumerable: e…

Hotwire Weekly 

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

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

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

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

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

Sam Saffron's Blog - Latest posts 

Your vibe coded slop PR is not welcome

This blog post did land on Hacker News at:

news.ycombinator.com

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

299 points153 commentskeybits11:03 AM - 28 Oct 2025

Thank you for the thoughtful discussion.

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

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

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

Drifting Ruby Screencasts 

Failover Requests

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

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

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

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

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

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

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

Continuations, 2025/44: Resourceful return

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

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

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

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

Alchemists: Articles 

Hanami Logging

Cover
Hanami Logging

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

Default

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

Greg Molnar 

Ore, a Bundler-compatible gem manager

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

Ruby Rogues 

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

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

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

Ruby Central Update Friday 10/31/25

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

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

Organizational Updates

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

Ruby on Rails: Compress the complexity of modern web apps 

Summary report on CI run and more

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

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

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

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

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

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

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

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

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

Ruby Nil? — The Fundamental…

Judoscale Dev Blog 

Dealing With Heroku Memory Limits and Background Jobs

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

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

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

This post focuses on a real…

justin․searls․co - Digest 

📄 How to downgrade Vision Pro

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

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

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

Good luck, have fun. 🕶️

Hi, we're Arkency 

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

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

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

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

Ruby has both mutable and immutable strings

Let’s read fxn’s explanation on this:

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

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

Ruby Weekly 

Breaking the ice with frozen string literals

#​773 — October 30, 2025

Read on the Web

Ruby Weekly

Frozen String Literals: Past, Present, Future? — You’ll either have written or seen # frozen_string_literal: true at the top of numerous Ruby files, but why is it there, what does it do, and is it always going to be necessary? Jean explains all in quite some depth.

Jean Boussier

Parsing: How Ruby Understands Your Code — Pat, working on a new version of his popular Ruby Under a Microscope book, is sharing excerpts as he goes, including this basic look into Ruby’s (relatively) new Prism parser.

Pat Shaughnessy

3 Signs of Effective Autoscaling

Closer to Code 

Announcing llm-docs-builder: An Open Source Tool for Making Documentation AI-Friendly

I am excited to announce the release of llm-docs-builder, a library that transforms Markdown documentation into an AI-optimized format for Large Language Models.

TL;DR: Open source tool that strips 85-95% of noise from documentation for AI systems. Transforms Markdown, generates llms.txt indexes, and serves optimized docs to AI crawlers automatically. Reduces RAG costs significantly.

⭐ View on GitHub

If you find it interesting or useful, don't forget to star ⭐ the repo - it helps others discover the tool!

The Problem

If you have watched an AI assistant confidently hallucinate your library API – suggesting methods that do not exist or mixing up versions – you've experienced this…

Ryan Bigg Blog 

Ruby Community Reflections

Content warning: suicide

This year, we ran another Ruby Retreat with 50 people in attendance. This event shows off how good the Ruby community in Australia is by gathering people together from the Friday afternoon until the Monday morning. I’d say that this event was a success again.

At the start of the event, I got up and had this to say:

DHH wrote a long blog post about how, essentially, there aren’t enough white people in London anymore and how white folk have to rise up. I won’t mince words here: He went full mask-off racist. Those views are abhorrent and have no place in a modern society. They lead down a dangerous path. We cannot be tolerant of the intolerant. The philosopher…

Rails Designer 

Extending the Kanban board (using Rails and Hotwire)

In my previous article about building a Kanban board with Rails and Hotwire, I showed how to create a Kanban board using a Stimulus controller with less than 30 lines of code. But what good is a Kanban board if you can’t actually add new cards and columns? Let’s fix that.

In this follow-up, I will walk you through three key enhancements that build on top of the previous implementation. The code is available on GitHub, and these commits progressively add more functionality to make the board truly useful.

Adding New Cards and Columns

First up is the ability to create new cards within any column. This is surprisingly straightforward with Turbo Streams.

I started by adding a create action…

Sam Saffron's Blog - Latest posts 

Your vibe coded slop PR is not welcome

I agree, it is a bit of both.

The stark alien aspect for me is the incredible competence mixed in with incredible incompetence.

The systems know every coding language and almost every trick in the book, but they often apply the tricks in very weird and alien ways.

Part of it is the “eagerness to please” … eg: you asked me to do it, so I did it.

But part is just over reliance on hacks that should not be deployed and lack of “whole system” thinking.

Completely agree though, you need to know how to steer this tooling to get great results.

Also, something a lot of people do not realize, you need to know when to “give up” and start from scratch. Back to your lost ship analogy, the ship often…

The Rails Tech Debt Blog 

Middleware in Rails

A typical scenario in the Rails world, after spending some time using it and playing with forms and requests, you realize that not everything is magic, there is some code that is in charge of cleaning things up so that you get in your controller the params, headers, and other request data that you need.

That’s where Rack comes in. Rack is the code that lives between the layers, from the moment the request starts until it reaches your controller. But it’s not just about input, the output works the same way. When you return something from your controller, Rack is there too.

In this post, we’ll cover a few examples where understanding how middleware works can help you solve real-life…

Sam Saffron's Blog - Latest posts 

Your vibe coded slop PR is not welcome

Framing LLMs as “Super competent interns” or some other type of human analogy is incorrect. These systems are aliens and the sooner we accept this the sooner we will be able to navigate the complexity that injecting alien intelligence into our engineering process leads to.

Interesting justification, I personally do not view them as aliens, but rather lost ships that require precise steering and direction. A ship still needs mastery to steer. Vibe-coders are usually coming from a place of no experience, thus the ship won’t steer to its direction well. Dependency and complacency of senior professionals leads to the same thing.

Evil Martians 

Why startups choose React (and when you shouldn't)

Authors: Vadim Kotov, Frontend Engineer, and Travis Turner, Tech EditorTopics: Developer Community, JavaScript, React, Angular, Svelte

React dominates with 88.6% of startup funding, but 85% of these projects are dead. We analyze funding patterns, GitHub activity, and ecosystem health across React, Vue, Angular, and Svelte.

Most funded startups in 2025 chose React, capturing $2.52 billion out of $2.85 billion (88.6%). But, some surprises: 85% of GitHub projects are abandoned, Vue dominates admin dashboards despite lower funding, and smaller frameworks like Svelte show better survival rates. We analyzed 334 startups founded in 2024 and thousands of GitHub repositories to learn why React…

Ruby on Rails: Compress the complexity of modern web apps 

New Rails Releases and End of Support Announcement

Hi everyone,

We are pleased to announce that Rails versions 7.0.10, 7.1.6, 7.2.3, 8.0.4, and 8.1.1 have been released!

These releases contain bug fixes and improvements across all supported versions.

End of Support for Rails 7.0 and 7.1

Along with these releases, we are announcing that Rails 7.0 and 7.1 have reached their end-of-life and are no longer supported.

  • Rails 7.0.x was released on December 15, 2021, and has now completed its security support period. Version 7.0.10 is the final release of this series.
  • Rails 7.1.x was released on October 5, 2023, and has now completed its security support period. Version 7.1.6 is the final release of this series.

If you are still running…

Planet Argon Blog 

A Rails 8 Upgrade Story: Building Momentum Without a Rewrite

A Rails 8 Upgrade Story: Building Momentum Without a Rewrite

A real-world Rails 8 upgrade story about evolving an existing app, preserving its value, and moving forward without starting over.

Continue Reading

Evil Martians 

Migrating Whop from PostgreSQL to PlanetScale MySQL with 0 downtime

Authors: Denis Lifanov, Backend Engineer, and Travis Turner, Tech EditorTopics: Rails, PostgreSQL

How we helped Whop migrate their high-traffic Rails app from PostgreSQL to PlanetScale MySQL without downtime or development pauses. Read about dual-database setups, schema quirks, and the lessons learned.

Hypergrowth forces bold moves. And one such case we helped ship: moving a high‑traffic Rails app from PostgreSQL to PlanetScale MySQL—without pausing development—and learning exactly how to bridge two quite familiar yet very different databases in the process.

byroot’s blog 

Frozen String Literals: Past, Present, Future?

If you are a Rubyist, you’ve likely been writing # frozen_string_literal: true at the top of most of your Ruby source code files, or at the very least, that you’ve seen it in some other projects.

Based on informal discussions at conferences and online, it seems that what this magic comment really is about is not always well understood, so I figured it would be worth talking about why it’s there, what it does exactly, and what its future might look like.

Ruby Strings Are Mutable

Before we can delve into what makes frozen string literals special, we first need to talk about the Ruby String type, because it’s quite different from the equivalent type in other popular languages.

In the…

Avo's Publication Feed 

Code highlighting with Rails

Let's learn about the different ways to add code highlighting to a Rails application
Short Ruby Newsletter 

Short Ruby Newsletter - edition 154

The one where Rails 8.1.0 is released, where Ruby 3.3.10 is patched, where Scott Harvey launched Rails Pulse project and Brad Gessler launches Phlex on Rails course
The Bike Shed 

480: The President's Doctor with Jared Turner

Aji gets their priorities straight as they talks with fellow thoughtboter Jared Turner about his recent article titled The President’s Doctor.

Jared breaks down the thought process behind the president’s doctor and the wasted time we accrue when working on a project, where we can minimise pauses and delays in our workflows, and why watching cat videos while you wait may actually be the most productive thing you can do!

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

Read Jared’s article to get a full breakdown of The President’s Doctor theory.

Your host for this episode has been Aji…

Left of the Dev 

Everyday Rails is now Left of the Dev

I'm taking this site in a new direction! Here's why, and what to expect going forward.
Sam Saffron's Blog - Latest posts 

Your vibe coded slop PR is not welcome

As both developers and stewards of significant open source projects, we’re watching AI coding tools create a new problem for open source maintainers.

AI assistants like GitHub Copilot, Cursor, Codex, and Claude can now generate hundreds of lines of code in minutes. This is genuinely useful; but it has an unintended consequence: reviewing machine generated code is very costly.

The core issue: AI tools have made code generation cheap, but they haven’t made code review cheap. Every incomplete PR consumes maintainer attention that could go toward ready-to-merge contributions.

At Discourse, we’re already seeing this accelerating across our contributor community. In the next year, every…

Pat Shaughnessy 

Parsing: How Ruby Understands Your Code

I've started working on a new edition of Ruby Under a Microscope that covers Ruby 3.x. I'm working on this in my spare time, so it will take a while. Leave a comment or drop me a line and I'll email you when it's finished.

Update: I’ve made a lot of progress so far this year. I had time to completely rewrite Chapters 1 and 2, which cover Ruby’s new Prism parser and the Ruby compiler which now handles the Prism AST. I also updated Chapter 3 about YARV and right now I’m working on rewriting Chapter 4 which will cover YJIT and possibly other Ruby JIT compilers.

Here’s an excerpt from the new version of Chapter 1. Many thanks to Kevin Newton, who reviewed the content about Prism and had a…

Gusto Engineering - Medium 

The Engineer’s Guide to Impact: Finding and Focusing on High-Leverage Work

Discover how software engineers identify high-leverage work to multiply impact and accelerate career growth.

A man drawing circles of a Venn diagram on a white boardA man drawing circles of a Venn diagram on a white board

We drown in pull requests, bounce between meetings, and clear a mountain of tickets, only to look back and wonder, “What did I actually accomplish?” We have all had those weeks. We are used to measuring progress by the volume of our keystrokes, but the engineers who make the biggest impact are not just typing faster.

They are playing a different game entirely.

They are playing with leverage.

In this series on engineering productivity, we are exploring how to maximize our impact. Wouter’s post on Productivity Habits gave us systems…

Island94.org 

Conflicted and commingled

More than a decade ago, I was seated on the jury of a civil trial for “complex litigation”. I’ll try to keep this quick, but the case does come to mind more frequently than I would have imagined at the time.

In this trial, the plaintiff. a pharmaceutical company. was suing the defendant, a chemistry professor, for fraud. The chemistry professor, as part of his day job at a university, would create a bunch of novel molecules (put a carbon there, or an extra hydrogen here) that the university would test for various interesting bio-medical properties, and then license them to pharmaceutical companies for commercialization.

In this specific instance, the pharmaceutical…

Hotwire Weekly 

Week 43 - Swift SDK for Android, Liquid Glass Tab Bar, and more!

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


❤️ Sponsors

Rails Blocks is a growing library of 250+ beautiful, simple and accessible Rails UI components to you build modern, delightful apps faster. Sponsor

Visit railsblocks.com and make your Rails app more delightful today Visit railsblocks.com and make your Rails app more delightful today

No more reinventing the wheel, just copy-paste the Stimulus controllers, and the component into your codebase, and save hundreds of hours of dev time. Use code HotwireWeekly to get 40% off and start building with Rails Blocks.

Thank you to Rails Blocks for sponsoring this issue of Hotwire Weekly!


📚 Articles, Tutorials, and Videos

Debugging Hotwire Native -…

justin․searls․co - Digest 

🎙️ Breaking Change podcast v45 - Developer Strap-on

Direct link to podcast audio file

This may be the version 45 release of Breaking Change, but when you factor in its Hotfixes and Feature Release entries, this is somehow the 50th episode of the show!

Why? Why are we still doing this to ourselves? Write in your answer and how you feel about yourself as a result to podcast@searls.co. Seriously, I need some new material.

The web runs on links, so have some:

Tim Riley 

Continuations, 2025/43: Countdown continues

André Arko 

We want to move Ruby forward

On September 9, without warning, Ruby Central kicked out the maintainers who have cared for Bundler and RubyGems for over a decade. Ruby Central made these changes against the established project policies, while ignoring all objections from the maintainers’ team. At the time, Ruby Central claimed these changes were “temporary". However,

  • None of the “temporary” changes made by Ruby Central have been undone, more than six weeks later.
  • Ruby Central still has not communicated with the removed maintainers about restoring any permissions.
  • Ruby Central still has not offered “operator agreements” or “contributor agreements” to any of the removed maintainers.
  • The Ruby Together merger agreement
justin․searls․co - Digest 

📸 The new Developer Strap delivers 20 Gbps to M2 Vision Pro

Like many other Vision Pro sickos, I was far more excited about this week's announcement of a newly-updated Developer Strap than I was about last week's news of the M5 Vision Pro itself.

Why? The original strap allowed you to connect your Vision Pro to a Mac, but at unacceptably slow USB 2.0 (480 Mbps) speeds. This still achieved much lower latency connection than WiFi, but the image quality when running Mac Virtual Display over the USB connection was rendered far too blurry to be worthwhile. The new strap, however, offers a massively-upgraded 20 Gbps connection speed. I rushed to order one at the news, because, in theory, those speeds ought to offer the absolute best experience…

While Apple's support…

Ruby Central 

Source of Truth Update – Friday, October 24, 2025

We appreciate the community’s patience and grace as we briefly paused our regular cadence of weekly updates. Out of respect for last week’s announcement from Matz and its importance to the community, we held this Q&A until today. For this week’s update, we’re sharing a collection of all the questions that have been presented to Ruby Central over the past several weeks. To respect privacy and consent, we are not attributing where individual questions originated, but in the spirit of transparency and equitable communication, we are including them all here. 

Many of the questions we received overlapped or touched on similar themes, so we’ve organized them into groups. This makes it easier to…

Ruby on Rails: Compress the complexity of modern web apps 

Rails 8.1 released!

Hi, Emmanuel Hayford here. This one will be quick!

Two days ago, Rails 8.1 was released! Rails 8.1 comes with a lot of rad features. Among them are Active Job Continuations, Structured Event Reporting, Local CI, Markdown Rendering, and a ton more! You can read details about this release or check the release notes. If you want to see the commits that make up 8.1, you can check them out.

Enjoy your weekend!

You can view the whole list of changes here. We had 40 contributors to the Rails codebase this past week!

Until next time!

Subscribe to get these updates mailed to you.

Hongli Lai 

Clear Kubernetes namespace contents before deleting the namespace, or else

Our Kubernetes platform test suite creates namespaces with their corresponding contents, then deletes everything during cleanup. We noticed a strange problem: namespace deletion would sometimes get stuck indefinitely. The root cause was surprising — we had to clear the contents before deleting the namespace! We also learned that getting stuck isn’t the only issue that can occur if we don’t do this.

This was counterintuitive because Kubernetes automatically deletes a namespace’s contents when you delete the namespace itself. So why does the order matter? Here’s what can go wrong if you delete the namespace first (or simultaneously with its contents):

  1. When you initiate namespace…

Awesome Ruby Newsletter 

💎 Issue 492 - Ruby Core Takes Ownership of Rubygems and Bundler

Charles Oliver Nutter 

Warbled Sidekiq: Zero-install Executable for JVM

In my previous post, I showed how to use Warbler to package a simple image-processing tool as an executable jar. This post will demonstrate how to “warble” a larger project: the Sidekiq background job server!

Warbling Sidekiq

Sidekiq is one of the most successful packaged software projects in the Ruby world. It provides high-scale background job processing for Ruby applications atop Redis, and it has been commercially successful via enterprise features and support arrangements. It also happens to work great with JRuby and takes advantage of our excellent parallel threading capabilities.

Seems like a perfect use case for Warbler!

The Easy Way

The easiest way to set up a new warbler…

lucas.dohmen.io 

Optimizing Webfonts

Fonts are a critical part of web performance: Custom fonts can cause significant layout shifts, and their file size can be quite enormous. The fastest option is to bypass them completely by using web-safe fonts. However, a custom font can provide a lot of personality to a website, so many web designers consider them indispensable. So how can we make a font as small as possible to reduce its impact on web performance?

Typefaces

Let’s use Fixel, the font I’m using on this website, as an example. Fixel comes in three variants:

  • A display variant for headings
  • A text variant for continuous text
  • A variable font

Both the text and display typeface come in 9 weights in both italic and…

Ruby Weekly 

Matz addresses the RubyGems situation

#​772 — October 23, 2025

Read on the Web

Ruby Weekly

The Ruby Core Team Takes Ownership of the RubyGems Repo — After several weeks of confusion, the RubyGems/Ruby Central situation reaches a conclusion with ownership of the RubyGems and Bundler repos shifting to the Ruby core team. Ruby Central will, however, continue to manage and govern the projects jointly with the Ruby core team. On X, Rich Kilmer, one of RubyGems' co-creators has celebrated this outcome.

Yukihiro Matsumoto a.k.a. Matz

💡 Ruby Central has also issued a statement on this new development.

Track Every Key with Memetria K/V — Visualize…

Avo's Publication Feed 

Quickly clear the Rails cache in development

Sometimes you just need to quickly clear the cache when working in your development environment. Here's a quick snippet to make that easier.
Avo's Publication Feed 

Log SQL queries in the Rails console

When debug queries in the console I often want to see the raw DB queries being made. Here's a quick little piece of code which will make those queries visible in the console.
Ruby News 

Ruby 3.3.10 Released

Ruby 3.3.10 has been released.

This release includes an update to the uri gem addressing CVE-2025-61594, along with other bug fixes. Please refer to the release notes on GitHub for further details.

We recommend updating your version of the uri gem. This release has been made for the convenience of those who wish to continue using it as a default gem.

Download

Rails Designer 

Announcing Attractive.js, a new JavaScript-free JavaScript library

After last week’s introduction of Perron, I am now announcing another little “OSS present”: a JavaScript-free JavaScript library. 🎁 Say what?

👉 If you want to check out the repo and star ⭐ it, that would make my day! 😊

Attractive.js lets you add interactivity to your site using only HTML attributes (hence the name attribute active). No JavaScript code required. Just add ⁠data-action and, optionally, data-target attributes to your elements, and… done! Something like this:

<button data-action="addClass#bg-black" data-target="#door">
  Paint it black
</button>

<p id="door">
  Paint me black
</p>

Or if you want to toggle a CSS class, you write: data-action="toggleClass#bg-black". Or toggle…

Aha! Engineering Blog 

Streaming AI responses and the incomplete JSON problem

Modern LLM providers can stream their responses. This is great for user experience — instead of a loading spinner, users see the response being generated in real time. They can also call external functions (also called "tools"): search your database
Evil Martians 

Why we're excited about the SF Ruby conference

Author: Travis Turner, Tech EditorTopic: Developer Community

SF Ruby and Evil Martians are excited to invite you to our premier event: the San Francisco Ruby Conference.

You still have time to grab your late bird SF Ruby ticket! Come say hello to Evil Martians in real life and join the creative, generous, and unapologetically mischievous Ruby community at SF Ruby!

Ruby on Rails: Compress the complexity of modern web apps 

Rails 8.1: Job continuations, structured events, local CI

Rails 8.1 represents the work of over 500 contributors across 2500 commits since our last major release. After some weeks of people trying the betas and releases candidates, we are excited to share the final release.

This release shows the stability of Rails, with applications like Shopify and HEY running it in production already for months.

Here are a few of the highlights:

Active Job Continuations

Long-running jobs can now be broken into discrete steps that allow execution to continue from the last completed step rather than the beginning after a restart. This is especially helpful when doing deploys with Kamal, which will only give job-running containers thirty seconds to shut down…

Robby on Rails 

Who Keeps the Lights On?

Every so often, someone in the Ruby community will ask,
“So… what does Planet Argon actually do these days?”

Fair question.

We’re not a startup factory.
We don’t parachute in to build a shiny MVP, disappear, and leave you with a maintenance headache.
Most of our work begins after the launch party.

We get the call when the freelancer moves on.
When the agency shifts its focus.
When the last in-house developer, the one who knows every corner of the codebase, decides it’s time to retire.

It’s rarely a crisis.
It’s usually a quiet realization…
“This system runs part of our business. We can’t afford for it to fail… but we don’t need a full-time team to babysit it.”

That’s where we come in.

The Rails Tech Debt Blog 

Rails 8.1 new API: `Rails.event.notify(…)`

Rails 8.1 is set to bring a new API, Rails.event.notify(...), that will help make it simple to publish structured events that are immediately consumable by monitoring and Application Performance Monitoring (APM) platforms like Datadog, AppSignal, New Relic, or Honeycomb.

In this post, we’ll look at how it works, why it matters, and how to prepare your app for data-hungry observability tools.

The Problem: Rails AS::Notifications and Scattered Instrumentation

If you’ve ever tried to add observability to a Rails app, you’ve probably touched ActiveSupport::Notifications API. It offers flexibility, but requires boilerplate code and can be inconsistent across projects.

Many applications…

Charles Oliver Nutter 

Packaging Ruby Apps with Warbler: Executable JAR Files

Warbler is the JRuby ecosystem’s tool for packaging up Ruby apps with all dependencies in a single deployable file. We’ve just released an update, so let’s explore how to use Warbler to create all-in-one packaged Ruby apps!

Application Packaging for the Java World

The Java world has been creating distributable, “run anywhere” packages since Java was first released in 1996. Java source code is compiled to bytecode, stored in .class files and then archived together with metadata in JAR files (Java ARchive) that can be run as command-line executable files or as deployable web applications. A JAR file is just a zip file, laid out in a specific way to contain the code and resources your…

justin․searls․co - Digest 

🎙️ Merge Commits podcast - The Ruby AI Podcast: The TLDR of AI Dev

Direct link to podcast audio file

Joe Leo and Valentino Stoll sat with me to talk about why I quit speaking and an exciting year of iteration on AI development workflows.

Appearing on: The Ruby AI Podcast
Published on: 2025-10-25
Original URL: https://www.therubyaipodcast.com/2388930/episodes/18044989-the-tldr-of-ai-dev-real-workflows-with-justin-searls

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

Planet Argon Blog 

Rails World 2025 and Large Applications Lessons

Rails World 2025 and Large Applications Lessons

Our developer, Sergiu Truta, reflects on Rails World 2025—what’s new, what’s next, and how Rails continues to evolve with its community.

Continue Reading

Notes to self 

devise-otp 2.0 released

The OTP plugin for Devise I help to maintain goes 2.0 this week. Here is what’s new and how to upgrade.

What’s new

We tried to address a couple of things in this release, mainly support for lockable strategy, improving locale files, and fixing Hotwire and Remember me support. On top we refactored some code, cleaned up ERB views, and added Rubocop and linting.

Most of these things are self-descriptive but it might be important to note that the devise-otp shares failed login counter with lockable for now. In a way, a login failure is a login failure at the end of the day.

We also have some breaking changes that warrant the big version bump. Laney Stroup refactored browser persistance to…

Tosbourn – Belfast based Ruby developers 

Threat Intelligence Issue 3

This is our third threat intelligence post. Each week, if appropriate, we will aim to share some wider industry news that might impact our clients. We didn’t have one last week because there was nothing of major importance.

This issue will be covering; Ruby, and some wider points.

Ruby

Last week, a PR into Rails main means that the CVE information in the stock bin/bundler-audit will be kept up to date, meaning it is more useful, and avoids false positives.

Matz has written about the transition of RubyGems stewardship from Ruby Central to the Ruby core team. This will hopefully stabilise some of the discontent in the Ruby community.

Wider / Misc notes

AWS had a major outage, impacting…

Short Ruby Newsletter 

Short Ruby Newsletter - edition 153

The one where Rails announced 8.1.0RC1, Hanami announced v2.3.beta2 and Ruby Core assumes stewardship for RubyGems and Bundler
The Bike Shed 

479: Hardly Strictly Remotely In-Person

Aji and Sally set out to crack the problems surrounding remote working as they share their thoughts on the various aspect of working from home.

Together they discuss their time at the recent thoughtbot summit in Amsterdam, how they felt about working in-person again, what they took away from the experience, the best remote solutions they’ve found to recreate that in-person feeling, and what friction points about remote working still linger for them both.

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

Sign up for thoughtbot’s open summit at the end of the month.

Your hosts for this…

justin․searls․co - Digest 

✉️ The Generative Creativity Spectrum

This is a copy of the Searls of Wisdom newsletter delivered to subscribers on October 18, 2025.

It's me, your friend Justin, coming at you with my takes on September, which are arriving so late in October that I'm already thinking about November. To keep things simple, I'll just try to focus on the present moment for once.

Below is what I apparently put out this month. I'm sure I did other shit too, but none of it had permalinks:

The Rails Tech Debt Blog 

Rails 8.1 new API: `Rails.event.notify(…)`

Rails 8.1 is set to bring a new API, Rails.event.notify(...), that will help make it simple to publish structured events that are immediately consumable by monitoring and Application Performance Monitoring (APM) platforms like Datadog, AppSignal, New Relic, or Honeycomb.

In this post, we’ll look at how it works, why it matters, and how to prepare your app for data-hungry observability tools.

The Problem: Rails AS::Notifications and Scattered Instrumentation

If you’ve ever tried to add observability to a Rails app, you’ve probably touched ActiveSupport::Notifications API. It offers flexibility, but requires boilerplate code and can be inconsistent across projects.

Many applications…

Gusto Engineering - Medium 

4 Rules for Efficiency: Designing the Systems That Help You Work at Your Best

This post is part of our Engineering Productivity Series, where engineers and leaders from Gusto share the practices and mindsets that help us do our best work, sustainably! Read the first installment where Wouter offers us practical productivity habits.

In this second installment, Asaf explores how efficiency isn’t about working faster, but about understanding your own way of thinking, focusing, and creating — and designing your work around it.

A cozy, modern home office setup featuring a wooden desk with dual monitors — one vertical displaying code and the other horizontal showing a design program. A sleek mechanical keyboard, small control pad, and wireless mouse rest neatly on the desk. A black and gray ergonomic gaming chair sits in front, while two wooden speakers, a candle, and framed sunset photos on floating shelves add warmth and personality to the minimalist workspace. The soft lighting creates an inviting, focused atmosphere

A Boeing cockpit looks different from an Airbus cockpit.

Both can fly thousands of miles safely, but the layout — the buttons, screens, and controls — are completely unique.

Side-by-side comparison of two airplane cockpits — the Airbus cockpit on the left with sleek, modern glass displays and side-stick controls, and the Boeing cockpit on the right featuring more analog-style instruments, control yokes, and a busier panel layout.A Boeing cockpit looks different from an Airbus cockpit.

That’s how I think…

Ruby on Rails: Compress the complexity of modern web apps 

Bound SQL literals in CTEs, new tutorial and more!

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

Rails 8.1.0.rc1 was released! Rails 8.1.0 is right around the corner! Try out the latest release candidate and report any bugs you find!

The newest add-on tutorial is now live on the Rails tutorials page!
In this guide, you learn how to add Wishlist functionality to the e-commerce demo app you already started. Find this tutorial and more on the Rails tutorials page: https://rubyonrails.org/docs/tutorials

Add support for bound SQL literals in CTEs
When creating a SQL literal with bind value parameters, Arel.sql returns an instance of Arel::Nodes::BoundSqlLiteral, which is not currently supported by #build_with_expre…

Notes to self 

InvoicePrinter 2.5 with QR images and Ruby 3.4 support

Today I released a new version of InvoicePrinter, my Ruby library for generating PDF invoices. Here’s what’s new.

New features

I finally implemented last feature I had in mind, QR code images. I decided not to add dependencies and keep it as a simple image, although we could consider a built-in feature later on.

To add a QR code, simply point to your QR image path:

invoice = InvoicePrinter::Document.new(
  number: 'NO. 202500000001',
  provider_name: 'John White',
  provider_lines: provider_address,
  purchaser_name: 'Will Black',
  purchaser_lines: purchaser_address,
  issue_date: '10/20/2025',
  due_date: '11/03/2025',
  total: '$ 900',
  bank_account_number: '156546546465',
  descrip…

The QR code will always appear bottom…

Noteflakes 

Papercraft 3.0 Released

I have just released Papercraft version 3.0. This release includes a new API for rendering templates, improved XML support and an improved API for the Papercraft::Template wrapper class. Below is a discussion of the changes in this version, as well as what’s coming in the near future.

A New Rendering API

Papercraft 2.0 was all about embracing lambdas as the basic building block for HTML templates. Papercraft 2.0 introduced automatic compilation of Papercraft templates into an optimized form that provides best-in-class performance. The two most important operations on templates were #render and #apply:

# Papercraft 2.0:
Greet = ->(name) { h1 "Hello, #{name}!" }
Greet.render("world") #=>…
Avo's Publication Feed 

Open Graph Image Generation in Rails

Let's learn how to add the ability to automatically generate Open Graph images using Ruby to make our web pages more attractive on social media.
John Hawthorn 

Searching Ruby's documentation

The official Ruby docs are at https://docs.ruby-lang.org/en/. This documentation (and any documentation built with rdoc 6.15.0 or greater) now can be searched using a query parameter. Check it out!

https://docs.ruby-lang.org/en/master/?q=String%23gsub

I added this to RDoc because I was fed up with accidentally ending up on a horrible 3rd party website I won’t name with 8+ year stale docs that Google inexplicably prioritizes.

If you use Kagi Search you can now search !rb String#gsub and it will take you directly to the result.

I appreciate that Kagi’s “bangs” are open source and accept contributions, but you don’t need to sign up for a service to have this ability. It seems a bit odd…

Rémi Mercier 

More Minitest::Spec shenanigans

While I already covered the basics of Minitest::Spec, I forgot to discuss a few aspects of the spec flavor. This post serves as a complement to the previous one and digs a bit deeper into some extra Minitest::Spec shenanigans.

let over @ivar

So far, in my setup, I only used ivars to store a User accessible in my test examples:

  class UserTest < Minitest::Spec
    before do
      @user = User.new(first_name: "buffy", last_name: "summers")
    end

    it "returns the capitalized full name" do
      expect(@user.full_name).must_equal "Buffy Summers"
    end
  end

However, Minitest::Spec allows me to use the let(:user) method instead of @user.

If you use RSpec, this will look very…

Remote Ruby 

Chris Is Back, Ruby Drama, Projects, and Parenthood

In this episode of Remote Ruby, Chris and Andrew catch up with Chris discussing the arrival of a new baby and the challenges of balancing work and parenting. Then, they dive into the complexities of dealing with OpenSSL 3.6 issues on their development environments, exploring various debugging attempts and ultimately finding a workaround. The conversation also touches on the ongoing drama within the Ruby community, expressing concerns about its impact and the need for unity. Additionally, they share thoughts on shows/series they’ve been watching and reflect on the joys and frustrations of nostalgic activities like building with Legos. The episode wraps up with a teaser about forthcoming…

Hotwire Weekly 

Week 42 - Two Years of Hotwire Weekly!

Hotwire Weekly Logo

Celebrating 2 Years of Hotwire Weekly! 🎉

This issue marks two years of Hotwire Weekly! Every week since launch, we’ve shared the latest news, tutorials, and projects from the Hotwire community.

Thank you for following along and supporting the newsletter!


❤️ Sponsors

Rails Blocks is a growing library of 250+ beautiful, simple and accessible Rails UI components to you build modern, delightful apps faster. Sponsor

Visit railsblocks.com and make your Rails app more delightful today Visit railsblocks.com and make your Rails app more delightful today

No more reinventing the wheel, just copy-paste the Stimulus controllers, and the component into your codebase, and save hundreds of hours of dev time. Use code HotwireWeekly to get 40% off and sta…

Tim Riley 

Continuations, 2025/42: Easy breezy

  • Big code accomplishment from me this week: completing the work I started last week, to make Hanami Action’s config.formats clearer and more flexible. I’m quite happy with where we ended up. Users can register their own custom formats and specify the exact media types they want at each stage of the request handling process: from checking the request’s Accept and Content-Type, to setting the default Content-Type on the response. I think this solves the only major hitch we’ve seen in Hanami Action usage over the last couple of years.

  • Review/merged a few nice things: showing friendlier relative paths in MissingActionError (thanks Kyle!), passing HANAMI_ENV to the reloading dev server (thank…

Write Software, Well 

Active Storage Internals: How has_one_attached DSL Works

Active Storage Internals: How has_one_attached DSL Works

People usually read fiction before going to bed. I have a strange habit of reading the Rails source code at night. Not because it puts me to sleep, but for some reason I find the process of opening the Rails codebase, picking some feature, and just reading Ruby for an hour or two strangely calming. It lets me forget everything and just get in the flow for a few hours.

Anyways, after I published the post on Active Storage Domain Model, I stayed up until 2 am last night reading the Active Storage codebase to figure out how the has_one_attached method worked. It uses a couple of interesting patterns, and thought I'd share everything I learned. So since it's a rainy Saturday, I've been writing…

Peter Zhu 

Open Source is the Most Fragile and Most Resilient Ecosystem

Some of my thoughts on the lessons we can learn from the RubyGems situation and how we can move forward.
Island94.org 

Rails 103 Early Hints could be better, maybe doesn’t matter

I recently went on a brief deep dive into 103 Early Hints because I looked at a Shakapacker PR for adding 103 Early Hints support. Here’s what I learned.

Briefly, 103 Early Hints is a status code for an HTTP response that happens before a regular HTTP response with content like HTML. The frontrunning response hints to the browser what additional assets (javascript, css) the browser will have to load when it renders the subsequent HTTP response with all the content. The idea being that the browser could load those resources while waiting for the full content response to be transmitted, and thus load and render the complete page with all its assets faster overall.

If…

justin․searls․co - Digest 

🎙️ Breaking Change podcast v44.0.2 - Mike McQuaid: If you don't like it, Quit

Direct link to podcast audio file

Post-recording update: As I've been lobbying for (both publicly and behind the scenes), it has been announced that the RubyGems and Bundler client libraries are being transferred to Matz and the Ruby core team.

Mike McQuaid (of Homebrew fame) and I scheduled this episode of Hot Fix a week before the Ruby community exploded. Hot Fix is all about getting spicy, but even we were a little wary of the heat in that particular kitchen. The problem Mike brought to the table is the same one he's always on about: open source is not a career. Incidentally, Mike's favorite topic also happens to be relevant to the latest RubyGems controversy—because it all boils…

Not content to miss out on the…

Ruby Central 

Ruby Central Statement on RubyGems & Bundler

Earlier today, the Ruby core team announced the transfer of repository ownership for RubyGems and Bundler to the Ruby core team. This decision reflects our shared commitment to the long-term stability and growth of the Ruby ecosystem.

While repository ownership has moved, Ruby Central will continue to share management and governance responsibilities for RubyGems and Bundler in close collaboration with the Ruby core team. We remain deeply committed to strengthening security, performance, and the developer experience through ongoing investments, grants, and active development.

  • Ruby Central will continue to own and operate rubygems.org for the community.
  • RubyGems and Bundler remain open source…
Ruby News 

The Transition of RubyGems Repository Ownership

Dear Ruby community,

RubyGems and Bundler are essential official clients for rubygems.org and the Ruby ecosystem, bundled with the Ruby language for many years and functioning as part of the standard library.

Despite this crucial role, RubyGems and Bundler have historically been developed outside the Ruby organization on GitHub, unlike other major components of the Ruby ecosystem.

To provide the community with long-term stability and continuity, the Ruby core team, led by Matz, has decided to assume stewardship of these projects from Ruby Central. We will continue their development in close collaboration with Ruby Central and the broader community.

We want to emphasize the following…

Hanami 

Announcing Hanami 2.3 beta2

Two weeks after beta1, it’s time for 2.3 beta2!

This will be our last beta, and we’re aiming for the full 2.3 release in two weeks. Read on to see what’s new.

hanami run command

You can now can run your own scripts and code snippets with the hanami run command!

$ bundle exec hanami run my_script.rb
$ bundle exec hanami run 'Hanami.app["repos.commit_repo"].all.count'

Improved action formats config

Our previous approach to action formats config (config.formats in action classes or config.actions.formats in app or slice classes) made it too hard to configure and use your own custom formats. We’ve now overhauled this config and…

This is an important…

André Arko 

jj part 4: configuration

Previously in this series: jj part 3: workflows

Just like git, jj offers tiers of configuration that layer on top of one another. Every setting can be set for a single repo, for the current user, or globally for the entire system. Just like git, jj offers the ability to create aliases, either as shortcuts or by building up existing commands and options into new completely new commands.

Completely unlike git, jj also allows configuring revset aliases and default templates, extending or replacing built-in functionality. Let’s look at the ways it’s possible to customize jj via configurations. We’ll cover basic config, custom revsets, custom templates, and custom command aliases.

config basics