RubyFlow The Ruby and Rails community linklog

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

oops 0.3.0: copy the last shell command and its output as a Markdown block

oops is a small Ruby CLI with no runtime gem dependencies. It records your shell in the background, and oops copies the last command and its output to the clipboard as a paste-ready Markdown code block, with API keys and other secrets masked. It is handy for bug reports, pull request comments and asking for help. Version 0.3.0 adds fish support, oops clear, and deletes old logs of closed tabs after 7 days. Install with gem install oops-cli or Homebrew. (I am the author.)

The Open-Core task runtime that unlocks Ractors, unifies your backends, and delivers

The Open-Core task runtime that unlocks Ractors, unifies your backends, and delivers a 3× performance leap. Background job scheduling in Ruby has historically forced a brutal hardware compromise: suffer from Global VM Lock (GVL) limitations in multi-threaded modes, or deploy heavy, RAM-hungry isolated instances to parallelize workloads (Sidekiq) [1.7, 1.10]. The hardware physics & performance answer under native Linux (Debian Bookworm) & Ruby 4.0.7: Production telemetry benchmarks executed across a full 288-case matrix prove the raw power of SolidEngine’s Shared-Nothing model paired with isolated Ruby 4 Ractors [1.7, 1.10]: ⚡ Mixed Workload Crushing: On mixed workloads combining dense CPU processing and network wait, the SolidJobs + SolidEngine stack scales linearly up to 1,763 jobs/s at concurrency 8, delivering a massive 3.1× throughput gain over Sidekiq bottlenecked at 572 jobs/s by the GVL [1.7]. ⚡ Multiprocess Parity at −72.8% RAM: On pure CPU workloads, the Ractor-native layout matches the throughput of multiple isolated Sidekiq processes (2,021 jobs/s), while collapsing overall physical memory from 250 MiB down to only 68 MiB [1.7, 1.17]. ⚡ Zero-Overhead Density: Powered by a geometric sub-table partitioning layout (split-64) and a dedicated thread handling asynchronous memory trimming, the server’s idle RSS drops straight down to 5.6 MiB at rest via malloc_trim(0) [1.6, 1.7]. The core paradigm shift: Total backend flexibility out of the box With SolidJobs, your business task API remains strictly unchanged, but you select and swap your storage engines dynamically [1.10]: 🔹 The :solid_redis adapter: Powered by the highly optimized solid-redis gem, routing jobs to your Redis, Sentinel, or Cluster layout with isolated state, pools, and sockets per Ractor [1.7, 1.10]. It maintains a 5.5× speedup over single-process Sidekiq threads on CPU work [1.7]. 🔹 The :solid_engine adapter: Bypassing Redis completely to stream tasks directly over TCP/Unix sockets to our dedicated Rust server (SolidEngine), unlocking binary fencing, atomic leases, and native deduplication [1.10]. This architectural freedom includes per-channel routing, allowing both engines to run side by side for granular migrations. Routing all channels to SolidEngine makes Redis entirely optional, completely removing it from the production environment [1.10]. Version 0.6.0 is live and will be featured tomorrow night at Paris.rb [1.10]. Check the official repository for documentation, CSV matrices, and multi-language protocol examples [1.10]. Read more

White Box Testing: Techniques, Examples & Best Practices

Explore white box testing, its core principles, techniques, and practical applications in software development. Learn how developers use knowledge of internal code structure to validate logic, identify hidden defects, improve code coverage, and strengthen application reliability. Discover key approaches such as statement coverage, branch coverage, path testing, and condition testing, along with best practices and tools for building more robust software. Read more

Puma, Falcon or Pitchfork? Choosing a Rails App Server in 2026

A practical comparison of Puma 8.0, Pitchfork 0.18 and Falcon 0.57 for Rails on Ruby 4.0: concurrency models (threads vs forked processes vs fibers), what changed in each server this year, production configs for all three, a comparison table, how to measure GVL wait before switching, and a decision guide by workload. Also available in pt-BR. Read more

rbcop: RuboCop rewritten in Rust, about 14x faster in CI

rbcop is a drop-in replacement for RuboCop 1.92.2, written in Rust on Prism. It reads the same .rubocop.yml, takes the same command line and produces the same output, checked against RuboCop itself on nine large codebases: about two million offenses, zero differences, autocorrect included. In CI with a cold cache it runs about 14x faster than rubocop --parallel. Read more

A new database for Rails

Over the past eight months, I’ve been building BicDB, a Rust-based database with PostgreSQL-compatible interfaces, full-text search, vectors, queues, and more. I relied heavily on AI coding agents (Claude and OpenAI), alongside roughly 1,200 hours of my own time. Read more

It seems good judging by the documentation, but as a system engineer, i would l…

ruby2html 2.1.0 — write views in pure Ruby, render HTML faster than ERB and Phlex

ruby2html lets you write views as a plain Ruby block DSL — div(class: ‘card’) { h1 @title } — and renders clean, escaped HTML with a C extension doing the hot work (SIMD escaping, tag rendering, attribute serialization). No runtime dependencies. Works standalone, as Rails .html.rb templates, inside ERB, in ViewComponent, or as lightweight Ruby2html::Component classes. Read more

Asgard v0.6.0 adds Background Job Management

Asgard v0.6.0 is a task runner for any kind of project, with tasks written in Ruby. This release adds background jobs: sh "mkdocs serve", background: true starts a process that keeps running after asgard exits and logs its output, and asgard jobs list|stop|log|restart|clean manages those processes. A shells registry (shell, default_shell) picks the interpreter every sh runs under. 0.6.0 requires Ruby 4.0+ and has breaking changes: if you use schedules or the watcher, remove and stop them with the old version still installed, then upgrade, then reinstall and restart them.

beyond Ruby on Rails

Hey, I’m a Ruby on Rails developer who has been working with Rails since v1.2.3. I did many open-source projects (I think the total stars count >7K of all my projects), but now with AI era, it’s time to look at more things. Read more

API Regression Testing

Learn how API regression testing helps detect breaking changes, maintain backward compatibility, and ensure consistent API performance across releases. Explore practical testing approaches, real-world examples, essential checklists, CI/CD integration strategies, and tools like Keploy, Postman, Pact, and Schemathesis to build reliable automated API regression testing workflows and prevent production failures. Read more

Your Rails audit log has 4 blind spots. Auditors know all of them.

paper_trail, audited and logidze answer “what changed, and who changed it?” well. HIPAA and SOC 2 reviews also ask who viewed or exported sensitive data, whether the log itself can be trusted, how long it’s kept, and whether you can produce evidence. This article walks through each gap with plain Rails and PostgreSQL code (read logging, a hash chain, an append-only table, a retention job) and compares the existing gems. It also introduces sealed_trail, a new MIT-licensed audit gem, though everything in the article works without it.

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

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

Loading older posts