<?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>Forem: SwipeReel</title>
    <description>The latest articles on Forem by SwipeReel (@swipereel).</description>
    <link>https://forem.com/swipereel</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3818507%2Fd6a85c64-d3e5-4ebf-a392-3a63671e98c6.png</url>
      <title>Forem: SwipeReel</title>
      <link>https://forem.com/swipereel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/swipereel"/>
    <language>en</language>
    <item>
      <title>How We Built Shoppable Video Feeds for Shopify with Remix and React</title>
      <dc:creator>SwipeReel</dc:creator>
      <pubDate>Wed, 11 Mar 2026 13:00:09 +0000</pubDate>
      <link>https://forem.com/swipereel/how-we-built-shoppable-video-feeds-for-shopify-with-remix-and-react-1050</link>
      <guid>https://forem.com/swipereel/how-we-built-shoppable-video-feeds-for-shopify-with-remix-and-react-1050</guid>
      <description>&lt;p&gt;We recently launched &lt;a href="https://www.swipereel.app" rel="noopener noreferrer"&gt;SwipeReel&lt;/a&gt; — a Shopify app that turns Instagram Reels and TikTok videos into shoppable video feeds embedded directly in online stores. Here's a look at how we built it and the technical decisions behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Shopify merchants spend hours creating video content for Instagram and TikTok, but that content lives and dies on social platforms. There was no easy way to repurpose those videos as shoppable experiences on their own store — without hiring a developer or dealing with complex embed code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;We chose &lt;strong&gt;Remix 2.16&lt;/strong&gt; (with Vite) as our framework, paired with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React 18&lt;/strong&gt; + &lt;strong&gt;Shopify Polaris 13&lt;/strong&gt; for the admin UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB&lt;/strong&gt; (Mongoose 8) for video metadata and feed configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud Run&lt;/strong&gt; for hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shopify App Bridge&lt;/strong&gt; for seamless embedded admin experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Remix?
&lt;/h3&gt;

&lt;p&gt;Remix gave us server-side rendering, nested routing, and great data loading patterns out of the box. Since Shopify's app framework already uses Remix as the default template, it was a natural fit. The loader/action pattern keeps our data fetching clean and colocated with routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Video Import Pipeline
&lt;/h3&gt;

&lt;p&gt;We built a one-click import flow for Meta (Instagram/Facebook) videos. The OAuth flow connects the merchant's account, and we sync their Reels and video posts. Each video gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Metadata extraction (thumbnail, duration, dimensions)&lt;/li&gt;
&lt;li&gt;Cloud storage via Shopify's Files API&lt;/li&gt;
&lt;li&gt;Product tagging with tap-to-buy overlays&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Multiple Layout Modes
&lt;/h3&gt;

&lt;p&gt;We support 4 layout types, each with different rendering strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stories&lt;/strong&gt; — vertical swipe, TikTok-style fullscreen player&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carousel&lt;/strong&gt; — horizontal scroll using Embla Carousel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline Feed&lt;/strong&gt; — grid layout embedded in page sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overlay Popup&lt;/strong&gt; — floating button that opens a modal player&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each layout is delivered as a Shopify Theme App Extension block, so merchants drag-and-drop it into their theme — zero code needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Performance
&lt;/h3&gt;

&lt;p&gt;Video is inherently heavy, so we implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lazy loading&lt;/strong&gt; — videos only load when they enter the viewport&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poster images&lt;/strong&gt; — static thumbnails until the user interacts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preload metadata&lt;/strong&gt; — &lt;code&gt;preload="metadata"&lt;/code&gt; to get duration/dimensions without downloading the full video&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intersection Observer&lt;/strong&gt; — pause videos when they scroll out of view&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: near-zero impact on Lighthouse scores.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Analytics
&lt;/h3&gt;

&lt;p&gt;We built a lightweight analytics system that tracks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video views and watch time&lt;/li&gt;
&lt;li&gt;Product click-through rates&lt;/li&gt;
&lt;li&gt;Add-to-cart events from video overlays&lt;/li&gt;
&lt;li&gt;Per-feed and per-video breakdowns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All events are batched and sent via &lt;code&gt;navigator.sendBeacon()&lt;/code&gt; to avoid blocking the main thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;We're working on TikTok direct import, A/B testing for feed layouts, and AI-powered product tagging suggestions. If you're building Shopify apps with Remix, happy to chat about our experience.&lt;/p&gt;

&lt;p&gt;Check it out: &lt;a href="https://apps.shopify.com/swipereel" rel="noopener noreferrer"&gt;SwipeReel on Shopify App Store&lt;/a&gt; | &lt;a href="https://www.swipereel.app" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you built shoppable video experiences? What challenges did you run into? Let's discuss in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>react</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
