<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kryeo</title>
    <description>The latest articles on DEV Community by Kryeo (@kryeo).</description>
    <link>https://dev.to/kryeo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4208226%2Fd85ec063-e575-48d3-9df3-147f04789692.png</url>
      <title>DEV Community: Kryeo</title>
      <link>https://dev.to/kryeo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kryeo"/>
    <language>en</language>
    <item>
      <title>We swapped the entire backend of a live store. The frontend never found out.</title>
      <dc:creator>Kryeo</dc:creator>
      <pubDate>Wed, 04 Nov 2026 20:25:27 +0000</pubDate>
      <link>https://dev.to/kryeo/we-swapped-the-entire-backend-of-a-live-store-the-frontend-never-found-out-1poe</link>
      <guid>https://dev.to/kryeo/we-swapped-the-entire-backend-of-a-live-store-the-frontend-never-found-out-1poe</guid>
      <description>&lt;p&gt;Picture replacing a car's engine while someone is still driving it down the highway. No pit stop, no "back in two weeks" banner, and the driver shouldn't feel a thing.&lt;/p&gt;

&lt;p&gt;That was the brief for &lt;a href="https://kryeo.com/work/increddy" rel="noopener noreferrer"&gt;Increddy&lt;/a&gt;, a storefront selling game and software license keys. It ran on Shopify. The commerce logic the business actually needed didn't fit Shopify well, so the backend had to go: cart, checkout, payments, inventory, all of it.&lt;/p&gt;

&lt;p&gt;The frontend had to stay. Same Next.js app, same Zustand stores, same React Query hooks, same customers who'd never know anything changed.&lt;/p&gt;

&lt;p&gt;Here are the three calls that made that work, and the one that sounds reckless but turned out to be the safest.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. We didn't write a spec. We read the frontend.
&lt;/h2&gt;

&lt;p&gt;The textbook move is a specification document: list the endpoints, define the payloads, hand it to the backend team.&lt;/p&gt;

&lt;p&gt;We skipped it.&lt;/p&gt;

&lt;p&gt;A spec written before the build is a guess about what the frontend needs. The frontend itself is the truth. So before writing any backend code, we went through the live frontend feature by feature and wrote down exactly what it called and exactly which fields it read off every response.&lt;/p&gt;

&lt;p&gt;That became the contract. Not what a commerce platform &lt;em&gt;usually&lt;/em&gt; returns, but what &lt;em&gt;this&lt;/em&gt; frontend actually reads.&lt;/p&gt;

&lt;p&gt;Specs drift from reality the moment someone finds a requirement mid-build. Code that's already running doesn't drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Two repos, two owners, one contract
&lt;/h2&gt;

&lt;p&gt;The frontend and backend lived in separate repositories, owned by different people, built in parallel.&lt;/p&gt;

&lt;p&gt;What kept them from drifting apart was a pair of boring documents: a gap tracker mapping every frontend data need to a backend capability, and matched task lists with dependency IDs so each side knew exactly what it was blocked on.&lt;/p&gt;

&lt;p&gt;The documents weren't the real secret, though. (That story is its own post in this series.)&lt;/p&gt;

&lt;h2&gt;
  
  
  3. We migrated zero orders. On purpose.
&lt;/h2&gt;

&lt;p&gt;This is the one people push back on.&lt;/p&gt;

&lt;p&gt;No Shopify orders. No customers. No catalogue rows. The new &lt;a href="https://medusajs.com" rel="noopener noreferrer"&gt;Medusa v2&lt;/a&gt; backend was built and populated from scratch.&lt;/p&gt;

&lt;p&gt;It sounds like throwing away history. But think about where replatforms usually hurt: a migration script that quietly maps some edge-case record wrong, and you find out from a support ticket three weeks after launch.&lt;/p&gt;

&lt;p&gt;Increddy's backend was being rebuilt, not translated. Starting clean removed the riskiest step entirely instead of trying to make it safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody puts in the pitch deck
&lt;/h2&gt;

&lt;p&gt;Leaving Shopify means everything it did invisibly becomes code you write: multi-currency, payment orchestration, inventory logic. For a license-key store it also means building the one thing no platform gives you, a system that can never sell the same key twice.&lt;/p&gt;

&lt;p&gt;That is where the real engineering went, and it's where this series goes next.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The full case study&lt;/strong&gt;, with the architecture, the results, and every module we built, is on our site: &lt;a href="https://kryeo.com/work/increddy" rel="noopener noreferrer"&gt;How we migrated Increddy to a self-hosted Medusa backend →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the step-by-step migration write-up, including how the gap tracker was structured, read &lt;a href="https://kryeo.com/blog/increddy-shopify-to-medusa-migration" rel="noopener noreferrer"&gt;the long version on the Kryeo blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We're &lt;a href="https://kryeo.com" rel="noopener noreferrer"&gt;Kryeo&lt;/a&gt;. We build headless commerce on Medusa, Directus and Next.js. If you're weighing a move off Shopify, &lt;a href="https://kryeo.com/services/medusa-development" rel="noopener noreferrer"&gt;our Medusa development page&lt;/a&gt; is a good place to start.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>medusa</category>
      <category>ecommerce</category>
      <category>nextjs</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
