Running Roda on an old Ruby? Roda 3.x supports Ruby 2.4.1 through 3.3, while Roda 2.10+ tops out at 2.4.1. Every range in one table. go.fastruby.io/erc #Ruby #Roda
FastRuby.io
FastRuby.io
@fastruby.io
Productized services by @OmbuLabs.ai to remediate technical debt in #Ruby and #Rails applications. Open source contributors and maintainers.
29 followers8 following220 posts
Our Rails upgrade roadmap: 40 to 90 concrete tasks, each with best and worst case estimates. www.fastruby.io/roadmap?utm_... #RailsUpgrade
errors.messages used to be a hash you could poke at directly. Rails 6.1 turned errors into queryable objects (errors.where, of_kind?) and Rails 7.0 dropped the old deprecated methods. go.fastruby.io/6by #RailsUpgrade
Running Roda on an old Ruby? Roda 3.x supports Ruby 2.4.1 through 3.3, while Roda 2.10+ tops out at 2.4.1. Every range in one table. go.fastruby.io/erc #Ruby #Roda
Our Rails upgrade roadmap: 40 to 90 concrete tasks, each with best and worst case estimates. www.fastruby.io/roadmap?utm_... #RailsUpgrade
HEY's Rust backend reportedly uses 99% less CPU than its Rails version. Most Rails apps still fit on a Raspberry Pi. Why I'm optimistic about Rails anyway: go.fastruby.io/x3v #RubyOnRails
ImageMagick alone accounts for 161 of 378 CVEs across libvips and its dependencies. Hot Cell stops patching and sandboxes Active Storage processing instead: go.fastruby.io/igg #RubyOnRails #AppSec
That @thing ||= compute memoization in your Rails class? Under the GVL it worked. In a non-main Ractor it raises. Notes from Aaron Patterson's keynote: go.fastruby.io/vy7 #Ruby #Ractors
bundle config set cooldown 7 makes Bundler skip any gem version under a week old. Cheap supply chain insurance. Notes from Jenny Shen's talk: go.fastruby.io/177 #Ruby #RubyGems
ReActionView's pitch: your existing HTML+ERB views become reactive, and the same controller action answers both requests. No websocket, no duplicate markup. go.fastruby.io/s9z #RubyOnRails
Action Text is no longer tied to Trix. Lexxy brings tables, native markdown, and code blocks in 20+ languages, built on Meta's Lexical: go.fastruby.io/j8q #RubyOnRails #ActionText
Broken markup can now fail while the template compiles instead of in your user's browser. The herb gem can replace erb_lint and better-html too: go.fastruby.io/d5h #RubyOnRails #Herb
Updated: Rails 7.2 is now end of life, and Rails 6.1 boots on Ruby 3.4 if you set RUBYOPT="-r logger". Full Ruby and Rails compatibility table: go.fastruby.io/jvq #RubyOnRails #RailsUpgrade
Trying the new HTTP QUERY method in Rails 8.2? Puma 8.0.2 rejects it by default. Add it to supported_http_methods or upgrade to 8.0.3: go.fastruby.io/45e #RubyOnRails #Puma
Rails API recall across AI models ranged from 8% to 41%. Asked to normalize emails, models wrote before_validation callbacks instead of using normalizes. Measure it on your app: go.fastruby.io/y1n #RubyOnRails #AI
When a Rails generator or Rake task already does the job reliably, the model shouldn't recreate it. Your tools just got a new kind of caller: go.fastruby.io/aqj #RubyOnRails #AI
A volunteer-run chess federation with no engineering budget, five minor Rails versions, and one hidden shim a model wouldn't have flagged on its own: go.fastruby.io/rn8 #RubyOnRails #RailsUpgrade #TechDebt
Before you benchmark ZJIT: building Ruby with it needs Rust 1.85.0 or newer, so your CI image needs a Rust toolchain first. go.fastruby.io/8mn #Ruby
Every gem audit you run leans on the Ruby Advisory Database, maintained by volunteers. www.fastruby.io/security-ris...
We have done ~40 Rails 3.2 to 4.2 upgrades and only ~10 from 6.1 to 7.1. The difference is not difficulty, it is whether the team ever agreed to stay one minor version behind. go.fastruby.io/idh #RailsUpgrade
FastRuby.io reposted
A full rewrite bets everything on one release after months of work, with no validation until launch. Strangler fig migrates one capability at a time, and the debt only drops once the old path is deleted. go.fastruby.io/1j3 #TechnicalDebt #LegacyCode
bundler-audit does patch level verification, not just "is this gem old." Different question, different answer. www.fastruby.io/security-ris...
Power HRG went from 60 servers at 2 processes each to 20 servers at 6 to 8. Wait time fell from 20 to 50ms to almost zero, and the server bill went down with it. go.fastruby.io/407 #RailsPerformance
Mixed string and symbol keys in a delegated hash is how Ruby 3 hands you an ArgumentError with no obvious cause. ActiveJob keeps the distinction, Sidekiq flattens it through JSON. go.fastruby.io/wl4 #Ruby
Herb just got merged into Rails. Running it against our own views turned up problems in 21 templates and 1,404 lint offenses, over half of them autofixable. go.fastruby.io/yfs #Rails #TechnicalDebt
The AI is not replacing Rails conventions, it is orchestrating them. Generators, Rake tasks and a well designed CLI are the interface a coding agent actually needs. go.fastruby.io/8ya #Rails
Rails upgrade roadmaps we've scoped have landed from $20k to $200k+, each backed by a real audit, not a guess. www.fastruby.io/roadmap?utm_...
Three attempts at a Rails task with GPT-5.4, ten to fourteen steps each: $0.42 total. The open-sourced lemans harness lets you run that math on your own app instead of trusting a generic leaderboard. go.fastruby.io/s61 #RailsUpgrade #AIAgents
We updated our Ruby 4.0 piece: there's now a tracking issue for Ruby Box support in RubyGems and Bundler. Also worth knowing, 8 Ractors used about 7x less memory than 8 forked workers in one benchmark. go.fastruby.io/5y0 #Ruby4 #Ractors
Rails 6.1 can raise an exception when a fixed deprecation creeps back in, but the config signature changed: 2 args pre-5.2, 4 args after. go.fastruby.io/2nt #RubyOnRails #TechnicalDebt
An upgrade isn't finished when the tests pass. Drop the dual boot conditionals, swap in Gemfile.next.lock, and actually read the new_framework_defaults file before adopting it wholesale. go.fastruby.io/hps #RailsUpgrade
Rails 7.1 added connection_pool as a dependency, which breaks Sidekiq-Ent before 8.1.0 unless you pin the gem below 3.0. The full compatibility grid: go.fastruby.io/yoc #Sidekiq #Rails
Log output is an attack surface too. CVE-2025-55193 lets ANSI escape sequences ride into your logs and rewrite what you see in the terminal. go.fastruby.io/tth #RailsSecurity
Ruby Box lets a gem reopen String inside a box without that method existing outside it. Monkey patches that stay where you put them. go.fastruby.io/zfr
Arrange, Act, Assert reads the same in RSpec, Minitest or Capybara. Three phases of structure is what makes a test obvious to the next person who opens it. go.fastruby.io/rm2
Budget about 3 minutes of downtime per GB when you copy a deprecated Heroku Postgres into a new database, and keep the old one a few days as your cheapest rollback. go.fastruby.io/1a0 #Rails
One controller went from 39% to 60% covered once the Cypress runs counted. Nobody wrote a new test: the Rails server just runs outside SimpleCov's test lifecycle. go.fastruby.io/tpo #Rails #Testing
post.comments.update(id, ...) used to happily write to a comment on a different post. Rails 8.2 raises RecordNotFound instead. The Rails team calls the old behavior an oversight. go.fastruby.io/qis #RubyOnRails
ZJIT compiles whole methods through an SSA-based IR instead of YJIT's basic blocks. It is faster than the interpreter and not yet as fast as YJIT, which is the honest part of the pitch. go.fastruby.io/bbd #Ruby
Dual-booting a gem is one BUNDLE_GEMFILE swap. Dual-booting Ruby means the version lives in your Gemfile, your CI matrix, and your version manager, so a next? helper in the Gemfile is where it starts. go.fastruby.io/oqn #Ruby
No gem to install, no code to touch. A Gemfile.lock is enough to list your Rails app known CVEs. www.fastruby.io/security-ris...
Three of the seven CVEs here do not live in Rails at all. Two sit in net-imap, one in REXML. A Rails bump leaves every one of them open. go.fastruby.io/g3a #RailsSecurity
Your coverage number is not just low, it is wrong about which code is untested. Everything Cypress exercises is invisible to SimpleCov, so you end up writing tests for lines already covered. go.fastruby.io/g76 #Ruby #Testing
Rails 7.0 to 8.1 in 8 pull requests, dual booting through every version in between, and the client's verdict was that nothing ever broke. go.fastruby.io/3pc #RailsUpgrade
Pick your upgrade target by its open advisories, not just the version you're leaving. Rails 3.0 to 7.2 indexed. www.fastruby.io/security-ris...
Running the new code next to the old one is not the win. #TechDebt only drops when you delete the legacy path. Shadow-log both, compare, then flip the flag. go.fastruby.io/sow #LegacyCode #StranglerFig #DesignPatterns
#SimpleCov 1.0 filters test directories by default when you call start with no arguments, so your coverage number can drop without a single line changing. Recalibrate the baseline before you panic. go.fastruby.io/xfr #Ruby
Parallelizing your RSpec test suite could produce massive performance gains. For example: Nearly 2 hours down to under 5 minutes! Here is the part teams skip: isolating Redis and cache per worker, not just the database. go.fastruby.io/vo1 #RSpec #Ruby #Performance
Skipping versions feels faster until a user hits a bug and nobody can say which jump introduced it. go.fastruby.io/6sc #RailsUpgrade #RubyOnRails