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_...
FastRuby.io
@fastruby.io
Productized services by @OmbuLabs.ai to remediate technical debt in #Ruby and #Rails applications. Open source contributors and maintainers.
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:
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.
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.
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
