
I found vinyl records from my late grandfather recently. It struck me how this media from the previous millennium played without issues. Vinyl represented a key shift in music distribution - it made printing and sharing sounds accessible, establishing a standard that persists. While audio sharing methods evolved, the original approaches remain functional. In our increasingly complex world, many people return to vinyl because it offers simplicity, stability, and longevity[1].
Amidst the constant changes of web technologies, it's easy to forget that old websites continue to work just fine, too. A plaintext website from the 1990s loads in modern browsers just as it did then.
Websites gained additional capabilities over time - CSS for styling, JavaScript for interactivity, and websockets for real-time updates. Yet their foundation remains based on pages, forms, and sessions.
Ruby on Rails emerged twenty years ago as a unified approach to building interactive, database-powered web applications. It became the foundation for numerous successful companies - Airbnb, Shopify, Github, Instacart, Gusto, Square, and others. Probably a trillion dollars worth of businesses run on Ruby on Rails today.
Effective tools simplify complex tasks through abstraction. Cars illustrate this - driving once required understanding fuel systems, timing, and clutch mechanics. Now most drivers don't know how many gears their car has.
Ruby on Rails packaged web development best practices into an approachable toolkit: login sessions, CSRF protection, database ORMs. This abstraction lets developers focus on building products rather than technical tedium. Today, most developers don't know the contents of their login cookie, even though it powers their application.
Rails succeeded by staying close to web fundamentals. It uses HTML primitives like pages, input fields, and forms. As a backend-focused framework, it concentrates on data validation, processing, and storage, making form creation straightforward.
JavaScript gained prominence after Rails' initial success. The last ten years of web development advancements basically gave websites the functionality of an iPhone app, while still being a website.
Next.js now serves as the most common tool for building a startup. Its frontend-focused framework enables dynamic loading states, server-side rendering, and complex component building. Another trillion dollars worth of companies is being built on Next.js, and these web apps are faster and more polished than what could have been built on Ruby on Rails.
Next.js and its underlying technology React, drive much of modern web innovation. Basically every mainstream consumer product you love runs on this stack - like Spotify, Netflix, Facebook, and Stripe. It allows developers to create quick, customized, and interactive products by pushing web standards to their limits.
Amid the rapid adoption of Next.js, Rails has continued to maintain relevance. New projects - from independent projects to AI companies - are still choosing it for new projects.
The truth is that the new wave of Javascript web frameworks like Next.js has made it harder, not easier, to build web apps. These tools give developers more capabilities - dynamic data rendering and real-time interactions. But, the cost of this additional functionality is less abstraction.
Next.js really competes with native iPhone apps. Previously, startups needed iPhone apps for refined user experiences, and building iPhone apps was a complex process that often requires multiple developers with different specialities. Next.js enabled websites to approach iPhone app quality. Many of today's most polished products, like Linear and ChatGPT launched as Next.js applications, and treated mobile apps as secondary priorities.
Rails evolved over the two decades since its launch, adding JavaScript interactivity, backend job management, loading states, and real-time application tools. It even supports mobile app development. As application patterns evolved, Rails incorporated them as framework features while maintaining its HTML-based foundation.
Most web applications continue to be forms on pages - job boards, vendor systems, and ecommerce stores. Next.js can build these, but requires additional development time compared to Rails. Using cutting-edge frameworks introduces instability through frequent updates, new libraries, and unexpected issues. Next.js applications often rely on a multitude multiple third-party services like Vercel, Resend, and Temporal that introduce platform risk.
Developers choose Rails today because, 20 years later, it remains the most simple and abstracted way to build a web application. Solo developers can create dynamic, real-time web applications independently (as I did with Booklet and Postcard). Enterprise teams use it to build applications with multiple models and access controls, supported by thorough testing. Rails helps small teams work faster while reducing development and maintenance costs.
I have experience with both frameworks. I built Find AI, a venture-funded AI startup, using Rails. As a search engine, it benefited from Rails' ability to handle complex backend operations with simple frontend needs. Today I'm working on Chroma Cloud, designed for exploring and managing large datasets, and Next.js powers its advanced interactions and data loading requirements. [2]
Rails has started to show its age amid with the current wave of AI-powered applications. It struggles with LLM text streaming, parallel processing in Ruby[3], and lacks strong typing for AI coding tools. Despite these constraints, it remains effective.
Vinyl changed music by broadening access. Sound quality improved over time, but earlier formats retain value. The Köln Concert maintains its popularity regardless of bit rate. In the technology world, we can enjoy the polish of Linear while appreciating that Craiglist's 90s-era website probably makes more money.
At the end of the day, users care about product utility more than implementation details. Polish fades, but utility persists.
Taylor Swift helps, too. ↩︎
A heuristic I use: Divide the number of tables in your database by the number of developers on your team, and if that number is greater than 3 - then use caution on building with Next.js. ↩︎
JavaScript beats Ruby at "pat head while rubbing belly" ↩︎