I've started moving all of my content over to baweaver.com powered by Bridgetown under github.com/baweaver/portfolio.
Why?
I wanted more control of my content and some of the mechanics around it, and to finally redo my homepage which I had not honestly updated since... 2014?
After years of attempts I landed on a design that I liked, and over vacation I had enough time to get it all put together.
Lemurs?
The current site is focused more on architectural imagery, watercolor, and art deco. Where are the lemurs then?
Well for those I want to make something more special, and I haven't quite figured out how I want to land that yet.
The current idea is a literal…
One of the ways I have been using coding agents these days is to prototype small UI changes in an existing project. I use them as a tool to explore.
In this usage mode, I am not interested in the code. I am interested in how the options look. My objective is to extract ideas from the LLM, choose what I want, and later work on the real change in a different chat.
Ask for a selector to compare
One little trick I discovered recently is that you can simply ask for a selector to compare the options.
The coding agent can implement several UI alternatives and add a small selector that lets you switch between them in the real application.
You can literally ask for it. This is a translation of…
A Rails blog app in a ~500KB binary
#806 — June 25, 2026
Ruby Weekly
Spinel on Rails — When I dug into Spinel, Matz's AOT Ruby compiler, I knew we’d see some interesting use cases, but a webapp wasn't on my radar. This experiment uses Sam’s Roundhouse compiler which converts Rails apps to targets like Rust, TypeScript, and now Spinel. It’s not near the level of "compile any Rails app to a binary", but it’s fun to see a Ruby webapp served in 12MB of RAM!
Sam Ruby
💡 Sam has also been experimenting with Roundhouse compiling to JRuby, where the same emitted app hit ~46k req/sec vs 1k running normally as a Rails app.
Beam Up is a command-line tool I wanted for some time. Its goal is to make deployments of static sites across various providers simpler from your machine: run one command: beam_up ./output/. ❤️
If you feel generous, head over to the GitHub repo and give it a star! 🌟
Installation and configuration
To install Beam Up, run:
gem install beam_up
Then initialize a configuration file for your chosen provider with:
beam_up init # to start an interactive process, or:
# beam_up init hetzner
This creates a .beam_up.yml file:
provider: netlify
netlify:
api_token: your_token_here
project_id: your_project_id
Ready to beam ⚡
Now you can deploy your static site using the super fun beam_up command:
https://avdi.codes/158216-2/?utm_source=rss&utm_medium=rss&utm_campaign=158216-2
Users don’t experience systems as implementations. They experience them as continuity.
leaflet.pub: UI Is a Conservation Layer
Welcome to Once a Maintainer, where we interview open source maintainers and talk about the work they do.
This week we’re talking to Mike Dalessio, longtime Ruby maintainer (nokogiri, loofah, mechanize to name a few) and member of the Rails Committer team. Mike works on security, infrastructure, and performance at 37signals.
Once a Maintainer is written by the team at Infield, a platform for managing open source software upgrades.
I’d love to get started by hearing how you got into software development. What was your first exposure to writing software?
When I was a kid, I had a friend who lived up the street whose dad bought him a VIC-20, which was like the Commodore 64 predecessor. And we…
https://avdi.codes/158050-2/?utm_source=rss&utm_medium=rss&utm_campaign=158050-2
I think we wrote a brilliant critique of ideology. We should have completely blown [techno-optimist capitalism] out the water, but it of course just carried on. … material reality is more important if it offers to triple your wages. Co-option is easy. … Critique is important. I’m not dissing it. We should do it. But we shouldn’t have any illusions that it will make any difference without our words being turned into action.
wedontagree.net: Technically Radical: On the Unrecognized Potential of Tech Workers and Hackers
https://avdi.codes/157853-2/?utm_source=rss&utm_medium=rss&utm_campaign=157853-2
As much as I fear the fallout of this technology, I fear the fallout of ideological purity even more. Time and again, people fall victim to the transformation of a stance on an issue into a holy cause, a flag to rally behind, a group from which to exclude The Other. Purity is a dangerous idea—historically, more dangerous than technology’s capacity to change labor.
taggart-tech.com: I Used AI. It Worked. I Hated It.
https://avdi.codes/157772-2/?utm_source=rss&utm_medium=rss&utm_campaign=157772-2
the markets can stay irrational longer than you can stay solvent.
Gil Duran: Attack of the Trillionaire
Announcing the RubyConf VIP Raffle
At RubyConf 2026, anyone who buys a ticket before July 1st is entered into a raffle for an exclusive RubyConf VIP experience. What exactly is a RubyConf VIP experience?
Five lucky winners, drawn at random, will:
- Get a ticket for you and a plus-one to the world-famous RubyConf speakers' Dinner, where you'll meet your real-world Ruby Heroes. Get exclusive behind-the-scenes access to the people who make Ruby and make RubyConf while you eat like royalty.
- VIP reserved seating for all keynote talks so you won't miss a thing. No fighting for a free seat or squeezing in the middle of a row of strangers. Walk right up and take a load off.
- A personal "thank you" from the board and staff. Because we…
But that's not all, everyone who enters by buying a ticket by July 1st will receive a limited edition RubyConf 2026 pin! If you were on the fence before, don't let this chance of a lifetime pass you by. When the clock strikes midnight on July 1st (PST), this door will officially be closed. Anyone who buys a ticket after that will…
If you're heading to RubyConf this July, make sure to stop by and meet the team from SmartFinancial.
SmartFinancial is a technology-driven insurance marketplace that helps people find and compare insurance options across all 50 states. Their goal is simple: make buying insurance easier, more transparent, and less frustrating for consumers.
Ruby plays a major role in making that happen.
The SmartFinancial engineering team has been building and operating Ruby on Rails applications for years, and they're excited to be part of the RubyConf community in Las Vegas this July 14–16 at Red Rock Casino Resort. Like many of us, they're coming to learn, share ideas, meet fellow Rubyists, and stay…
https://avdi.codes/157638-2/?utm_source=rss&utm_medium=rss&utm_campaign=157638-2
The fifth obstacle is us. Our cynicism, our exhaustion, our tendency to scroll past the policy debate and doom-post about the inevitable robot apocalypse. Doomerism is a form of political paralysis. If you believe the future is already determined, you don’t organize, you don’t vote, you don’t fight. You wait for the catastrophe and feel validated when it arrives.
JA Westenberg: A Soft-Landing Manual for the Second Gilded Age
Writing effective test cases is as important as writing the business logic in your application. This blog post dives into the simple yet effective ways developers can use when crafting test cases.
Lack of assertions in the test cases
We all have written controller test cases in the past. It could be rspecs, minitests, or any other framework. Consider we have an UsersController and the code look like this:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def create
@user = User.new(user_params)
if @user.save
# Sending welcome email
UserMailer.welcome_email(@user).deliver_later
# Creating default settings for user
Use…
Evil Martians benchmarked five WebSocket servers for Node.js: Socket.io, uWebSockets.js, and AnyCable (OSS and Pro). How we caught our own load generator lying, and how to make WebSocket benchmark numbers honest.
I compared five ways to run WebSockets on Node.js: default Socket.io, Socket.io with Connection State Recovery, uWebSockets.js, AnyCable OSS, and AnyCable Pro. In this post, I share how a banned laptop, a lying load generator, and a stubborn throughput disparity taught me that the hardest part of benchmarking is getting…
GHSA-g9g8-vgvw-g3vf (nokogiri): Possible invalid memory read when calling `Nokogiri::XML::Node#initialize_copy_with_args` with incorrect argument type
Blue Ridge Ruby made a comeback in 2026 and Jeremy Smith joins the podcast to talk about how it went
Show Notes
Sponsors
Lots of teams out there are still overpaying for their hosting and getting tripped up by traffic spikes. If you’re on one of those teams, you need a better autoscaler. Judoscale uses better metrics, gives you more control, and reacts faster than any other autoscaler. Learn more at https://judoscale.com/
Founding a Company in Germany: €9,600, 152 Days, and I Still Can’t Send an Invoice
I started founding my second company in Germany in late January. It is now late June.
In that time, the state, two courts, a notary, a law firm, a tax firm, and software vendors have all found a way to bill me. Every single one of them, on time.
I have spent more than 9,600 euros to start a company: a little over 7,600 in fees and bills, plus 2,000 in share capital frozen in an account I am not allowed to touch. And after five months, here is what I have to show for it:
I have not been able to send a single invoice of my own.
Not one.
The work is happening. The clients are real. The one thing the state exists to let me do, bill them cleanly, is the one thing I still can’t.
The timeline
…Some time ago, we migrated our work application from Rails 6 to Rails 8 in one big jump and adopted several new features that came with this version. One of those was a Procfile that defined the necessary processes to run the application in local environments, which is executed when you run bin/dev. If you look at the code of this file, you will find the real responsible party for executing all these processes: foreman (unless you modified the original file).
The first problem we started encountering was that all process outputs were mixed into a single stream, making it take us a long time to realize that, for example, JavaScript compilation had failed, which is why we weren’t seeing the…
How Ruby Itself Uses Dependabot: A Look Behind MRI's Dependency Management June 23, 2026 When people think about Dependabot, they usually picture a Rails application keeping its gems up to date. But Ruby itself—the MRI interpreter—also relies on Dependabot to automate dependency updates. Its configuration offers an interesting glimpse into how the Ruby core team … Continue reading How Ruby Itself Uses Dependabot: A Look Behind MRI’s Dependency Management
This week I made a refactor to remove a job (ActiveJob::Base) that was used only in recurring.yml, and call a class method directly instead.
Sometimes it is ok to have a job, but sometimes using the method can help you write a little less code. And these days it is just a prompt away.
The example
I was working on a follow-up flow for users who had not updated their profile in over a year. The recurring task only needed to fan out work: find eligible users and enqueue one job per user.
Instead of scheduling a job in recurring.yml, like this…
follow_up_main_info_review:
class: "User::ScheduleMainInfoReviewFollowUpsJob"
schedule: "every day at 09:00"
With a thin wrapper job like this…
…4.0.15 Released
RubyGems 4.0.15 includes enhancements and bug fixes and Bundler 4.0.15 includes enhancements and bug fixes.
To update to the latest RubyGems you can run:
gem update --system [--pre]
To update to the latest Bundler you can run:
gem install bundler [--pre]
bundle update --bundler=4.0.15
RubyGems Release Notes
Enhancements:
- Rubygems: Fix Gem::Request for PQC support, adding integration connection tests. Pull request #9615 by junaruga
- Reduce peak memory usage of full index loading and bundle install. Pull request #9618 by hsbt
- Installs bundler 4.0.15 as a default gem.
Bug fixes:
- Forward security policy to old-format gems. Pull request #9611 by hsbt
Bundler Release Notes
…How to Write a Claude Code Skill
We have been spending time teaching Claude Code how to help us upgrade Rails applications. Along the way we learned that the most reusable piece of that effort is not the prompt we type, it is the skill we wrote once and now load on demand.
If you keep pasting the same checklist or procedure into a chat, a skill is probably what you want. This post walks through writing your first skill from scratch and keeping it lean, so it triggers when you want and costs almost nothing when you don’t.
What Is a Skill?
A skill is a folder with a SKILL.md file inside it. The file has two parts: YAML front matter that tells Claude when to use the skill, and Markdown instructions that tell Claude what…
Somewhere in the mid-aughts eXtreme Programming (XP) practices became widely-discussed in software. From that time forward, a strange chasm emerged in the discourse.
I would stumble across large pockets of programmers discussing—with full confidence—the fact that “nobody is actually doing TDD”, “pairing all the time is a myth”, “no one can actually succeed with those practices, it’s just hype”. Meanwhile, I was writing all my code test-first, spending nearly all of my time pair-programming, and by all accounts succeeding greatly. Not to mention enjoying coding more than ever.
It was like living in parallel universes. In my universe, XP practices were a welcome way of life, making…
This is a short post to show the compatibility between JRuby and Ruby on Rails across different versions. JRuby is an implementation of Ruby that runs on the JVM, so picking a version means lining up four things at once:
- JRuby release
- Ruby version
- Minimum Java version
- Rails version
JRuby tracks a specific CRuby (MRI) language level per release, and Rails support on JRuby is delivered through the activerecord-jdbc-adapter gem, whose version number mirrors the Rails version it targets. The Rails versions listed below are the ones that both run on that JRuby line’s Ruby language level and have a matching adapter release.
JRuby Version Ruby Compatibility …503: Seeing the Graph for the Trees
Aji and Joël join forces to discuss graph and tree structures, and their connection to the emergent properties, attributes and qualities you can find from a largely connected group of data.
Joël dives into their recent graphs and tree work through a contracting system, whilst Aji looks back at when he previously tried to serialise a graph or tree to a database.
—
Watch Joël’s Blue Ridge Ruby talk here, or Matheus’ Ruby Internal talk from last year here.
There’s still time to secure your place at thoughtbot’s upcoming UK meet ups over the next month.
London Tech Leader Meetup - Tuesday June 23rd
Brighton Tech Leader Meetup - Wednesday June 24th
Brighton Ruby - Thursday June 25th…
Your hosts for this episode have…
CVE-2026-54904 (concurrent-ruby): Concurrent Ruby - `AtomicReference#update` livelocks when the stored value is `Float::NAN`
CVE-2026-54905 (concurrent-ruby): Concurrent Ruby - `ReentrantReadWriteLock` read-count overflow grants a write lock without exclusivity
CVE-2026-54906 (concurrent-ruby): Concurrent Ruby - ReadWriteLock allows wrong-thread write release and stray read-release counter corruption
CVE-2026-54592 (oj): Oj - Stack Buffer Overflow in Oj::Doc#each_child via Deeply Nested Input
https://avdi.codes/156725-2/?utm_source=rss&utm_medium=rss&utm_campaign=156725-2
Certain shifts in software history feel like freedom because they remove familiar signals of control. In reality, they relocate rigor closer to where truth lives. They make it harder to fake progress.
leaflet.pub: Relocating Rigor
The fourth edition of Rails World is fast approaching with just over three months to go, so it’s time to meet the speakers who will join us this year in Austin, TX.
But first: Thank you to everyone who applied this year. When we opened the CFP, three of the nine topics were AI-related, but in the end half of all submissions were in these three categories. Not at all surprising considering the year we are having, but there are only 20 speaking slots, and still a lot happening in Rails outside of (or maybe adjacent to) AI, so finding the right balance took a little more work this year. (Big shout out to the content committee for their patience, discernment, and endless review cycles!)
With…
CVE-2026-54297 (faraday): Faraday - Uncontrolled recursion in NestedParamsEncoder allows stack exhaustion DoS via deeply nested query parameters
GHSA-mqq5-j7w8-2hgh (alchemy_cms): AlchemyCMS - Unauthenticated nested page API leaks restricted and unpublished content
Can Ruby Next Help You Upgrade an Application Gradually? June 21, 2026 Upgrading a Ruby application is rarely as simple as changing the version number. Dependencies, deployment pipelines, CI environments, and legacy code often mean that a runtime upgrade becomes a project of its own. As a result, many teams postpone adopting newer Ruby language … Continue reading Can Ruby Next Help You Upgrade an Application Gradually?
GHSA-5prr-v3j2-97mh (nokogiri): Nokogiri: Possible Out-of-Bounds Read in `Nokogiri::XML::NodeSet#[]`
GHSA-5v8h-3h3q-446p (nokogiri): Nokogiri: Possible Use-After-Free when `Nokogiri::XML::Document#encoding=` raises an exception
GHSA-8678-w3jw-xfc2 (nokogiri): Nokogiri: XML::Schema on JRuby allows network requests when NONET is set, bypassing CVE-2020-26247
GHSA-9cv2-cfxc-v4v2 (nokogiri): Nokogiri: Null Pointer Dereference calling methods on uninitialized wrapper classes
GHSA-p67v-3w7g-wjg7 (nokogiri): Nokogiri: Possible Use-After-Free when directly using `NokogirI::XML::XPathContext` beyond document lifetime
GHSA-phwj-rprq-35pp (nokogiri): Nokogiri: Possible Use-After-Free when setting an attribute value via `Nokogiri::XML::Attr#value=` or `#content=`
GHSA-wfpw-mmfh-qq69 (nokogiri): Nokogiri: Possible Use-After-Free in XInclude Processing
GHSA-wjv4-x9w8-wm3h (nokogiri): Nokogiri: Possible Use-After-Free when setting `Document#root=` to an invalid node type
https://avdi.codes/155720-2/?utm_source=rss&utm_medium=rss&utm_campaign=155720-2
We organized around nouns, not verbs. Users, lists, tasks, comments, each owned by exactly one service. Operations were almost entirely CRUD. Communication happened through exactly two mechanisms: a standardized REST/JSON convention that every service spoke natively and exclusively, and a message bus that broadcast every mutation. That was it. No service-to-service RPC. No custom protocols. No internal APIs that only two services knew about.
We didn’t choose this approach because we loved distributed systems. We chose it because it enforced replaceability. When a service became too heavy—too much conceptual mass—we didn’t refactor it. We deleted it and replaced it with something simpler.…
CVE-2026-12515 (katello): katello - missing repository authorization in content_uploads exposes cross-product content existence
CVE-2026-55518 (avo): Avo - Missing Authorization in Avo Association Attach Endpoint Allows Unauthorized Relationship Manipulation and Privilege Escalation
Hi, it’s zzak. This week was full of changes, so let’s pull into the station and take a look.
Last Rails World GA tickets available
Heads up: there are now just 100 General Admission tickets available for Rails World 2026. Don’t miss your chance to join the Rails community in Austin this September for two days of talks, code, connection and music.
Rails Foundation documentation guides
The documentation project reworked the Multiple Databases guide, now ready for community review, and reorganized the Internationalization guide from beginner-friendly setup through advanced topics.
Allow query log tags to be configured per connection pool
Database configurations can now override query log…
Navigating Subscription Overhauls and Payments
Chris, Andrew, and David catch up after a missed week of recording and quickly dive into the kind of deeply practical Rails work that only comes from real production pain. Andrew shares the massive subscription and billing migration happening at Podia, including Stripe edge cases, legacy plan preservation, and stress-test tooling built from live scenarios. Chris then goes deep on a Hatchbox email cancellation flow that turns into a Rails internals rabbit hole around Action Mailer callbacks, mail delivery cancellation, and a tiny Rails PR born from production debugging. Hit download now to hear more!
Links
I wrote recently about Syntropy, a new Ruby web framework I’m working on (it runs this site). Syntropy’s design is based around the idea of file-based routing, which means that the source files for route handlers (i.e. controllers) that make up the app are organized and named according to the app’s URL namespace. I also discussed the way Syntropy loads the different source files (referred to as modules), and I’d like to discuss this a bit more in detail.
Code Organization in Ruby on Rails
Now, if you’re a Rails developer, you know that Rails’ approach to code organization is based on auto-loading of the different source files that make up the app, performed by the Zeitwerk gem.…
Continuations 2026/24: Clearing the decks
This edition’s a bit late—please grant me an amnesty, as I don’t want to break my streak! So here we’ll focus on last week’s work, and in a few days’s time, I’ll bring you up to the present.
The focus last week was clearing the decks so we could make ship a 3.0 release candidate for Hanami.
Sean merged another nice batch of performance improvements for Hanami Action, as well as an attachments-related fix for Mailer. Thanks Sean!
Paweł got in on the action too, with a website update for our generated README, plus sourcing our gems from our gem.coop namespaces if you elect gem.coop as your gem source in new apps. I also tweaked and merged his documentation for undecorated view exposures.…
Merged (another!) nice fix from Jane Sandberg: Do not create duplicate routes when running the…
Herb and ReActionView: A Glimpse Into the Future of Rails Views June 18, 2026 For years, Rails developers have enjoyed one of the simplest and most productive ways to build web applications: write HTML with ERB, let Action View render the templates, and move on. While the Ruby language, the parser, and the tooling ecosystem … Continue reading Herb and ReActionView: A Glimpse Into the Future of Rails Views
Comsol Customer Service
I’ve had a Comsol 3-in-1 wireless charger sitting on my desk for ages. It has a hardcore 2010s tech aesthetic, with its white plastic and chrome combination. I use it to charge my phone, watch and earbuds all at once. Or at least I did, until it stopped being able to charge the phone. It could still charge a watch and the earbuds, but I used it most for charging the phone.
The device still turned on, but it would flash a solid white light for about a second, then off again, then repeat. I didn’t know what caused this, and googling for the manual turned up no results. But I did find the support email! So I contacted them and asked what it meant and if they had the manual.
They then asked…
No Node
The Asset Pipeline has had many changes over the years, from not needing NodeJS when using Sprockets, to supporting NodeJS to manage JS dependencies through npm packages, to requiring NodeJS by default with Webpacker, and to not needing NodeJS by default again with ImportMaps.
ImportMaps is a good way to not have NodeJS as a dependency of the application, but it has many limitations (like the lack of TypeScript support) and it requires a lot of work to migrate to it when upgrading older applications.
In this blog post, we will see how to use Bun to remove the need to install NodeJS system-wide, how to use the standalone binary to not require an installation step, and at the same time keep…
Before and after (image) sliders are great for product showcases, before/after transformations, renovation projects or photo editing results. They’re engaging, interactive, and honestly just fun to use.
Ever thought of building one from scratch? Not complicated at all! In this article, I want to show how to build a simple, reusable Stimulus controller that does just all that. This is how the end result will look like:

As always, the code can be found on GitHub.
It is simple, really
The beauty of this controller is its simplicity. You need three things:
- a wrapper element;
- two images (before and after), and;
- a slider.
That’s it. Here’s it in HTML:
<div data-controller="compare">
<img da…https://avdi.codes/154684-2/?utm_source=rss&utm_medium=rss&utm_campaign=154684-2
Generative AI dramatically lowers the cost of modification, which creates a dangerous illusion: that everything can change quickly, therefore everything should.
leaflet.pub: Pace Layers and AI Integration
41M requests/hour on Rails
#805 — June 18, 2026
Ruby Weekly
The Plan for rv and a Progress Update — Inspired by Python’s uv, rv is a fast Ruby install, gem, and project manager built by several prominent Rubyists. v0.6 landed this week, and things are going well. This post shares some history, progress, and where the team is focusing next.
André Arko
⚡ "You can go straight from brew install rv to a Rails app from rvx rails new in 10 seconds flat." – André Arko
Hiring Rails Engineers Takes Months. We Start Next Week! — Since '17, teams have trusted us to upgrade Rails. The same engineers are now available for staff augmentation:…
https://avdi.codes/154635-2/?utm_source=rss&utm_medium=rss&utm_campaign=154635-2
It’s the **robber barons, rails, rents and defaults** of the next twenty years I worry about, not skynet, the singularity or misaligned paperclip optimizers.
Philipp Markolin, PhD: The AI Race to Reboot Feudalism
https://avdi.codes/154575-2/?utm_source=rss&utm_medium=rss&utm_campaign=154575-2
I’m mourning the future I grew up and came of age thinking we would have. Fascism, and overbearing type systems, was something my forebearers dealt with so that I wouldn’t have to.
okayfail.com: In Praise of DHH
https://avdi.codes/154526-2/?utm_source=rss&utm_medium=rss&utm_campaign=154526-2
90% utilization is causing more failure than you realize, not just in burn-out, but in productivity and output.
Jason Cohen: A Smart Bear » Your non-linear problem of 90% utilization
https://avdi.codes/154516-2/?utm_source=rss&utm_medium=rss&utm_campaign=154516-2
perhaps languages aren’t slowing down so much as *spreading sideways*. They are dissolving into domains like query languages, shader languages, build languages, DSLs for robotics or finance, etc. The langdev shift perhaps is less about one big new paradigm and more about fifty smaller ones, deeply integrated.
Fogus: The Long Season of Langdev
Before and after (image) sliders are great for product showcases, before/after transformations, renovation projects or photo editing results. They’re engaging, interactive, and honestly just fun to use.
Ever thought of building one from scratch? Not complicated at all! In this article, I want to show how to build a simple, reusable Stimulus controller that does just all that. This is how the end result will look like:

As always, the code can be found on GitHub.
It is simple, really
The beauty of this controller is its simplicity. You need three things:
- a wrapper element;
- two images (before and after), and;
- a slider.
That’s it. Here’s it in HTML:
<div data-controller="compare">
<img da…Ingress is not the owner of the invariant
A polemic with Callbacks Are Not Invariants by Brandon Weaver.
A disclaimer: I’m a RailsEventStore maintainer and this article ends up on the Arkency blog — so cards are on the table. Despite this, I’m keeping the core of my argument in pure
ActiveRecord: no step of the reasoning requires RES. I only show the RES version at the end, separately, as “and this is what it looks like when you’re not typing it in manually”. If you’re convinced by the bare-metal AR reasoning, not the library, that’s what matters.
We agree about the disease
I enjoy reading Brandon’s Rails: The Sharp Parts series and sending it to the team — it’s one of the better…
Ruby 4.0 Is Here. Why Is AI Still Writing Ruby 3.0? June 17, 2026 Artificial intelligence has become an indispensable tool for Ruby developers. We ask AI assistants to write methods, refactor services, generate RSpec tests, explain stack traces, and even architect new features. For many developers, AI is no longer an experiment—it's part of … Continue reading Ruby 4.0 Is Here. Why Is AI Still Writing Ruby 3.0?
Brighton Ruby 2026 will take place in a few days and the thoughtbot team will be there to meet you all in real life, learn from all the great talks, and enjoy a day by the English coast.
We love Brighton Ruby and enjoyed it for many years. It is a single-day, single-track conference packed with great energy and great people.
This year we will have 5 thoughtbotters attending:

Aji will be at Brighton Ruby for the first time! They are always happy to talk about ruby game development, recent conversations on The Bike Shed, tracking reading lists on Storygraph, or (let’s see what else… ::rummages through bag of hobbies::) linguistic anthropology. Come say hello!

Chad is thoughtbot’s…

We’ve talked a lot lately about governance, sustainability, accountability, and the future of Ruby Central. Those conversations were necessary, but they were largely conversations about the past.
This year’s RubyConf feels different.
This RubyConf is going to be a conversation about the future.

For the first time, we will be inducting the inaugural class of Ruby Fellows. Leaders from Ruby Alliance companies will gather to discuss how they will be collectively investing in Ruby's future. We'll officially launch Steering Committees that create new opportunities for community members to get directly involved. We'll host Ruby Runway and showcase founders building exciting new businesses on Ruby.
No…
Every developer has tools they rely on daily. The workflows they’ve built around them, the ways they’ve learned to move faster, debug smarter, and write better code – that kind of hands-on experience can be hard to put into words.
We’re collaborating with LinkedIn to make it easier for you to showcase your expertise with JetBrains IDEs on the world’s largest professional network. You can now connect your IDE to LinkedIn and let your real tool usage speak for itself.
IntelliJ IDEA, PyCharm, WebStorm, PhpStorm, Rider, GoLand, CLion, RustRover, and RubyMine are already supported via a free plugin, while support for DataGrip is coming soon.
In this blog post, we’ll…

Coding without design guidelines can leave teams with an inconsistent UI design and a complex feature development process. Here's how we built a design system for Currents that's readable by engineers and AI agents.
AI-assisted coding allows technical founders and lean engineering teams to try new languages and frameworks, write more code, and ship new designs. It's the perfect solution for validating ideas, building PoCs and MVPs. However, as adoption grows, it's time to drastically elevate the UX and UI.
https://avdi.codes/154098-2/?utm_source=rss&utm_medium=rss&utm_campaign=154098-2
When code can be regenerated faster than it can be understood, preserving it for sentimental or historical reasons no longer makes sense. What matters instead is stewardship: maintaining the system’s behavior, boundaries, and intent over time, regardless of how many times its internals are replaced.
leaflet.pub: The Death and Rebirth of Programming
Travis Dockter wanted a Ruby conference closer to home, so he made one. Today we chat about the ups and downs of putting together a brand new conference.
Show Notes
Sponsors
Lots of teams out there are still overpaying for their hosting and getting tripped up by traffic spikes. If you’re on one of those teams, you need a better autoscaler. Judoscale uses better metrics, gives you more control, and reacts faster than any other autoscaler. Learn more at https://judoscale.com/
Waiting over an hour for a test suite to finish is a productivity killer.
On a recent project, that was our reality.
Running the full local RSpec suite took almost 2 hours, making it difficult to get quick feedback and confidently iterate on changes. While there are many ways to optimize test performance including fixtures, request stubbing, faster tooling, and more, most of these options require significant effort to implement.
Instead, we explored a simpler approach: bringing parallel test execution to local development. The result was a much faster feedback loop (down to 5 minutes) and a significantly better developer experience.
Although our primary goal was to improve the local…

Gusto, like most companies building with LLMs, is amassing a LOT of software: one-off projects, Claude Artifacts, HTML visualizations, dashboards, and my own growing fleet of personal tools.
The agent loop made building 100 times easier, but deployment and operations still assume the old world. Your choices are weirdly binary:
- Static sites with data in the HTML
- A whole app with Dockerfile, Postgres, secrets, CVE mitigation, deploy pipeline, PagerDuty, and sharp edges.
When software was hard, most things were #2. Now, most things sit in the middle: stuff that’s real enough to need a database, but not real enough to deserve an app stack.
Neither fits, and this isn’t about engineers vs.…
502: Apps That Make Our Work Go
Aji and Sally are back together again, this time to discuss the different apps they use to make their workflows and To Do lists easier and quicker to achieve.
Sally dives into the Notion calendar system which she uses to coordinate her many Google calendars, Aji looks back on using Jira to co-ordinate their international move, before they both reminisce about the benefits of using Alfred as people with ADHD.
—
There’s still time to secure your place at thoughtbot’s upcoming UK meet ups over the next month.
London Tech Leader Meetup - Tuesday June 23rd
Brighton Tech Leader Meetup - Wednesday June 24th
Brighton Ruby - Thursday June 25th
Evolve - Friday June 26th
Your hosts for…
Today we’re sharing the release candidate for Hanami 3.0, feature-complete and ready for testing. We’d love your help to give it a good workout before our final release—which, all going well, will be in just a couple of weeks!
What’s coming in 3.0
There’s a lot I’m excited for in 3.0, but I’ll save the full announcement for when it ships. For now, here’s where we’d love your help with testing.
Built-in i18n
Internationalization is now a built-in feature. Bundle the i18n gem and Hanami loads your translations and makes translation and localization helpers available across your views and actions. See Previewing i18n integration in Hanami 3.0 for details.
First-class mailers
We’ve…
Verify faster
We’ve been working to a pretty tight deadline as a team recently. We had a period of relative stability with a few concurrent projects on the go, and then we had this new elephant-sized project dropped on us. The entire team has rallied around it and everyone’s contributing exceedingly well to their own parts.
During the last few months of this project, I’ve been taking a look at how we can get to the point of verifying our changes faster after reading Accelerate for the second time. Trying to find answers for how we from “push” to knowing something works, and then shipping that with less time passing between all of those points.
A few things that our team has worked on to fix this has…
Building a quiz with Stimulus
Quizzes are a fun! Well… I do think they are. Always up to learn new things. So how can you create one in with your favorite frameworks? In this article, I want to show how you can build a quiz witg Stimulus. It can be a good starting point for learn about a new customer in your SaaS or as a smart, little marketing tool (keep readers engaged/on your page). 💡
The quiz loads questions from a Rails endpoint, tracks answers in real-time, calculates results and submits them to your server. As always, the code can be found on GitHub.

This will be the result. Time to dust off that good ol’ computer science knowledge… 🤓
Building the data class
Here’s the QuizData class that handles the quiz…
jj's whole deal
jj’s whole deal is that it collapses many Git concepts (stashes, staging, fixups, in-progress rebases, conflicts) into a single unified model of working with history, which then lets you use the same tools to do all of those things. For example, to fix up an old commit you jump to it, edit it, and jump back to where you were; to fix a rebase conflict you jump to the conflicting commit, edit it, and jump back to where you were, using the same commands.
– Understanding Jujutsu bookmarks
This is such a good summary, I’m probably going to steal it when I try to explain jj in the future.
Shopify Joins the Ruby Alliance
We’re excited to share that Shopify has joined the Ruby Alliance.
Shopify is a leader in the Ruby ecosystem, powering millions of businesses around the world and demonstrating what is possible when Ruby is trusted at global scale.
For years, Shopify has invested in Ruby through engineering leadership, open source contributions, performance improvements, and a deep commitment to the technologies that help power the community. Their work has benefited not only Shopify, but Ruby developers everywhere.
Their participation in the Ruby Alliance represents a meaningful investment in the long-term health, resilience, and sustainability of the Ruby ecosystem and the critical infrastructure it depends…
Build a Workflow-Priority Ticket Queue with Rails' in_order_of Array Grouping
rv plan and progress update
This post was originally given as a talk at Rubycon IT 2026. The slides and video are also available.
It’s been a while since I first talked about rv, a Ruby manager for the future. I’d like give an update on what we’ve done since then, but I’m going to recap some of that earlier post first to give context for the updates. If you still remember what I said back then, you can jump to the new stuff right away. Either way, I’m excited to update you about the work that we’ve been doing, and show exactly how far we’ve gotten.
bundler isn’t enough
For the last ten years or so of working on Bundler, I’ve had a wish rattling around: I want a bigger, better dependency manager. It doesn’t just…
I’ve always been interested in coding as a craft - a thing to do with your hands, your eyes and your mind. In many ways, I feel that a lot of the satisfaction and accomplishment I get from making software comes from the process itself, the doing of it, and not necessarily the end result. To quote one of my favorite musicians:
Most vagabonds I knowed don’t ever want to find the culprit
That remains the object of their long relentless quest,
The obsession’s in the chasing and not the apprehending,
The pursuit you see and never the arrest.
- Tom Waits, Foreign Affair
This is also one of the reasons why the recent AI “revolution” doesn’t really resonate with me. They say…
CVE-2026-47240 (net-imap): Net::IMAP: Command Injection via non-synchronizing literal in "raw" argument
CVE-2026-47241 (net-imap): Net::IMAP: Denial of Service via incomplete raw argument validation
Hi, it’s Greg, bringing you this week’s changes in the Rails codebase.
Fix increment! with explicit query constraints
This pull request fix increment! / decrement! on models with query
constraints to include every query constraint column in the counter update.
self.class.update_counters(id, attribute => change, touch: touch)
Support a single composite primary key id in delete
This change aligns the class level delete method with destroy and now they both accept a single ID of a composite primary key.
Return an empty array from find([]) on a composite primary key
With this fix, Model.find([]) returns [] for a model with a composite primary key, the same as it does with a single primary…
Introduce a new mechanism for applications to prepare for ractor safety
…
[The lost episode 259] All Right, Rant Time - Debugging
[This episode from February 2024 was never published and recently discovered]
In today’s episode, Andrew kicks things off with a rant about tackling developer experience tasks at Podia, wrestling with GitHub actions, and Heroku deployment woes. Then the conversation takes a turn to the importance of debugging, the power of bash scripting, and the challenges of naming in programming, with Chris mentioning DHH’s insights from a live stream. They discuss Chris’s travel plans for RubyConf in Australia, other conferences coming up, and reminisce about their childhood love for trains and Thomas the Tank Engine. The episode wraps up with Chris and Andrew sharing advice and tips on writing…
How to Leverage PurgeCSS in Your Rails App for Faster Stylesheets
It’s common for Rails applications to serve massive CSS files filled with unused Bootstrap, Tailwind, or custom utility classes as projects grow. This bloat isn’t just a developer annoyance—it has a real impact on your users. Every unused kilobyte adds milliseconds to page load time. In this post, we’ll explore what PurgeCSS is and how your Rails project can benefit from it.
What Is PurgeCSS and Why Should You Care?
PurgeCSS is a tool that analyzes your content and CSS, then removes unused CSS selectors, stripping away dead weight to leave you with lean, optimized stylesheets.
For example, if you’re using the full Bootstrap CSS framework (approximately 200KB) but only utilizing 30% of…
"How many yoga classes are booked today?"
Neeti answered straight away: 23.
It was confident. And it was wrong.
The real number was 62.
This gap is a good place to start, because it says a lot about what it takes toput an AI assistant on top of real production data. Everyone is worried about AImaking things up, and that's a real worry. In this case, 23 was a real count ofreal bookings in some sense. Neeti had simply counted the number of bookings ofthe first page.
Neeti is an AI assistant we built into NeetoCal.NeetoCal is the most affordable Calendly alternative. This blog is about howNeeti works, how we fixed the above-mentioned bug, and how we made it fast. Youdon't need to know anything…
JRuby 10.0.6.0 Released
The JRuby community is pleased to announce the release of JRuby 10.0.6.0.
- Homepage: https://www.jruby.org/
- Download: https://www.jruby.org/download
JRuby 10.0.6.x targets Ruby 3.4 compatibility.
Thank you to our contributors this release, you help keep JRuby moving forward! @chadlwilson, @kares, @sampokuokkanen
Notable Changes:
Standard Library
- erb has been updated to 4.0.4.1 to address CVE-2026-41316. (#9389)
- jruby-openssl has been updated to 0.16.0, fixing many long-standing issues with SSLSocket. (#6455, #8935, #9390)
Java Integration
- Performance and consistency improvements for passing a block or proc as the implementation of a Java interface. (#1401, #9401, #9424) …
23 Issues and PRs resolved for 10.0.6.0
Small PRs, big Ruby speedups
#804 — June 11, 2026
Ruby Weekly
📈 Small PRs, Big Speedups: The Ruby Performance Work You Almost Missed — A roundup of recent Ruby performance PRs covering strings, file handling, GC, concurrency, Prism, JITs, and more. It’s a neat snapshot of how much incremental performance work has landed in CRuby in the past year.
Maciej Mensfeld
Stop Juggling 5 Tools to Monitor One Rails App — Errors, performance, logs, uptime, host metrics — AppSignal covers your whole Rails stack. Auto-instruments Active Record, Sidekiq, Puma, and ActionView out of the box. Request-based pricing, unlimited seats. Free 30-day…
AppSignal sponsor
…Performance problems in Rails applications are sneaky. Generally speaking, nobody opens tickets that say “my application is slower than it was last month (about 20%)”. What you do get instead are vague complaints from team members about a p95 latency that is climbing every week or a background job that used to take 2 seconds now taking 40 seconds to finish.
Nine times out of ten, the problem is going to be a query that used to be fast, and now it’s not. When that query was first written, it had 500 records in the table. Now, it’s got 500K records, and it’s running a full table scan on every page load. Each new row means slightly more scan time and latency. This increase in time continues…
Let Your AI Assistant Explore the Event Store with res-mcp
When you’re debugging with an AI assistant, half the work is giving it enough context. You copy event payloads into the chat, paste stream contents, look up IDs, then repeat the process every time you need another piece of information.
ruby_event_store-mcp removes that step. It’s the companion to the res CLI. Instead of you querying the event store from the terminal, your AI assistant does it for you through MCP tools. You ask questions in plain English, it reads the events itself.
The difference from copying the events into the chat yourself is that the assistant can ask follow-up questions on its own. If it needs to inspect…
Building a quiz with Stimulus
Quizzes are a fun! Well… I do think they are. Always up to learn new things. So how can you create one in with your favorite frameworks? In this article, I want to show how you can build a quiz witg Stimulus. It can be a good starting point for learn about a new customer in your SaaS or as a smart, little marketing tool (keep readers engaged/on your page). 💡
The quiz loads questions from a Rails endpoint, tracks answers in real-time, calculates results and submits them to your server. As always, the code can be found on GitHub.

This will be the result. Time to dust off that good ol’ computer science knowledge… 🤓
Building the data class
Here’s the QuizData class that handles the quiz…
Recently, we had a crash in our NeetoCRMapplication.

As we can see in the screenshot, it looks like the error happened inneeto-widget-replay.js file.
At Neeto we have built an internal tool called NeetoReplaywhich captures users' activities in the browser. This helps us in debugging whenusers contact us for support or in investigating bugs. This is built on top ofrrweb. Just want to add that admins of theworkspace can completely opt out of NeetoReplay.
We had not changed anything in NeetoReplay for a while, so the error happeningin NeetoReplay was perplexing. Upon investigation, I found that the consoleindeed pointed to the neeto-widget-replay.js file. But I also knew that thefilename only…
Strengthening Security for the Ruby Ecosystem: A Team of Security Engineers in Residence

We’re excited to announce that Ruby Central has been awarded a grant from Alpha-Omega to help improve the security of the Ruby open source ecosystem. With this support, Ruby Central is funding a team of Security Engineers in Residence to find real vulnerabilities in the gems the community depends on most, verify them, and bring maintainers reports worth their time.
The same AI tooling that helps developers ship faster has made finding vulnerabilities cheap. An attacker can act on a raw signal the moment a tool surfaces it. A responsible reporter cannot. Someone has to confirm the vulnerability is real, work out what it means in practice, and decide it is worth a maintainer's time. That work…

As part of our recent bylaw modernization, the Ruby Central Board has been exploring new ways to increase participation across the Ruby ecosystem while maintaining the accountability required to effectively operate a nonprofit organization.
Our goal in 2026 is to create more opportunities for contributors, community members, sponsors, and ecosystem leaders to help shape Ruby Central's future while preserving the Board's responsibility for stewarding the organization. And to do this as quickly as possible.
Ruby Central governs its own suite of voluntary programs, infrastructure, education, and initiatives that support the Ruby ecosystem. It does not govern the Ruby language itself.
Guiding…
There's a moment at every RubyConf that we quietly look forward to: the smell of fresh coffee drifting through the venue as attendees start their mornings, and the sight of a room full of name badges swaying from lanyards as people connect, collaborate, and find their people. For years, that moment has been made possible by GitLab.
GitLab has been a steadfast supporter of the Ruby community as both our coffee sponsor and name badge lanyard sponsor, and we don't take that for granted. Sponsorships like these are easy to overlook; they don't come with a keynote slot or a giant booth, but they are woven into the fabric of the conference experience in ways that matter deeply.
Every cup of coffee…

