Jay's Tech Bites Logo

I Shipped More With Rails in 3 Weeks Than With Node.js in 3 Months

After years of chasing JavaScript frameworks, I've learned that boring, mature technology ships products while trendy stacks ship complexity.

An opinionated take on why Rails beats modern JavaScript stacks for shipping products fast. Learn what breaks with microservices, why convention beats configuration, and when Rails is genuinely the wrong choice.

Jay McBride

Jay McBride

Software Engineer

10 min read
Support my work on Buy Me a Coffee

Introduction

I’ve watched three startups burn through six months of runway building features that Rails ships in a generator command.

The pattern is always the same. Someone says “we need to be modern” and picks Node.js with React. Next thing you know, you’re configuring TypeScript, setting up Prisma, writing API endpoints manually, debugging CORS, and explaining to investors why you don’t have a demo yet.

Six months later, you have authentication that barely works, a database schema that can’t handle relationships properly, and a deployment process held together with duct tape. Your competitors using Rails shipped their MVP in week three and are iterating based on user feedback.

This article is for developers who’ve built production applications with modern JavaScript stacks and are wondering why it felt like fighting the framework instead of building a product. If you haven’t shipped a real application yet, this isn’t your starting point. Go build something with Next.js first, then come back when you’re tired of writing boilerplate.

I’m going to tell you why Rails ships products faster, when it’s genuinely the wrong choice, and what breaks when teams pick trendy over proven. No “it depends” hedging. Just what actually works.

Enjoying this? 👉 Tip a coffee and keep posts coming

Here’s who this is for: Developers building products, not resumes. CTOs who need to ship before running out of money. Teams tired of maintaining infrastructure instead of building features.

Not for: People optimizing for interview questions. This assumes you care more about shipping products than learning the newest framework.

The question isn’t “is Rails still relevant?” It’s “why did we make building products so complicated?”


The Core Judgment: Rails Ships Products, Modern Stacks Ship Complexity

Here’s my default recommendation after shipping products in both ecosystems: use Rails when you need to build a data-driven application quickly, and only reach for JavaScript-heavy stacks when you have a specific need for real-time client-side interactivity.

Not theoretical. Specific.

Most teams pick modern JavaScript stacks because they feel “professional” or “scalable,” then spend months building infrastructure that Rails provides out of the box. Authentication. Authorization. Database migrations. Background jobs. Email sending. File uploads. All of this is one gem install away in Rails.

I’ve built the same application in both. Rails: three weeks from idea to production. Node.js with Next.js: three months and still missing features. Same functionality. Same design. Users couldn’t tell the difference except the Rails version actually shipped.

JavaScript stacks are optimizing for the wrong thing. They optimize for flexibility—choose your ORM, your auth library, your email service, your background job system. But this flexibility is a trap. Every choice is time you’re not shipping. Every integration is code you have to maintain.

The mistake people make is thinking “flexibility” means “better.” It doesn’t. It means more decisions, more maintenance, more things that can break. Rails made those decisions for you. Good ones. Based on building thousands of applications over 20 years.

I see this constantly: teams spend weeks evaluating ORMs, building auth from scratch, configuring email services, setting up background jobs. Rails does all of this in one command: rails new. Then you build features instead of infrastructure.

The decision isn’t “which is more powerful?” It’s “how fast can I validate my business idea?”

If you’re building a SaaS application, e-commerce site, or internal tool, Rails ships it faster. If you’re building a real-time collaborative editor or a client-only application, use JavaScript. But for everything else, Rails wins on speed.


How This Works in the Real World

The reason Rails feels productive is that it’s been solving the same problems for 20 years.

You think modern JavaScript stacks are “cleaner” because you write everything yourself. You’re missing the point. Writing code isn’t productive. Shipping features is.

Here’s what actually happens when you scaffold a Rails application:

You run rails new myapp. You get authentication with Devise in 10 minutes. You generate a scaffold: rails g scaffold Post title:string body:text. This creates the model, migration, controller, views, routes, and tests. All connected. All working. You run rails db:migrate and you have a functioning CRUD interface.

Need background jobs? Add Sidekiq. One gem, one config file. Need file uploads? Add Active Storage. Built-in. Need to send email? Action Mailer is already configured. Need WebSockets? Action Cable is there.

You combine this with Hotwire for modern interactivity. No build step. No JavaScript bundler. No hydration. Just server-rendered HTML with Turbo for smooth navigation and Stimulus for targeted JavaScript.

What surprised me when I went back to Rails after years of JavaScript:

  1. Feature velocity was 5x faster. No bikeshedding about tech choices. No hunting for libraries. No integration work. Just building the actual product.

  2. Maintenance dropped to near zero. Rails upgrades handle database, routing, and framework changes together. No “Express is fine but we need to update Passport and Sequelize separately.” Everything moves together.

  3. New developers shipped code day one. Rails conventions mean every Rails developer knows where things go. No “how does this team structure their code?” Just follow the conventions.


A Real Example: When JavaScript Complexity Killed Velocity

I built a SaaS application for client management in 2022. They needed user accounts, client profiles, project tracking, file uploads, and email notifications. Standard SaaS features.

I chose the “modern” stack: Next.js, Prisma, NextAuth, AWS S3, SendGrid. Felt like the professional choice. Three months in, we had authentication that broke randomly, file uploads that failed silently, emails that went to spam, and background jobs that didn’t exist because we hadn’t built that infrastructure yet.

I rebuilt core functionality in Rails in two weeks. Devise for auth. Active Storage for files. Action Mailer for email. Sidekiq for background jobs. Everything worked. We shipped to users and started iterating based on feedback instead of fighting infrastructure.

What I’d do differently: Ask “do I need to build this from scratch, or does Rails already solve this?” before starting any project. If Rails solves it, use Rails. If you need specialized client-side behavior Rails can’t provide, use JavaScript. But for standard web applications, Rails was right from the start.


Common Mistakes I Keep Seeing

Building microservices before you have a product. Teams split their application into 10 services before they have 10 users. This creates deployment complexity, network latency, and debugging nightmares. Rails monoliths ship products. Split when you hit actual scale problems, not hypothetical ones.

Choosing JavaScript “for scale.” Rails scales to Shopify (billions in transactions), GitHub (millions of users), and Basecamp (decades of operation). If your scale problems are worse than theirs, you’re not a startup anymore. You’re Google. Pick the technology that lets you find product-market fit before you run out of money.

Building a JSON API when you don’t need one. If your frontend and backend are the same application, you probably don’t need a JSON API. Just render the HTML. You save weeks not building serializers, not documenting endpoints, not handling CORS, not syncing types between frontend and backend.

Treating Rails like it’s 2012. Modern Rails has Hotwire for SPA-like interactivity, Action Cable for WebSockets, and Active Storage for file uploads. It’s not “just server rendering.” It’s a complete framework that handles modern needs.


Tradeoffs and When Rails Is Actually Wrong

I’m not saying Rails works for everything. I’m saying it works for most products.

Use Rails when:

  • You’re building a standard web application (SaaS, e-commerce, internal tools, marketplaces)
  • You need to ship quickly and validate your business idea
  • Your team is small and can’t afford to maintain complex infrastructure
  • You want proven patterns that thousands of applications have used successfully

Don’t use Rails when:

  • You’re building a real-time collaborative application (Google Docs, Figma)
  • Most of your application logic lives in the client with minimal server interaction
  • You need to support offline-first functionality
  • Your team is 100% JavaScript and learning Rails would slow you down more than the productivity gains

Real limitations of Rails:

  • Ruby is slower than Go or Rust for CPU-intensive tasks. But most web applications are I/O bound, not CPU bound. Database queries and external APIs are your bottleneck, not Ruby.
  • Real-time multi-user collaboration is harder. Rails can do WebSockets with Action Cable, but frameworks designed for real-time from the start (Phoenix, Node.js) handle this better.
  • The JavaScript ecosystem moves faster. New UI libraries appear in JavaScript first. Rails adopts them later. If you need cutting-edge frontend experiments, you’ll be waiting.

The honest answer: if you’re building a standard web application, Rails is probably the fastest path to production. If you’re building something genuinely novel, evaluate whether its novelty requires a novel stack.


Best Practices I Actually Follow

Start with the monolith. Build everything in one Rails application first. Split into services only when you have actual performance problems with real metrics. Premature optimization kills more startups than bad technology choices.

Use Hotwire for interactivity. Most “interactive” features don’t need React. They need Turbo for smooth page transitions and Stimulus for targeted JavaScript. This ships faster and breaks less.

Embrace conventions aggressively. Don’t fight Rails. Use standard REST patterns. Put controllers in app/controllers. Follow naming conventions. The productivity comes from not making decisions.

Add JavaScript libraries only when necessary. Need a rich text editor? Use Trix. Date picker? Use Flatpickr. Don’t build these from scratch, but also don’t adopt a full JavaScript framework just to get them.

Measure time to ship, not technology sophistication. Track how long features take from conception to production. If Rails ships features faster, use Rails. If JavaScript stacks ship faster for your team, use them. But measure honestly, including all the infrastructure work.


Conclusion

JavaScript frameworks aren’t bad. Choosing them for the wrong reasons is.

Next.js, Express, and modern JavaScript stacks are powerful tools for applications that genuinely need them. But most products don’t. They need to validate business ideas quickly, iterate based on user feedback, and ship features before running out of money.

After years of building with modern stacks, I’ve learned that boring technology ships products faster than trendy technology. Rails has been boring for a decade. It’s also shipped more successful products than any JavaScript framework.

The future isn’t “Rails or JavaScript.” It’s choosing technology based on what actually ships products, not what looks good on Twitter.

Start with proven tools. Add complexity only when you hit concrete limitations. Your users care about features, not your tech stack.


Frequently Asked Questions (FAQs)

Isn’t Rails dead? I don’t see many job postings.

Rails powers Shopify, GitHub, Airbnb, Stripe, and thousands of profitable businesses. It’s not dead—it’s mature. Fewer entry-level jobs exist because companies hire senior developers to maintain critical applications. This is good. It means better compensation and more interesting problems.

Can Rails handle real-time features?

Yes, with Action Cable for WebSockets. But if your entire application is real-time collaboration, use Phoenix or Node.js. Rails handles real-time well for things like notifications and live updates, but it’s not optimized for 50 simultaneous users editing the same document.

What about TypeScript? Don’t you need type safety?

Ruby has type checking with Sorbet and RBS. But more importantly, comprehensive testing matters more than types for catching bugs. Rails makes testing easy with built-in test frameworks and conventions. Well-tested dynamic code is safer than untested typed code.

How does Rails compare to Django or Laravel?

All three are mature, productive frameworks. Pick based on language familiarity. If you know Python, use Django. PHP, use Laravel. Ruby, use Rails. They all solve the same problems well. The framework matters less than your ability to ship with it.

Can I use Rails for just the backend and React for frontend?

Yes. Rails API mode is excellent. But ask yourself: do you actually need React, or are you just comfortable with it? For most applications, Hotwire ships the same user experience with less complexity. Use React when you have concrete reasons, not comfort reasons.


Your turn: Look at your current project. How much code is business logic versus infrastructure? What would happen if you deleted everything Rails provides out of the box and focused only on your unique value proposition?

Enjoying this? 👉 Tip a coffee and keep posts coming

Found this helpful?

Share it with your network

Jay McBride

Written by Jay McBride

Software engineer with 10+ years building production systems and mentoring developers. I write about the tradeoffs nobody mentions, the decisions that break at scale, and what actually matters when you ship. If you've already seen the AI summaries, you're in the right place.

Based on 10+ years building production systems and mentoring developers.

Support my work on Buy Me a Coffee

Recommended for You

3 min read

Rails 8.0 Beta 1: No PaaS Required – The Future of Developer Simplicity

How Rails 8 Beta 1 Revolutionizes Development with Conceptual Compression and Deployment Ease

Read Article
7 min read

Ruby vs PHP in 2025: Why This Debate Misses the Point Entirely

One language optimizes for developer joy, the other for getting hired. Both choices have consequences.

Read Article