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
ziperu: a drop in rubyzip replacement with a Rust core
I just released ziperu, a drop in replacement for rubyzip backed by Rust. Swap the Gemfile line, keep require "zip", and existing code runs unchanged, 2x to 6x faster in my benchmarks against rubyzip 3.7. Read more
Drag and drop reordering in Rails: acts_as_list, Stimulus, and the parts that break
Drag and drop sorting in Rails takes an hour with acts_as_list, SortableJS and Stimulus. Here is that hour, plus the seven things that break once people use it, and how we handle each one in the Avo app that orders our own pricing page. Read the full article on:
oops 0.6.0: stop dumping 300 lines into Slack, just send a gist
A command just failed and you want a teammate to look at it, but pasting 300 lines of output into chat is not kind. With oops 0.6.0, oops --gist uploads the last command and its output as a secret gist through the GitHub CLI and copies the link, with tokens and emails masked. oops never touches your GitHub token; gh does. Read more
SVG sky map with Ruby and Astronoby
Ever wondered how the sky looked like when you were born? Don’t just watch it, build it, easily! Read more
AI Lite 1.3.0: Dependency-free Ruby client for OpenAI, Gemini, and Claude
AI Lite is a lightweight, pure Ruby client for OpenAI, Gemini, and Claude, built entirely on the Ruby standard library with no runtime gem dependencies. Read more
translation_diff: re-translate only the sentences that changed
Edit one word in a 3,000-character product description and most translation APIs bill you for all 3,000 characters again. translation_diff splits the text into sentences, caches each one by content hash, and sends the provider only the sentences it hasn’t seen. Repeated blocks like a return policy get translated once across your whole catalog. Read more
lexxy-variables 1.0: variables for Lexxy rich text
lexxy-variables 1.0 is out. It adds variables to Lexxy, the new rich text editor for Rails. Authors type {{ or use a toolbar menu to insert a variable, which is saved as an Action Text attachment, not as template markup. When you render, you pass a hash and with_variables swaps each one for its value: Read more
speedrunner: rubocop and other Ruby CLIs, forked from a warm daemon
rubocop sample.rb spends most of a call loading code: 686 ms natively, 164 ms once that loading is done in advance (x4.2, one small file, warm daemon). I wrote speedrunner to do that: it keeps the tool loaded in a daemon and forks it per call, with no per-tool setup and the same output as a native run. The cops’ own work is not sped up, and the first call in a fresh environment gains nothing. Linux and macOS. Code and runs:
oops 0.5.0: let Claude Code read the command that just failed
Your test run just failed, and you’re about to ask Claude Code about it. That usually means pasting the output, or watching it run the whole slow suite again. With oops 0.5.0 it just reads it: oops records your terminal tab, and its new Claude Code plugin hands the last failed command and its output to Claude, with secrets masked. Read more
AI in Software Development: Great Advantage or Gaslighting?
AI in Software Development: Great Advantage or Gaslighting?
When Rails Conventions Are Not Enough
Why business logic in a growing Rails application bounces between fat controllers and fat models, and how service objects and layered architecture give it a home. Read more
[Screencast] Idempotency
In this episode, we look at several different examples of background jobs and how we can refactor them to handle situations where they get called twice from either a user action or a retry. We’ll look at scenarios where we can prevent duplicate actions.
oops 0.4.0: now it can print, not just copy
You know the drill: a command blows up, you want to show it to someone, and suddenly you’re drag-selecting terminal output and typing code fences by hand. oops skips all that. Type oops and the last command plus its output lands on your clipboard as a Markdown block, with secrets masked. Read more
llm.rb v18.0.0 released!
llm.rb is a runtime that supports agentic development. This release requires Ruby v4 (with v4.1.0+ recommended, even as a preview1). The standout feature (from this release) is being able to run tool calls on Ractor. Works especially well with MCP tool calls. It worked before but was very rough around the edges. This release makes them first-class. The CHANGELOG includes everything. :)
The Agents on Rails Files: enter lemans, a Ruby harness for fair agent races
Meet lemans, the open source Ruby harness we built for the Agents on Rails benchmark. You’ll see how an eval task is composed, how we run and grade coding agents, and how cheaters shaped its guardrails (one even paid for its cheat sheet with our API key). Read more
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. Read more
IP-Based Route Restrictions on Heroku with Rails
Here’s how to restrict Rails routes to VPN-only IPs on Heroku, where the managed router doesn’t support IP filtering
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
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