Platform & Infrastructure 11 Sep 2026 34 min read

Where Shopify refused to rewrite, and where it rewrote three times

How Shopify's platform changed between 2014 and 2026, reconstructed from the public repository record: the backend runtime it funded rather than left, the boundaries it enforced in the build rather than on the network, the tools it donated once they stopped differentiating it, and the storefront framework it rebuilt on three foundations in five years.

One company running two opposite policies in the same decade. On the substrate it can change, Shopify has not migrated since 2014: it funded a JIT inside CRuby, adopted a database driver and upstreamed the adapter, and enforced module boundaries in the build instead of extracting services. On the substrate it only consumes, its storefront framework has moved foundations three times since 2021, including after acquiring the framework's team. The guide gives an architect the test that separates the two cases, six decisions with the condition that flips each, four documented failure modes with transferable rules, and a six-rung ladder for measuring their own leverage before choosing between evolving a system and replacing it.

The finding that surprised me

Shopify could not fit its own language into its own extension platform: Ruvy was archived in January 2026 because its WebAssembly modules exceed the maximum size Shopify Functions accepts, while the JavaScript toolchain stayed and moved to the Bytecode Alliance.

What you get out of it

  • The policy follows leverage, not technology: where a Shopify engineer can land a change upstream the company invests and stays, and where it can only consume it wraps thin and migrates.
  • Buying your constraint means shipping the risk first: Ruby 3.2 declared YJIT no longer experimental on the strength of production exposure that was largely Shopify's own.
  • It is also a standing team, not a purchase: four years after the first JIT stabilised, its replacement ships in Ruby 4.0 experimental and slower than the thing it replaces.
  • Modularisation survives a live monolith only as a ratchet: violations are recorded in a todo file and paid down, and the whole-codebase check needed content-addressed caching to fall from three and a half minutes to under twenty seconds.
  • Circuit-breaker recovery is a capacity budget nobody sets: at the library's default timeouts, 16.7% of worker capacity goes into probing a resource that is still down, and the proposed fix has been open since 2019.

Scope

Why this, now. Ruby 4.0 ships a second Shopify-funded JIT that is still slower than the first one, and in January 2026 Shopify archived its attempt to run Ruby inside the WebAssembly sandbox it gives merchants, so both ends of the decade's strategy now have a dated public verdict.

What it does not cover. Anything Shopify never published: the shard router, the pod topology, the Storefront Renderer, the data platform and peak-traffic figures, plus every Shopify engineering blog post, talk and incident report, because this session's network policy reached github.com and no other host.

Open the field guide → Self-contained: it loads nothing at read time, follows your system theme, and prints cleanly.