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.
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.