<?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: Jitender</title>
    <description>The latest articles on DEV Community by Jitender (@jitender_8d5c306fa3fb55f0).</description>
    <link>https://dev.to/jitender_8d5c306fa3fb55f0</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%2F3512587%2F98b4088e-d569-4785-aaac-779e4d8b0873.jpg</url>
      <title>DEV Community: Jitender</title>
      <link>https://dev.to/jitender_8d5c306fa3fb55f0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jitender_8d5c306fa3fb55f0"/>
    <language>en</language>
    <item>
      <title>How We Built a Video-First Shopping Feed on Top of Shopee, Lazada and Amazon Catalogs</title>
      <dc:creator>Jitender</dc:creator>
      <pubDate>Sat, 10 Oct 2026 16:29:17 +0000</pubDate>
      <link>https://dev.to/jitender_8d5c306fa3fb55f0/how-we-built-a-video-first-shopping-feed-on-top-of-shopee-lazada-and-amazon-catalogs-4n73</link>
      <guid>https://dev.to/jitender_8d5c306fa3fb55f0/how-we-built-a-video-first-shopping-feed-on-top-of-shopee-lazada-and-amazon-catalogs-4n73</guid>
      <description>&lt;p&gt;Scroll-first shopping is how a lot of people in Southeast Asia already discover products: they watch a short clip, swipe, and buy. Marketplaces like Shopee and Lazada have huge catalogs, but their apps are built around search and category trees, not a feed.&lt;/p&gt;

&lt;p&gt;We built &lt;strong&gt;Nexora&lt;/strong&gt; (for Blue Stingers Information Technology) to close that gap: one vertical feed that pulls product videos and photos from Shopee, Lazada, Amazon and other affiliate sources. You watch, swipe for photos, tap &lt;strong&gt;Buy Now&lt;/strong&gt;, and checkout happens on the original store. Nexora never touches payment.&lt;/p&gt;

&lt;p&gt;This post walks through the architecture decisions and what we'd do the same way again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The constraints
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero checkout.&lt;/strong&gt; Every purchase is an affiliate hand-off. That removes PCI scope and refunds, but it means attribution links must be correct and fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Media-heavy, catalog-light.&lt;/strong&gt; The feed is mostly video and images; product metadata is small but changes often (price, stock).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two platforms plus web from a small team.&lt;/strong&gt; iOS, Android and a web presence had to ship together.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Stack at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend / ingestion&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Rust&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Predictable latency and low memory while normalising thousands of catalog items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Flutter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One codebase for iOS and Android, smooth video scrolling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SEO-friendly landing pages and shareable product pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deploy&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same images locally and in production&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1. Normalise every source into one product shape
&lt;/h2&gt;

&lt;p&gt;Each marketplace returns data in its own format. The first thing the Rust service does is map every source into a single internal &lt;code&gt;Product&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// stable internal id&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// Shopee | Lazada | Amazon | ...&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;price_minor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// store money in minor units, never floats&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Media&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// video first, then images&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;affiliate_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two habits paid off immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Money in minor units&lt;/strong&gt; (centavos, cents) as integers. Floating-point prices across currencies are a bug factory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;source&lt;/code&gt; as an enum, not a string.&lt;/strong&gt; Adding a new marketplace becomes a compile error everywhere it needs handling, which is exactly what you want.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Rank for "watchability", not just relevance
&lt;/h2&gt;

&lt;p&gt;A search engine ranks by query match. A feed has no query, so the ranking question becomes &lt;em&gt;"will this hold attention for the next three seconds?"&lt;/em&gt; Our first-pass signals were simple and cheap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has a real product video (not a slideshow)?&lt;/li&gt;
&lt;li&gt;Media loads fast on a mid-range Android phone on mobile data?&lt;/li&gt;
&lt;li&gt;Price and stock refreshed recently?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple, explainable signals beat a clever model you can't debug in week two.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Make video scrolling feel native in Flutter
&lt;/h2&gt;

&lt;p&gt;Most of the perceived quality of a feed app comes from the scroll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Preload one item ahead, dispose two behind.&lt;/strong&gt; Keeping every player alive will exhaust memory on lower-end Android devices, which are common in the Philippine and Indonesian markets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show a poster frame instantly&lt;/strong&gt;, then swap to video when ready. A black rectangle feels broken even if it's only 300 ms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pause on app background and on scroll start&lt;/strong&gt;, resume on settle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Treat the affiliate hand-off as a critical path
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Buy Now&lt;/strong&gt; tap is the only moment that earns revenue, so it gets the same care as a checkout:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resolve and validate affiliate URLs server-side; never build them on the client.&lt;/li&gt;
&lt;li&gt;Open the marketplace app if installed (deep link), otherwise the browser.&lt;/li&gt;
&lt;li&gt;Log the hand-off event so attribution issues can be traced.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Ship web for discovery
&lt;/h2&gt;

&lt;p&gt;The Next.js site isn't an afterthought: shareable product and landing pages are how new users arrive from social media and search, and they need server-rendered metadata so previews look right in Messenger, WhatsApp and Viber.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we'd tell another team building in this space
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start with &lt;strong&gt;one marketplace, end-to-end&lt;/strong&gt;, before generalising the ingestion layer.&lt;/li&gt;
&lt;li&gt;Budget real time for &lt;strong&gt;low-end Android performance&lt;/strong&gt; in Southeast Asia.&lt;/li&gt;
&lt;li&gt;Keep ranking &lt;strong&gt;explainable&lt;/strong&gt; until you have enough engagement data to justify a model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nexora is live on the App Store and Google Play. If you're planning a commerce, feed or marketplace app for Southeast Asia, we're happy to compare notes. We're &lt;strong&gt;I Plus T Solution&lt;/strong&gt;, a software and AI development team in Gurugram, India: &lt;a href="https://www.iplust.in/" rel="noopener noreferrer"&gt;https://www.iplust.in/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>flutter</category>
      <category>architecture</category>
      <category>ecommerce</category>
    </item>
  </channel>
</rss>
