Rubyland

news, opinion, tutorials, about ruby, aggregated
Sources About
Posts on Kevin Murphy 

Don't REST on your Laurels

RESTful Routes 🔗

You can find many resources trumpeting the benefits of following RESTful routes in the context of a Rails application. I want to focus on my personal favorite benefit:

Adherence to the default RESTful actions creates a constraint, and is a noticeable heuristic, that aids in limiting the surface area of classes.

Planting an example 🔗

Let’s say we have an application that tracks people’s accomplishments. We call each instance of an accomplishment a laurel wreath. We love ourselves a metaphor.

class LaurelWreathsController < ApplicationController def show @laurel_wreath = LaurelWreath.find(params[:id]) endend

This is one of the mappings of HTTP verb and URL to controller action that…

danielabaron.me RSS Feed 

Pretty SQLite Output Persistently

Learn how to improve SQLite's default query output for better readability in Rails 8, where SQLite is now a serious option for production apps thanks to Solid Queue, Solid Cable, and Solid Cache.
Alchemists: Articles 

Git History

Cover
Git History

Other than your Git repository storing your source code, the second most valuable source of information is your commits which chronicle the evolution of your codebase. Your commits are a treasure trove of information — when properly maintained — because they allow you to:

  • Achieve Second-Order Thinking by having the long tail of thought for understanding what took place, why decisions were made, and how those decisions were implemented.

  • Have well thought out Code Reviews. Even better, mentorship is built in by default because your code review’s Git history explains the what, why, and how so less experienced engineers have a chance to level up and learn from more…

  • Au…

This all…

Nithin Bekal 

Obsidian Bases: Formula for star ratings with half stars

I recently started using Obsidian and have been enjoying the Bases feature, which lets you create database-like views using structured notes.

I have a bunch of movie ratings in my notes, and I wanted to display them as stars rather than numbers. The ratings are stored as properties on the notes:

type: [[Movies]]
rating: 4

Now that I have this data, it’s easy to create a view by querying for notes of type: [[Movies]], and adding ratings as one of the properties.

Movie ratings table in Obsidian with numeric ratings

I wanted star ratings to make this easier to read. I came across this article by Tyler Sticka with a formula for star ratings:

'⭐⭐⭐⭐⭐'.slice(0, rating).split('').map(icon('star'))

Here’s how it looks:

Movie ratings table in Obsidian with star icons

This works for…

Ruby Central 

Ruby Central Weekly Update – Friday, November 14, 2025

As we head toward the end of the year, this will be our final weekly update before we return to our monthly newsletter cadence. This change allows our small but mighty team to focus time and attention on producing more in-depth, thoughtfully prepared communications.

A reminder that Board of Directors applications remain open through November 21, 2025. We encourage community members from all backgrounds to apply and take part in shaping Ruby Central’s future.

As a U.S.-based organization serving a global Ruby community, we welcome board applicants from anywhere in the world. Three of our six current board members are internationally based, and we remain committed to global representation.

Open…

Ruby on Rails: Compress the complexity of modern web apps 

Rails Luminary 2025, dynamic rate-limiting options, performance optimizations and more!

Happy Friday! This is Greg, bringing you the latest changes from the Rails codebase.

The 2025 Rails Luminary nominations are open.
If you know of someone who has consistently gone above and beyond to contribute to the framework, triaging bugs, improving performance, adding helpful features or documentation, creating or maintaining gems, etc. please nominate them for the 2025 Rails Luminary Award by Dec 3.

Remove explicit –config from RuboCop binstub templates
By removing the explicit config flag from the RuboCop binstub templates, this change allows RuboCop’s cascading config feature to work properly, enabling subdirectory-specific configurations.

Enhance rate limiting to support dynamic …

Ruby Rogues 

Keeping Ruby Welcoming: A Conversation We Need to Have - RUBY 680

In this solo episode, I open up about what’s been going on behind the scenes with Ruby Rogues and why you’ve been hearing more solo shows from me lately. Between new full-time work, family life, and shifting schedules among the panelists, it’s been a wild stretch — but I’m committed to keeping the show coming to you every week. From there, I dive into something that’s been on my mind for a while now: the health of the Ruby community and what Minaswan really means in 2024.

I reflect on the growing cultural and political tensions I’ve seen spill into technical spaces and why I believe our community is stronger when we focus on behavior, kindness, and collaboration rather than labels and…
honeyryder 

Context: the missing API in ruby logger

Over the last few years, I’ve spent quite a significant chunk of my “dayjob” time working on, and thinking about, observability in general, and logging in particular. After a lot of rewriting and overwriting, “don’t repeat yourself” and coping with ecosystem limitations, I thought about writing a blog post about what I’ve learned about the general state of the art, what I think it’s missing and what I’m doing about it.

What is logging?

(skip this section if you’re above being lectured about what’s logging again).

Logging is one of those fundamental features of any type of program you use. At a high level, it keeps a record of what a program is and has been doing, be it error messages, or…

Ruby on Rails: Compress the complexity of modern web apps 

Nominate a 2025 Rails Luminary

Rails is the framework it is today thanks to the work of over 7,000 contributors who have shaped the framework through countless lines of code, features, fixes, and ideas.

The Rails Luminary Awards exist to celebrate those contributions, acknowledging those in the community who have significantly advanced Rails for the benefit of all.

If you know of someone who has consistently gone above and beyond to contribute to the framework, triaging bugs, improving performance, adding helpful features or documentation, creating or maintaining gems, etc. please nominate them for the 2025 Rails Luminary Award.

All nominations will be reviewed by Rails Core, and the final pick of Rails Luminaries…

Remote Ruby 

Managing Open Source with Nate Berkopec

In this episode, guest Nate Berkopec joins Chris and Andrew to discuss the current state and cultural controversies surrounding Ruby Gems, Bundler, and open-source projects in general. The conversation dives into the split within the Ruby community, the complexities of maintaining key projects, and the challenges of funding and sustaining open-source work. Nate shares his experiences with Puma and his philosophy on community-driven contributions and project ownership. The episode also explores broader issues such as the feasibility of getting paid for open-source work, the role of corporate sponsorship, and the need for more inclusive participation in maintaining and evolving open-source…

Saeloun Blog 

Customizing Rails Migrations with Execution Strategies

Introduction

Rails migrations are powerful tools for managing database schema changes. However, there are scenarios where we need more control over how these migrations execute.

We might need to log every schema change for audit purposes. We might want to prevent dangerous operations in production environments. Or we might need to route migrations through an external service for distributed systems.

Rails 7.1 introduced Execution Strategies to address these needs. This feature provides a way to customize the entire migration execution layer. It has been available since Rails 7.1 and continues to work in Rails 8.x.

This post explores how Execution Strategies work and demonstrates…

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Rails form_for vs form_with: Developer’s Complete Guide

For over a decade, form_for was the cornerstone of form-building in Ruby on Rails. Introduced in Rails 2.0, it offered a clean, model-centric API that automatically handled URLs, HTTP methods, and parameter scoping.

Then, in Rails 5.1, form_with arrived — not as a replacement, but as a unified evolution. By Rails 7.0, form_for and form_tag were officially deprecated.

Today, in 2025, form_with is the only supported form helper — and it’s more powerful, flexible, and future-ready than ever.

This is the complete guide every Rails developer needs to:

  • Understand the why behind the change
  • Migrate legacy form_for code safely
  • Master modern form patterns
  • Build production…

Understanding form_for in Ruby…

The form_for…

Weelkly Article – Ruby Stack News 

💎 Unless: The Ruby Way to Not Say No

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

Planet Argon Blog 

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

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

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

Continue Reading

GoRails 

Black Friday 2025 Sale

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

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

Here's what's on sale for 2025:

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

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

$50 off the Learn Hotwire course

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

Ruby Weekly 

Ruby 4.0 is on the way

#​775 — November 13, 2025

Read on the Web

Ruby Weekly

Photo used with the kind permission of Koichiro Ohba

Ruby 4.0 is arriving this year!

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

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

Leve…

Saeloun Blog 

Rails 8 adds conditional allow_nil and allow_blank in model validations

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

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

Before

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

Closer to Code 

Announcing YARD-Lint: Keep Your Ruby Documentation Solid

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

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

# In your Gemfile
gem 'yard-lint'

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

Here's an example of linting in practice:

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

Inline editing with custom elements in Rails

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

Inline editing demo

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

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

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

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

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

What are custom elements?

justin․searls․co - Digest 

📸 My lucky day

What are the odds?*

*The odds are 1 in 1.7 million

The Rails Tech Debt Blog 

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

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

What Is a Supply Chain Attack?

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

Ruby Magic by AppSignal 

Rendering Samples with Showcase for Ruby on Rails

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

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

Samples in our Ruby App

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

Showcase button samples

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

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

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

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

Hanami 2.3: Racked and Ready

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

Built for Rack 3

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

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

Noteflakes 

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

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

Papercraft Update

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

I also managed to release a few…

Rails Blocks - Component Updates 

4 New Rails UI Components sets Released

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

Components in this release:

View full changelog →

Ruby on Rails: Compress the complexity of modern web apps 

SerpApi joins Rails Foundation as a Contributing member

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

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

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

Illia Zub, Operations Engineer, SerpApi

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

Short Ruby Newsletter 

Short Ruby Newsletter - edition 156

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

482: Labels for our job

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

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

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

Thanks to our sponsors for this episode Judoscale -…

RubySec 

GHSA-vfpf-xmwh-8m65 (prosemirror_to_html): ProsemirrorToHtml has a Cross-Site Scripting (XSS) vulnerability through unescaped HTML attribute values

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

🔗 RIP iPhone 18 Air

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

Apple Delays Release of Next iPhone Air Amid Weak Sales

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

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

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

Gusto Engineering - Medium 

The Tech Stack Behind Gusto’s Ruby on Rails Platform

Gusto with Ruby on Rails

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

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

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


The Tech Stack Behind…

SINAPTIA 

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

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

What users actually experience

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

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

Payment form best coding practices that don't drop sales

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

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

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

Pat Shaughnessy 

YARV’s Internal Stack and Your Ruby Stack

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

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

Chapter 3: How Ruby Executes Your…

Nithin Bekal 

Moving form Logseq to Obsidian

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

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

My Obsidian layout

Migrating the notes

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

RailsCarma – Ruby on Rails Development Company specializing in Offshore Development 

Top Ruby on Rails Hosting Providers for Your Apps in 2025

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

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

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

Tim Riley 

Continuations, 2025/45: Releasemas eve

Hotwire Weekly 

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

Hotwire Weekly Logo

Welcome to Hotwire Weekly!

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


📚 Articles, Tutorials, and Videos

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

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

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

Left of the Dev 

My go-to prompt for legacy code exploration

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

🎙️ Breaking Change podcast v46 - Adjusted Gross Intelligence

Direct link to podcast audio file

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

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

Here 4 U:

okayfail.com (feed for #tech) 

In Praise of dhh

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

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

Prologue

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

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

David…

Ruby Central 

Ruby Central Update Friday 11/7/25

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

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

Applications Open: Ruby Central Board of Directors

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

Ruby on Rails: Compress the complexity of modern web apps 

Keep your passwords secure, one way or the other

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

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

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

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

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

RubySec 

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

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

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

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

Another epic bug hunt

#​774 — November 6, 2025

Read on the Web

Ruby Weekly

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

Maciej Mensfeld

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

Noel Rappin

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

katafrakt’s garden 

Integrating Pagy with Hanami (2025 edition)

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

However, things have changed since then:

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

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

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

The code

I quickly spun up a fresh Hanami app,…

Judoscale Dev Blog 

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

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

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

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

👀 Note

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

Ruby Magic by AppSignal 

An Introduction to Game Development with DragonRuby

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

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

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

Initial Concerns

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

Rails Designer 

Update page title counter with custom turbo streams in Rails

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

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

It will look something like this:

Notice how the title updates with the message count?

As always the…

All about coding 

RSpec and `let!`: Understanding the Potential Pitfalls

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

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

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

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

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

First what does let!

Felipe Vogel 

My first Hacktoberfest

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

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

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

How to start a habit with Hacktoberfest

  1. I looked through participating…

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…

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…