RubyFlow The Ruby and Rails community linklog

×

The Ruby and Rails community linklog

Made a library? Written a blog post? Found a useful tutorial? Share it with the Ruby community here or just enjoy what everyone else has found!

Submit a post

You can use basic HTML markup (e.g. <a>) or Markdown.
Note that your post may be edited to suit the format of the site.

As you are not logged in, you will be
directed via GitHub to signup or sign in

Post Preview

Note: Only the first pargraph is shown on the front page and overly long paragraphs may be broken up.

Today

Raindeer: An event-driven and compositional web framework that’s easy to use

Raindeer is a collection of gems that work together as a framework or can be used standalone. LowType adds inline type checking only where you want it (def method(var: String)). LowLoop is an async, event-driven server that sends events from the request right through to the data layer, so you can track every step of a request. The router turns each request into a route event for the nodes observing it, so observe '/users/:id' is all you need to respond. LowNodes are the building blocks: they render HTML straight from the Ruby class with RBX (similar to JSX) and render other nodes with <html><{ ChildNode }></html>. LowData follows the repository pattern with a twist: Data Expressions that use simple arithmetic operators to combine tables, so Posts[:title] + Users[:username] gives a list of posts with each post’s user, and plain Sequel queries still work too. Read more

Solid Trio or the classic stack? vs Sidekiq, Redis and AnyCable in 2026

This post compares each Rails 8 Solid gem with the library it replaces, using current versions: Solid Queue 1.7 (batches, fiber workers, dynamic recurring tasks) vs Sidekiq 8.1, Solid Cache vs Redis, and Solid Cable vs Redis and AnyCable, with the project’s own benchmarks. It covers the production gotchas (retries, killed workers, queue naming, MySQL isolation), a per-component decision table, and an incremental migration path off Sidekiq.

readword: word .doc and .docx files to markdown, in plain ruby

i kept needing to feed word files to llms and coding agents, and reading old .doc files from ruby always meant shelling out to libreoffice or antiword. so i wrote readword, its plain ruby, reads both .doc and .docx and gives you markdown with the headings, numbered lists, tables and links kept. compared it with antiword, the docx gem and anydoc on 650 files, numbers are in the readme. if you have a word file it gets wrong id love to see it

Playwright API Testing Guide

Playwright isn’t only for browser tests. With the community playwright-ruby-client gem, Ruby developers can send requests straight to a Rails API, check responses and reuse login sessions across tests, no browser needed. This post covers getting started, handling auth, and keeping backend dependencies stable so your API tests stay fast and reliable.

Best Automation Testing Tools for API Testing in 2026: 12 Tools Compared by Use Case

Picking an API testing tool for a Rails app usually means choosing between a lot of options that each solve a different part of the problem. This comparison of the best automation testing tools looks at 12 of them by use case: CI/CD automation, manual exploration, performance, security and SOAP. It covers Keploy, Karate, Postman/Newman, Bruno, Insomnia, k6, JMeter, OWASP ZAP and SoapUI, and includes a comparison table and a short guide for choosing a tool. Since these tools work over HTTP and don’t depend on the language, they apply to Rails and Sinatra APIs as well.

The Agents on Rails Files: designing black-box evals for coding agents

Agents on Rails is the Rails Foundation’s LLM benchmark. Evil Martians designed its evaluation tasks and the tooling to run trials at scale. On our blog, we’re going behind the scenes. First up: how we wrote black-box checks for apps whose code we’d never seen, to keep trials fair and results reliable. Bonus: the same evals run against Rust. Read more

Seven layers of cache in a Rails app, from the browser to Russian doll

This post walks through the seven places a request can be answered before it reaches Postgres: browser cache (expires_in, fresh_when), Varnish, Nginx proxy cache, action caching, Russian doll fragments in ERB and jbuilder, Rails.cache on Memcached or Solid Cache, and an object cache on Redis. Each layer comes with its config, what it actually saves, and how it breaks (cookies vs Varnish, CSRF in cached actions, sharing Redis with Sidekiq). Ends with a suggested build order: headers first, edge last. Read more

API Versioning in Rails: Start at /api/v1 Before You Think You Need It

Most Rails APIs start as a format.json branch in an HTML controller and only become an API once a partner depends on them. This post lays out the structure to put in place before that: URL path versioning starting at /api/v1, an Api::BaseController < ActionController::API that owns auth, error envelopes and transaction tagging, and one thin base per version. Read more

parallel_matrix_formatter: one readable display for parallel RSpec runs

Running specs with parallel_tests or parallel_split_test gives you interleaved output from every process and a separate failure report per process. parallel_matrix_formatter is an RSpec formatter that sends results from all processes over a UNIX socket to process 1, which renders a single progress display and one consolidated failure report with rerun commands. It also silences stray stdout, keeps each process’s stderr in a log, and the progress display looks like Matrix digital rain. Version 0.2.0 is out: gem install parallel_matrix_formatter. Feedback from real suites is very welcome.

Foreman or Docker Compose? The ideal local Rails setup in 2026

Native Procfile.dev or everything in docker-compose? This post argues for a hybrid: run web, css, js and workers natively via bin/dev, and keep only Postgres and Redis in a minimal compose file pinned to production versions. It covers why bind mounts slow Rails down on macOS, the Postgres 18 volume path change, OrbStack vs Docker Desktop memory usage, when a devcontainer still wins, and dropping Redis in dev with Solid Queue.

A new version of bidi2pdf is out

The highlight of this release is built-in support for Claude Code skills. The repository now includes a Claude Code plugin with skills that help AI agents generate PDFs, troubleshoot rendering issues, and work with Chrome through WebDriver BiDi. Read more

ruby_llm-providers-lms v0.3.0 with decisions API released

ruby_llm-providers-lms 0.3.0 brings RubyLLM 2.1’s judgments to LM Studio. Point RubyLLM.judge or a RubyLLM::Judge class at a local decision model and get typed answers back in tens of milliseconds: a probability that something is true, a choice from a fixed set with a confidence, or a score on an ordered scale, with no text to parse and nothing generated. Read more

llm.rb v17.0.0 released!

llm.rb is an agentic runtime for building AI applications on CRuby. It supports 14 different providers, it has zero runtime dependencies by default, and it can execute tool calls on their own process, thread, Async::Reactor, or Ractor. It can reliably interrupt an agent running in the same process but a different thread or fiber, too. Plus much more. Check it out if that sounds like your thing :)

Upgrading a Rails app from Ruby 3.4.4 to 4.0.3: what actually breaks

Ruby 4.0 is the first major bump in over a decade, but a Rails 8.x app usually upgrades in a day of focused work. Most of the pain is not in the language: it is gems that left the default set (cgi, ostruct, logger, benchmark), the Ractor::Port rewrite, Kernel#open("| cmd") no longer spawning a process, and a handful of changes that break tests rather than code (Set#inspect output, Net::HTTP no longer defaulting Content-Type on bodies, new backtrace frames that confuse Sentry/Datadog grouping rules). Read more

Loading older posts