Submit a post
Post Preview
Note: Only the first pargraph is shown on the front page and overly long paragraphs may be broken up.
Today
When Two Background Jobs Target the Same Record
Two Rails jobs can save successfully and still lose an update. Trace Solid Queue’s concurrency keys and expiry, then compare atomic increments with optimistic locking using a small database reproduction. 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
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
Alchemy CMS 8.4
Bye, bye jQuery 👋 Alchemy CMS v8.4.0 has been released. See what else has been changed (spoilers: a lot) in the release notes at
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
Solid Queue or Sidekiq? Choosing a background job backend for Rails 8 in 2026
A comparison of Solid Queue 1.7 and Sidekiq 8.1 for Rails 8 apps: Rails version support (Solid Queue needs 7.1+), DB vs Redis tradeoffs, fiber mode, batches, feature parity, operational cost, and how to migrate between them. Read more
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
RubyLLM 2.0 and 2.1 are out and the gem is much better than before
I wrote a thing or two how RubyLLM 2.x is improving agents.
Why a Background Job Can Run More Than Once
A deploy can replay unfinished Solid Queue jobs without retry_on, even after a webhook succeeds. Trace fork-mode shutdown, the effect that survives, and receiver-side duplicate protection, with source links and a separate process-death reproduction. 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
RedGem 0.3 (3D engine with ruby) is out!
This update brings bigger worlds, better visuals, and online multiplayer. 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.
Asgard 0.5.0 adds dynamic task execution on file/directory changes
Asgard 0.5.0 adds a file watcher to the Ruby task runner. In a project’s .loki, watch :test, paths: %w[lib test], only: /\.rb\z/ declares which files a task cares about, and asgard watcher start runs one background process per project that reruns the task when they change. Read more
New release Truemail 🚀 configurable framework agnostic plain Ruby 📨 email validator
Meet new Truemail 4.0.0. This major release hardens MX validation against IDNA-mapped confusable/fullwidth domains. Spoofed Unicode domains are no longer treated as valid ASCII lookalikes.
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.