485: HTTP Basic Auth
Joël and Aji kick off a new season by discussing the best use cases for HTTP basic auth and talking all things security.
The pair ask when and why you would use basic auth over standard HTTPS, it’s pros, cons and vulnerabilities over other forms of security, and provide some advice to help decide on what form of security you could implement on your site.
—
Thanks to our sponsors for this episode Judoscale - Autoscale the Right Way (check the link for your free gift!), and Scout Monitoring.
Check out these links for more information on some of the topics covered in today’s episode - Cross-Origin Resource Sharing - Cross-site request forgery (CSRF) - The Universe is Hostile to…
Arrange/Act/Assert is a name for a sequence of steps which most of your tests already perform. By recognizing this implicit pattern, and organizing your test code around it, you can make your tests easier to read and understand.
What is it?
- Arrange: Setup objects, the database, or anything else.
- Act: Exercise the system under test.
- Assert: Verify the result.
Here’s a simple example:
describe "#add_tag" do
it "adds the tag to the user" do
tag = create(:tag)
user = create(:user, tags: [])
user.add_tag(tag)
expect(user.tags).to eq([tag])
end
end
Each of the Arrange/Act/Assert steps are separated by newlines. This makes it easy to tell them apart, so…
Enter animations are easy with @starting-style, but exit animations need transition-behavior: allow-discrete to work. Most CSS properties are continuous—opacity can be 0.5, colors can blend. But display is discrete: it’s either none or block, with no intermediate values.
The allow-discrete keyword tells the browser to apply transition timing even for discrete properties. For closing animations, the browser keeps the element visible, runs the exit transition, then flips to display: none only after the transition completes.
dialog {
opacity: 1;
scale: 1;
transition:
opacity 0.2s ease-out,
scale 0.2s ease-out,
overlay 0.2s ease-out allow-discrete,
display 0.2s ease-out…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.
Buckle 🔗
Just get the new album. And all the prior albums. You’re welcome.
I’m much too old for this
But I’m not over it‘Cause I’m stupid and I’m damaged and you’re a disaster
When you walk into the room, oh, none of it matters
Oh, baby, I just buckle my resolution in tatters
‘Cause I know it won’t work, but make it ache, make it hurt
I’m not better than this, show me what I’m worthKeep me a secret, choose someone else
I’ll still be here hanging off, I’m hanging off
The…
Painkillers 🔗
Yup, Brian Fallon again. I don’t have very varied musical tastes.
And we want love like it was a drug
Yeah, all we wanted was a little relief
And every heart I held in between
Well, they were painkillers to me
Yeah, they were painkillers to me
Come get your…
Beautiful Rails confirmation dialogs (with zero JavaScript)
This is a guest collaboration with Stephen Margheim, creator of High Leverage Rails, a video course on building high-quality Rails applications with the power and simplicity of SQLite, HTML, and CSS.
Turbo’s data-turbo-confirm attribute is convenient for quick confirmation dialogs, but the native confirm() prompt it triggers looks dated and out of place. If you want a styled confirmation dialog that matches your app’s design, the traditional approach recommends a lot of JavaScript — a Stimulus controller to open and close the dialog, event listeners for keyboard handling, and coordination between the trigger and the modal.
But, recent browser updates have changed the game. Invoker Commands…
Continuations 2025/50: Egregious hack
This week I submitted my application to the gem fellowship. Fingers crossed!
I spent a good amount of time in bug fixing mode. The first fix was to Dry Logger, making sure its context and tagged logging are threadsafe. Thanks to Armin and Rob for their great bug report! We got there in the end.
After that, I made two related fixes to Hanami Router. Both of these came via wonderful reports from Andreas Haller. First, we set the Rack SCRIPT_NAME correctly for dynamic scope prefixes, and second, we preserve an empty Rack PATH_INFO when a prefixed mount is accessed by its exact prefix. I’ll be making patch releases for both Hanami Router and Dry Logger in the coming week.
What I love about…
Why are exec and run so confusing?
Originally posted on the Spinel blog.
While working on rv, there’s a specific question that has come up over and over again, in many different forms. In the simplest possible form, it boils down to:
What is the difference between
rv execandrv run? Why have both?
We haven’t finished implementing either rv exec or rv run yet, but every time one or the other comes up in a conversation, everything instantly becomes more confusing.
This post will summarize the history of exec and run in Bundler, npm, Cargo, and uv. Once we have the history laid out, we can take a look at what we plan to do in rv, and you can give us your feedback.
Bundler exec
Bundler manages project-specific packages, but…
In the last few days I’ve managed to finalize work on the UringMachine fiber scheduler. Beyond making sure the fiber scheduler is feature complete, that is, it implements all the different Fiber Scheduler hooks and their expected behaviour. To make sure of this, I also spent a couple of days writing test cases, not only of the fiber scheduler, but also of UM’s low-level API.
Beyond the tests, I wrote a series of benchmarks to have an idea of how UringMachine compares to other concurrency solutions:

You can consult the full results here. I’ll refrain from making overly generalized statements about what these benchmark results mean, but I think they demonstrate the promise of working…
Hi, it’s Claudio Baccigalupo. So many improvements to the Rails codebase this week!
If you are also looking to contribute, there are several documentation PRs open for community review. Oh and we also have some Rails World 2026 updates! And now, let’s get to the PR-esents 🎁
ActiveStorage immediate variants
Attachment variants gain the process: :immediately option:
has_one_attached :avatar_with_immediate do |attachable|
attachable.variant :thumb, resize_to_limit: [4, 4], process: :immediately
end
Attachments with process: :immediately variants now eagerly analyze during validation, making metadata like image dimensions available for custom validations:
def validate_avatar_dimensions
…CVE-2025-66567 (ruby-saml): Ruby-saml has a SAML authentication bypass due to namespace handling (parser differential)
CVE-2025-66568 (ruby-saml): Ruby-saml allows a Libxml2 Canonicalization error to bypass Digest/Signature validation
We were gone most of the day so I told Codex CLI to migrate Better with Becky to my searls-auth gem and to commit & push regularly to a PR so I could review remotely. Just noticed that it must have looked through the git history in order to write commit messages that match my own. Seriously thought I wrote half of these before I realized as much.
Uncanny, but appreciated.
If you don't count Halo LAN parties, I probably sank more time into Knights of the Old Republic on the original Xbox than any other game. By taking the classic tabletop mechanics they were known for and theming it with a setting that didn't bore me to tears, Bioware really hooked me. I even played through every campaign quest of the middling The Old Republic MMO, which are hundreds of hours I'll never get back.
Last night, this announcement just dropped, as reported by Jordan Miller at VGC:
Announced at The Game Awards, the game is being directed by Casey Hudson, the director of the original Knights of the Old Republic game.
"Developed by Arcanaut Studios in collaboration with Lucasfilm…
Want smooth fade-in animations when your <dialog> opens? The @starting-style CSS rule defines the initial state when an element first appears—no JavaScript needed.
dialog {
opacity: 1;
scale: 1;
transition: opacity 0.2s ease-out, scale 0.2s ease-out;
@starting-style {
opacity: 0;
scale: 0.95;
}
}
Without @starting-style, the browser renders the dialog immediately in its final state. With it, the browser starts from opacity: 0; scale: 0.95 and transitions to opacity: 1; scale: 1.
You can animate the backdrop too:
dialog::backdrop {
background-color: rgb(0 0 0 / 0.5);
transition: background-color 0.2s ease-out;
@starting-style {
background-color: rgb(0 0 0 /…Joined by David Hill
Chris and Andrew kick things off with some weather whiplash and snowblower talk before introducing a new guest on the show, long-time Rubyist David Hill. They chat about fast food and favorite shows, David’s accidental path into Ruby and Rails, and various projects he’s worked on, including an AED management application. The discussion also touches on the new open-source release of Basecamp's Kanban board, Fizzy, and some innovative CSS techniques used in the project. The conversation wraps up with upcoming Ruby conferences in 2026 and how Claude's AI assistance is helping with coding tasks. Hit download now to hear more!
Links
Building LLM-Powered Applications in Ruby: A Practical Introduction
Building LLM-Powered Applications in Ruby: A Practical Introduction December 12, 2025 (Based on Koichi Ito’s “Ruby × LLM Ecosystem” presentation at Ruby World Conference 2025)** Large Language Models (LLMs) have rapidly evolved from experimental chatbots to foundational components of modern software. They now augment workflows in customer support, content generation, data analysis, and even development … Continue reading Building LLM-Powered Applications in Ruby: A Practical Introduction
A good website doesn’t just look nice, it works for everyone. Accessibility ensures that all users, including those with disabilities, can easily browse, understand, and interact with your site. For consultancy websites, accessibility also builds trust. It shows professionalism, attention to detail, and a genuine commitment to inclusivity.
Why Accessibility Matters
When a consultancy site is accessible, it sends a clear message: you care about people and their experience. It’s not only the right thing to do but also good for business.
Here’s why accessibility matters:
- Wider reach. Millions of users rely on assistive technologies such as screen readers or voice navigation.
- Better…
Rails upgrades can feel daunting due to breaking changes, gem compatibility issues and potential downtime. But staying on outdated versions is riskier. Security vulnerabilities accumulate, performance suffers, and we miss powerful features that make development easier.
With proper planning, Rails upgrades can be smooth and predictable. This five part series shares proven strategies from dozens of successful upgrades.
Why Upgrade Now?
Let’s look at the current Rails ecosystem (as of December 2025):
- Rails 8.x: Early adoption phase (~5% of applications)
- Rails 7.x: ~40% of active applications
- Rails 6.x: ~35% of applications
- Rails 5.x and older: ~20% still running
Rails 8 was…
Hi everyone!
Before the year wraps up, while everyone is planning their 2026, we wanted to share some quick information about Rails World 2026 in case that is on your conference wishlist next year (and we hope it is!).
Quick overview
- Dates: September 23 & 24, 2026 (Wed & Thurs)
- Location: Palmer Event Center (very central Austin)
- CFP: open Q2/early spring 2026

Tickets
We adjust Rails World attendance to our chosen venue in each city, and since everything is bigger in Texas, that means we will have space for 1,200 attendees: the largest Rails World yet.
Tickets will be released in Q2 2026. We will have the same ticket tiers as before:
- Corporate Tickets - pre-released; for…
#779 — December 11, 2025
Ruby Weekly
Adding Iongraph Support to ZJIT — This is a very niche item to feature, but it’s a slow week (😅) and I found it interesting, given that the ZJIT compiler will be available in Ruby 4.0 later this month. Iongraph, a tool originally built to visualize JavaScript JIT compilation, can now be used to inspect optimizations made by ZJIT too. This is a truly ‘deep in the weeds’ post, but if it encourages you to work on, or experiment with, ZJIT, fantastic!
Aiden Fox Ivey
Stuck on Rails 4.2? Ready to Upgrade Rails with FastRuby.io? — Stop postponing your…
The closedby attribute gives you declarative control over how users can dismiss a <dialog>. Want users to close by clicking outside? Set closedby="any". Need to force them through your buttons? Use closedby="none".
<!-- Light dismiss: Esc key OR clicking outside -->
<dialog id="light-dismiss-dialog" closedby="any">
<p>Click outside or press Esc to close me.</p>
<button type="button" commandfor="light-dismiss-dialog" command="close">
Or close manually
</button>
</dialog>
<!-- Platform dismiss only: Esc key, no clicking outside -->
<dialog id="platform-dismiss-dialog" closedby="closerequest">
<p>Press Esc to close, but clicking outside won't work.</p>
<button type="button"…The command attribute lets you open <dialog>s declaratively—no JavaScript required. Use command="show-modal" for modal dialogs or command="show" for non-modal ones.
<!-- Modal dialog (with backdrop, traps focus) -->
<button type="button" commandfor="modal-dialog" command="show-modal">
Open Modal
</button>
<!-- Non-modal dialog (no backdrop, doesn't trap focus) -->
<button type="button" commandfor="modeless-dialog" command="show">
Open Dialog
</button>
<dialog id="modal-dialog">
<p>I'm a modal dialog with a backdrop.</p>
<button type="button" commandfor="modal-dialog" command="close">Close</button>
</dialog>
<dialog id="modeless-dialog">
<p>I'm a non-modal dialog. You can still…
After seeing dozens of vibe-coded projects up close, it's clear the gap between a prototype and product ready for users is wider than most expect. Eventually, progress becomes impossible without an experienced developer. We explore why that is, and I share a real-world case study to illustrate.
After seeing dozens of vibe-coded projects up close, it's clear the gap between prototype and production-ready product is wider than most think, and eventually impossible to ignore. Let's explore why that gap happens, how experienced developers are invaluable when closing…
I turned on Ring's new AI description feature for its cameras a couple weeks ago. Opened my event history for the first time since then and was kind of impressed by the honest assessment of what goes on around here.
Requestkit is inspired by Stripe’s CLI to send payloads to your app, but it instead can send (and receive!) any payload. It runs entirely on your machine. It’s a local HTTP server that captures incoming HTTP requests (webhooks) and send outbound requests (API).
Requestkit is fast, requires zero configuration and configuration can be easily shared within projects. Install it as a Ruby gem, start the server and point your webhooks to localhost:4000.

⭐ Star the project on GitHub ⭐
Tell me more!
Requestkit is a local HTTP request toolkit for development. Sounds fancy, but what can you do with it?
- See webhook payloads: view complete headers and body data for every request in a clean…
- Send HTTP…
![[6/4] git worktrees with parallel agents in practice](https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2025/12/coding-cooks-5_4.png)
This is not a comprehensive guide to Git worktrees, but I wanted to share how I'm currently using them to help you work more effectively. I also want to have a snapshot to compare against in a year, when multi-agent workflows will become more critical.
If you want to know how worktrees work fundamentally, check out [4/4] Code with LLMs in parallel. It starts with the basics of how worktrees work at the Git level and walks through the tools I don't use and why. In this post, you will see what I use almost daily and how.
"State of the Art"
I'll be a bit of a downer here because I think there is currently a mismatch between the potential parallel-agent capabilities of AI, the skill development of…
Match HTTP Methods with current_page?
When building a Rails app, you often need to create navigation links that highlight the current page. However, Rails’ default current_page? helper only works with GET and HEAD requests. This can be problematic when dealing with forms or actions that use other HTTP methods like POST, PUT, or PATCH. This feature was introduced in this PR
The Problem
For example, if you have a page for viewing posts and another for creating posts, both share the same URL (/posts). The only difference is the HTTP method used (GET for viewing and POST for creating). With the default current_page? helper, it’s difficult to highlight the correct navigation link when a user submits a form to create a post.
The…
This year, Rails introduced a new method for ActionMailer called deliver_all_later. This feature simplifies enqueuing multiple emails for delivery through Active Job. Instead of sending each email individually, you can now enqueue a batch of emails, allowing them to be sent asynchronously when their respective jobs run.
What is deliver_all_later?
deliver_all_later enqueues many emails at once. When each job is executed, it sends the email using deliver_now. This improves performance by reducing the number of round-trips to the queue datastore, especially when dealing with a large number of emails.
How Does It Work?
To use deliver_all_later, you can pass an array of email deliveries:
1
…
ZJIT is now available in Ruby 4.0
ZJIT is a new just-in-time (JIT) Ruby compiler built into the reference Ruby implementation, YARV, by the same compiler group that brought you YJIT. We (Aaron Patterson, Aiden Fox Ivey, Alan Wu, Jacob Denbeaux, Kevin Menard, Max Bernstein, Maxime Chevalier-Boisvert, Randy Stauner, Stan Lo, and Takashi Kokubun) have been working on ZJIT since the beginning of this year.
In case you missed the last post, we’re building a new compiler for Ruby because we want to both raise the performance ceiling (bigger compilation unit size and SSA IR) and encourage more outside contribution (by becoming a more traditional method compiler).
It’s been a long time since we gave an official update on ZJIT.…
Making Rails Global IDs safer
The new LLM world is very exciting, and I try to experiment with the new tools when I can. This includes building agentic applications, one of which is my personal accounting and invoicing tool - that I wrote about previously
As part of that effort I started experimenting with RubyLLM to have some view into items in my system. And while I have used a neat pattern for referencing objects in the application from the tool calls - the Rails Global ID system - it turned out to be quite treacherous. So, let’s have a look at where GlobalID may bite you, and examine alternatives and tweaks we can do.
What are Rails GIDs?
The Rails global IDs (“GIDs”) are string handles to a particular model in a…
Rails Native Composite Primary Keys: A Complete Evolution from Rails 3 to Rails 8
Introduction
Composite Primary Keys (CPKs) are one of those “real world engineering” features that frameworks eventually grow into. Many enterprise databases, analytics systems, geographic indexes, and ledger tables naturally model identity using more than one attribute.
For years, Rails avoided this space and assumed a single integer column called id, and our applications were expected to adapt with Rails 8, this is finally changing. The framework now understands identity that is multi column, not just “one number per record”.
Even more interesting: Rails does this without requiring external gems, and without asking us to break conventions everywhere. The feature is still maturing, but…
Last year, we introduced case studies highlighting how companies use and build with Rails. Next up, we’re highlighting the story of Cookpad, the world’s largest recipe-sharing platform, and how Rails has powered their growth from a small startup in Japan to a global platform serving more than 100 million home cooks every month.
In this case study, you’ll read how and why Cookpad migrated from ColdFusion to Rails in 2007, and how Rails has supported their growth every day since, from their expansion to many more countries, all the way to their public offering on the Tokyo Stock Exchange.
Read the case study: The Secret Ingredient: How Rails Helps Cookpad Serve 100M+ Home Cooks
A huge…
December 10, 2025 Based on the presentation script from RubyWorld Conference 2025 This article is based on the script of the presentation “Why Now Is the Right Time for PicoRuby”, delivered by Hitoshi Hasumi (ANDPAD Inc.) at RubyWorld Conference 2025. The original session was a 30-minute conference talk, and this text adapts its core ideas, … Continue reading Why Now Is the Right Time for PicoRuby
In recent years, Markdown has become the lingua franca of plain-text files on the web. If you're a developer, you have read — and maybe even written — hundreds of Markdown documents over the course of your career.
GitHub repositories use README files written in Markdown. Stack Overflow and Reddit use it to format posts. Technical documentation, blog posts, and entire books are written in Markdown. And it's not just for humans either! AI tools such as Claude Code and Cursor use Markdown documents to improve the effectiveness of AI agents. This article you are reading is — you guessed it — written in Markdown!
Ruby on Rails, of course, has its own tooling around Markdown, and in this post,…
Higher-order procedures in Ruby
Want to avoid layout shift when you remove scrolling on popover or dialog opening? Use the scrollbar-gutter: stable CSS rule on your scroll container (likely <body>).
body {
scrollbar-gutter: stable;
&:has(:popover-open) {
overflow: hidden;
}
}
The problem: when a popover opens and you hide the scrollbar with overflow: hidden, the content shifts horizontally to fill the space where the scrollbar was.

The solution: scrollbar-gutter: stable reserves space for the scrollbar even when it’s not visible, preventing the jarring horizontal shift.

All posts in this series
Want to prevent scrolling when a modal dialog is open? Use the :modal pseudo-class with body:has() to disable scrolling purely in CSS—no JavaScript needed.
body:has(dialog:modal) {
overflow: hidden;
}
Demo:

The :modal pseudo-class matches elements that are in a state where they exclude all interaction with elements outside of it until the interaction has been dismissed. This includes dialogs opened with showModal().
All posts in this series
Double-dashed IDs and the enhanced attr() CSS function allow us to bind popovertargets with their popovers without having to create distinct anchor-names.
<button popovertarget="--dropdown-example"></button>
<div id="--dropdown-example" popover></div>
[popovertarget] {
/* Dynamically generate anchor-name from the popovertarget attribute value */
anchor-name: attr(popovertarget type(<custom-ident>));
}
[popover] {
/* Dynamically bind to anchor using the menu's id attribute */
position-anchor: attr(id type(<custom-ident>));
/* Position at bottom of anchor, aligned to left edge */
top: anchor(bottom);
left: anchor(left);
}
The key insight is using attr() with type(<custom-…
Have a small scroll container where you want to de-emphasize the scrollbar, like in a popover? Say hello to scrollbar-color and scrollbar-width.
::picker(select) {
scrollbar-color: lightgray transparent;
scrollbar-width: thin;
}
The scrollbar-color property sets the thumb and track colors (here, light gray on transparent), while scrollbar-width can be set to thin for a more subtle appearance.
Demo:

All posts in this series
Coming in the next version of Safari, and already in Chrome and Edge, you can now create <textarea>s that auto-grow with the field-sizing: content rule.
textarea {
field-sizing: content;
min-block-size: attr(rows rlh);
}
The min-block-size: attr(rows rlh) ensures the textarea still respects its rows attribute as a minimum height, using the rlh unit (root line height).
Demo:

All posts in this series
<dialog>s with forms have a simple HTML-only way to implement “Cancel” buttons. In addition to POST and GET, <form>s inside of <dialog>s can make use of the dialog method. This allows the submit button to close the dialog without submitting the form to the backend.
<dialog id="example-dialog">
<form method="POST" action="/confirmations">
<footer>
<button type="submit" formmethod="dialog" formnovalidate value="cancel">
Cancel
</button>
<button type="submit">
Confirm
</button>
</footer>
</form>
</dialog>
The formmethod="dialog" attribute on the cancel button overrides the form’s method, closing the dialog instead of submitting. The formno…
Continuing with closing <dialog>s, in addition to formmethod="dialog" you can also implement a dialog close button in the header with an invoker command="close". Perfect way to close a dialog without a <form>.
<dialog id="example-dialog" aria-labelledby="dialog-title" aria-describedby="dialog-desc">
<header>
<hgroup>
<h2 id="dialog-title">Refund payment</h2>
<p id="dialog-desc">
Are you sure you want to refund this payment?
The funds will be returned to the customer's account.
</p>
</hgroup>
<button
type="button"
commandfor="example-dialog"
command="close"
aria-label="Close dialog"
>×</button>
…Why frozen test fixtures are a problem on large projects and how to avoid them
The RubyMine team will be stopping by r/jetbrains on December 11 from 1–5 pm CET and doing an Ask Me Anything (AMA) thread. You’re invited to join us!
This isn’t a product launch or a marketing campaign – it’s a chance to have an open conversation about RubyMine and the challenges you face as a Ruby and Rails developer.
How to Participate
When: December 11, 1:00–5:00 pm CET (7:00–11:00 am EST)
Where: r/jetbrains
Format:Drop your questions in the AMA thread anytime during the session.
We’ll be online responding in real time, but if you can’t make it live, you can post your questions early. This AMA is your chance to tell us what matters most, what’s working well, what’s not,…
4.0.1 Released
RubyGems 4.0.1 includes enhancements, bug fixes and documentation and Bundler 4.0.1 includes performance, enhancements and bug fixes.
To update to the latest RubyGems you can run:
gem update --system [--pre]
To update to the latest Bundler you can run:
gem install bundler [--pre]
bundle update --bundler=4.0.1
RubyGems Release Notes
Enhancements:
- Installs bundler 4.0.1 as a default gem.
Bug fixes:
- Fixed unexpected default bundler installation. Pull request #9167 by hsbt
Documentation:
- Update contributing docs with
RGV. Pull request #9155 by eileencodes
Bundler Release Notes
Performance:
- Increase connection pool to allow for up to 70% speed increase on
bundle…
Because I'm a glutton for punishment, from time to time I'll, "rub an LLM's nose in it," when it fucks up a task. I know the chatbot can't learn from this, and I know I'm just wasting 8¢ of some idiot investor's money, but I do it anyway.
Today, I asked:
in photos app for mac, i have an album. i want to export everything int the album into a directory that is organized yyyy/mm/dd subdirectories -- how?
ChatGPT 5.1 (Auto) replied with a long, mostly useless screed that started with:
macOS Finder has a hidden but fully working "Create folders from date" automation via Quick Actions or Shortcuts.
Immediately recognizing that statement as bullshit of the too-good-to-be-true variety, I pushed…
This post explores Rails’s swappable migration backend, a little-known feature that lets applications customize how migrations run. At Shopify, we relied on monkey patches and a brittle SQL parser to make Rails migrations work with our Schema Migrations Service. We developed the swappable backend feature to more simply adapt Rails’s migration runner to our needs. We’ll cover why and how we built this, and how Shopify uses it to power database migrations at scale.
At Shopify, we run hundreds of database migrations across many Rails applications every week. Each migration needs to be vetted for safety and executed in a way that doesn’t cause downtime for our merchants. For years, we relied…
Is Traditional Machine Learning Dead? Comparing LLMs and Gradient Boosting

Introduction
Large Language Models (LLMs) have gained significant traction recently due to their flexibility, ease of setup, and continuous improvement in performance and cost-efficiency. Meanwhile, other powerful machine learning algorithms have been established for decades. This article investigates whether these long-standing algorithms remain relevant for ranking tasks or if LLMs can effectively replace them.
Background
At Gusto, we offer a range of bookkeeping integrations, allowing companies to smoothly export data from Gusto to accounting platforms. This process requires mapping internal Gusto categories to external bookkeeping accounts. Accountants typically spend a considerable amount…
Back in the mists of time, I used a tool called rvm. It was more than just a Ruby version manager, it was also a gemset manager: instead of using bundle exec or a binstub, you could just type a command and it would “work” because every version+gemset was a pristine environment. Cool in a way, but also very complicated.
I eventually migrated to the simpler rbenv and have used that for years now. It only manages Ruby versions and expects you to make use of Bundler to keep gems and executables in line. Y’know. Modern Ruby.
But what if you could use something even more modern than rbenv? Enter rv.
Inspired by uv in the Python ecosystem, rv aims to become your singular solution for total…
RubyMine 2025.3 is out!
This blog post briefly goes over the highlights of the latest release. For a detailed description, check out our What’s New page.
You can get the new build from our website or via the free Toolbox App.
AI Assistant
Multi-agent experience: Junie and Claude Agent
With the addition of Claude Agent, the first third-party AI agent fully integrated into JetBrains IDEs, your development workflow becomes more flexible and powerful.
Both Claude Agent and Junie are now accessible from the same chat interface, allowing you to seamlessly switch between them and get the right kind of assistance for every task, whether it’s code generation, debugging, or…
Welcome to Hotwire Weekly!
Welcome to another, issue of Hotwire Weekly! Happy reading! 🚀✨
📚 Articles, Tutorials, and Videos
Vanilla CSS is all you need - Rob Zolkos makes the case for skipping heavy CSS frameworks and leaning on modern, plain CSS instead, with examples from Fizzy.
DriftingRuby: Cool Things in Fizzy - David Kimura published a new episode that highlights neat Ruby- and Rails-related tricks in Fizzy. It walks through features and patterns, showing how you can use it to clean up code and improve maintainability in Rails apps.
37 Signals Fizzy Kanban board - Similarly, Brad Gessler shared a video-walkthrough of the Fizzy source code.
Instant Drag&Drop in Fizzy - Jorge Manrubia…
RubyWorld Conference 2025: PicoRuby, mruby Girls, and the Future of Embedded Ruby
December 8, 2025 The RubyWorld Conference 2025, held in Matsue, Japan, showcased an unexpected star of the ecosystem: Ruby running on microcontrollers. While the event traditionally focuses on Ruby in web, enterprise, or academic settings, this year a significant amount of attention shifted toward embedded systems, thanks to PicoRuby and the community project mruby Girls. … Continue reading RubyWorld Conference 2025: PicoRuby, mruby Girls, and the Future of Embedded Ruby
Dion Lim wrote a pretty good angle on what the market correction will actually do:
The first web cycle burned through dot-com exuberance and left behind Google, Amazon, eBay, and PayPal: the hardy survivors of Web 1.0. The next cycle, driven by social and mobile, burned again in 2008–2009, clearing the underbrush for Facebook, Airbnb, Uber, and the offspring of Y Combinator. Both fires followed the same pattern: excessive growth, sudden correction, then renaissance.
Now, with AI, we are once again surrounded by dry brush.
I think in one of our discussions before our Hot Fix episode, Scott Werner and I used the same analogy—that a recessionary fire will be necessary to clear the overgrowth…
Cool Things in Fizzy
My goal for this week was to rewrite our new landing page copy in a friendlier, more conversational tone. And I got half of it done! One more solid session should do it. Max has been continuing to iterate on the design for these pages, and I think we have a visual approach that will work a treat with this kind of voice.
Jojo has also been chipping away at the site, recently fixing most of our 404s. Having everything in one place is going to make this kind of maintenance so much easier in the future!Website writing wasn’t the only writing I did this week. I also drafted up a submission for the gem fellowship, which I’ll submit this coming week. Regardless of the outcome for my…
Direct link to podcast audio file
I'm experiencing what breathing out of my nose properly feels like for the first time. Everything is new and wondrous and I've never felt so optimistic. This sensation lasted for two days and now I'm used to it and existence is once again pain.
Share your existential musings at podcast@searls.co and I'll nod and sigh along. I might even nod and sigh performatively for you on the show!
Important ground covered in this episode:
- My new gaming PC's final parts list
- This nifty Wake-on-LAN app for iOS
- The POSSE Party has STARTED!
- Aaron's puns, ranked
- Polymarket Builds In-House Trading Team as It Re-Enters the US (Archive)
- Amazon explores cutting ties…
I’m currently doing grant work for the Japanese Ruby Association on UringMachine, a new Ruby gem that provides a low-level API for working with io_uring. As part of my work I’ll be providing weekly updates on this website. Here’s what I did this week:
-
Last week I wrote about the work I did under the guidance of Samuel Williams to improve the behavior of fiber schedulers when forking. After some discussing the issues around forking with Samuel, we decided that the best course of action would be to remove the fiber scheduler after a fork. Samuel did work around cleaning up schedulers in threads that terminate on fork, and I submitted a PR for removing the scheduler from the active…
Hi, it’s Emmanuel Hayford. Here’s a look at the highlights from this week’s updates to the Rails codebase.
Add schematized json for has_json
Provides a schema-enforced access object for a JSON attribute. This allows you to assign values
directly from the UI as strings, and still have them set with the correct JSON type in the database.
Only the three basic JSON types are supported: boolean, integer, and string. No nesting either.
These types can either be set by referring to them by their symbol or by setting a default value.
Default values are set when a new model is instantiated and on before_save (if defined).
Examples:
class Account < ApplicationRecord
has_json :settings, restrict…Advent of Eternal Champions I
Snow was falling hard across the arctic hillside. The wind was biting. No trees offered shelter. Our hero was laying in the snow, barely conscious. His gear was strewn about him. His memories were a blur. He had known many names, but he knew not what they called him in this realm. This realm felt unfamiliar.
He struggled to his feet. The wind whipped snow into his eyes as he attempted to orient himself. He made out a faint glow in the distance and began to gather his gear.
Among his usual equipment were some items that seemed out of place. The first was a box made of a smooth, white, metallic material. It seemed to be designed to collect something, but he did not know what.
def…Docker Disasters and Dev Container Journeys
Andrew kicks off at 8 a.m. with six Docker containers running, and he and Chris dive into what modern Rails development looks like inside dev containers—covering Rails’ own images and features, using Mise and Playwright instead of Selenium, and why OrbStack has replaced Docker Desktop on their Macs. They talk through the trade-offs of running services in containers, the quirks of Kamal’s new local registry, and how Chris is turning all of this into a practical SaaS building series that shows real-world deployment and scaling with tools like JudoScale. Along the way, they weave in life updates about new babies, daycare costs, and even the power needs of AI data centers and nuclear energy. …
Rails pluralization with translations
A short blog on some tips to cleanly pluralize and translate content in Rails.
Vibe coding in style.md

We've experimented putting the essence of a Martian engineer into AGENTS.md. Learn the story, then try it on your next AI-assisted project!
Founders, designers, PMs, marketers—technical at different levels, but not engineers—use code generation tools heavily now. It feels liberating. It’s also incredibly addictive. But the reality check begins when an engineer opens your repo and (despite their best effort to make things work) must throw away everything you vibe coded and rewrite it from scratch. If you want to prevent that, this post is for you. This…
Adding Iongraph support to ZJIT
ZJIT adds support for Iongraph, which offers a web-based, pass-by-pass viewer with a stable layout, better navigation, and quality-of-life features like labeled backedges and clickable operands.
Prelude
I’m an intern on the ZJIT team for the fall term. I also have a rather bad habit of being chronically on lobste.rs.
While idly browsing, I spotted an article by Ben Visness titled Who needs Graphviz when you can build it yourself?, which covers his work on creating a novel graph viewer called Iongraph.

Immediately, I was intrigued. I like looking at new technology and I wondered what it might be like to integrate the work done in Iongraph with ZJIT, getting all sorts of novel and…
#778 — December 4, 2025
Ruby Weekly
RubyGems and Bundler 4.0 Released — If you want to get ahead of any potential issues the Ruby 4.0 upgrade may surface, the early release of RubyGems 4.0 and Bundler 4.0 could help you get started. There's many tweaks and minor improvements, like -j being set by default to speed up compilation of native extensions, cache_all true by default, and the ability to specify custom lockfile locations. There are some potentially breaking changes too, though, like the removal of support for multiple global sources in Gemfiles.
Hiroshi Shibata
💡 If sifting through a…
Help fund attorney for artist charged with transporting zines(?!?)
i know Des Revol, and know them to be an incredibly kind, solid, reliable person.
For real he’s facing federal charges and threat of deportation because of subversive political pamphlets found in his trunk.
Des was not at the Prairieland demonstration. Instead, on July 6, after receiving a phone call from his wife in jail (one of the initial ten), Des was followed by Federal Bureau of Investigation (“FBI”) agents in Denton, Texas. They pretextually pulled him over due to a minor traffic violation and quickly arrested him at gunpoint. He was later charged with alleged “evidence tampering and obstruction of justice” based on a box of political pamphlets that he purportedly moved…
Creating a Custom Mobile Integration for a Board Game Using Ruby on Rails
Picture this: you find a charming old board game at a garage sale, bring it home, gather some friends—and snap. The 50-year-old plastic components break instantly. You search the web for help to replace this fun and unique game mechanic but there’s nothing to be found. So naturally, you roll up your sleeves and build your own mobile version. No one else does this? Just me? Well, in case you ever find yourself in a similar boat, I figured I would walk you through what I did when building my own mobile integration to the 1973 Parker Brothers classic Billionare.
As I said, right when I went to try out this cool "new" board game for the first time, the plastic ends of the Analyzer…
Web application monitoring is the nervous system for our software—continuously listening, collecting signals, and analyzing them to catch problems before they become outages. A one-hour outage can cost millions. Amazon lost an estimated USD 34 million in 2021, while Meta lost close to USD 100 million in a similar incident. Effective monitoring moves our team from reactive firefighting to proactive fire prevention.
The Four Pillars of Telemetry
Modern applications are complex, distributed systems with dozens of moving parts. Without visibility into what’s happening inside, we’re flying blind. Monitoring solves this by collecting four types of telemetry data:
1. Metrics: The Vital Signs
M…
Custom elements are one of those web platform features that sound complicated but turn out to be surprisingly simple. If you have used Hotwire in Rails, you have already used them. Both <turbo-frame> and <turbo-stream> are custom elements. They are just HTML tags with JavaScript behavior attached.
This article walks through what custom elements are, how they compare to Stimulus controllers and how to build them yourself! Starting with a simple counter and ending with an optimistic form that updates instantly without waiting for the server. 🤯
The code is available on GitHub.
What are custom elements?
Custom elements let you define your own HTML tags with custom behavior. They fall under…
Ever since JRuby 10 upgraded to Java 21, I’ve been re-learning Java with all the excellent language enhancements of the past decade. One of my favorites has to be the instanceof pattern matching features added in Java 16. Today I also realized I can use an instanceof pattern to null-check and assign a variable at the same time.
Using instanceof to null-check
When checking if a value in Java is instanceof some type, we can get a false result in two cases:
- The value is an instance of a type not equal to or descended from the specified type.
- The value is
null.
This second property turns instanceof into a weird sort of null-check when applied to a variable or method that matches the i…
Hacktoberfest 2025: Our Team’s Open Source Contributions in AI and Technical Debt Management
At OmbuLabs, open source has always been at the core of our values. This year, for Hacktoberfest 2025, our team took the opportunity to give back to the communities that power our daily work, from Ruby developers tackling technical debt to those building the next generation of AI tools. Throughout October, we dedicated focused internal time to open source contributions. Our goal was twofold:
- Strengthen and maintain the tools that power our work at FastRuby.io, helping teams manage technical debt and improve code quality.
- Advance Ruby’s presence in artificial intelligence, contributing to libraries and frameworks that integrate Ruby with modern AI technologies. By aligning…
Package groups, but better
Packages, especially in node/JavaScript land, have been used to modularize software for some time now. The monorepo as a structure that defines a flurry of packages under a common namespace and released with the same version number at the same time has become somewhat popular in the last few years, with popular packages such as Babel leaning heavily into that.
We have, if a bit crudely, supported these monorepo-packages for quite some time. In the beginning via Greenkeeper’s monorepo definitions, then, after Greenkeeper became part of Snyk and the list was no longer maintained, with a private list that we updated whenever a client mentioned something missing.

We’ve decided to finally…
December 3, 2025 By Germán Silva Bindings are one of the most underrated yet critical pieces of the Ruby ecosystem. They are the bridges that connect Ruby to native libraries, databases, protocols, and even hardware. Bring Your Next Project to Life with High-Quality Development Don’t miss the opportunity to take your project to the next … Continue reading The Ruby Bindings Every Rails Developer Should Know
Introduction
Ruby 3.1 introduced Fiber::Scheduler#io_select, making IO.select work seamlessly with fiber-based concurrency. Before diving in, let’s clarify some key concepts.
What’s a Fiber?
A fiber is a lightweight, pausable unit of execution in Ruby. Unlike threads, fibers don’t run in parallel—they cooperatively yield control to each other, making them predictable and efficient for I/O-bound tasks.
fiber = Fiber.new do
puts "Starting"
Fiber.yield # Pause here
puts "Resuming"
end
fiber.resume # => "Starting"
fiber.resume # => "Resuming"
What’s a Scheduler?
A scheduler manages when fibers run. When a fiber performs I/O (like reading from a socket), the scheduler pauses it…
Upgrading to RubyGems/Bundler 4
We introduced breaking changes in RubyGems/Bundler 4 in order to improve usability, security, and maintainability of the tool. This document describes the changes that you will find when upgrading to RubyGems 4 and Bundler 4, and how to prepare for them while still using Bundler 2.7.
RubyGems 4: CLI behavior changes
Removed gem query command
Please use gem search or gem list instead.
Completely removed gem install --default feature
The --default option was confusing for RubyGems users and caused broken installs.
This was an unfinished feature originally intended to install gems directly into the Ruby standard library location, but it only generated executables without properly copying…
4.0.0 Released
RubyGems 4.0.0 includes features, performance, enhancements, bug fixes, security, breaking changes, deprecations and documentation and Bundler 4.0.0 includes features, performance, enhancements, bug fixes, security, breaking changes and documentation.
To update to the latest RubyGems you can run:
gem update --system [--pre]
To update to the latest Bundler you can run:
gem install bundler [--pre]
bundle update --bundler=4.0.0
RubyGems Release Notes
Features:
- Undeprecate
Gem::Version.new(nil). Pull request #9086 by tenderlove - Add pattern matching support to Gem::NameTuple. Pull request #9064 by baweaver
- Add pattern matching support to Gem::Platform. Pull request #9062 by…
Performance:
la_plata.rb November meetup
On November 27th, 2025, the la_plata.rb community came together at Calle Uno for what became the first and last meetup of the year in the city. More than 30 Ruby developers gathered together to share knowledge, experiences, and drinks.
The meetup was made possible thanks to the support of RubyCentral, GitHub, SINAPTIA, and Unagi. Many thanks to our sponsors; this wouldn’t have been possible without them.
Observability en la era de AI
The first talk was presented by Patricio Mac Adden from SINAPTIA, who shared his team’s journey combining observability tools with LLMs to tackle real-world Rails application problems. With an upfront disclaimer that this wasn’t “the definitive solution” but…
It's the most wonderful time of the year - Christmas Advent of Code time! Advent of Code is an Advent Calendar style series of programming puzzles put out each year, starting on December 1st leading up to Christmas. The puzzles are super festive and ramp up in difficulty over the course of the month. Programmers of every level can participate, and in researching some of the more difficult problems you'll probably learn something cool! It's a great way to finish out the year.
I've been taking part in Advent of Code since 2019 (I've never completed a full year - and that's ok! You can participate for as long as it's fun and have the time) and have tried solving in multiple different…
How to Expose Your Rails Localhost Securely Using Cloudflare Tunnel
This blog series is dedicated to celebrating our Black, Latinx, and Women Engineers who are making an impact in the lives of our Gusties and Gustomers (Gusto customers) every day.
Today, we’re spotlighting Masha (Maria) Gorkovenko, who has been with Gusto for 1 year, working on enabling lower-cost health insurance offerings and creating an Agentic Benefits Advisor for the Benefits team.

Kevin: How did you join Gusto?
Maria: I joined Gusto last October, so it’s been almost exactly a year now. Before that, I was a founder at my own startup where we built AI agents. Joining Gusto felt like a natural continuation of that work — I’m now part of the Benefits team, focusing on our Generative…
Kevi…
Why So Serious?
The question Sheon Han poses — “Is Ruby a serious programming language?” — says a lot about what someone thinks programming is supposed to feel like. For some folks, if a tool feels good to use… that must mean it isn’t “serious.”
Ruby never agreed to that definition. If it did, I missed the memo.
If you arrived late, you missed a chapter when the language felt like a quiet rebellion. The community was small. The energy was playful. Ruby tapped you on the shoulder and asked what would happen if programming didn’t have to feel intimidating… what might be possible if clarity and joy were allowed.
The early skeptics were predictable. Java architects. Enterprise traditionalists. Anyone whose…
I was building a form with a file input. Nothing fancy—just a place for users to upload a document. I wanted the trigger to look like the other buttons on the page: the same subtle shadows, the same hover effects, the same spacing. I was using Catalyst, the component kit from Tailwind Labs, so I had a <Button> component with all those styles baked in.
But I couldn’t use it.
A file input needs a <label> as its clickable element—that’s how you style file inputs without fighting the browser’s native UI. But Catalyst’s <Button> component only renders as a <button> element or a <Link>. There’s no way to apply those styles to a <label>.
Some component libraries offer escape hatches—props like …
Welcome to Hotwire Weekly!
Welcome to another, issue of Hotwire Weekly! Happy reading! 🚀✨
📚 Articles, Tutorials, and Videos
GoRails: Rails new with TailwindCSS - Chris Oliver published a new video as part of the "Domain Monitoring SaaS product" series on GoRails, where he sets up Tailwind CSS in a new Rails project.
What Are Invokers? Interactivity Without JavaScript - Scott Tolinski published a new video on the Syntax FM YouTube channel, in which he talks about the new-ish Invoker Commands API in HTML and JavaScript.
From ERB to JavaScript - Server Computes, Hydration Joins, Templates Filter - Sam Ruby shares the final architecture of an offline-first Rails app built using ERB templates…
Hanami with Sidekiq
As your Hanami application grows, you might want to add asynchronous background processing. A good gem to handle this for you is Sidekiq. You might also want Sidekiq Scheduler for dealing with scheduled jobs that repeat on a specific schedule. This is especially important if you are in a situation where you can’t upgrade to Sidekiq Pro which includes this feature by default. Let’s look at both gems and how you can wire them up in your application.
Setup
To get started, add both the Sidekiq and Sidekiq Scheduler gems as follows:
bundle add sidekiq
bundle add…
Debugging in Real Life: How I Use Rails.logger and Docker Logs in My Daily Workflow
December 1, 2025 Debugging is one of those tasks that quietly shapes a developer’s day. It’s not flashy, it’s not glamorous, but it’s the difference between smooth development and losing an afternoon wondering why a request refuses to behave. Over the years working with Ruby and Rails, one of the tools I’ve learned to appreciate … Continue reading Debugging in Real Life: How I Use Rails.logger and Docker Logs in My Daily Workflow
Pinch, punch, it’s December! But only because I’m writing this a day later than usual. Either way: this month we’re going to launch a new site!
My biggest area of work this week was preparing copy and code samples for our home and landing pages. I got it all completed, but instantly hated everything I wrote. This is good, though. It was a process I knew I had to go through. I’m excited for my next pass: I’m going to make everything a lot more informal, more conversational. Less hard sell, more sharing what excites us. This is the voice I want us to have, and it should be instilled across all our communications avenues. Our new site can set the tone for the future.
Alongside this, I’ve…
Customizing Omarchy with Ruby
Typecraft made a really good video about how he customizes Omarchy with a set of bash scripts, so he can replicate his setup easily on new machines. While his approach is good, I chose a different one to achieve the same goal. Bash is fine, but let’s be honest, Ruby is a much better language to work with, and since Ruby is installed on Omarchy anyways, I decided to script my setup with Ruby.
Seattle Downtown Library





I want to try posting more images to my blog, so here’s my first try. Instagram doesn’t really seem like a good place to post photos anymore, so I figured I’d try on my blog. I’d like to get my blog working with Posse Party at some point, I just need to figure out the API keys, and then I can cross post this to Instagram anyway.
Recently I went on a photo walk to the Seattle downtown public library. These images are from that photo walk! I’ve been living in Seattle since before the library was built, and I never took the chance to actually go visit, so this was a good opportunity. I feel like when you live somewhere, you don’t take the opportunity to visit all of the cool stuff there, and…
Triaging bugs
At Fat Zebra, one of my duties as a team lead is managing the workloads of those I work with and falling into that ambit is bug triaging. We have a dedicated support channel where people can tag all leads and then the responsible leads can triage those issues. All leads get tagged as it’s sometimes unclear who is responsible for an issue, and it helps with the “pinball effect” that can go on for tickets in their early stages.
Another rule of thumb is that when I can see a ticket is about my team’s work is that I’ll assign it to the on-call person for the team to investigate. This helps spread the load away from myself, and trains up the rest of the team on how to investigate all sorts of…
I spent my holiday weekend gaining massive respect for the small-form factor (SFF) PC gaming community. Holy shit, was this a pain in the ass. BUT, it's a fraction the size, way faster, and whisper quiet compared to my outgoing build. Glad I did it.
😮💨
This week I made substantial progress on the UringMachine fiber scheduler implementation, and also learned quite a bit about the inner workings of the Ruby I/O layer. Following is my weekly report:
-
I added some benchmarks measuring how the UringMachine mutex performs against the stock Ruby Mutex class. It turns out the
UM#synchronizewas much slower than core RubyMutex#synchronize. This was because the UM version was always performing a futex wake before returning, even if no fiber was waiting to lock the mutex. I rectified this by adding anum_waitersfield tostruct um_mutex, which indicates the number of fibers currently waiting to lock the mutex, and avoiding callingum_futex_… -
I also noticed that the
UM::Mut…
Hi, it’s Vipul. Let’s explore this week’s changes in the Rails codebase.
Active Support Instrumentation Documentation
This Pull Request updates the Active Support Instrumentation documentation to receive various additions, improvements and more.
It is now open for review and feedback from the community!
Ensure TimeWithZone#as_json always returns a UTF-8 string
This PR addresses a regression in Rails 8.1.0 where ActiveSupport::TimeWithZone#as_json was returning strings with incorrect encoding.
Since Time#xmlschema returns a US-ASCII encoded string, as_json was returning US-ASCII instead of UTF-8.
The fix ensures that the JSON representation always returns a properly encoded UTF-8 string.
San Francisco Ruby Conference Recap
Andrew returns from SF Ruby with a lot more than conference swag! He brings a clear snapshot of where Ruby, Rails, and AI are headed right now. In this episode, he and Chris walk through the most impactful talks from SF Ruby, share highlights of engaging discussions with other developers and friends, reminisces about nostalgic tech items, and explores insightful conversations on the future of Rails, startup culture, AI's impact on programming, developer anxiety, and they share product ideas from Chris new SaaS series on GoRails to Andrew’s concept for a serious GitHub Actions monitoring tool. Hit download now to hear more!
Links
Before jumping into a website redesign, it’s worth taking a step back to see what’s actually working and what’s not. A proper UI/UX audit helps you understand your current website from both a design and user perspective. It’s like a health check before surgery — it saves time, money, and effort later.
Why a UI/UX Audit Matters
A redesign without an audit often leads to repeating old mistakes. Instead of guessing what needs improvement, a UI/UX audit gives you a clear roadmap. It helps you see how real users experience the site and what’s stopping them from reaching their goals.
An audit helps you:
- Identify design inconsistencies and outdated visuals
- Find usability issues that…
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. Rails 8.1 further enhanced this by allowing per-adapter strategy configuration.
This post explores how Execution Strategies work and demonstrates…
✉️ I'd do it all again
This is a copy of the Searls of Wisdom newsletter delivered to subscribers on November 25, 2025.
Hello! We're all busy, so I'm going to try my hand at writing less this time. Glance over at your scrollbar now to see how I did. Since we last corresponded:
- Dropped in on the Ruby AI podcast
- Added a new cable to the increasing number of cables plugging my face into my computer, which shipped with some pretty glaring issues, some of which I talked about
- Found somebody else saying that, in the short term, AI codegen is going to dramatically increase the demand for software as the supply constraint on programming eases
- Made an open source library called Straight-to-Video that performs…
#777 — November 27, 2025
Ruby Weekly
Unparser: Real Life Lessons Migrating Ruby Tools to Prism — Ruby 3.4 ships with a new built-in parser called Prism. This post is a good introduction to why Prism exists, what it does, as well as some Ruby quirks it needs to deal with. Beyond that, if you’re working with tools that use the old parser, you’ll need to put your code through the.. prism of new classes, tips, and tricks to transition.
Yaroslav Kurbatov (Evil Martians)
♥️ Thankful for the Ruby Open Source Contributors — Open source makes everything we do possible. This Thanksgiving, we’re…

.jpg)