251 Our Rails stack, and why it isn't Omakase [0.5d]

Posted . Visible to the public.

Rails ships with a default menu of libraries and conventions — its creators call it "Omakase", the chef's choice. Like many companies, we don't follow that menu blindly. Over the years we have adjusted our stack to our own taste and experience. This card explains where we differ and why, so you won't be confused when a tutorial, a Rails guide or a freshly generated app looks different from our projects.

Important

Work on this lesson in teacher mode.

Learning goals

  • You can explain what "Omakase" means in Rails and why a company deviates from the default menu.
  • You have a rough understanding of where our stack differs from Rails defaults and the reasoning behind each difference.
  • You can explain our testing strategy — end-to-end tests for every happy path plus many unit tests for edge cases — and why we prefer it over the classic testing pyramid.
  • You can recognize 37signals-specific pieces in tutorials and generated apps (e.g. Hotwire, Kamal, Solid Queue) and know to skip them.
  • You know that client projects don't always use our stack, and where to look up how the alternatives differ.

Omakase vs. makandra

Topic Rails default (Omakase) At makandra Why
Frontend interaction Hotwire / Turbo / Stimulus Unpoly; React where an SPA is warranted Unpoly is the more mature and more powerful solution, especially for complex forms and intricate overlay interactions
Testing framework minitest RSpec Expressive matchers and describe/context structure make specs read like requirements; the ecosystem (Capybara feature specs, factories, mocking, shoulda matchers) is built around it
Testing strategy Testing pyramid: many unit tests, few or no end-to-end tests Testing hourglass: an E2E test for every happy path, many unit tests for edge cases Only an E2E test proves the app works for a user; unit tests are cheap for edge cases; the middle layer (controller and view tests) costs much and proves little
Controllers and models Fat controllers, models with many callbacks Slim controllers, fat models, core models with few callbacks Business logic in models is testable without HTTP; controllers stay boring and uniform; callbacks on core models fire everywhere and cause surprises
Form models / presenters No default — a gap in the framework ActiveType form models and presenters Screen-specific validations, callbacks and virtual attributes (sign-up, checkout, wizards) don't belong on the core model; ActiveType gives them a home with the full ActiveRecord API
Authorization No default Consul One declarative place for what a user may do, usable in controllers, views and tests alike
HTML components Partials only Partials and ViewComponent Components have an explicit API, co-locate template, helpers, CSS and JS, and can be unit-tested
File uploads ActiveStorage CarrierWave ActiveStorage still has issues; CarrierWave is conceptually simple, stores files in the file system, and can deliver downloads without hitting a Rails controller
Background jobs Solid Queue GoodJob (Sidekiq in older projects) Also PostgreSQL-backed, but more mature: cron jobs, concurrency controls, a dashboard, and jobs enqueued in the same transaction as your data
JavaScript build Propshaft, import maps, "no build" esbuild No-build means no bundling, no Sass, no JSX, and poor debugging; esbuild bundles, transpiles and fingerprints JS, CSS and images in milliseconds
Package manager yarn pnpm (movie-db-base still uses yarn 1) yarn 1 is no longer maintained and yarn 2+ never caught on; pnpm is fast, disk-efficient and feature-rich
Deployment Kamal (containers on your own servers) Capistrano to servers run by our operations team We run our own hosting with dedicated servers, monitoring and backups, and our DevOps team takes care of Linux package upgrades; Capistrano deploys straight onto those servers, no containers needed

"Testing hourglass" is our own term for many unit tests plus an end-to-end test for every happy path; elsewhere, e.g. at Google, "hourglass" names the opposite problem — too many end-to-end tests and too few unit tests. The "why" column is a one-sentence version. Later cards go into each topic; where a card teaches our choice, it links back here and explains the alternative.

Resources

Read what's new to you, skim what's familiar, skip what you already master. Stop when you can meet the learning goals.

Your agent can also generate an overview, a tutorial or an explanation for anything here, tailored to what you already know. Just ask.

The case for the menu

The trade-offs, row by row

Discuss with your mentor

Pick three rows of the table. For each, argue the Omakase side first, then ours. Which of our choices would you question, and what would change your mind?

Profile picture of Henning Koch
Henning Koch
License
Source code in this card is licensed under the MIT License.
Posted by Henning Koch to makandra Curriculum (2026-08-31 15:28)