Ruby2JS now supports Ruby 3.3's Prism parser while maintaining backwards compatibility. This enables a vision where model annotations become the single source of truth for serialization contracts, with shared business logic automatically transpiled to JavaScript. The result: eliminate duplicate code between server and client without runtime overhead.
After three iterations seeking simpler offline scoring, a clean architecture emerged: server computes derived values, client-side hydration joins normalized data, and JavaScript templates filter for display. ERB templates convert automatically to JavaScript using Prism, eliminating dual maintenance. The result is offline-first scoring with 52% less code than the original Web Components approach.
After two ambitious rewrites seeking simpler offline scoring—first Web Components (4,025 lines), then Turbo MVC (2,604 lines)—the real problem finally crystallized: template duplication. Automatic ERB-to-JavaScript conversion eliminates parallel implementations entirely. The result? 66% less code than Web Components, guaranteed parity, and powerful debugging tools. With Claude Code compressing exploration from weeks to days, ambitious rewrites become practical.
Web Components delivered offline-first scoring, but at 4,461 lines of code. Could Turbo navigation interception and template strings achieve the same offline resilience with dramatically less complexity? A spike reveals surprising results—and Claude Code proved essential in exploring the solution space.
Event WiFi fails at the worst times. Songs start playing but stop after a few seconds. DJs scramble to restart. The audience waits. This post documents how IndexedDB-based progressive audio caching and Tigris CORS configuration solved the problem.
Distributed applications need centralized logs. When your Rails app runs across Fly.io, Hetzner, and a Mac Mini at home, how do you view logs in one place? Navigator's Vector integration, NATS message broker, and a simple Bun viewer provide unified logging without operational complexity.
Network outages during live dance competitions turn scoring systems into paperweights. Web Components plus IndexedDB enable graceful offline operation while maintaining Rails as the source of truth. Here's a pattern for building resilient SPAs that work when the network doesn't.
The components of discipline are simple: plan, document, and test. The end result is that I can produce code of a higher quality and quicker with Claude than I could build by myself.
Most tutorials teach Postgres + Redis + horizontal scaling as the default architecture for SaaS applications. But what if your tenants naturally partition? By embracing shared-nothing architecture with SQLite, TurboCable, and Navigator, we're running 350+ real-time applications across 8 countries on 4 continents for ~$100/month. Here's how aligned constraints create radical simplification.
TurboCable brings real-time Turbo Streams to Rails with 89% less memory than Action Cable and zero external dependencies. No Redis, no Solid Cable, no message queue—just in-process WebSockets via Rack hijack. Perfect for single-server deployments and multi-tenant applications where each tenant runs in isolation.
Sometimes the old ways are the best ways. By adding CGI support to Navigator, we're solving a critical deployment problem: eliminating downtime and delays when making simple configuration changes. Here's how a 1993 technology is helping us build a more responsive system in 2025.
When a user on macOS 10.12 couldn't access the showcase application due to browser compatibility issues, we discovered that our minimum browser requirements were too aggressive. Here's how we added conditional polyfill support to make the app work on older browsers without sacrificing performance for modern ones.
Following expert feedback, I ran a more statistically rigorous test of frozen string literals with thousands of requests. The results were surprising.
An experiment to reduce memory usage by enabling frozen string literals resulted in unexpected findings when tested in production.
Memory usage patterns in a multi-tenant Rails application with SQLite databases, where users are pinned to specific machines with hard memory limits.
This post walks through adding a new feature to an existing application using Claude Code.
ActiveRecord::Tenanted is a promising multi-tenancy solution for Rails, but its eager synchronous migration approach won't scale to geographically distributed deployments with Kamal Geo Proxy.
This post advocates for adding geo-aware lazy migrations to ActiveRecord::Tenanted, based on patterns battle-tested in Showcase across 70+ sites in 8 countries over 3+ years.
Five years ago, I migrated this blog to Eleventy v0.12.1. This week, Claude Code upgraded it to v3.1.2, handled configuration changes, made the site environment-aware, and completed the search functionality I'd started but never finished. Eleventy still embodies the "it's just data" philosophy that attracted me in the first place.
Three years ago, I unretired to join Fly.io as a Rails Specialist. As of last month, I've re-retired. What's changed for me? Not much.
If you don't get your hands slapped at least twice a year, you aren't pushing the boundaries hard enough.