intertwingly

It’s just data

From ERB to JavaScript - Server Computes, Hydration Joins, Templates Filter

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.

Automatic ERB-to-JavaScript Conversion for Offline SPAs

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.

Simpler Offline Scoring with Turbo MVC

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.

Offline DJ Playlists with IndexedDB and Tigris CORS

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.

Unified Logging for Multi-Region Rails with Navigator, Vector, and NATS

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.

Offline-First Scoring with Web Components and Rails

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.

Disciplined use of Claude

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.

Shared-Nothing Multi-Tenancy with SQLite, TurboCable, and Navigator

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 - Real-Time Rails Without External Dependencies

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.

Bringing CGI Back from the Dead

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.

Supporting Older Browsers with Import Maps

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.

Frozen String Literals Redux - A More Rigorous Test

Following expert feedback, I ran a more statistically rigorous test of frozen string literals with thousands of requests. The results were surprising.

Testing Frozen String Literals in Production

An experiment to reduce memory usage by enabling frozen string literals resulted in unexpected findings when tested in production.

Capacity Planning for Multi-Tenant SQLite Applications

Memory usage patterns in a multi-tenant Rails application with SQLite databases, where users are pinned to specific machines with hard memory limits.

Adding a feature using Claude

This post walks through adding a new feature to an existing application using Claude Code.

ActiveRecord::Tenanted Needs Geo-Aware Lazy Migrations

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.

Upgrading Eleventy After 5 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.

Re-Retired

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.

Snoopy

If you don't get your hands slapped at least twice a year, you aren't pushing the boundaries hard enough.

Unretiring

Fly

I went looking for a place to host my ballroom showcase application. I ended up with a job. I start on Monday at Fly.io. as a Rails Specialist