<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Swym Stories]]></title><description><![CDATA[Discover insights and stories from the Swym team as we explore the intersection of e-commerce, technology, and customer experience. Through blogs, videos, and podcasts, we share our lessons learned, fresh perspectives and expertise]]></description><link>https://stories.getswym.com</link><image><url>https://substackcdn.com/image/fetch/$s_!Rz1A!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef083a9-eb60-4abd-b1a1-26ce5d0a082e_309x309.png</url><title>Swym Stories</title><link>https://stories.getswym.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 14 Jul 2026 02:06:20 GMT</lastBuildDate><atom:link href="https://stories.getswym.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Swym Corp]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[swymming@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[swymming@substack.com]]></itunes:email><itunes:name><![CDATA[Swym Stories]]></itunes:name></itunes:owner><itunes:author><![CDATA[Swym Stories]]></itunes:author><googleplay:owner><![CDATA[swymming@substack.com]]></googleplay:owner><googleplay:email><![CDATA[swymming@substack.com]]></googleplay:email><googleplay:author><![CDATA[Swym Stories]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Our time with Preact: Shipping pluggable UX for storefronts]]></title><description><![CDATA[Lessons in building UX that works on all storefronts]]></description><link>https://stories.getswym.com/p/our-time-with-preact-shipping-pluggable</link><guid isPermaLink="false">https://stories.getswym.com/p/our-time-with-preact-shipping-pluggable</guid><dc:creator><![CDATA[Swym Stories]]></dc:creator><pubDate>Thu, 09 Jul 2026 11:33:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Dfxk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Before writing anything about Preact, I personally wanted to know our history with </span><a href="https://preactjs.com/"><span>Preact</span></a><span> and found we had our first mention of &#8220;preact&#8221; in our archives around June 2016 &#128516;, as we were exploring a custom integration into a b2b-ecommerce platform. The real practical usage started around June 2020 as we scaled up. In the early 2010s, I was a huge fan (maybe still looking for that) of </span><a href="https://knockoutjs.com/"><span>knockout.js</span></a><span>&#8217;s simplicity of declarative bindings aka MVVM type architecture, but missed React&#8217;s structure. Preact acted as that balance of utilitarian and familiar as React but without the heavy bulky-feel of React.</span></p><p><span>When an engineer proposed using preact for the first time, it wasn&#8217;t a slam dunk. It had to work with our first principles - We needed to work where our merchants needed us to work, i.e, we needed a UI platform that stayed fast, reusable, and safe to plug into multiple surface areas we do not own and never biased to a UX framework as default. Breaking that into specifics:</span></p><ul><li><p><span>plug into storefronts with different frameworks and theme structures,</span></p></li><li><p><span>stay lightweight in embedded runtime contexts,</span></p></li><li><p><span>scale reuse across experiences,</span></p></li><li><p><span>keep regression risk controlled for shared merchant-facing paths.</span></p></li></ul><p><span>The goal of this post is not to prescribe an action plan for you, it is to share what we learned from building pluggable storefront UX in real environments, and why those lessons remain highly relevant right now.</span></p><p><span>Why talk about this now? </span><a href="https://shopify.dev/changelog/polaris-web-components-migration-guides-now-available-for-checkout-and-customer-account-ui-extensions"><span>Shopify extensions is leaning heavily on preact as a welcome change to improve performance on all fronts - size, speed and rendering control.</span></a><span> That&#8217;s a philosophy we share and it helped us build and </span><a href="https://www.linkedin.com/posts/jeremyhorowitz1_top-10-shopify-apps-dominating-10myr-brands-ugcPost-7469039392905379840-iR8C/?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAMk_uUBi-HKYYbuAfYaY-OZt7iT2HXBPoU"><span>scale across thousands of Shopify Plus merchants (including $10M+/yr brands</span></a><span>)</span></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><span>&#8220;Pre&#8221;Preact (pun waiting to happen)</span></h2><p><span>From 2016 to 2020, our storefront UI was plain no-dependency JavaScript, low-fi Mustache templating, with custom loaders for css, strings plus other assets and a single deployment model.</span></p><h3><span>What worked</span></h3><p><span>This was lean and generally fast.</span></p><ul><li><p><span>Low runtime overhead</span></p></li><li><p><span>Good baseline speed characteristics</span></p></li><li><p><span>Minimal dependency risk</span></p></li><li><p><span>Flexible embedding model</span></p></li></ul><h3><span>What did not scale cleanly</span></h3><ul><li><p><span>Testability degraded as interaction depth increased</span></p></li><li><p><span>Reuse was harder than component-first systems</span></p></li><li><p><span>Safe change velocity depended on high expert context</span></p></li><li><p><span>Regression risk stayed high across shared merchant-facing paths</span></p></li></ul><h3><span>Performance nuance</span></h3><p><span>The old stack was not broadly slow, i.e. Raw script speed was generally not the primary blocker. Constraints were often:</span></p><ul><li><p><span>chunk size floors,</span></p></li><li><p><span>older mobile browser compute ceilings pre-2020,</span></p></li><li><p><span>paint and rerender behavior on constrained devices.</span></p></li></ul><p><span>So our move wasn&#8217;t necessarily &#8220;slow to fast.&#8221; It was &#8220;lean but hard-to-evolve to modular-and-verifiable.&#8221;</span></p><h2><span>What we changed from 2020 to ~2022</span></h2><p><span>We moved incrementally to a componentized UI model with a shared base and host adapters.</span></p><p><span>High-level shape:</span></p><ol><li><p><span>Host adapter layer</span></p></li><li><p><span>Shared orchestration and contracts</span></p></li><li><p><span>Shared UI bundle using React-compatible Preact setup</span></p></li><li><p><span>&#8220;Chunk&#8221;y packaging and deployment artifacts</span></p></li></ol><p><span>This gave us a practical component model with low runtime tax in embedded storefront contexts. We evaluated other potential fits like React, ember and other highly versatile frameworks, but each had a bulk that we didn&#8217;t want our merchants (and their shoppers) to deal with that additional tax.</span></p><h3><span>What Preact was great at in this model</span></h3><ul><li><p><span>Reusable UI components with clearer boundaries</span></p></li><li><p><span>Lower runtime overhead in embedded storefront contexts</span></p></li><li><p><span>Better component-level testability</span></p></li><li><p><span>Faster iteration on shared UX behavior across surfaces</span></p></li></ul><h3><span>Where it was not magic</span></h3><ul><li><p><span>Host seam bugs still happen</span></p></li><li><p><span>Data/model contract drift still happens</span></p></li><li><p><span>Mixed runtime debugging still requires telemetry</span></p></li><li><p><span>Passing tests still does not prove live-path correctness</span></p></li></ul><h3><span>What did not change automatically</span></h3><ul><li><p><span>Seam bugs still occurred at host/runtime boundaries</span></p></li><li><p><span>Mixed script environments still required instrumentation</span></p></li><li><p><span>Poor state placement could still create rerender cascades</span></p></li><li><p><span>Confidence still required live probes, not test-only green status</span></p></li></ul><h2><span>Architecture for a pluggable storefront model</span></h2><p><span>Here are the visual structure of how our UX component defense is structured, mostly based on internal architecture without all the intricacies</span></p><h3><span>System context: platform vs Swym boundaries</span></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LwVh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LwVh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png 424w, https://substackcdn.com/image/fetch/$s_!LwVh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png 848w, https://substackcdn.com/image/fetch/$s_!LwVh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png 1272w, https://substackcdn.com/image/fetch/$s_!LwVh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LwVh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png" width="1456" height="404" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:404,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LwVh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png 424w, https://substackcdn.com/image/fetch/$s_!LwVh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png 848w, https://substackcdn.com/image/fetch/$s_!LwVh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png 1272w, https://substackcdn.com/image/fetch/$s_!LwVh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a98888-4f01-4cc3-82da-405392eaafee_2048x568.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><span>Dependency ownership map</span></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9mXx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9mXx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png 424w, https://substackcdn.com/image/fetch/$s_!9mXx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png 848w, https://substackcdn.com/image/fetch/$s_!9mXx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!9mXx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9mXx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png" width="1456" height="755" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:755,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9mXx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png 424w, https://substackcdn.com/image/fetch/$s_!9mXx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png 848w, https://substackcdn.com/image/fetch/$s_!9mXx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!9mXx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b0b8b3-a796-4d89-a546-a9ee18857535_2048x1062.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><span>Request path distinction (runtime flow)</span></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YZSr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YZSr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png 424w, https://substackcdn.com/image/fetch/$s_!YZSr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png 848w, https://substackcdn.com/image/fetch/$s_!YZSr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png 1272w, https://substackcdn.com/image/fetch/$s_!YZSr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YZSr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png" width="1456" height="739" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:739,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YZSr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png 424w, https://substackcdn.com/image/fetch/$s_!YZSr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png 848w, https://substackcdn.com/image/fetch/$s_!YZSr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png 1272w, https://substackcdn.com/image/fetch/$s_!YZSr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c34616-7c9d-4d00-a0d8-6de95394a862_2048x1039.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><span>Failure isolation diagram (who owns breakage)</span></h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dfxk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dfxk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png 424w, https://substackcdn.com/image/fetch/$s_!Dfxk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png 848w, https://substackcdn.com/image/fetch/$s_!Dfxk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png 1272w, https://substackcdn.com/image/fetch/$s_!Dfxk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dfxk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png" width="1456" height="361" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:361,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dfxk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png 424w, https://substackcdn.com/image/fetch/$s_!Dfxk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png 848w, https://substackcdn.com/image/fetch/$s_!Dfxk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png 1272w, https://substackcdn.com/image/fetch/$s_!Dfxk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d77447-84a7-4db0-b698-01a44040b88c_2048x508.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><span>Final takeaways</span></h2><p><span>Our long-term value has been predicated by ensuring Preact-compatible shared component base with strict boundary architecture. As confident as we are in our approach and grounding principles, I am not going to claim victory yet, not even close to what we can achieve with this structural unlock.</span></p><p><span>Here are a few reasons to back that non-claim</span></p><ul><li><p><span>When building an SDK that also distributes UX components, the build x deploy challenges are numerous with the first one being nobody wants to have very bulky code. Some bulk is expected for convenience but mostly it is avoidable tax.</span></p></li><li><p><span>Testing pluggable components (that compose entire experiences) without &#8220;owning&#8221; the storefront is nightmarishly hard and a constantly moving target.</span></p><ul><li><p><span>Add to that the fact that true testing is not just that &#8220;it works&#8221;, it is more that it works fast, looks good, compliant and renders properly across all states of the experience (again, something you don&#8217;t own entirely). Even with years of hard grind and doing the &#8220;low value&#8221; work, the chase for the smooth 100% fit is ongoing.</span></p></li></ul></li><li><p><span>Non-app-based installations are inconsistent. Through our apps, the hard parts around installation, initialization and loading are pretty well optimized. It also gains directly through improvements made on Shopify&#8217;s extensibility. But headless and other non-app/extensions are tricky and varied, be prepared for answers that are inconsistent that nobody likes.</span></p></li></ul><p><span>I suppose the most important parts of this post are tucked away in this final part &#128516; These architectural nuances typically get overlooked in the race to ship. But that&#8217;s what the joy (of building) and delightful experiences rely on. Exactly where our team is spending a ton of time and seeing breakthroughs with AI-native solutions.</span></p><p><span>If you have reached this part and are excited about crafting nuanced solutions for hairy problems, talk to me or any of us at Swym, come build that future with us &#128588;</span></p><p><span>P.S Credit to </span>https://mermaid.live/<span> for the mermaid chart output</span></p>]]></content:encoded></item><item><title><![CDATA[Building for recovery - To Redis or not?]]></title><description><![CDATA[A decision framework for Redis vs. orchestrators failures]]></description><link>https://stories.getswym.com/p/building-for-recovery-to-redis-or</link><guid isPermaLink="false">https://stories.getswym.com/p/building-for-recovery-to-redis-or</guid><dc:creator><![CDATA[Swym Stories]]></dc:creator><pubDate>Mon, 06 Jul 2026 04:26:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2QCA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>At Swym, folks probably know one of the hills I&#8217;ll die on is that there is still nothing like Redis queues for baseline throughput and cognitive simplicity.</span></p><p><span>And no matter what is promised, once a broker or Temporal-class orchestrator enters the stack, we are buying a different operating model, not just a better queue. </span>But for seasoned builders and engineers, the useful version is:  it depends on which costs we want now vs later, and where we can tolerate ambiguity.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The mistake is pretending that queue choice is an architecture decision once and done. It is an operating cost decision that keeps compounding.</p><p>Here is the non-gyaan version (maybe a bit of TLDR;):</p><ul><li><p>Redis buys speed now and pushes coordination cost into application code later.</p></li><li><p>Temporal/brokers buy explicit workflow semantics now and charge platform tax immediately.</p></li><li><p>Both work.</p></li><li><p>Both hurt.</p></li><li><p>There is a sweet spot between hurt and gains that will match the team&#8217;s  failure appetite.</p></li></ul><p>So &#8220;it depends&#8221; is lifting a lot of weight clearly, let&#8217;s talk through what &#8220;it&#8221; &#8220;depends&#8221; on.</p><p>Some notes before going into it</p><ul><li><p>This is not about our AI-first ops, those fit better on <a href="https://stories.getswym.com/p/from-zero-to-production-lessons-from">separate detailed posts</a></p></li><li><p><a href="https://stories.getswym.com/p/bfcm-2025-a-magical-time-for-shoppers">Here is a sampling of scale we deal</a></p></li><li><p>This post focuses on the Redis vs. Orchestrator extremes. If you are reaching for SQS/SNS or Kafka, you are generally landing in the 'Redis-like' bucket&#8212;optimizing for throughput and eventual consistency&#8212;but with a different set of platform tradeoffs. We treat them as 'Redis-first' for the purpose of this argument because the fundamental trade-off remains: platform-provided durability vs. application-logic-defined flow.</p></li></ul><div><hr></div><h2><span>Redis - Still the fastest way to a useful system</span></h2><p>A quick reality check: 'Redis-first' is only 'cognitive simplicity' if you already have a mature Redis management strategy. Once you hit scale, persistence requirements, and replication lag, maintaining a high-throughput Redis cluster can become an operational tax of its own. Do not assume it is free infrastructure.</p><p><span>We already know the upside:</span></p><ul><li><p><span>Minimal bootstrap time</span></p></li><li><p><span>Familiar operational model</span></p></li><li><p><span>Tight feedback loops in local/dev</span></p></li><li><p><span>Low ceremony for producer/consumer patterns</span></p></li></ul><p><span>For narrow, high-throughput, short-lived jobs, Redis is often the right default.</span></p><p><span>What gets missed is that this default silently expands from &#8220;queue&#8221; to &#8220;execution semantics&#8221; over time.</span></p><p><span>We start with enqueue/dequeue. We end up hand-building retry policy, poison message handling, delayed jobs, idempotency, visibility, backoff, dead-letter behavior, and failure observability.</span></p><p><span>At that point, we did not avoid orchestration complexity. We just forced it into application code.</span></p><div><hr></div><h2><span>Temporal/Brokers - Complexity relocated</span></h2><p><span>The common debate is framed as simplicity vs complexity. That&#8217;s not as well connected to any real first principles for us.</span></p><p><span>The real trade-off is:</span></p><ul><li><p><span>Local simplicity (Redis-first): fewer moving parts early, more custom semantics later</span></p></li><li><p><span>Systemic explicitness (Temporal/broker-first): more moving parts early, fewer implicit behaviors later</span></p></li></ul><p><span>Temporal/broker ecosystems buy us explicit workflow state, durable execution history, replay/debug affordances, and stronger long-running control primitives.</span></p><p><span>They also introduce:</span></p><ul><li><p><span>Platform dependency</span></p></li><li><p><span>New operational surface area</span></p></li><li><p><span>Team-wide learning tax</span></p></li><li><p><span>Higher blast radius when orchestration infra degrades</span></p></li></ul><div><hr></div><p><span>At this stage, it sounds fair to say neither is &#8220;better&#8221; by default.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2QCA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2QCA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2QCA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2QCA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2QCA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2QCA!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg" width="1200" height="669.7674418604652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:385887,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/205325532?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2QCA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2QCA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2QCA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2QCA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9804394-8f65-452b-8607-249c75a6b790_1376x768.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><span>Receipts from our own systems</span></h2><p><span>This is not theory, here are real issues (recorded on our internal tracking, but more generalized)</span></p><ol><li><p><span>Manual trigger gaps turn into compliance risk when workflow ownership is implicit.</span></p></li><li><p><span>Missing fail paths in queue processors silently drop obligations.</span></p></li><li><p><span>Small reliability defaults become large incident multipliers at scale.</span></p></li><li><p>Storage runs out with a tsunami spike - affects both brokered queues and redis-based queues</p></li><li><p><span>Cross-repo write/read split creates real execution drag in production fixes.</span></p></li><li><p><span>No audit trail on template mutation is not &#8220;small tooling debt&#8221;, it is operational blindness.</span></p></li><li><p><span>Even service-to-service auth details can fail in ways that look trivial but hurt recovery speed.</span></p></li><li><p><span>Temporal setup is explicitly heavier, even in docs, because you are buying orchestration primitives not just a queue.</span></p></li><li><p><span>Event infrastructure with Kafka/Event Hubs has clear setup and operational surface area beyond app logic.</span></p></li><li><p><span>We already encode &#8220;fail fast vs degrade gracefully&#8221; differently across repos. That alone tells you cost is contextual, not ideological.</span></p></li></ol><div><hr></div><h2><span>Cost Model: What Actually Bites in Production</span></h2><h3><span>1. Infra Cost</span></h3><p><span>Redis-first:</span></p><ul><li><p><span>Cheap baseline infra footprint</span></p></li><li><p><span>Predictable memory/network profile initially</span></p></li><li><p><span>Costs spike when adding sidecar services for delayed/retry/scheduling metrics</span></p></li></ul><p><span>Temporal/broker-first:</span></p><ul><li><p><span>Higher fixed platform cost from day one</span></p></li><li><p><span>Additional storage for event history/state</span></p></li><li><p><span>More cross-service network chatter</span></p></li><li><p><span>Often more expensive in low-volume workloads, relatively cheaper in high-coordination workloads</span></p></li></ul><p><span>Hidden cost in both:</span></p><ul><li><p><span>Observability spend (logs, traces, cardinality explosions, retention)</span></p></li><li><p><span>Peak-capacity headroom for incident scenarios, not average traffic</span></p></li></ul><h3><span>2. Maintenance Cost</span></h3><p><span>Redis-first:</span></p><ul><li><p><span>Policy logic drifts across services</span></p></li><li><p><span>Retry/backoff semantics fork over time</span></p></li><li><p><span>&#8220;One-off&#8221; processors accumulate bespoke behavior</span></p></li><li><p><span>Documentation lags actual queue behavior</span></p></li></ul><p><span>Temporal/broker-first:</span></p><ul><li><p><span>Versioning workflows/activities safely is non-trivial</span></p></li><li><p><span>Backward compatibility and migration discipline required</span></p></li><li><p><span>SDK/runtime upgrades can create broad churn</span></p></li><li><p><span>Platform ownership becomes a standing function, not a task</span></p></li></ul><h3><span>3. Debugging Cost</span></h3><p><span>Redis-first:</span></p><ul><li><p><span>Great for simple failure modes</span></p></li><li><p><span>Painful when failures are multi-step and asynchronous</span></p></li><li><p><span>Hard to reconstruct causal chains across retries and partial side effects</span></p></li></ul><p><span>Temporal/broker-first:</span></p><ul><li><p><span>Better execution history and traceability</span></p></li><li><p><span>Better post-facto reasoning for long workflows</span></p></li><li><p><span>New class of bugs: determinism/replay/versioning edge cases, activity timeouts, worker lifecycle behaviors</span></p></li></ul><p><span>Bottom line:</span></p><ul><li><p><span>Redis debugging pain is usually missing context.</span></p></li><li><p><span>Temporal debugging pain is usually semantic correctness under platform rules.</span></p></li></ul><h3><span>4. Scaling Cost</span></h3><p><span>Redis-first:</span></p><ul><li><p><span>Scales throughput quickly</span></p></li><li><p><span>Coordination semantics degrade first under scale (dedupe, ordering, retries, race windows)</span></p></li><li><p><span>More load reveals consistency gaps, not just capacity gaps</span></p></li></ul><p><span>Temporal/broker-first:</span></p><ul><li><p><span>Better scaling for multi-step orchestration and delayed/compensating flows</span></p></li><li><p><span>Throughput still bounded by worker design, activity latency, and downstream rate limits</span></p></li><li><p><span>Cluster sizing and partitioning strategy become first-order concerns</span></p></li></ul><h3><span>5. On-call and Incident Cost</span></h3><p><span>Redis-first incidents:</span></p><ul><li><p><span>Faster to triage initially</span></p></li><li><p><span>Longer tail for &#8220;why did this happen this way in this order?&#8221;</span></p></li><li><p><span>More manual compensations and data patching</span></p></li></ul><p><span>Temporal/broker-first incidents:</span></p><ul><li><p><span>Better forensic trail</span></p></li><li><p><span>More infra+app joint incidents</span></p></li><li><p><span>Requires stronger runbook quality and clearer ownership boundaries</span></p></li></ul><div><hr></div><h2><span>Competing Contexts (Where &#8220;Just Use X&#8221; Fails)</span></h2><h3><span>Use Redis-first when:</span></h3><ul><li><p><span>Jobs are short-lived and reversible</span></p></li><li><p><span>Throughput matters more than long-lived coordination</span></p></li><li><p><span>Failure impact is bounded and compensations are cheap</span></p></li><li><p><span>Team cannot yet justify orchestration platform ownership</span></p></li></ul><h3><span>Use Temporal/broker-first when:</span></h3><ul><li><p><span>Workflows are long-lived, stateful, or compliance-sensitive</span></p></li><li><p><span>We need explicit retries, timeouts, cancellation, and auditability</span></p></li><li><p><span>Cross-service coordination is core, not incidental</span></p></li><li><p><span>Failure cost is high enough to justify platform overhead</span></p></li></ul><h3><span>Use hybrid intentionally, not accidentally:</span></h3><ul><li><p><span>Redis for high-volume fire-and-forget lanes</span></p></li><li><p><span>Orchestrator for critical, multi-step, high-blast-radius paths</span></p></li><li><p><span>Shared invariants: idempotency keys, correlation IDs, retry taxonomy, dead-letter strategy</span></p></li></ul><p>The Hard Rule: If you find yourself building a complex state machine inside your Redis consumer logic&#8212;tracking status, retries, and conditions&#8212;you have already lost the bet. Port it to the Orchestrator, or simplify the requirement. Don't build a poor man's orchestrator in your queue code</p><div><hr></div><h2><span>A practical lens for other mid to senior teams</span></h2><p><span>Before choosing tooling, answer these clearly:</span></p><ul><li><p><span>What is the maximum acceptable ambiguity during incident reconstruction?</span></p></li><li><p><span>Which failures must be automatically recoverable vs manually compensable?</span></p></li><li><p><span>Where do we need strict audit trails?</span></p></li><li><p><span>What is the cost of being wrong: latency, money, trust, or compliance?</span></p></li></ul><p><span>If these are vague, architecture choice will </span>not resemble engineering, more<span> ideology.</span></p><p><strong><span>The Decision Matrix</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E5uj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E5uj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png 424w, https://substackcdn.com/image/fetch/$s_!E5uj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png 848w, https://substackcdn.com/image/fetch/$s_!E5uj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png 1272w, https://substackcdn.com/image/fetch/$s_!E5uj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E5uj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png" width="1260" height="534" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7d49059-4173-497f-96c3-7194f9072d13_1260x534.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:534,&quot;width&quot;:1260,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91036,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/205325532?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!E5uj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png 424w, https://substackcdn.com/image/fetch/$s_!E5uj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png 848w, https://substackcdn.com/image/fetch/$s_!E5uj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png 1272w, https://substackcdn.com/image/fetch/$s_!E5uj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7d49059-4173-497f-96c3-7194f9072d13_1260x534.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><span>Final Take</span></h2><p><span>Redis queues are still the best baseline for many systems. Temporal/brokers are not over-engineering by default; they are explicit bets on failure semantics and recoverability.</span></p><p><span>The wrong move is not as much choosing one over the other but it is pretending either comes without an operating cost.</span></p><p><span>Coming back to us - Our failure mode dictates what infrastructure we pick, in our case it has been both. As a first principle, we don&#8217;t optimize for architecture aesthetics at Swym, we optimize for recoverability. In other words - what&#8217;s the worst failure to handle before they happen as much as possible before we ship and proceed with iterative coverage. </span></p><p><span>Our undeniable belief to drive decisions - shipping isn't the win, owning the failure mode is the only path to win (even if it leads to failure some times).</span></p><h4><span>References</span></h4><ol><li><p><a href="https://github.com/taoensso/carmine/wiki/3-Message-queue">https://github.com/taoensso/carmine</a> &#8594; our primary clojure x redis library</p></li><li><p><a href="http://oldblog.antirez.com/post/250">http://oldblog.antirez.com/post/250</a> &#8594; old blog exploring lua based server-side scripting to handle queues over redis</p></li><li><p><a href="https://temporal.io/">https://temporal.io/</a></p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Opinion - Where is it `I` more than `AI` ]]></title><description><![CDATA[Bringing back the joy of building]]></description><link>https://stories.getswym.com/p/opinion-where-is-it-i-more-than-ai</link><guid isPermaLink="false">https://stories.getswym.com/p/opinion-where-is-it-i-more-than-ai</guid><dc:creator><![CDATA[Swym Stories]]></dc:creator><pubDate>Thu, 02 Jul 2026 08:56:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uuYN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI lowers (has lowered) the cost of getting from zero to a running software prototype to near-zero. Many mid-to-senior teams already know that. The harder part is the second curve: keeping the system reliable as reality around us gets noisy and context diverges.</p><p>We can build autonomous loops quickly now. Keeping them correct under change is where total cost shows up. Plus, it&#8217;s a lurking feeling for the many that the joy of building or craft has been taken away by AI (rightfully so in many cases), where does one find that sense of joy.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Below are points that tends to get underestimated when &#8220;AI&#8221; builds:</p><ul><li><p>Infra cost: model tokens, retries, tool-call fanout, queue/broker throughput, storage for traces/state, observability pipelines, network egress, and burst headroom for peak traffic.</p></li><li><p>Maintenance cost: prompt drift, model/version churn, schema evolution, integration contract changes, policy updates, and regression hardening as edge cases accumulate.</p></li><li><p>Debugging cost: non-deterministic behavior, partial failures across steps, weak replayability, missing correlation IDs, and long-tail failures that only appear under specific load and data shapes.</p></li><li><p>Scaling cost: latency budgets across multi-hop flows, concurrency controls, backpressure, idempotency guarantees, rate-limit strategy, and contention on shared dependencies.</p></li><li><p>Operational cost: on-call handling, runbook quality, incident triage loops, recovery automation, and the ownership tax of &#8220;works in dev, flakes in prod.&#8221;</p></li><li><p>Opportunity cost: time spent stabilizing orchestration instead of shipping product leverage tied to measurable outcomes.</p></li></ul><p>None of this means &#8220;don&#8217;t build with AI.&#8221; It means choosing the autonomy level intentionally. Competing contexts that are often better than full autonomy:</p><ul><li><p>Human-in-the-loop workflows for high-impact or low-frequency decisions where correctness matters more than throughput.</p></li><li><p>Deterministic workflow engines/state machines for compliance-heavy paths where auditability and replay are non-negotiable.</p></li><li><p>Simple queue-plus-worker pipelines for narrow, well-bounded jobs where complexity overhead of agentic control planes is not justified.</p></li><li><p>SaaS/off-the-shelf automation for non-differentiated operations where build cost cannot beat buy cost over 12-18 months.</p></li><li><p>Manual ops with strong tooling for early-stage capabilities where problem definition is still moving faster than architecture should.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uuYN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uuYN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uuYN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uuYN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uuYN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uuYN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:523324,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/204591722?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!uuYN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uuYN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uuYN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uuYN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5ec61d1-2f59-4bfe-8d8e-f6d745ba2cd0_1376x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A practical rule for I&#8217;ve found useful for experienced builders:</p><ul><li><p>Autonomy is worth it when the task is high-volume, low-ambiguity, reversible, and measurable. The gains will compound.</p></li><li><p>Assistance is better when the task is light/sparse, high-ambiguity, or has large blast radius.</p></li><li><p>If success criteria cannot be expressed as clear invariants, don&#8217;t close the loop yet. It&#8217;s simply premature.</p><p></p></li></ul><p>Build because it is useful or because it is a deliberate learning bet. Not because it is fun to automate everything that moves. Fun is a valid reason for exploration. It is a weak reason for production/business ownership. </p><p>With that context, it may even get easier to discover new paths to the joy of building.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[BTS: 5 minutes to 25 ms]]></title><description><![CDATA[How a 130M+ Row PostgreSQL feed went from 5 minutes to 35 milliseconds]]></description><link>https://stories.getswym.com/p/bts-5-minutes-to-25-ms</link><guid isPermaLink="false">https://stories.getswym.com/p/bts-5-minutes-to-25-ms</guid><dc:creator><![CDATA[Lezwon Castelino]]></dc:creator><pubDate>Thu, 02 Jul 2026 05:38:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5t50!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In high-volume e-commerce analytics, delivering real-time performance tracking to merchants is a hard technical requirement. Merchants expect to open a dashboard and see instantly whether a specific &#8220;Back in Stock&#8221; or &#8220;Price Drop&#8221; campaign generated meaningful revenue.</p><p>We recently tackled a massive performance bottleneck on one of our core feature feeds: the <strong>Sent Alerts Report</strong>. This report provides a dashboard with all the details of notifications that were sent out to the shoppers of a particular store. i.e If someone was alerted of a price drop via email, this report would have the product details, the email details, the date and status and also if it converted to an order.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><ul><li><p><strong>The Dataset:</strong> 131 M rows (and growing).</p></li><li><p><strong>The Core Bottleneck:</strong> Initial dashboard loads were clocking in at an unacceptable <strong>305 seconds (over 5 minutes)</strong>.</p></li><li><p><strong>The Target:</strong> </p><ul><li><p>Sub-second latency (~50ms) for any filter, search, or sort operation.</p></li><li><p>Sortable by sent date and revenue</p></li><li><p>Searchable by product name, SKU, product ID or user email</p></li><li><p>Filterable by click action, purchased filter</p></li></ul></li></ul><p>Here is engineering playbook of how we completely restructured our storage and query patterns on a distributed PostgreSQL (<strong>Citus</strong>) cluster to achieve a <strong>6,000x speed improvement</strong>.</p><h2>1. The Anatomy of a Slow Query: &#8220;The Real-Time Funnel Tax&#8221;</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5t50!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5t50!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png 424w, https://substackcdn.com/image/fetch/$s_!5t50!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png 848w, https://substackcdn.com/image/fetch/$s_!5t50!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png 1272w, https://substackcdn.com/image/fetch/$s_!5t50!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5t50!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png" width="1456" height="2610" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2610,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1211794,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lezwon.substack.com/i/188108213?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!5t50!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png 424w, https://substackcdn.com/image/fetch/$s_!5t50!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png 848w, https://substackcdn.com/image/fetch/$s_!5t50!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png 1272w, https://substackcdn.com/image/fetch/$s_!5t50!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76398047-f1d2-47da-9794-bc7bceac73bd_4196x7523.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Our original query pattern followed a classic database anti-pattern. Every time a user loaded the dashboard, the database was forced to dynamically reconstruct the entire report from scratch across multiple massive tables:</p><ol><li><p><strong>The Live Funnel Stitching:</strong> To determine if a specific alert worked, it had to left-join raw dispatch logs against click attributions. Then, it joined those clicks to order records and multiple attribution revenue logs to calculate the financial ROI.</p></li><li><p><strong>Row Inflation:</strong> It simultaneously joined those records against raw product catalog and variant attribute tables. Because a single product item can have multiple distinct attributes (e.g., Size: Large, Color: Red), a 5-million-row dataset exploded into over 11 million intermediate rows in memory.</p></li><li><p><strong>The Real-Time Aggregation Penalty:</strong> To squash those inflated rows back down into a clean dashboard view, it performed heavy <code>SUM(order_line_value)</code> calculations and a <code>json_agg()</code> to bundle variant metadata. This forced a massive <code>GROUP BY</code> on more than 20 long text strings and URLs.</p></li><li><p><strong>The 5.5 GB Disk Spill:</strong> Because the database couldn&#8217;t fit this massive, un-indexed intermediate dataset in RAM, it resorted to an <code>external merge disk sort</code>. The coordinator node thrashed SSDs sorting millions of fully joined records just to return the top 25 most recent rows.</p></li></ol><pre><code><code>-- EXPLAIN ANALYZE snippet showing the carnage:
Sort Method: external merge  Disk: 5513880kB
Execution Time: 305439.394 ms  -- 5.09 minutes!</code></code></pre><h2>Step 1: The Architectural Solution: A Denormalized Read Model</h2><p>To solve this sustainably, we decoupled our highly write-intensive transactional tables from the analytics layer. We introduced a dedicated read-optimized table called <code>analytics.enriched_alerts_feed</code>, sharded across our database worker nodes by <code>account_id</code>.</p><p>We split our data into two distinct classifications:</p><ul><li><p><strong>Immutable Historical Facts:</strong> The email address, dispatch channel (email, sms), and alert type (price drop, restocked) <em>never change</em> after transmission. We copy these directly into the new read model, pre-calculating the union between successful dispatches and failures.</p></li><li><p><strong>Mutable Performance Metrics:</strong> Clicks and total revenue fluctuate in the days following a broadcast. These are updated asynchronously via background micro-batches.</p></li></ul><p>By trading a small amount of disk space for massive compute savings, we completely removed the overhead of the dynamic <code>UNION</code> and on-the-fly math.</p><h2>Step 2: Hitting the Indexing Sweet Spot</h2><p>A typical store&#8217;s conversion rate hovers around 2% to 5%. If we built a standard index on revenue across 131 million rows, the database would waste valuable memory indexing a sea of zeros.</p><p>Instead, we built <strong>Partial Indexes</strong>:</p><p>SQL</p><pre><code><code>CREATE INDEX idx_enriched_revenue 
ON analytics.enriched_alerts_feed (account_id, sent_date DESC) 
WHERE total_revenue &gt; 0;</code></code></pre><p>This tells PostgreSQL: <em>Only index rows that actually made money.</em> This index is tiny, lives entirely in RAM, and allows a dashboard filter like <code>"Show me only conversions"</code> to execute via an instant index seek in under <strong>15 milliseconds</strong>.</p><h3>The Multi-Column &#8220;Google Bar&#8221; Search</h3><p>Users wanted a single search bar to look up a customer&#8217;s email, a specific SKU, or an external platform ID simultaneously. Instead of chaining heavy <code>OR</code> predicates that confuse the query planner and break index adoption, we created a single <code>search_vector</code> text field.</p><p>At the exact millisecond an alert read-model entry is created, we evaluate the entity data and snapshot a lowercase string directly into a <strong>GIN Trigram Index</strong>:</p><p>SQL</p><pre><code><code>CREATE INDEX idx_enriched_search_vector 
ON analytics.enriched_alerts_feed USING GIN (search_vector gin_trgm_ops);
</code></code></pre><p>Fuzzy substring queries like <code>WHERE search_vector ILIKE '%nike%'</code> now evaluate instantly across billions of characters.</p><h2>Step 3: Architecting an Idempotent Revenue Pipeline</h2><p>Computing the financial attribution tied to an alert means matching dispatches to downstream user clicks, and then matching those clicks to final receipts.</p><p>Running an aggregate calculation over a 6-month window is devastating for performance. To solve this, we track a persistent cursor in a metadata table and process updates incrementally every 15 minutes.</p><p>To ensure the process is entirely <strong>production-grade and retry-safe</strong>, the pipeline avoids additive accumulation (<code>total_revenue = total_revenue + new_value</code>), which would double-count sales if a job failed halfway through and restarted. Instead, it utilizes an <strong>Absolute Overwrite</strong> snapshot pattern:</p><p>SQL</p><pre><code><code>-- An idempotent, retry-safe metric update block
WITH recent_activity AS (
    SELECT attribution_id, account_id, order_line_value
    FROM analytics.windowed_revenue_matches
    WHERE updated_at &gt;= (SELECT last_processed_at FROM analytics.job_cursors WHERE job_name = 'revenue_sync')
    UNION ALL
    SELECT attribution_id, account_id, order_line_value
    FROM analytics.direct_revenue_matches
    WHERE updated_at &gt;= (SELECT last_processed_at FROM analytics.job_cursors WHERE job_name = 'revenue_sync')
),
absolute_totals AS (
    SELECT a.alert_id, a.account_id, SUM(ra.order_line_value) as fresh_sum
    FROM recent_activity ra
    JOIN analytics.click_attributions a USING (attribution_id, account_id)
    GROUP BY a.alert_id, a.account_id
)
UPDATE analytics.enriched_alerts_feed en
SET total_revenue = alt.fresh_sum,
    has_purchase = (alt.fresh_sum &gt; 0),
    is_clicked = true
FROM absolute_totals alt
WHERE en.alert_id = alt.alert_id
  AND en.account_id = alt.account_id;</code></code></pre><h2>Step 4: Deferring the Cost with Late Materialization &amp; Lateral Seeks</h2><p>The final phase of our performance breakthroughs came down to query restructuring. Our API query now enforces <strong>Late Materialization</strong>.</p><p>Instead of joining heavy product titles, text blobs, and asset URLs across millions of records, sorting them, and keeping the top 25, we isolated our layout. We execute the filters, cursor pagination, and search criteria entirely on the optimized <code>enriched_alerts_feed</code> table first.</p><p>Once the database identifies the exact 25 or 50 <code>alert_id</code> values needed for the screen, we pass those specific keys into a late, high-speed lookup join to hydrate the human-readable product images and master catalog records.</p><p>To resolve the <strong>product attribute row inflation</strong>, we swapped out the heavy global <code>JOIN</code> and <code>GROUP BY</code> pattern. Instead, we use an isolated scalar subquery lookup that runs exactly 25 times only on the finalized dataset, packing the attributes directly into a clean JSON array without duplicating rows.</p><h2>6. The Outcome</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y6I6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y6I6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png 424w, https://substackcdn.com/image/fetch/$s_!y6I6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png 848w, https://substackcdn.com/image/fetch/$s_!y6I6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png 1272w, https://substackcdn.com/image/fetch/$s_!y6I6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y6I6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png" width="1456" height="1228" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1228,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1245942,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lezwon.substack.com/i/188108213?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!y6I6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png 424w, https://substackcdn.com/image/fetch/$s_!y6I6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png 848w, https://substackcdn.com/image/fetch/$s_!y6I6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png 1272w, https://substackcdn.com/image/fetch/$s_!y6I6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6f7979a-d01c-4e0a-b995-cb3aa6ac3226_6093x5137.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>By treating our database engine as a strategic collaborator; rethinking data access through read models, leveraging partial indexes, and structuring robust, batch-isolated ingestion pipelines, the metrics speak for themselves:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TV22!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TV22!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png 424w, https://substackcdn.com/image/fetch/$s_!TV22!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png 848w, https://substackcdn.com/image/fetch/$s_!TV22!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png 1272w, https://substackcdn.com/image/fetch/$s_!TV22!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TV22!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png" width="1456" height="441" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:441,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152964,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lezwon.substack.com/i/188108213?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!TV22!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png 424w, https://substackcdn.com/image/fetch/$s_!TV22!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png 848w, https://substackcdn.com/image/fetch/$s_!TV22!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png 1272w, https://substackcdn.com/image/fetch/$s_!TV22!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4aed09f6-ee06-429a-98d3-31149f34766f_2180x660.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Designing systems to scale seamlessly from millions to billions of rows requires shifting workloads from CPU-heavy on-the-fly aggregations into linear, index-driven seeks. Disk space is cheap; sub-millisecond execution loops are priceless.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From Zero to Production: Lessons from Building Alfred]]></title><description><![CDATA[Even Batman needed Alfred.]]></description><link>https://stories.getswym.com/p/from-zero-to-production-lessons-from</link><guid isPermaLink="false">https://stories.getswym.com/p/from-zero-to-production-lessons-from</guid><dc:creator><![CDATA[Saai Sudarsanan D]]></dc:creator><pubDate>Fri, 12 Jun 2026 11:47:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Vsqj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Problem: Why was Alfred even needed?</h2><p>Being in SRE means you get comfortable with one thing above everything else: <em>being woken up at 2 AM</em> &#129394;</p><p><em>Most of the time, the problem wasn&#8217;t that deeply hidden. A few minutes in the logs, a quick look at traces, and you&#8217;d have your answer. But &#8220;a few minutes&#8221; is relative when you&#8217;re half-asleep, switching between Grafana dashboards, OpenSearch, and Jaeger, trying to figure out which of the hundred signals in front of you actually matters.</em></p><p>The real cost wasn&#8217;t the hard incidents. It was the easy ones that ate time &#8212; not because they were complicated, but because debugging is fundamentally a <em><strong>searching</strong></em> problem. You have all the data. Finding the right slice of it is the work.</p><p>On-call engineers would take the first pass. Only if they were stuck would it escalate to the DevOps team. That handoff had latency, context loss, and a low ceiling on how fast any single person could move through the observability stack.</p><p>We&#8217;d already experimented with giving Claude access to OpenSearch log data <strong>via MCP, with built-in sanitisation</strong>. It worked. But we wanted to use Gemini, and around that time, something called Open-Claw was making the rounds, and people were genuinely worried that AI would replace engineers. I was handed this project, and I&#8217;ll be honest: I wanted to prove the paranoia right. Not about replacing engineers, but about what was actually possible.</p><p>I went through names. Bobby, Anton, Namma Copilot, before landing on Alfred. Because even Batman needed one.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe to read more stories from Swym!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2><strong>The Tool Stack</strong></h2><p>Alfred doesn&#8217;t query dashboards. It doesn&#8217;t parse Slack alerts and hope someone left a runbook. It talks directly to the raw data, at query time, across four observability backends and a production cluster. Here&#8217;s what that looks like under the hood.</p><h3>Architecture: Two Layers, One Surface</h3><h4>The Observability Surface - MCP Proxy</h4><p><code>mcp-proxy</code> is the core tool server. Prometheus, OpenSearch, Jaeger, and GitHub are each mounted as independent FastMCP modules with explicit namespaces. Alfred talks directly to it.</p><p><strong>Prometheus: </strong>Write and execute raw PromQL &#8212; instant queries, range queries, label discovery, metric metadata. No dashboards, no pre-built panels. Alfred constructs the query itself.</p><p><strong>OpenSearch: </strong>Full Query DSL across every prod log index, scoped to a namespace or service. Index inspection, cluster health, text analysis. </p><p><strong>Jaeger: </strong>Trace search by service, operation, duration, or error tag. Full span-level detail, per-service timing breakdowns, live service dependency graph. When something is slow, Alfred finds where the time went.</p><p><strong>GitHub: </strong>Read issues and PRs freely. Write operations, such as creating issues or comments, require human approval in Slack.</p><h3>Shell Access</h3><p>Knowing what&#8217;s broken is half the job. Alfred needed to <em>run queries</em>, <em>inspect cluster state</em>, <em>tail live logs</em>, and <em>dig into data that lives outside the observability stack</em>. That meant a shell. And <strong>giving an AI a shell on a production cluster</strong> is exactly as interesting <strong>a security problem</strong> as it sounds.</p><p>The original design was simple: <code>shell=True</code>, run commands, done. That lasts until you think about it for five minutes.</p><p><code>shell=True</code> In Python, you hand your command string directly to <code>/bin/sh</code>. That means <code>curl | bash</code>.</p><p>It means, </p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">kubectl get pods &amp;&amp; cat /var/run/secrets/kubernetes.io/serviceaccount/token :(</code></pre></div><p><strong>PATH poisoning, background processes, redirects, subshells. You haven&#8217;t given Alfred a tool &#8212; you&#8217;ve given him a terminal with production credentials!!</strong></p><p>So we rebuilt it around <code>shell=False</code>. In Python&#8217;s <code>subprocess.run</code>, <code>shell=False</code> bypasses the shell entirely &#8212; the command string is parsed into an argv list by <code>shlex.split</code> and handed directly to the OS. There is no shell process, no environment expansion, no pipe interpretation. <code>curl | bash</code> It isn&#8217;t dangerous anymore. It&#8217;s a syntax error in the argv parser.</p><p>And on top of it, the access,</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_eq4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_eq4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png 424w, https://substackcdn.com/image/fetch/$s_!_eq4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png 848w, https://substackcdn.com/image/fetch/$s_!_eq4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png 1272w, https://substackcdn.com/image/fetch/$s_!_eq4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_eq4!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png" width="1200" height="276.0989010989011" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb587240-83b4-43f0-af50-088bb5019274_1902x438.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:335,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:153686,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/200097991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_eq4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png 424w, https://substackcdn.com/image/fetch/$s_!_eq4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png 848w, https://substackcdn.com/image/fetch/$s_!_eq4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png 1272w, https://substackcdn.com/image/fetch/$s_!_eq4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb587240-83b4-43f0-af50-088bb5019274_1902x438.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Alfred can inspect Kubernetes clusters, query ClickHouse, tail pod logs with <code>stern</code>, and read files it's been explicitly given access to. It cannot do anything else. Alfred can read, list, find, and grep files using tools built with Python only on directories Alfred is allowed to search and read, i.e, <code>/research</code> and <code>/scratch</code></p><p>All the security implementation is done in code, not using prompts that plead &#8220;please, don&#8217;t delete anything.&#8221; </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g30o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g30o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png 424w, https://substackcdn.com/image/fetch/$s_!g30o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png 848w, https://substackcdn.com/image/fetch/$s_!g30o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png 1272w, https://substackcdn.com/image/fetch/$s_!g30o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g30o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:144279,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/200097991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g30o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png 424w, https://substackcdn.com/image/fetch/$s_!g30o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png 848w, https://substackcdn.com/image/fetch/$s_!g30o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png 1272w, https://substackcdn.com/image/fetch/$s_!g30o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81e3dd92-8f09-4ca0-a386-007ff16565a8_2316x1312.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>Knowledge: swym knowledge + qmd</strong></h3><p>The third server gives Alfred a semantic search over Swym&#8217;s internal <code>systemic-knowledge</code> repo &#8212; architecture diagrams, incident postmortems, operational runbooks, data flow docs. Before Alfred touches a single tool on any non-trivial task, it runs two lookups in parallel:</p><p><em><strong>find_skills(query)</strong></em> | | <em><strong>qmd.query(lex + vec)</strong></em></p><p><strong><a href="https://github.com/tobi/qmd">QMD by Tobi Lutke</a></strong> is a mini CLI search engine that runs entirely on your local machine, designed to search your personal docs, notes, meeting transcripts, and knowledge bases. It has 16.5k stars on GitHub, which speaks to how useful people find it.</p><p>What makes it stand out is that it combines three search techniques under the hood: BM25 full-text search for fast keyword matching, vector semantic search for finding meaning rather than exact words, and LLM re-ranking to sort results by true relevance. All of this runs locally using GGUF models, so nothing ever leaves your device.</p><p>It also exposes an MCP server, meaning you can connect it directly to Claude or other AI agents and give them access to your local documents when answering questions. This makes it a powerful tool for agentic workflows.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">qmd collection add ~/notes --name notes
qmd embed
qmd query "what did we decide about the API design?"</code></pre></div><p>Skills give the procedure. Knowledge gives the context.</p><p>The interesting engineering is in the deployment. <code>qmd</code> binds to <code>127.0.0.1</code> by design, built for local use, not Kubernetes pod-to-pod traffic. Rather than fork the binary, we added an nginx sidecar: nginx owns <code>0.0.0.0:3333</code> and proxies to qmd on <code>127.0.0.1:3334</code>. The right call was to not touch QMD&#8217;s code at all. Solve the networking problem at the infrastructure layer, keep the third-party binary clean.</p><p>Cold start pulls ~2GB of GGUF embedding models once and caches them to a PVC. Every restart after that is warm. The repo syncs every 10 minutes using an incremental, mtime-based process with no full rebuilds required. <br><em>Cold means the model needs to be downloaded and does not already exist on disk, which would take a long time. Warm means that it exists on disk and I don&#8217;t have to re-download it.</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kiKI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kiKI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png 424w, https://substackcdn.com/image/fetch/$s_!kiKI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png 848w, https://substackcdn.com/image/fetch/$s_!kiKI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png 1272w, https://substackcdn.com/image/fetch/$s_!kiKI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kiKI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png" width="1456" height="295" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:295,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84464,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/200097991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kiKI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png 424w, https://substackcdn.com/image/fetch/$s_!kiKI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png 848w, https://substackcdn.com/image/fetch/$s_!kiKI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png 1272w, https://substackcdn.com/image/fetch/$s_!kiKI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88a7baf8-8374-4a1e-a8bc-c380664f0ac3_2469x500.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>The Redaction Layer</h3><p>Every response from every tool passes through a middleware layer before Alfred sees it. No per-tool configuration, no code changes needed. To add redaction for a new tool, add its namespace prefix to a list.<em> </em>By extracting the source namespace from tool names like <code>opensearch_search_documents</code> and <code>jaeger_get_trace</code>, the mechanism determines if the source requires sanitization and strips sensitive data in-flight. Alfred receives a clean response. The raw data never travels further than it needs to.</p><p>The sanitisation logic lives in one place: <code>commonlib/sanitize.py</code>, a shared package mounted as a dependency across every service. <code>mcp-proxy</code> uses it in the redaction middleware. <code>shell-access</code> applies it directly to the subprocess output. <code>jaeger_tools.py</code> calls it inline on span tags and log fields before they even leave the tool. One source of truth. No duplicated patterns, no diverging redaction rules across services. Every service (mcp-proxy, shell-access, core, slack-integration) imports the same package. One place to update a redaction pattern. No risk of one service leaking what another strips.</p><p>An LLM that can read your database connection strings and also write GitHub issues is a different threat model entirely. The redaction layer is why Alfred can have broad access to tools without it becoming a liability.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3ao3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3ao3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png 424w, https://substackcdn.com/image/fetch/$s_!3ao3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png 848w, https://substackcdn.com/image/fetch/$s_!3ao3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png 1272w, https://substackcdn.com/image/fetch/$s_!3ao3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3ao3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png" width="462" height="298.58653846153845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:462,&quot;bytes&quot;:230483,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/200097991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3ao3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png 424w, https://substackcdn.com/image/fetch/$s_!3ao3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png 848w, https://substackcdn.com/image/fetch/$s_!3ao3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png 1272w, https://substackcdn.com/image/fetch/$s_!3ao3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b7a2f2-13c1-43f8-8e43-60c649bdf232_2581x1668.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>MCP-Gateway: Engineers Get This Too</h3><p>Engineers have direct access through mcp-gateway to every tool Alfred uses, including Prometheus, OpenSearch, Jaeger, GitHub, shell access, and qmd. It&#8217;s a thin FastMCP aggregator, proxied through Teleport (a popular reverse proxy software), that fronts all three backend servers behind a single MCP endpoint. Claude Code and Copilot connect here. Adding a new backend is one line in a config file. No restarts, no code changes.</p><div><hr></div><h2>Flow of a Query</h2><p>When you mention Alfred in Slack, a lot happens before you see a reply. Here&#8217;s the full lifecycle.</p><h3>Why Gemini and Slack</h3><p>Alfred runs on Gemini. Swym has data usage contracts with Google, and because Google has a better chance of surviving the current AI landscape than most. Model choice isn&#8217;t always a technical decision. Gemini also offered better usage limits and a per-million-tokens cost, even for its best models.</p><p>The interface choice was never really a choice. Swym runs on Slack. Incidents get reported there, and engineers are already watching it. A separate UI would&#8217;ve meant one more thing to open at 2 AM. Slack meant Alfred lived where the conversation already was.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vsqj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vsqj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif 424w, https://substackcdn.com/image/fetch/$s_!Vsqj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif 848w, https://substackcdn.com/image/fetch/$s_!Vsqj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif 1272w, https://substackcdn.com/image/fetch/$s_!Vsqj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vsqj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif" width="900" height="620" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82f3868a-0548-4930-bd89-5362e554640c_900x620.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:620,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:194967,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/200097991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vsqj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif 424w, https://substackcdn.com/image/fetch/$s_!Vsqj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif 848w, https://substackcdn.com/image/fetch/$s_!Vsqj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif 1272w, https://substackcdn.com/image/fetch/$s_!Vsqj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f3868a-0548-4930-bd89-5362e554640c_900x620.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Step 1: <strong>The Message Arrives</strong></h4><p>The Slack message hits <em>slack-integration</em> and gets written to the <code>slack_ingress</code> Redis stream, and is picked up by whichever <code>core</code> pod wins the consumer group race. Session identity is derived immediately: <code>SHA256(channel_id + thread_ts)</code>. Every message in the same Slack thread maps to the same session, regardless of which pod handles it.</p><p>If the session already has an active task running, the new message gets queued. Alfred processes one task per session, strictly in order, with no interleaving.</p><p><strong>Why Slack Threads?</strong> A Slack thread is already a conversation, inherently dedicated to a single incident, question, or moment. Alfred treats it exactly that way. The conversation boundary was already there; Alfred just respects it.</p><p><strong>Why Session IDs?</strong> Any pod can handle any session. Redis streams deliver each message to exactly one consumer, meaning Alfred gets horizontal scaling for free without needing to build custom load balancing.</p><h4>Step 2: Memory Merge</h4><p>Before Gemini sees anything, Alfred loads the session&#8217;s conversation history from Postgres (STM - Short Term Memory) and merges it with the incoming messages, deduplicating by Slack <code>ts</code>. When the full history exceeds 800K tokens, it is compacted by dropping the oldest messages first. Alfred then builds the system prompt from assembled prompt files and opens the Gemini chat session.</p><p>Alfred also has a second memory tier: LTM (Long-Term Memory), stored as Markdown files on the shell-access pod and exposed as MCP tools. Unlike STM, which is automatic, LTM is deliberate. Alfred writes to it when it learns something worth keeping across sessions, and queries it during the pre-task routine. Consequently, insights such as a fix that worked, a recurring pattern, or a user preference survive beyond the conversation.</p><p><em><strong>STM is what happened in this thread. LTM is what Alfred has learned from every thread.</strong></em></p><h4>Step 3: The First Gemini Call</h4><p>The user&#8217;s message goes to Gemini. Gemini&#8217;s first response almost always includes tool calls. This is by design. The system prompt mandates a silent pre-task routine before Alfred responds to anything:</p><ol><li><p><code>find_skills(keyword)</code> &#8212; search for a matching playbook. If one matches <code>read_skill(name)</code> and follows it exactly. Skills are canonical procedures, not suggestions.</p></li><li><p>For any non-trivial task &#8212; incident, investigation, performance issue &#8212; <code>query</code> the knowledge base with both lexical and vector sub-queries, in parallel with the skills lookup.</p></li><li><p>Check long-term memory if relevant.</p></li></ol><p>Skills follow Claude Code&#8217;s native format, utilising the exact SKILL.MD structure found in Claude Code. That means any skill written for Claude Code works for Alfred out of the box, and the skills engineers write for Alfred can be used by Claude Code, too. One format, two agents, shared playbook library.</p><p>Alfred doesn&#8217;t decide whether to do this. The prompt requires it. Skills give the procedure. Knowledge gives the context. LTM surfaces anything Alfred has learned from previous sessions. All three fire before Alfred touches a single observability tool.</p><h4>Step 4: The Tool Loop</h4><p>Once the pre-task lookups are complete, Alfred enters the agentic loop. Gemini issues tool calls. Alfred executes them, feeds results back, and gets the next response. This continues until Gemini stops issuing tool calls or the iteration limit (30) is hit.</p><p>Two rules govern execution:</p><ul><li><p><strong>Read-only tools run in parallel</strong> &#8212; <code>asyncio.gather</code> across all concurrent reads</p></li><li><p><strong>Mutating tools run serially</strong> &#8212; one at a time, in order, after all reads complete</p></li></ul><p>Every N iterations (configurable), a one-shot Gemini Flash call summarises the pending tool calls and posts an italicised status line to Slack. For long-running investigations, the user isn&#8217;t staring at a spinner but rather watches Alfred&#8217;s working notes update in real time.</p><p>If an approval-gated tool comes up &#8212; <code>github_create_issue</code>, <code>github_comment_on_issue</code> &#8212; The loop pauses. Alfred posts a Slack message with Approve/Deny buttons and blocks on a Redis key. </p><h4>Step 5: The Reply</h4><p>When Gemini returns a text response with no further tool calls, Alfred posts it to Slack, appends it to STM, and increments the session token counter. If the response is empty, which happens occasionally, Alfred nudges Gemini with a summarisation prompt up to four times with linear backoff (1s, 2s, 3s, 4s) before giving up.</p><p>The session stays alive. The next message in the thread picks up exactly where this one left off.</p><p><strong>Steering Commands</strong></p><p>Users can intervene mid-flight:</p><p><em>!interrupt </em>: Cancels the active task and clears the entire queue for this session.</p><p><em>!interrupt-one </em>: Cancels only the active task; queued messages still run</p><p><em>!tokens </em>: Reports total token usage for this session</p><div><hr></div><h3>Approvals for Alfred</h3><p>Alfred can write to GitHub to open issues and leave comments. Early on, it could do that freely. It didn&#8217;t take long to find out why that was a problem: Alfred raised two GitHub issues that nobody asked for. Far from malicious or buggy, it was just a confident agent that had the tools and decided to use them.</p><p>That was the moment we added the approval gate.</p><p>Now, before Alfred touches anything that can&#8217;t be undone, it stops and asks. It posts a message to Slack explaining what it&#8217;s about to do in plain English, rather than using tool names and arguments, along with two buttons: Approve and Deny. Alfred waits. A human clicks. Only then does it proceed.</p><p>If nobody clicks within 5 minutes, it auto-denies and moves on.</p><p>Every decision is logged, capturing what the tool was, what it was going to do, who approved or denied it, and when. The audit trail is permanent. </p><p>One thing worth calling out: waiting for approval only pauses that one conversation. Every other engineer talking to Alfred in a different thread continues unaffected. Rather than freezing while it waits for a human, Alfred simply sets that one session aside until someone responds.</p><div><hr></div><h3>What&#8217;s Next?</h3><p>Alfred is in production. It handles real incidents, triages real alarms, and has already paid for itself, specifically by surfacing codebase inefficiencies that led to meaningful cost reductions. What started as a 2 AM problem is now second nature for everyone at Swym. Engineers don&#8217;t open Grafana first anymore. <strong>They ask Alfred</strong>.</p><p>The next frontier is turning that inward. Alfred has full visibility into production, yet we have no visibility into Alfred. We&#8217;re building observability for Alfred itself: tracing every query, measuring response quality, understanding where it gets stuck, and why. An agent that investigates your infrastructure should be just as observable as the infrastructure it investigates.</p><p>There&#8217;s more on the roadmap, including semantic LTM, tighter shell controls, and broader tool coverage. But the foundation is solid. Alfred is pulling more than its weight, and we&#8217;re only getting started.</p><p>At Swym, we don&#8217;t wait for AI to mature before we use it. We build with it, ship it to production, and iterate. Alfred is the proof of what that looks like when you take it seriously.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe to read more stories from Swym!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Shipping AI Agents in Production: The WebSocket Problem Nobody Warned Me About]]></title><description><![CDATA[I built a Storefront Agent that spins up a real Chrome browser, browses and debugs live Shopify storefronts, and streams results over WebSockets.]]></description><link>https://stories.getswym.com/p/shipping-ai-agents-in-production</link><guid isPermaLink="false">https://stories.getswym.com/p/shipping-ai-agents-in-production</guid><dc:creator><![CDATA[Ishaan Shettigar]]></dc:creator><pubDate>Mon, 01 Jun 2026 11:11:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f72010ac-d2e3-40da-99ee-424c1ee8eb64_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I built a Storefront Agent that spins up a real <strong>Chrome browser</strong>, browses and debugs <strong>live Shopify storefronts</strong>, and streams results over WebSockets. When I deployed it to production on <em><strong>Kubernetes</strong></em>, it worked perfectly. <em><strong>Until it didn&#8217;t</strong></em>.</p><p>The failure was bizarre from the outside. Someone would trigger an agent run from the dashboard. The agent would start. Then the WebSocket connection would fail. Sometimes a retry worked. Sometimes it took three tries. No consistent pattern. No obvious error in the code. Mind you, the agent was actually continuing to run in the background, it was the WebSocket connection that was failing.</p><p>Here is what was actually happening.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new stories and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h3>My naive assumption</h3><p>I had worked with REST APIs a lot. This was my first time shipping something over <strong>WebSockets</strong>, and I naively assumed it would behave the same way. I had never had to think about how <strong>K8s</strong> (Kubernetes) routes traffic because REST just works. That changed the moment I used WebSockets.</p><p>The reason REST &#8220;just works&#8221; is that every REST request is stateless. It doesn&#8217;t matter which pod handles it because no pod holds any memory of the previous request. Kubernetes can round-robin requests across every pod in your deployment and everything is fine.</p><p>WebSockets are fundamentally different. The connection stays open for the entire lifetime of the agent run. And the state it needs -- a live Chrome process -- exists on exactly one pod. So the connection has to reach that pod</p><p>Here is what was happening on every failure:</p><pre><code><code>POST /agents/run  &#8594;  Pod A  &#8592; Chrome starts here, run state stored here
WS   /agents/ws   &#8594;  Pod B  &#8592; Kubernetes round-robins here
                              Pod B: "Run not found" &#8594; connection fails</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!alQy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!alQy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!alQy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!alQy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!alQy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!alQy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5161980,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/199454300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!alQy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!alQy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!alQy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!alQy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a721e6c-42e1-4290-8002-5533b162fdf9_2752x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The POST request that starts the run lands on Pod A. Pod A spins up Chrome, starts the agent orchestrator, and stores the run state in memory. Then the WebSocket connection comes in and Kubernetes routes it to Pod B. Pod B has never heard of this run. Connection fails.</p><p>That is the entire problem. REST is stateless so it does not care which pod it hits. My agent is not stateless because <strong>Chrome is running on exactly one pod</strong>.</p><div class="callout-block" data-callout="true"><p>One more thing worth noting here: my WebSocket client was not a browser. It was another backend service that then forwarded the stream to its own frontend. This matters because one of the first solutions I looked at (cookie-based sticky sessions) relies on a browser faithfully replaying cookies on every request. A backend service does not do that reliably. So that option was out immediately.</p></div><div><hr></div><h3>The amplification loop I did not see coming</h3><p>Here is the part that made this genuinely painful to debug.</p><p>Chrome is heavy. A single browser session eats serious memory. When multiple agent runs were in flight simultaneously (some user-triggered, some fired by automated business events) the memory pressure caused Kubernetes HPA (Horizontal Pod Autoscaler) to spin up additional pods.</p><p>More pods means the probability of a WebSocket connection landing on the wrong pod goes up. <em><strong>More concurrent runs means more Chrome processes means more memory pressure means more pods</strong></em>. The failure rate was climbing as load increased and I had no idea why. I was watching the dashboard break worse under pressure without connecting it to pod count at all.</p><p>Once I understood that, the problem was obvious. But getting there took a bit longer than I&#8217;d like to admit. </p><p>I just had to make sure the WebSocket connection was routed to the pod running the live Chrome process. That&#8217;s it. Simple to say, surprisingly annoying to actually solve.</p><div><hr></div><h3>Solutions I actually considered</h3><p>I want to walk through every option I evaluated, because the list of rejected solutions is where the real learning is.</p><div class="callout-block" data-callout="true"><p><strong>A quick note if you haven&#8217;t had to think about this layer before</strong></p><p>A load balancer sits in front of your pods and decides which pod handles each incoming request. In Kubernetes, this is typically nginx or a managed cloud load balancer like Azure Application Gateway. By default it distributes requests evenly across pods round-robin. Everything below assumes this basic picture.</p></div><p></p><h4>Cookie-based sticky sessions (rejected immediately)</h4><p>When sticky sessions are enabled, the load balancer sets a cookie on the first response it sends back to the client (not in the browser, not on the server, but at the load balancer itself). From that point on, whenever that client makes a request, the load balancer reads the cookie and sends it to the same pod every time.</p><p>Sounds perfect. Two reasons it didn&#8217;t work here.</p><p><strong>First</strong>: my WebSocket client was a backend service, not a browser. Browsers are designed to store and replay cookies automatically on every request. Backend services are not. Therefore, there is no guarantee the service preserves and resends that cookie. So the stickiness breaks.</p><p><strong>Second</strong>, and this one is worth reading slowly: if my <strong>dashboard service</strong> ran only one client pod, every single WebSocket connection from that pod would be pinned to the same <strong>agent pod</strong>. All traffic, always, to one pod. The HPA could spin up ten pods under load and nine of them would sit idle while one gets hammered. The autoscaling is completely defeated.</p><p>Notice these are opposite failure modes. If the cookie is not preserved, stickiness never forms. If it is preserved, all traffic from one client pod pins to a single agent pod. Either way, the approach fails.</p><p></p><h4>nginx consistent hash (rejected, but not obviously)</h4><p>When I hit this problem I did what most engineers do, asked an AI assistant for the standard solution. Copilot gave me <strong>nginx consistent hash</strong> routing. It is technically the correct answer for this class of problem &#8212; routing a persistent connection to the same backend every time.</p><p>Here is how it works: instead of &#8220;<em>round-robining&#8221;</em> blindly, <strong>nginx</strong> can hash on a key you provide. Give it a run ID, it deterministically sends that request to the same pod every time. No randomness, no wrong pod.</p><p>The specific version that works for this problem: the client generates a <em>UUID</em> before calling POST to start the agent run and passes it as <code>?run_id=&lt;uuid&gt;</code> in the query string. nginx extracts that same <em>UUID</em> from both the POST query param and the WebSocket URL path, hashes on it, and both requests land on the same pod. Perfectly even load distribution. Works at any replica count. No shared state needed.</p><p>I spent real time on this. It is a clean solution.</p><p>Then I found out it only works on staging.</p><p>Production uses <strong>Azure Application Gateway</strong>, a managed load balancer from Azure that sits in front of the cluster. AppGW handles SSL termination, routing, health checks, and more at the infra level. Unlike nginx, it does not support the <code>upstream-hash-by</code> annotation that makes consistent hash routing work. The feature simply does not exist on AppGW.</p><p>The answer was sitting in my own Helm chart the whole time. I had given Copilot the staging config but not the production one. It gave me the correct solution for the environment I showed it. I just hadn&#8217;t shown it the full picture.</p><p></p><h4>Redis Pub/Sub with a namespace-local deployment (chosen)</h4><p>Once nginx was off the table, the answer got simple fast.</p><p>The core insight is: instead of trying to route the WebSocket connection to the right pod, let any pod serve it. The pod running the agent <strong>publishes every event to a Redis channel</strong>. Any pod (whichever one the WebSocket connection lands on) <strong>subscribes</strong> to that channel and forwards events to the client. Pod routing stops mattering entirely.</p><p>I spun up a Redis instance as a separate deployment in the same Kubernetes namespace as my service. Not the shared Redis used elsewhere in the platform -- its own dedicated pod, completely independent, right next to my service. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ux-0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ux-0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Ux-0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Ux-0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Ux-0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ux-0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5512564,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/199454300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ux-0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Ux-0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Ux-0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Ux-0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd923bb-0d09-4711-a7fe-5c61b3b39259_2752x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This is literally all I added to my Helm chart:</p><pre><code><code>extraManifests:
  - |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: storefront-agent-redis
      namespace: platform
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: storefront-agent-redis
      template:
        metadata:
          labels:
            app: storefront-agent-redis
        spec:
          containers:
            - name: storefront-agent-redis
              image: redis:7-alpine
              command:
                - redis-server
                - --maxmemory
                - 200mb
                - --maxmemory-policy
                - noeviction
              ports:
                - containerPort: 6379
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
              volumeMounts:
                - name: storefront-agent-redis-data
                  mountPath: /data
          volumes:
            - name: storefront-agent-redis-data
              emptyDir: {}
  - |
    apiVersion: v1
    kind: Service
    metadata:
      name: storefront-agent-redis
      namespace: platform
    spec:
      selector:
        app: storefront-agent-redis
      ports:
        - port: 6379
          targetPort: 6379</code></code></pre><p>I will be honest: I do not fully understand every line of that <em>YAML</em>. But I do understand the nature of the solution and why the specific choices were made.</p><p>One thing worth understanding about Pub/Sub: Redis does not store these messages anywhere. When the agent pod calls <code>publish</code>, Redis finds all active subscribers on that channel and delivers the message immediately. Then it is gone &#8212; no key, no buffer, no replay. If a subscriber is not connected at that exact moment, the message is dropped. This is why <code>emptyDir</code> is fine: there is nothing durable to lose. MongoDB holds the real run state. The only thing Redis is doing here is wiring together a publisher and subscriber that might be on different pods.</p><p>MongoDB holds the real durable state for completed runs. Losing Redis mid-run means losing the in-flight WebSocket connection, but the run itself survives in MongoDB and can be retried.</p><p>One implementation detail worth keeping: I did not rip out the existing local queue. If the WebSocket connection happens to land on the same pod running the agent, events flow through the local queue directly, no Redis round-trip, lower latency. Redis is only used when the connection lands on a different pod. The fast path stays fast. Before this, a WebSocket landing on the wrong pod simply failed. Now it works regardless of which pod it hits.</p><div><hr></div><h3>Why this matters beyond the immediate fix</h3><p>Here is a bonus I did not plan for. Future versions of this agent will need to pause mid-run and wait for a human to make a decision before continuing. That only works if the agent&#8217;s state is somewhere any pod can reach, not locked inside one pod&#8217;s memory.</p><p>By solving the WebSocket routing problem, that foundation is already in place. The event wiring is now <strong>pod-independent</strong>, and durable run state already lives in <strong>MongoDB</strong>, so the pieces for a future human-in-the-loop pause are mostly in place. Sometimes you get lucky.</p><div><hr></div><h3>The honest summary</h3><p>The Redis implementation was done in a jiffy, once I knew what to build. The hard part was before that - watching non-deterministic failures, not knowing whether the problem was in the agent logic or the infrastructure, chasing the nginx solution because I did not know my own prod environment well enough to catch the mismatch.</p><p>Turns out it was the infrastructure. Probably worth understanding that layer before you need to debug it at 11pm.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new stories and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p>Still figuring a lot of this out. If you&#8217;ve solved problems like this differently, I&#8217;d genuinely love to know. <a href="https://x.com/Ishaan2291">X</a> or <a href="https://www.linkedin.com/in/ishaanshettigar/">LinkedIn</a>.</p>]]></content:encoded></item><item><title><![CDATA[The Day My “Support Job” Took Me to Japan]]></title><description><![CDATA[How a Customer Experience Internship at Swym Became Something I Didn&#8217;t Have a Name For]]></description><link>https://stories.getswym.com/p/the-day-my-support-job-took-me-to</link><guid isPermaLink="false">https://stories.getswym.com/p/the-day-my-support-job-took-me-to</guid><dc:creator><![CDATA[Eshan]]></dc:creator><pubDate>Mon, 01 Jun 2026 05:52:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d3e3fb74-1619-4223-ba5d-161869d1cf61_1179x2096.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There&#8217;s a moment I keep coming back to.</p><p style="text-align: justify;">I am in Japan. December 2025. I am sitting across from the decision-makers of one of the country&#8217;s most respected heritage brands. And they are not happy. They are asking hard questions about our product. The kind that, if left unanswered, end partnerships.</p><p style="text-align: justify;">My title? Technical Support Engineer.</p><p style="text-align: justify;">I walked out of that same meeting with them going from unhappy to inviting me to their office. That wouldn&#8217;t happen if Swym ran a traditional support org. It happened because Swym doesn&#8217;t.<br><br>Because at Swym, titles are never really the full story.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CQCf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CQCf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CQCf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CQCf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CQCf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CQCf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!CQCf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CQCf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CQCf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CQCf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdbd1277-7913-4463-8daa-b5be8d21d6e0_1536x2048.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p style="text-align: center;"><em>Eshan somehow ended up carrying the heaviest box. Tokyo streets, December 2025.</em></p><h2><strong>Where It Started: Day One</strong></h2><p style="text-align: justify;">I joined Swym as a Customer Experience Intern in January 2024. I was fresh out of VIT Vellore, curious, and had no idea what I was walking into.</p><p style="text-align: justify;">The first signal that things would be different came early. Within my first few weeks, I wasn&#8217;t just resolving issues. I was being asked to understand <em>why</em> they happened. Senior engineers would walk me through root cause analyses. I was encouraged to exhaust every possible explanation before asking for help. The bar wasn&#8217;t &#8220;did you close the ticket.&#8221; It was &#8220;do you actually understand what went wrong.&#8221;</p><p style="text-align: justify;">My first big debugging note earned a comment from a senior engineer, Kiran: <em>&#8220;Good debugging by Eshan.&#8221;</em> I have thought about that line more times than I can count. Not because it was flattering, but because it told me exactly what kind of place I had joined. Curiosity wasn&#8217;t a nice-to-have. It was the baseline.</p><p style="text-align: justify;">At most companies, a support engineer is a translator: they turn a user complaint into a ticket and hand it to someone else who fixes things. What I found at Swym, from the very start, was that the expectation was different. You were meant to understand the problem well enough to fix it yourself wherever you could, and to make a genuinely useful contribution when you couldn&#8217;t.</p><p style="text-align: justify;">Six months in, I converted from intern to full-time Technical Support Engineer. The title changed. The philosophy that had been shaping me from day one stayed exactly the same.</p><h2><strong>Growing Into the Role: The Part Nobody Warned Me About</strong></h2><p style="text-align: justify;">Here is what nobody warned me about working at a fast-moving product company in a support role: the job grows with you, sometimes faster than feels comfortable.</p><p style="text-align: justify;">Within the first year, I found myself doing things I had no formal training for: reviewing product launches before they went live, catching issues that would have affected thousands of merchants, and sitting in with the Product team not to give a quarterly summary of what support was seeing, but to work through actual merchant problems together so product decisions were made with real context rather than filtered reports.</p><p style="text-align: justify;">I was writing documentation the whole team would use, mentoring junior team members, onboarding new senior hires, and contributing to discussions about where the product should go next.</p><p style="text-align: justify;">None of this was in the job description. All of it was expected.</p><p style="text-align: justify;">The moment that tested me most was when a new feature was close to shipping. There was momentum, there were timelines, and everyone was excited. But after my testing, I wasn&#8217;t convinced it was ready for merchants. So I said so. Brought the specific scenarios, the data, the reasoning. It was an uncomfortable call to make. The deployment was held, we fixed what needed fixing, and the launch happened cleanly.</p><p style="text-align: justify;">Looking back, that moment taught me more about what Swym actually values than any onboarding document could. They didn&#8217;t want me to nod along. They wanted me to think, and then say what I thought, even when that was inconvenient.</p><h2><strong>Building, Not Just Supporting</strong></h2><p style="text-align: justify;">Somewhere in the middle of all this, something shifted in how I thought about the job.</p><p style="text-align: justify;">I had gone from someone who resolved problems, to someone building systems to prevent them. I was designing automation flows that would turn a support interaction into a product growth moment without any human needing to intervene. I was contributing directly to the codebase, acting as the primary support point of contact for third-party integrations, and doing work that at another company would have sat in an entirely different department with an entirely different job title.</p><p style="text-align: justify;">A big part of what made this possible was Swym&#8217;s relationship with AI. While a lot of companies were still figuring out what AI even meant for their business, Swym had already committed to being AI-first. That wasn&#8217;t a slogan. It was a leadership decision that filtered into how every team operated, and it meant I was being actively encouraged to rethink entire workflows from scratch, to build things that had no precedent inside the company, and to move fast. Working here genuinely prepares you for the world as it is right now, and as it will be, not as it was five years ago.</p><p style="text-align: justify;">A month I spent with the team in Bangalore crystallised this. It was 2am on more nights than I&#8217;d like to admit, learning tools I had never touched, rebuilding systems from scratch when a better approach emerged, all while keeping up with regular work. The kind of month that is genuinely hard while it is happening and, looking back, is exactly the thing that accelerated everything.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cbuB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cbuB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cbuB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cbuB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cbuB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cbuB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg" width="1456" height="1096" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1096,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!cbuB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cbuB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cbuB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cbuB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd0eb380-d5c2-44dc-9911-626ea0f06f49_2048x1542.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p style="text-align: center;"><em>The Bangalore sprint. 2am sessions, new tools, and the kind of month that changes how you think about what you&#8217;re capable of.</em></p><h2><strong>The People. This Is the Part That Actually Matters.</strong></h2><p style="text-align: justify;">I need to talk about something that is hard to put into words without it sounding like something off a careers page.</p><p style="text-align: justify;">We are a remote-first company. That means fewer meetings, more async work, and a culture built around trust rather than presence. There was one particular team catchup in Bangalore where I wasn&#8217;t fully present. Something was going on personally, and I just wasn&#8217;t there mentally. I didn&#8217;t say anything. I figured I&#8217;d push through.</p><p style="text-align: justify;">Arvind, our CEO, noticed. After the meeting, he set aside time just to sit with me and ask if I was ohkay.</p><p style="text-align: justify;">Not a performance note. Not a follow-up task. Just: are you ohkay?</p><p style="text-align: justify;">And that wasn&#8217;t the first time. In a remote-first company where the CEO is across time zones and carrying a hundred things at once, he still notices when someone on the team is off. That is not something you can fake or policy your way into. It is just who the people are.</p><p style="text-align: justify;">Sonali, my manager, has pushed me in the best possible way: by genuinely seeing what I was capable of before I saw it myself, creating the conditions for me to get there, and having my back whenever it counted, even without me knowing.</p><p>AJ, my director, has been the person who gave me room to take on things well outside my lane, and trusted my judgment when it mattered. The fact that I ended up in Japan representing the company internationally is, in no small part, because of the confidence he placed in me.</p><p>And it is not just them.</p><p style="text-align: justify;">I have disagreed with people senior to me. I have said &#8220;I don&#8217;t think this is right&#8221; in rooms where it would have been much easier to stay quiet. Every single time, I was heard. Sometimes I was right and changed the outcome. Sometimes I was corrected and learned something. But I was never, not once, made to feel that speaking up was a risk.</p><p style="text-align: justify;">That psychological safety is rarer than most companies will admit. At Swym, it is just how things work.</p><p style="text-align: justify;">The leaders at Swym are the kind I hope to become.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RhfJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RhfJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RhfJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RhfJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RhfJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RhfJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!RhfJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RhfJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RhfJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RhfJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a71fcb-715b-45b4-a809-e99bbdf94311_1536x2048.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p style="text-align: center;"><em>With Gopal, VP Swym, in Tokyo. December 2025.</em></p><h2><strong>Japan: Where It All Came Together</strong></h2><p style="text-align: justify;">Back to that room.</p><p style="text-align: justify;">In December 2025, I flew to Tokyo to represent Swym at a joint conference and dinner with merchants and agency partners across Japan. Not as part of a sales team. As the technical person on the ground, because my team believed I was the right person to be there.</p><p>Walking into that conference, it felt a little surreal. I had spent two years understanding this product from every angle, and suddenly I was using all of it in a room full of Japanese merchants and agency decision-makers, with a language barrier, no safety net, and real relationships on the line. But it also felt strangely natural. Like everything I had been doing had been quietly building toward exactly this kind of moment.</p><p>The conference was followed by an invite-only dinner with some of the most important agency partners in the market. The conversations were informal but went deep: technical gaps, product opportunities, what Swym could do better for the Japanese market. The kind of feedback that doesn&#8217;t come through a support ticket and doesn&#8217;t make it into a quarterly report unless someone was actually in the room to hear it. That is the kind of investment Swym makes, because when partners grow, the product grows, and it is the people on the ground who make that happen.</p><p>Swym put me on that ground.</p><p>I came back with new merchant relationships, strengthened existing ones, and market insights that fed directly into product planning. The work I did there shaped decisions that outlasted the trip.</p><p>That is what the role can become at Swym, if you let it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HBxw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HBxw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HBxw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HBxw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HBxw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HBxw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!HBxw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HBxw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HBxw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HBxw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146faa-a20b-4f2d-8c8a-6b0a54c7b748_1536x2048.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p style="text-align: center;"><em>The Swym x DotDigital conference, Tokyo. December 2025.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mVgK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mVgK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mVgK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mVgK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mVgK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mVgK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!mVgK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mVgK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mVgK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mVgK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb62b03a8-78cf-45b2-8c11-1076c50959fa_2048x1536.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p style="text-align: center;"><em>The invite-only dinner with some of Japan&#8217;s top agency partners.</em></p><h2><strong>What This Role Actually Is</strong></h2><p style="text-align: justify;">If you&#8217;re considering joining Swym in a customer experience or support capacity, here is the honest version of what the job looks like.</p><p style="text-align: justify;">You will handle support tickets. You will also shape the product. You will answer questions. You will also be the person who prevents those questions from ever needing to be asked. You will learn things you weren&#8217;t hired to know. You will be trusted before you feel ready. The work will expand to fill your curiosity, and then stretch a little further.</p><p style="text-align: justify;">You will also be working in an environment that is genuinely AI-first, not as a talking point but as a lived reality. That means you will be expected to think about how AI can change the way you work, not just use the tools that already exist. In a world where AI literacy is fast becoming the most important professional skill there is, that kind of environment is rare and genuinely valuable.</p><p style="text-align: justify;">The thing that makes Swym different is not just what you end up doing. It is that the people around you, at every level, are genuinely invested in your growth. You are not a headcount filling a function. You are someone they are actively trying to develop. And when something is going on with you personally, they notice.</p><p style="text-align: justify;">In about two and a half years, I went from nervously resolving my first ticket to representing the company internationally, contributing to the codebase, achieving the highest quality audit score on the team, shaping product decisions, and mentoring people who are now starting the same way I did.</p><h2><strong>To Anyone Considering This</strong></h2><p style="text-align: justify;">Swym is not for everyone. If you want clearly defined edges to your role and a scope that stays comfortable, this will push you in ways that don&#8217;t always feel good in the moment.</p><p style="text-align: justify;">But if you want a place where the ceiling is defined by how far you&#8217;re willing to go, where the people above you are genuinely rooting for you, and where you will be treated like a person first and an employee second, I think you should take a hard look at this place.</p><p style="text-align: justify;">I&#8217;m still a Technical Support Engineer. Depending on the week, I&#8217;m also a product quality gatekeeper, an automation builder, a technical presence in the field, and a mentor to people starting out exactly the way I did.</p><p style="text-align: justify;">The title stayed the same. Everything else kept growing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u1ae!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u1ae!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!u1ae!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!u1ae!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!u1ae!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u1ae!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!u1ae!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!u1ae!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!u1ae!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!u1ae!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce7cc56f-09a2-499d-bb3c-967e23bee2f4_2048x1536.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-XRd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-XRd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-XRd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-XRd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-XRd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-XRd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg" width="1456" height="830" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:830,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-XRd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-XRd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-XRd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-XRd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d56c64f-cdda-43af-be04-f125ce8951c0_2048x1168.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p style="text-align: center;"><em>The Swym team. The people you&#8217;ll work with, grow with, and probably stay up until 2am with.</em></p><p><em><a href="https://www.linkedin.com/in/eshan-bajaj/">Eshan Sunam Bajaj</a> is a Technical Support Engineer at Swym, working across product quality, AI automation, integrations, and merchant success. He joined as a Customer Experience Intern from VIT Vellore in January 2024. (Also posted <a href="https://eshan03.substack.com/p/the-day-my-support-job-took-me-to">here</a>)</em></p>]]></content:encoded></item><item><title><![CDATA[Why We Switched from theme_store_id to schema_name and What the Data Showed]]></title><description><![CDATA[What our instrumentation revealed about theme_store_id and why we replaced it.]]></description><link>https://stories.getswym.com/p/why-we-switched-from-theme_store_id</link><guid isPermaLink="false">https://stories.getswym.com/p/why-we-switched-from-theme_store_id</guid><dc:creator><![CDATA[Ishaan Shettigar]]></dc:creator><pubDate>Fri, 08 May 2026 10:10:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/86b6a6da-3e7a-4b74-9b2c-e4f55b0285c3_1322x576.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Of 175k+ unique theme IDs in our dataset, only 66k had a valid <code>theme_store_id</code>. The identifier our entire theme automation was built on covered <strong>37% of real-world merchant themes</strong>. We thought it covered everything.</p><p>If you&#8217;re building a Shopify app that touches the storefront, you already know the pain. 1000+ themes in the Shopify theme store, countless custom and agency-built themes, and merchants who <em><strong>expect your app to just work</strong></em> regardless of which one they&#8217;re on. No configuration, no support ticket, no &#8220;please contact our team.&#8221; Just works.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>That&#8217;s the bar we set for Wishlist Plus. Install it like you install Twitter on your phone. It works on day one, on your storefront, whatever that storefront looks like.</p><p>The mechanism we built to get there was <em><strong>theme presets</strong></em>, i.e a map of known themes to the exact CSS selectors needed to inject our UI correctly. </p><p>We use a <code>productLinkSelector</code> and an <code>attachButtonSelector</code> to position the wishlist button on a product card on collections grids. Our header implementation needs selectors to find the cart icon in the header and so on. Get the selectors wrong and the experience breaks. Get them right and it&#8217;s invisible (merchants never think about it).</p><p>The key to this whole system was <code>theme_store_id</code>. You look up the <code>window.Shopify.theme.theme_store_id</code> find your matching preset, apply the right selectors. This was the assumed approach. Inherited wisdom passed down through the codebase. Nobody had questioned it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ppdj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ppdj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png 424w, https://substackcdn.com/image/fetch/$s_!ppdj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png 848w, https://substackcdn.com/image/fetch/$s_!ppdj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png 1272w, https://substackcdn.com/image/fetch/$s_!ppdj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ppdj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png" width="1304" height="344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:1304,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:64501,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/196383112?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ppdj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png 424w, https://substackcdn.com/image/fetch/$s_!ppdj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png 848w, https://substackcdn.com/image/fetch/$s_!ppdj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png 1272w, https://substackcdn.com/image/fetch/$s_!ppdj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a49515-b890-4fdb-87e5-56b1a3ccf8a9_1304x344.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We should have questioned it sooner.</p><p>Theme presets aren&#8217;t new. Apps have been shipping selector maps since the Shopify&#8217;s ecosystem first matured enough to need them. The first principles haven&#8217;t changed, you still need to know which theme you&#8217;re on to inject correctly. What has changed is the scale. 1000+ themes, countless custom builds, and a theme identifier that was never designed to scale with the ecosystem it was supposed to describe.</p><div><hr></div><h3>The quiet tax</h3><p>The failure mode wasn&#8217;t dramatic. The system didn&#8217;t fall over. What happened instead was subtler: when a merchant&#8217;s theme had no matching <code>theme_store_id</code> in our preset map, the experience broke for that merchant specifically. They&#8217;d raise a support ticket. Support would investigate, identify the theme, add the preset manually, <em><strong>fix it for that merchant</strong></em>. Everyone moved on.</p><p>On the surface, this looked like a support team doing its job. What it actually was: our automation silently failing for a large chunk of merchants, and humans absorbing the cost of a broken assumption in the codebase.</p><p>There&#8217;s no alert for &#8220;theme coverage is poor.&#8221; No dashboard that says &#8220;X% of installs fell through to the generic fallback.&#8221; What you get instead is a support queue that feels manageable, because you have no baseline to compare it against. The system looked healthy. It wasn&#8217;t.</p><p>We didn&#8217;t know how large those gaps were until we had the data to look.</p><div><hr></div><h3>The number that changed everything</h3><p>We&#8217;d built an system that gave us real visibility into what was actually live on merchant storefronts. This was data we&#8217;d never had clean access to before. When we started re-examining our theme presets during a revamp of our Collections button, we pulled that data and looked at our <code>theme_store_id</code> coverage properly for the first time.</p><p><strong>175k+</strong> unique theme IDs in our dataset.</p><p>Only <strong>66k</strong> had a valid <code>theme_store_id</code>.</p><p>That&#8217;s <strong>~37%</strong> coverage. We were flying blind on 63% of the themes in our merchant base.</p><p>The assumption that had been quietly running our theme identification layer covered barely a third of the real world.</p><div><hr></div><h3>The fix was hiding in a changelog</h3><p>We have Shopify&#8217;s RSS feed piped into Slack. While we were re-examining our preset logic, a <a href="https://shopify.dev/changelog/updates-to-theme-information-access-in-shopify">changelog</a> entry caught my eye: <code>schema_name</code>.</p><p>Shopify had introduced <code>schema_name</code> specifically to address the gaps in <code>theme_store_id</code> coverage, a more <strong>consistently populated identifier for theme identification</strong>. The question was how much better it actually was in practice. So we cross-referenced it against the same dataset.</p><p><strong>140k+</strong> of those same theme IDs had a valid <code>schema_name</code>.</p><p><em><strong>Coverage jumped from 37% to above ~85%.</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L3aF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L3aF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png 424w, https://substackcdn.com/image/fetch/$s_!L3aF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png 848w, https://substackcdn.com/image/fetch/$s_!L3aF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png 1272w, https://substackcdn.com/image/fetch/$s_!L3aF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L3aF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png" width="1456" height="776" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:776,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94444,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/196383112?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L3aF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png 424w, https://substackcdn.com/image/fetch/$s_!L3aF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png 848w, https://substackcdn.com/image/fetch/$s_!L3aF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png 1272w, https://substackcdn.com/image/fetch/$s_!L3aF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a01f90a-d0ad-4a9d-bc14-5ba85c90c744_1542x822.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That was the moment. We refactored the entire theme identification layer to use <code>schema_name</code> as the primary identifier. The preset map that had previously keyed on <code>theme_store_id</code> now keys on <code>schema_name</code>. Every theme lookup, now running through the new identifier.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cAMX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cAMX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png 424w, https://substackcdn.com/image/fetch/$s_!cAMX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png 848w, https://substackcdn.com/image/fetch/$s_!cAMX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png 1272w, https://substackcdn.com/image/fetch/$s_!cAMX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cAMX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png" width="1432" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:968,&quot;width&quot;:1432,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159357,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/196383112?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cAMX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png 424w, https://substackcdn.com/image/fetch/$s_!cAMX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png 848w, https://substackcdn.com/image/fetch/$s_!cAMX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png 1272w, https://substackcdn.com/image/fetch/$s_!cAMX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefe1bfae-d114-45c4-aff2-2d219877baa5_1432x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The before and after in the code was straightforward once the decision was made. The hard part was realising the decision needed to be made at all.</p><div><hr></div><h3>The honest caveat</h3><p>This isn&#8217;t a complete solution. Custom and agency-built themes often have their own <code>schema_name</code> values that aren&#8217;t regulated by Shopify. We don&#8217;t maintain presets for those and we don&#8217;t want to, they&#8217;re one-offs that don&#8217;t scale. Those merchants still fall through to a generic fallback. It&#8217;s a known gap we live with.</p><p>Going from 37% to 85%+ coverage doesn&#8217;t mean the problem is solved. It means it&#8217;s dramatically smaller. The tickets that remain are genuinely one-off situations that need human attention regardless of which identifier you use. That's a different, more tractable problem.</p><div><hr></div><h3>What this means for you</h3><p>If you&#8217;re building a Shopify app that relies on theme identification, presets, selector maps, theme-specific behaviour of any kind please check your <code>theme_store_id</code> coverage. Pull your data if you have it.If you don&#8217;t have the instrumentation to check, that&#8217;s a separate problem worth solving first.</p><p>You can read <code>schema_name</code> the same way you&#8217;d read <code>theme_store_id</code>, it&#8217;s right there at <code>window.Shopify.theme.schema_name</code></p><p>And if you&#8217;re not monitoring Shopify&#8217;s RSS changelog, start. This fix was sitting in a changelog entry. It wasn&#8217;t announced loudly. It wasn&#8217;t in a developer blog post. It was just there, waiting for someone to connect the dots.</p><p>The dots were worth connecting.</p><div><hr></div><p><em>Building on Shopify storefronts at scale? I&#8217;d love to compare notes. Find me on <a href="https://x.com/Ishaan2291">X</a> or <a href="https://www.linkedin.com/in/ishaanshettigar/">LinkedIn</a>.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Swym x Shopify Markets]]></title><description><![CDATA[Unlocking Global Sales with Shopify]]></description><link>https://stories.getswym.com/p/swym-x-shopify-markets</link><guid isPermaLink="false">https://stories.getswym.com/p/swym-x-shopify-markets</guid><dc:creator><![CDATA[Sakshi Gupta]]></dc:creator><pubDate>Wed, 01 Apr 2026 04:29:14 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/192743281/67c5389fb8dc41ebab83c3a8e17a79b3.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>This episode explores Shopify Markets, a powerful tool for global e-commerce, featuring insights from product manager Renuka and platform engineer Adam. Discover how Shopify enables merchants to sell internationally with localized experiences, the technical challenges faced, and future AI-driven enhancements.</p><ul><li><p>Shopify Markets overview and benefits</p></li><li><p>Technical architecture and challenges of implementing Markets</p></li><li><p>Market-aware shopper experience and personalization</p></li><li><p>Data and marketing strategies for global merchants</p></li><li><p>Future AI integrations and product roadmap</p></li></ul><h4>Chapters</h4><p>00:00 Introduction to Shopify Markets</p><p>02:58 Understanding Shopify Markets</p><p>05:27 Shopper Experience in Global Markets</p><p>08:17 Technical Challenges and Solutions</p><p>10:55 Marketing Insights for Merchants</p><p>13:55 Product Challenges and Edge Cases</p><p>16:46 Building for Scale and Complexity</p><p>19:13 Future of Market Support</p><p>22:12 Advice for Developers and Merchants</p><p></p><h4>Resources</h4><p><a href="https://shopify.com/markets">Shopify Markets Overview</a><br><a href="https://www.getswym.com/blog/wishlist-plus-shopify-markets-support">Swym&#8217;s Shopify Markets details</a><br><br></p><p><br><br></p><p> </p>]]></content:encoded></item><item><title><![CDATA[The Silent Signal: Enabling Shopper Intent directly on Shopify core]]></title><description><![CDATA[How we use Product Metafield to enable fast and efficient social proof on Shopify storefronts. Bonus - Works with Shopify Flow!]]></description><link>https://stories.getswym.com/p/the-silent-signal-enabling-shopper</link><guid isPermaLink="false">https://stories.getswym.com/p/the-silent-signal-enabling-shopper</guid><dc:creator><![CDATA[Ishaan Shettigar]]></dc:creator><pubDate>Wed, 25 Feb 2026 16:59:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!f528!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>Note from the Author</strong><br>This document reflects my perspective on how we built and enabled the capability, not really a how-to-use. If you are looking to try it out or looking for <a href="https://developers.getswym.com/docs/wishlist-social-count-from-product-metafields">our product documentation</a> or support features, <a href="https://getswym.com">our web portal</a> is the best place to start or try <a href="https://apps.shopify.com/swym-relay?utm_source=stories.getswym.com">our app</a> on your store.</p></blockquote><p>There&#8217;s a silent conversation happening on every storefront, every single day.</p><p>It&#8217;s the moment a shopper hovers over an item, pauses, and clicks that heart button. They aren&#8217;t ready to buy - not yet - but they&#8217;ve just raised their hand. They&#8217;ve signaled intent.</p><p>For years, we at Swym have tracked this social proof (the number of times a product is added to a wishlist) and enabled access via APIs. We knew which products were simmering just below the surface of a &#8220;Best Seller&#8221; list. Quite a few merchants leveraged it but not without limitations. Eg: a product details page will show just one product&#8217;s social proof, but a collection page needs to show all products in that all collection. That meant there were more API calls to pull and render it. Plus this wasn&#8217;t easily available to build customizations that are directly connected to the catalog filtering. It was a &#8220;Swym capability,&#8221; not a entirely general &#8220;Storefront reality.&#8221;</p><p>By making this nugget available on <strong><a href="https://shopify.dev/">Shopify Product Metafields</a>, </strong>it makes many use cases previously complicated to a simpler usage pattern and not compromised based on the implementation philosophy (if you know Shopify, you know there are infinite options to implement the same thing and usually most of them don&#8217;t end up with efficiency and speed goals the implementation starts with)</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to read new stories!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Start with why</h3><p>Like usual, we start with why. So let me dive a bit deeper</p><p>Ecommerce business philosophy is somewhat obsessed with &#8220;Best Sellers.&#8221; It&#8217;s one of the loudest metric out there. But sales data only tells us what happened <em>yesterday</em>.</p><p>The Wishlist Social Proof (aka Wishlist Social Count) tells us what is going to happen <em>tomorrow</em>. By syncing this intent data point natively into Shopify Metafields, this  a way to listen to the <em>Most Desired</em> products - the ones that are trending in the hearts of shoppers before they get to the checkout line eventually.</p><div><hr></div><h3>Why should Shopify Native matter?</h3><p>This is something that needs context more than technicality. So when we sat down to build this, we had plenty of merchants leveraging this social proof in their experience flows. But it was nowhere straightforward. Clearly we need to multiple the craft of the modern developer, not add more complexities</p><p>By pushing into a metafield, we&#8217;ve enabled access to the data from an API call to a native Shopify attribute, ie it&#8217;s available where Shopify renders the rest of the ecommerce context that the merchant wants.</p><p>So it may not be obvious, but the answer goes far beyond just <strong>Storefront Efficiency</strong> (though that&#8217;s a huge part of it).</p><ol><li><p><strong>Render at Liquid speed:</strong> Think of the metafield as an extended edge cache for <a href="https://developers.getswym.com/docs/fetch-wishlist-social-count-batch-rest">the Swym API</a> (ie render first, refresh later if needed). So by storing these values directly on the Shopify Product object, the storefront load doesn&#8217;t have to make any additional API call to finish rendering. <br>eg: Reference to the social count directly on a Liquid theme file<br><br><code>{{ product.metafields.swym_wishlist.wishlist_social_count }}<br></code><br>This is critical for rendering social counts on <strong>Collection Pages</strong> where there may be 50+ products displayed at once. The result? <strong>No layout shift, no &#8220;loading&#8221; spinners, and zero impact to PageSpeed scores due to any missed implementation constraint. </strong>I am sure we don&#8217;t have to say this, but this is a huge dev experience lever.</p></li><li><p><strong>Native Automation:</strong> As the data point is available inside Shopify, it is accessible on tools like <strong>Shopify Flow</strong>. It opens up ideas we haven&#8217;t even thought about, like using a flow trigger workflow based on the change in soccial count of a product. eg: Do something cool when product.wishlist_social_count &gt; 1000.</p></li><li><p><strong>AI Readiness:</strong> I am sure pretty much every Shopify admin is already using Shopify <strong>Sidekick. </strong>So now that can also parse this &#8220;popularity&#8221; construct to help make better decisions, be it merchandising or support cool segments or widgets to the storefront experience.</p></li><li><p><strong>The future - Seamless Ecosystem Enablement:</strong> This essentially normalizes access to Swym for <strong>theme developers, agencies, or other apps</strong> in the ecommerce tech stack (like search provider or loyalty program). This means the experiences are faster to build (low complexity), cheaper to maintain (we maintain it!), and require little to no API work.</p></li></ol><div><hr></div><h3>The Technical &#8220;How-To&#8221;</h3><p>We push the Social Count to our namespace to enable ease of use. </p><h4>Using it in Liquid</h4><p>Displaying this on Product Details Page (PDP) or Collection Page is now literally one Liquid render:</p><p>Sample Code snippet</p><pre><code><code>{% if product.metafields.swym_wishlist.wishlist_social_count &gt; 10 %}
  &lt;span class="swym-wishlist-plus-badge"&gt;
    &#128293; {{ product.metafields.swym_wishlist.wishlist_social_count }} people want this!
  &lt;/span&gt;
{% endif %}
</code></code></pre><div><hr></div><h3>The Power of the TOML: Seamless Integration</h3><p>Sure it&#8217;s easy to build something, but to deploy it at our scale (50K and growing) requires an equally reliable way to deploy and monitor. Not to mention to rollback if things go awry. So we leveraged <strong>Metafield Definitions</strong> directly within the app' <strong>TOML configuration</strong>. giving our silent tip of the hat to Shopify&#8217;s evolving dev experience. </p><p>With this incredible automation powered by the Shopify platform itself, it&#8217;s a big chunk off our todo-list. Literally, we pushed these standardized definitions to our all of those <strong>50K+ merchants</strong> without a hitch. </p><p>It&#8217;s clean, it&#8217;s standardized and it&#8217;s simple.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;toml&quot;,&quot;nodeId&quot;:&quot;ccb0d007-528e-4963-b03d-01a00de7635c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-toml">[product.metafields.app.wishlist_social_count]
name = &#8220;Wishlist Social Count&#8221;
description = &#8220;The number of times this product has been added to a shopper&#8217;s wishlist&#8221;
type = &#8220;number_integer&#8221;
capabilities.admin_filterable = true
access.customer_account = &#8220;read&#8221;
access.storefront = &#8220;public_read&#8221;
access.admin = &#8220;merchant_read&#8221;</code></pre></div><p>The above was the seemingly simple part, in the background we manage the scale per merchant per intent update through our systems. We deliberated on efficient ways on doing this sync. Here is a small brief on what we discussed</p><ul><li><p>When&#8217;s the best time to sync a product?</p></li><li><p>What triggers should initiate a refresh?</p></li><li><p>What&#8217;s a good SLA?</p></li><li><p>How do we measure the above-mentioned SLA?</p></li><li><p>How do we &#8220;onboard&#8221; past social proof for existing scale?</p></li><li><p>This one is super tricky - How do we manage retries and rate limits? (both internal services and Shopify&#8217;s API rate limits)</p></li></ul><p>Without going into the details, we have decisions and factors considered into it. We&#8217;ll reassess and upgrade our approach as we learn more or if factors change/new factors enter the picture</p><div><hr></div><h3>Intent proof finding voice</h3><h4>1. Automated Merchandising with Shopify Flow</h4><p>Set up a workflow that monitors wishlist social counts. If a product&#8217;s social count hits a &#8220;Viral&#8221; threshold (For example, a social count value of 100), have Flow automatically add it to a &#8220;Trending Now&#8221; collection or tag it for a social media spotlight.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zlzT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zlzT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif 424w, https://substackcdn.com/image/fetch/$s_!zlzT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif 848w, https://substackcdn.com/image/fetch/$s_!zlzT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif 1272w, https://substackcdn.com/image/fetch/$s_!zlzT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zlzT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif" width="1138" height="604" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:604,&quot;width&quot;:1138,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2166876,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/188986452?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zlzT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif 424w, https://substackcdn.com/image/fetch/$s_!zlzT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif 848w, https://substackcdn.com/image/fetch/$s_!zlzT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif 1272w, https://substackcdn.com/image/fetch/$s_!zlzT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d83c65-d906-4e66-8d5f-3a1ccd2ae8ee_1138x604.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Merchant using wishlist_social_count metafield in Shopify Flow</figcaption></figure></div><h4>2. Automated Urgency with Shopify Flow</h4><p>Imagine a workflow where, if a product&#8217;s Social Count hits 100 but inventory drops below 10, an automatic &#8220;High Demand&#8221; tag is added to the product.</p><h4>3. AI-Generated Badges with Sidekick</h4><p>Use Shopify Sidekick to effortlessly design UI elements based on it, surface it any which way.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JOH1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JOH1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif 424w, https://substackcdn.com/image/fetch/$s_!JOH1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif 848w, https://substackcdn.com/image/fetch/$s_!JOH1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif 1272w, https://substackcdn.com/image/fetch/$s_!JOH1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JOH1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif" width="1127" height="652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:652,&quot;width&quot;:1127,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2079206,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/188986452?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JOH1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif 424w, https://substackcdn.com/image/fetch/$s_!JOH1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif 848w, https://substackcdn.com/image/fetch/$s_!JOH1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif 1272w, https://substackcdn.com/image/fetch/$s_!JOH1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abae6bd-128e-4528-8904-c70627b8d75f_1127x652.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Sidekick building a widget with swym_wishlist.wishlist_social_count</figcaption></figure></div><p></p><h4>4. Collection Sort</h4><p>Go beyond &#8220;Best Selling&#8221; or &#8220;Price: Low to High.&#8221; Create a <strong>&#8220;Most Wanted&#8221;</strong> sort option. This allows shoppers to filter the catalog by what the community is currently eyeing, creating a trend-driven shopping experience that feels real and alive.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JNr5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JNr5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif 424w, https://substackcdn.com/image/fetch/$s_!JNr5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif 848w, https://substackcdn.com/image/fetch/$s_!JNr5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif 1272w, https://substackcdn.com/image/fetch/$s_!JNr5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JNr5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif" width="913" height="907" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:907,&quot;width&quot;:913,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1806280,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/188986452?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JNr5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif 424w, https://substackcdn.com/image/fetch/$s_!JNr5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif 848w, https://substackcdn.com/image/fetch/$s_!JNr5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif 1272w, https://substackcdn.com/image/fetch/$s_!JNr5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6675e3da-af16-47be-bcfb-30aed99ed64d_913x907.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">GIF Showing the creation of a Smart Collection based on the Wishlist Social Count Metafield Value</figcaption></figure></div><div><hr></div><h3>The Heart of the Story</h3><p>We didn&#8217;t enable this sync just to move numbers from point A to point B. We built it because we believe the most successful experiences are the ones that connect best products with the shoppers in the best way possible - ie the experiences that are best at listening to what the shopper &#8220;wants&#8221;.</p><p>We can see the crowd gathering from our end and now, so can our merchants and their shoppers as easily as we do.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f528!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f528!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png 424w, https://substackcdn.com/image/fetch/$s_!f528!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png 848w, https://substackcdn.com/image/fetch/$s_!f528!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png 1272w, https://substackcdn.com/image/fetch/$s_!f528!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f528!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png" width="1456" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5941184,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/188986452?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f528!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png 424w, https://substackcdn.com/image/fetch/$s_!f528!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png 848w, https://substackcdn.com/image/fetch/$s_!f528!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png 1272w, https://substackcdn.com/image/fetch/$s_!f528!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8aa115e-a3f6-4176-999e-9e6083f76fb7_2815x1237.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><p>P.S: Here is <a href="https://developers.getswym.com/docs/wishlist-social-count-from-product-metafields">our product documentation again</a> in case you want to try it out</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to read new stories!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[[RECAP] The Great Library Merge: A Journal on Taming Complexity]]></title><description><![CDATA[From Many to One: Our Journey in Merging Repos to Conquer Complexity]]></description><link>https://stories.getswym.com/p/recap-the-great-library-merge-a-journal</link><guid isPermaLink="false">https://stories.getswym.com/p/recap-the-great-library-merge-a-journal</guid><dc:creator><![CDATA[Raj Laddha]]></dc:creator><pubDate>Wed, 25 Feb 2026 10:45:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!k7jV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k7jV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k7jV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!k7jV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!k7jV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!k7jV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k7jV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg" width="728" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:1303773,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/168832858?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!k7jV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!k7jV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!k7jV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!k7jV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bcc0fd7-4463-4086-8357-6331fbed75e8_2048x2048.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI-generated</figcaption></figure></div><p>In the world of software engineering, growth is a good problem to have. But with growth in services, code, and people comes its inevitable companion: complexity. At Swym, we undertook a significant project to tackle this head-on by merging our numerous internal Clojure library repositories into a single, unified repo.</p><p>This wasn't just a technical exercise in tidying up. It was a strategic move to simplify our systems, reduce cognitive overhead for our engineers, and pave the way for a more efficient future. This is the story of that project&#8212;our motivations, our strategy, our risks, and the lessons we learned along the way.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to read more stories from the Swym team!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h3>The Tipping Point: Why We Had to Change</h3><p>Like many growing companies, our architecture evolved. The initial choice to have separate repositories for different services and libraries made sense at the time, but as we scaled, this separation started to create friction. The real-world trigger for the merge was the sheer complexity involved in what should have been simple tasks: needing to build, deploy, test, and manage numerous components for a single function was becoming a bottleneck. The cost of adding value was becoming too high compared to the value itself.</p><p>Our stack is built on Clojure, a powerful and dynamic language running on the JVM. By its nature, Clojure allows for a lot of flexibility through guidelines rather than rigid rules. While this is a strength, it also meant that over time, inconsistencies grew across our many repos. This lack of a singular, enforceable guideline was a constant challenge.</p><p>There was also a subtle, forward-looking trigger: a centralised context would be hugely beneficial for the AI tools we are increasingly relying on. While not the sole reason, it was a necessary condition to unlock their full potential. We knew we had to re-evaluate our architectural choices to get ready for the future.</p><h3>The Game Plan: A "Band-Aid Rip-Off"</h3><p>We had attempted this before and paused, knowing the problem had merit but that the timing wasn't right. This time, we had a clear strategy. Aravind Baskaran, who spearheaded the initiative, called it the <strong>"band-aid rip-off" approach</strong>.</p><p>The core idea was to make the change swiftly and cleanly, focusing <em>only</em> on simplifying deployment and structure without altering any existing functionality in the first phase. All the code would move, the structure would change, but the underlying logic would remain untouched.</p><p>This approach had a few key principles:</p><ul><li><p><strong>No Functionality Changes:</strong> This was critical. By ensuring the core logic was the same, we could be confident that, with baseline tests passing, the system would behave as expected.</p></li><li><p><strong>Active Monitoring is Key:</strong> After the merge, we had to be incredibly watchful. We paid close attention to key metrics like build and deploy times&#8212;which we expected to be reduced by 50-60%&#8212;but also watched for any negative runtime implications.</p></li><li><p><strong>A Stable Technical Foundation:</strong> A key technical goal was to have a solid map of all our component versions&#8212;from the JVM and Clojure itself to our Kubernetes environment variables&#8212;to ensure a smooth and predictable rollout.</p></li></ul><h3>Navigating the Risks: Don't Stop the Train</h3><p>A project of this scale is not without its risks. The biggest fear was the point of no return. Aravind likened it to <strong>"stopping and reversing a large train"</strong>. An undertaking this large had to be atomic&#8212;it was either done or not done, with no room for a "half-done" intermediate state.</p><p>Other significant risks included:</p><ul><li><p><strong>Lack of Signals:</strong> The fear that even with testing, we might not have adequate signals to detect subtle issues once the changes hit our production Kubernetes environments.</p></li><li><p><strong>Feature Release Conflicts:</strong> We are constantly shipping new features. Trying to coordinate this merge with twenty other feature releases could have created a processing nightmare.</p></li></ul><p>To mitigate this, the project was given a <strong>critical "shelf life"</strong>. It had to be completed within a specific, tight time window to avoid causing more damage than it solved. If it took too long, the disruption to business requirements would outweigh the benefits. We carefully planned this window to execute the project with minimal disruption, ensuring no other deployments proceeded without a "green flag" from the merge team.</p><p></p><h3>Lessons from the Trenches: Our Key Takeaways</h3><p>This project was a tremendous learning experience. Here are our biggest takeaways for any team considering a similar endeavor.</p><h4>1. This is Not a Side Project</h4><p>Our previous attempts had stalled because the work was treated as a "side experiment". The most significant learning was that for a project of this magnitude to succeed, it cannot be a side project. <strong>It has to be </strong><em><strong>the</strong></em><strong> project</strong>. It requires focus and commitment to get it done.</p><h4>2. Empower a Single Driver</h4><p>While input from many is crucial, the execution needs a single, responsible owner to avoid "room for committee" based negotiations. We found success by letting the person who wants to take it forward build the proposal and enabling them to succeed, knowing they will be responsible for making and fixing mistakes along the way.</p><h4>3. Embrace Your Tools (and Your Team)</h4><p>The AI tooling available today significantly reduced the manual grunt work that would have made this project much more arduous in the past. But tools are only part of the equation. The project's success was driven by the team's conviction that this was a necessary pain point to address and by their confidence in the system's scalability and reliability.</p><h4>4. The Merge is a Foundation for the Future</h4><p>This project wasn't just about cleaning up the past; it was about building a better future. By bringing our Clojure code together, we now have the closest shot at developing and enforcing community-driven guidelines and standards internally. It allows our internal community to grow and build its legacy in terms of how we build software in 2025 and beyond.</p><h3>The Journey to Simplicity Continues</h3><p>The great library merge is complete, but it marks a beginning, not an end. Our journey toward simplicity is ongoing. Over the next few weeks and months, we will be closely observing the ripple effects of this change&#8212;both good and bad&#8212;to continue learning and refining our processes. The immediate next steps involve improving our monitoring signals so we can understand system health without digging into every detail, making our operations even more efficient.</p><p>This merge has given us more than just a cleaner codebase; it has provided a simplified, stable foundation. It enables us to finally attack the larger opportunities we had previously put on hold. By taking on this challenge, we've not only improved our day-to-day development reality but have also reaffirmed a core engineering principle: sometimes, to go faster, you first have to simplify.</p><h3><strong>Reflections from 2026</strong></h3><p>Looking back from early 2026, the &#8220;Great Library Merge&#8221; of August 2025 has proven to be a watershed moment for our engineering velocity. The most immediate win was the dramatic slash in overhead; our <strong>build and deployment times dropped</strong>, transforming what used to be a sluggish bottleneck into a streamlined, rapid-fire process. However, the most strategic advantage emerged in our AI integration. By consolidating our entire Clojure ecosystem into a single, unified source of truth, we provided our <strong>AI agents with a comprehensive, centralized context.</strong> This &#8220;one-stop shop&#8221; for code architecture has made it significantly easier to build agents that understand our entire system&#8217;s nuances without getting lost in repository sprawl. What started as a cleanup project has become the essential foundation for our AI-driven future.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to read more stories from the Swym team!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[The Engineering Pulse]]></title><description><![CDATA[Where engineering does not just stop at shipping but starts owning outcomes]]></description><link>https://stories.getswym.com/p/the-engineering-pulse</link><guid isPermaLink="false">https://stories.getswym.com/p/the-engineering-pulse</guid><dc:creator><![CDATA[Sakshi Gupta]]></dc:creator><pubDate>Sun, 08 Feb 2026 12:56:46 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/187283364/84e9bbcb736d2a67b5a0b8d840dba294.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p></p><p></p><h3><strong>Navigating Change: Inside Swym&#8217;s Evolving Engineering Culture</strong></h3><p>In this episode, Rishin, Aravind and I discuss the significant shifts happening within Swym&#8217;s engineering practices, emphasizing the move towards more autonomous, signal-driven decision-making powered by AI and automation. They explore how these changes impact daily routines, team ownership, and future growth strategies in a rapidly transforming tech landscape.</p><h6><strong>Key topics:</strong></h6><ul><li><p>Transition from traditional product-defined workflows to the &#8220;engineering pulse&#8221; approach</p></li><li><p>The role of daily rituals and automation in aligning teams with impact-driven goals</p></li><li><p>How AI is revolutionizing repetitive tasks in infrastructure and code development</p></li><li><p>New metrics and signals replacing old success measures</p></li><li><p>The importance of ownership, autonomy, and deep work in an AI-enhanced environment</p></li><li><p>Future of engineering careers in a fast-evolving AI-driven world</p></li><li><p>The significance of continuous learning, experimentation, and honest reflection</p></li></ul><h6><strong>Timestamps:</strong></h6><p>00:00 - Introduction to Swym&#8217;s internal shift towards the &#8220;engineering pulse&#8221;<br>02:31 - The importance of daily rituals and reducing hype with consistent routines<br>04:48 - How metrics are evolving and the shift in success signals<br>06:19 - Deep impact, automation, and focusing on what truly matters<br>09:03 - Making the abstract concrete: transferring learning and the power of repetition<br>12:19 - The future of engineer careers with AI and ownership of outcomes<br>15:01 - AI as a stepping stone for rapid experimentation and deep work<br>17:16 - Changing roles, titles, and the focus on intent over seniority<br>18:39 - Envisioning 2026: key truths about the evolving software landscape<br>21:14 - Preparing for exponential growth and strategic positioning<br>24:50 - The importance of discipline, boring routines, and continuous iteration<br>28:27 - Reflecting on company metrics, growth expectations, and upcoming targets<br>29:39 - Closing thoughts on ongoing support, transparency, and future initiatives</p><p></p><h6><strong>Resources &amp; Links:</strong></h6><ul><li><p><strong><a href="https://getswym.com">Swym Official Website</a></strong></p></li><li><p>Want to join us - Read below !</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;2c0a5de7-8958-447e-ae91-cd17b363aa6a&quot;,&quot;caption&quot;:&quot;As a recruiter, I&#8217;ve seen it all. I&#8217;ve seen the &#8220;Wait, which company is this?&#8221; emails, the accidental Google filters, and the total ghosting. I get it. Job hunting is a marathon in a rainstorm.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Swymming, Not Sinking: A Guide to Our Interview Process &#127946;&#8205;&#9794;&#65039; &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:361957232,&quot;name&quot;:&quot;Danica Lobo&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!wzOW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b4d72e-a91e-4ef2-af9c-d03866a530a9_720x1280.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-30T13:16:26.889Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!_B_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1092240-7c5c-4cfb-aaf7-ab6ad9f84ffb_270x270.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://stories.getswym.com/p/swymming-not-sinking-a-guide-to-our&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:186284224,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:4,&quot;comment_count&quot;:1,&quot;publication_id&quot;:2886569,&quot;publication_name&quot;:&quot;Swym Stories&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!_B_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1092240-7c5c-4cfb-aaf7-ab6ad9f84ffb_270x270.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p></li></ul><h6><strong>Note:</strong></h6><p>This conversation reflects Swym&#8217;s internal evolution and its strategic emphasis on automation, ownership, and agility amid technological shifts driven by AI advancements.</p>]]></content:encoded></item><item><title><![CDATA[An Engine for Enhancing Customer Journeys]]></title><description><![CDATA[From Intent to Loyalty - How your customer thinks?]]></description><link>https://stories.getswym.com/p/an-engine-for-enhancing-customer</link><guid isPermaLink="false">https://stories.getswym.com/p/an-engine-for-enhancing-customer</guid><dc:creator><![CDATA[Saai Sudarsanan D]]></dc:creator><pubDate>Tue, 03 Feb 2026 10:59:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vtEL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>Note from the Author</strong><br>This document reflects my perspective on how Swym functions as a Customer Journey Management engine. It is shaped by my understanding of the product, its design philosophy, and how I see journeys being modeled and executed in practice.</p><p>It is my attempt to explain the underlying ideas in a way that connects customer experience thinking with systems that operate at scale. </p><p>If you are looking for our product documentation or support features, <a href="https://www.getswym.com/">our web portal</a> is the best place to start or try <a href="https://apps.shopify.com/swym-relay?utm_source=stories.getswym.com">our app</a> on your store.</p></blockquote><h2>Context is King: Navigating the Fine Line Between Boosting Sales and Losing Trust</h2><p>For any merchant getting started with their online store, there are  too many apps out there waiting to help you take your sales through the roof and make your business boom. But why isn&#8217;t every merchant successful then? A sword is only as good as the person who wields it; the merchant decides whether it will kill or create their business.</p><p>One merchant might track specific points of their customer&#8217;s interactions on their page and send out minimal and targeted emails, which enhances both the customer&#8217;s experience with their brand and also boosts their business. Another sends out emails for every price drop and every discount on their store, and eventually end up in their customers&#8217; spam folder or even worse, get unsubscribed.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The difference here is perception. A merchant must ensure a customer&#8217;s overall view of a brand stays positive because the loss of trust is irreversible.</p><p>A real-life instance I found while researching customer trust is a complete disconnect between how messaging without context (or in the wrong context) can end up being pretty bad. <a href="https://www.bbc.com/news/world-us-canada-39641002">In 2017, </a><strong><a href="https://www.bbc.com/news/world-us-canada-39641002">Adidas</a></strong><a href="https://www.bbc.com/news/world-us-canada-39641002"> sent an automated email to Boston Marathon participants with the subject line, &#8220;</a><em><a href="https://www.bbc.com/news/world-us-canada-39641002">Congrats, you survived the Boston Marathon.</a></em><a href="https://www.bbc.com/news/world-us-canada-39641002">&#8221;</a> The intent was positive, but the message ignored critical context. Just a few years earlier, the Boston Marathon had been the site of a deadly bombing. What should have been celebratory came across as insensitive, forcing Adidas to issue a public apology.</p><p>Read more here on <a href="https://medium.com/better-marketing/how-adidas-recovered-from-their-boston-marathon-marketing-blunder-2aaae987a7bc">how they recovered</a> from that. </p><p><strong>Tools lacking context can create moments where the brand value erodes, needing additional effort to recover.</strong></p><div><hr></div><h2>What is a Customer Journey Map and why does it matter?</h2><p>A Customer Journey Map (CJM) is a visual representation of a customer&#8217;s experience with your brand. It provides an understanding of needs and concerns that either motivate or inhibit action. While we often discuss these as four distinct phases, it is important to remember that <strong>human behavior is rarely linear.</strong> Customers often loop back to previous stages or jump ahead unexpectedly. For this discussion, we will look at these four primary phases:</p><h3>Discovery Phase </h3><p>The customer becomes aware of a problem or desire and first encounters your brand through ads, content, word-of-mouth, or organic discovery. </p><p>Take Alice, she uses the local train to commute to work every day. She gets tired of the crowd, discomfort, and delays while using public transport, and the idea of buying a car pops into her head as a solution to the problems of time, comfort, and convenience.</p><h3>Research Phase</h3><p>The customer compares options, evaluates credibility, reads reviews, and looks for signals of trust, value, and relevance before committing.</p><p>Alice compares car models, prices, fuel types, EMI options, reviews, maintenance costs, and resale value while shortlisting brands that fit their budget and lifestyle.</p><h3>Decision Phase</h3><p>The customer decides to purchase based on price, confidence, timing, and experience, converting intent into action.</p><p>As Alice visits multiple car showrooms, most offer similar prices and features. One dealer, however, stands out: transparent pricing, flexible financing, a smooth test-drive experience, and timely follow-ups without pressure. </p><p>At this point, Alice isn&#8217;t choosing a car anymore; she&#8217;s choosing <strong>who she trusts</strong>. That confidence tips the decision, and she makes the purchase.</p><h3>Delight Phase</h3><p>Post-purchase experiences reinforce trust, build loyalty, and turn customers into repeat buyers and advocates through thoughtful communication and value.</p><p>After the purchase, Alice&#8217;s experience with the brand truly begins. Smooth delivery, clear onboarding, timely service reminders, responsive support, and thoughtful follow-ups reinforce her decision. Over time, consistent positive experiences turn satisfaction into trust, and trust into loyalty and recommendations.</p><h3>The Non-Linear Loop</h3><p>In reality, a customer might be in the Research phase and suddenly get pulled back into Discovery by a new technology, or they might stay in a loop between Research and Decision for months.</p><p>External factors also play a massive role in providing context. For example, a car dealership might see a sudden price drop or a spike in promotions. Is it just a sale, or is it because a heavy snowstorm has stopped everyone from driving, forcing the dealer to adjust? A merchant who understands that &#8220;it&#8217;s snowing, so no one is thinking about test drives&#8221; can adjust their messaging to be more empathetic rather than just pushy.</p><div><hr></div><h2>How to Make a Customer Journey Map?</h2><h4>Define a Persona (a generic customer)</h4><p>Create a representative customer profile that reflects your target audience&#8217;s goals, behavior, and constraints.</p><h4>Define the Journey Phases</h4><p>Outline the key stages of interaction with your brand (Discovery, Research, Decision, Delight).</p><h4>Map the Steps in Each Phase</h4><p>Identify the actions the customer takes at every stage.</p><h4>Analyze Each Phase</h4><ul><li><p>Questions in the customer&#8217;s mind</p></li><li><p>Thoughts and emotions driving decisions</p></li><li><p>Pain points or friction</p></li><li><p>Opportunities to improve the experience</p></li></ul><div><hr></div><h2>How to use a CJM with E-commerce Tools?</h2><p>In each phase of the map, the tool we use differs based on its relevance and effectiveness. Simple, you can&#8217;t use a screwdriver to write poems.</p><p>In the previous step, we analyzed the customer&#8217;s mindset at each phase of the journey. Use that understanding to decide which tools genuinely help the customer move through that phase with ease.</p><p>The goal isn&#8217;t to use more tools, but to use the <em>right</em> tool at the <em>right</em> moment, and sometimes, to use none at all.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vtEL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vtEL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp 424w, https://substackcdn.com/image/fetch/$s_!vtEL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp 848w, https://substackcdn.com/image/fetch/$s_!vtEL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp 1272w, https://substackcdn.com/image/fetch/$s_!vtEL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vtEL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp" width="1000" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Wrong Tool For The Job&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Wrong Tool For The Job" title="Wrong Tool For The Job" srcset="https://substackcdn.com/image/fetch/$s_!vtEL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp 424w, https://substackcdn.com/image/fetch/$s_!vtEL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp 848w, https://substackcdn.com/image/fetch/$s_!vtEL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp 1272w, https://substackcdn.com/image/fetch/$s_!vtEL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b42b1a6-be19-4fd9-801c-f7d360a7614c_1000x400.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For example, an email tool might be used in one phase to run a broad, targeted marketing campaign, while in another it may simply send a single price-drop alert to a customer who has already shown clear interest in a product.</p><p>Hence, the same tool can be used multiple times across a journey, but in very different ways.</p><div><hr></div><h2>The CJM Engine</h2><p>Understanding a journey is one thing, but <strong>executing it consistently at scale</strong> is another. Imagine a sous chef in a restaurant. They don&#8217;t invent the recipes; they focus on consistent execution. They wait for orders, observe the kitchen, and react when the time is right. They coordinate the stoves, ovens, and knives using only what the dish needs.</p><p>A CJM engine works the same way. It executes the journey by following intent with judgment. The merchant defines the &#8220;recipe&#8221; (the instructions of when and what to do) and the engine follows it.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nfr8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nfr8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Nfr8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Nfr8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Nfr8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nfr8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg" width="346" height="146" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:146,&quot;width&quot;:346,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;YARN | follow his recipes. follow the recipe. | Ratatouille (2007) | Video  gifs by quotes | 56c5c5a8 | &#32023;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="YARN | follow his recipes. follow the recipe. | Ratatouille (2007) | Video  gifs by quotes | 56c5c5a8 | &#32023;" title="YARN | follow his recipes. follow the recipe. | Ratatouille (2007) | Video  gifs by quotes | 56c5c5a8 | &#32023;" srcset="https://substackcdn.com/image/fetch/$s_!Nfr8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Nfr8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Nfr8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Nfr8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5287cd78-7912-44a4-b75b-f5b7621aec92_346x146.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><h3>The Recipe</h3><p>For the engine to work, <strong>the recipe must be clear</strong>. This is your data model: a structured description of what starts a journey, what conditions matter, and when it should end.</p><p>Just like in a kitchen, vague recipes lead to inconsistent dishes.<br>A well-defined recipe allows the engine to execute journeys reliably, repeatedly, and at scale.</p><p>This is how intent becomes something software can understand and follow.</p><h3>Example: A Shoe Brand&#8217;s Customer Journey Recipe</h3><p><strong>Persona:</strong><br>A customer looking for comfortable running shoes for daily workouts.</p><p><strong>Discovery</strong><br>The customer sees a social media ad about lightweight running shoes and visits the brand&#8217;s website to browse.</p><p><strong>Research</strong><br>They read reviews, compare models, check sizing guides, and shortlist one pair. They add the shoes to their wishlist.</p><p><strong>Decision</strong><br>A few days later, the price drops slightly. The customer receives a single, well-timed notification highlighting the offer and free returns. They complete the purchase.</p><p><strong>Delight</strong><br>After delivery, the brand sends care tips, running advice, and a reminder to review the product. Over time, the customer receives loyalty rewards and early access to new launches.</p><p>This entire flow can be written as a <strong>recipe</strong>.<br>The CJM engine follows it, deciding when to act, when to wait, and when to stop.</p><p>Let&#8217;s now try writing it as a recipe</p><ul><li><p><strong>Discovery Phase</strong><br>A customer views a pair of running shoes and adds them to their wishlist.<br>Which event should trigger the journey? At what point do you decide this customer is worth engaging?</p></li><li><p><strong>Research Phase</strong><br>The customer repeatedly views the product, reads reviews, and selects sizes.<br>Which signals indicate genuine interest, and what do you define as <em>clear intent</em>?</p></li><li><p><strong>Decision Phase</strong><br>The shoe&#8217;s price drops, or the stock starts running low. This could be the tipping point.<br>Which conditions should trigger communication that nudges the customer toward purchase?</p></li><li><p><strong>Delight Phase</strong><br>After purchase, request a review, offer loyalty rewards, or share care tips.<br>What actions help bring the customer back and strengthen their experience with the brand?</p></li></ul><div><hr></div><h2>Conclusion</h2><p>Customer journeys are not about sending more messages. They are about <strong>making better decisions over time</strong>. A map helps you understand what your customer needs, while an engine ensures those decisions are executed with restraint.</p><p>When journeys are treated as recipes and tools as instruments, the customer experience stops feeling reactive and starts feeling intentional. The brands that survive won&#8217;t be the ones with the most automation, but the ones that know exactly <strong>when and when not to act</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3_QI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3_QI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3_QI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3_QI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3_QI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3_QI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg" width="693" height="462" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:462,&quot;width&quot;:693,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Plating Food: how to arrange a plate like a top chef&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Plating Food: how to arrange a plate like a top chef" title="Plating Food: how to arrange a plate like a top chef" srcset="https://substackcdn.com/image/fetch/$s_!3_QI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3_QI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3_QI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3_QI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dc04829-7b17-4988-85ac-ec4afd96cbba_693x462.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Swymming, Not Sinking: A Guide to Our Interview Process 🏊‍♂️ ]]></title><description><![CDATA[A candid look at how we hire, what it takes to thrive here, and why self-selection matters]]></description><link>https://stories.getswym.com/p/swymming-not-sinking-a-guide-to-our</link><guid isPermaLink="false">https://stories.getswym.com/p/swymming-not-sinking-a-guide-to-our</guid><dc:creator><![CDATA[Danica Lobo]]></dc:creator><pubDate>Fri, 30 Jan 2026 13:16:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_B_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1092240-7c5c-4cfb-aaf7-ab6ad9f84ffb_270x270.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a recruiter, I&#8217;ve seen it all. I&#8217;ve seen the &#8220;Wait, which company is this?&#8221; emails, the accidental Google filters, and the total ghosting. I get it. Job hunting is a marathon in a rainstorm.</p><p>At Swym, we don&#8217;t use fancy bots to reject you in milliseconds. We&#8217;re humans. We&#8217;re small, we&#8217;re scaling (and we want to stay small keeping exponential growth in mind), and we care more about your drive than your ability to keyword-stuff a resume.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>If you&#8217;ve been wondering what happens after you hit &#8220;Apply,&#8221; here is the real story.</p><h2><strong>&#128681; Is Swym Actually For You? (The Vibe Check)</strong></h2><p>Before we talk about interviews, let&#8217;s see if we&#8217;re a match. If you&#8217;re looking for a long form manual on how to do your job, we are most definitely not the one.</p><p><strong>You&#8217;ll love it here if:</strong></p><ul><li><p>You see ambiguity and think &#8220;Cool, I get to build the map&#8221; rather than &#8220;Help, I&#8217;m lost&#8221;, because you understand that wrapped within the ambiguity is the true size of the opportunity that nobody else can unravel other the ones working on it constantly</p></li><li><p>You care about making an impact much more than having a fancy title, because you understand that the voice of impact speaks more consistently, confidently (and louder) than the voice of a title in most rooms if not all, especially in our rooms. </p></li><li><p>You know that remote-first doesn&#8217;t mean work from under a rock disconnected from reality, because you understand remote-first is a convenience that everyone pays for in bits-and-pieces and more importantly you win by making others win and vice versa and that needs consistent communication that is &#8220;persistent&#8221; (calls/meetings are not considered communication btw).</p></li><li><p>You know that the AI-enabled-you &gt; &gt; &gt;  no-AI-you, because you understand that if you don&#8217;t take advantage of technology, what you do will eventually become obsolete (in most cases) and you are already eliminating those &#8220;grunt&#8221; work that bother you from pursuing deeper problems</p><p></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ffyn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ffyn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ffyn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ffyn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ffyn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ffyn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg" width="2816" height="1312" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1312,&quot;width&quot;:2816,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:496640,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/186284224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8507045-6810-4554-b708-0ad032b8ed70_2816x1536.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ffyn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ffyn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ffyn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ffyn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a21b9fc-484f-493c-93fd-f45127ac9064_2816x1312.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><strong>This is fine&#8230;..</strong></figcaption></figure></div><h2><strong>&#128736; The Swym Roadmap: From Hello to Hired</strong></h2><p>We respect your time. We aim to wrap things up in 2 to 3 weeks. No six month marathons here.</p><h3><strong>Stage 1 - Questionnaire - All about you</strong></h3><p><strong>&#128173;What Happens?  - </strong>A quick screen to see how you think</p><p><strong>&#128161;Pro Tip - </strong>Be yourself. We can tell when it&#8217;s authentic</p><h3><strong>Stage 2 - Chat with me</strong></h3><p><strong>&#128173;What Happens?  - </strong>A vibe check with me (Danica!)</p><p><strong>&#128161;Pro Tip - </strong>Ask about the culture. I&#8217;ll give you the real tea</p><h3><strong>Stage 3 - Discuss with us</strong></h3><p><strong>&#128173;What Happens?  - </strong>Talk shop with a future teammate</p><p><strong>&#128161;Pro Tip - </strong>This is where you nerd out about the role, everything is on the proverbial table</p><h3><strong>Stage 4 - Solve/Build with us</strong></h3><p><strong>&#128173;What Happens?  - </strong>A practical take-home, real world challenge</p><p><strong>&#128161;Pro Tip - </strong>Show us your thought process, ask questions/discuss, not just the final answer</p><h3><strong>Stage 5 - Align with us</strong></h3><p><strong>&#128173;What Happens?  - </strong>Align with leads on the vision and how we want to get there</p><p><strong>&#128161;Pro Tip - </strong>45 minutes. No trick questions, just real talk</p><h2><strong>&#128161; How to Put Your Best Foot Forward</strong></h2><h3><strong>1. Do a Little Homework &#128214;</strong></h3><p>If I ask &#8220;What do we do?&#8221; and you say &#8220;I think you guys sell swimsuits?&#8221; we&#8217;re off to a rocky start. Check our <a href="https://www.linkedin.com/company/swym-corporation">LinkedIn</a>, read our blog (you are already here!), or <a href="https://getswym.com/">just browse our site</a> for five minutes (or more hopefully).</p><h3><strong>2. The STAR Method</strong></h3><p>When we ask about a time you failed or solved a problem, try the STAR method: <strong>S</strong>ituation<strong>, T</strong>ask<strong>, A</strong>ction<strong>, R</strong>esult<strong>.</strong> It keeps you from rambling. We&#8217;ve all been there!</p><h3><strong>3. Be a Human</strong></h3><p>We want to see your brain work. The &#8220;ums&#8221; and &#8220;ahs&#8221; are fine. We value a thoughtful conversation over a rehearsed script. </p><h3><strong>4. Laptop Over Phone &#128187;</strong></h3><p>Technical glitches happen, but joining a video interview from a shaky phone while walking your dog makes it hard for us to focus on your story.</p><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hhhG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hhhG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!hhhG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!hhhG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!hhhG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hhhG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!hhhG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!hhhG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!hhhG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!hhhG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd762d87a-53be-43bf-9fa7-463416830cc8_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>&#129516; What Makes a &#8220;Swymmer&#8221;?</strong></h2><p>We aren&#8217;t looking for robots. We look for people who are honest about their values and how they work. We care deeply about:</p><ul><li><p><strong>Ownership</strong>: You aren&#8217;t here just to do the thing; you own the outcome. </p></li><li><p><strong>Big Impact and</strong> <strong>High-Agency:</strong> You won&#8217;t let anything stop you from getting to your outcome, be it your lack of experience or context or know-how, all of those can be acquired when fully aligned. You drive towards the impact, it doesn&#8217;t &#8220;just happen&#8221;.</p></li><li><p><strong>Growth Mindset</strong>: We win together - You thrive on collaboration and learn from the smart people we have around. Even more important is that you actively raise the bar for the smart folks that we are, making us grow our combined depth/knowledge.</p></li><li><p><strong>Customer-First</strong>: You always start and end with how this helps the people using what we build, be it an internal customer or an external one.</p></li><li><p><strong>Data aware aka &#8220;Guessing&#8221; with Data</strong>:  First principle thinking on using data to build your hypotheses - you make decisions based on accessible real info, not all info but the necessary and sufficient info to let you iterate.</p></li><li><p><strong>Sustainable Ambition aka Work AND Life</strong>: We value hard work but continued hard work is hazardous without healthy boundaries. You know how to define those boundaries responsibly, that prioritizes your life without compromising your or your team&#8217;s goals. </p></li><li><p><strong>Pure Passion</strong>: Whether it&#8217;s your craft, a cause, or a personal side project, share it with us. We love seeing what drives your conviction in action.</p></li><li><p><strong>AI-enabled:</strong> You think and use AI effectively to maximize time spent on deep work. This enables pretty much every other point laid above this, simply impossible to sustain without this first-principle.</p></li></ul><h2><strong>&#10067; Frequently Asked (and Honestly Answered) Questions</strong></h2><p><strong>Is it remote?</strong></p><p>Yes. We are remote-first. We also believe active collaboration is a serious competitive advantage and love working together as well. Our Bangalore space plays the part of an office during those days of intensity. (Cubbon Park is literally a stone&#8217;s throw away if the view matters)</p><p><strong>Will I get ghosted?</strong></p><p>No. We aim to give feedback within 48 hours of each stage. If it isn&#8217;t a fit, we will tell you why.</p><p><strong>What are you actually looking for?</strong></p><p>Ownership, data-informed decisions, and passion. Whether you&#8217;re obsessed with scalable systems or great experiences or sourdough baking, we want people who care about something.</p><p><strong>What are the responsibilities and deliverables for this role? Where is this role going?</strong></p><p>This will sound odd - A lot of the roles that are needed to do justice to our true opportunity have not been defined yet. Knowing that, we don&#8217;t always go heavy on the JDs. We instead align on our non-negotiables and your non-negotiables, let the other details evolve with time-bound milestones. Some of our best people have come in as role &#8220;X&#8221;, shaped up into role &#8220;Y&#8221; that is carved out based on what the opportunity needed - We love making this happen.</p><h2><strong>The Bottom Line</strong></h2><p>We aren&#8217;t looking for perfection. We&#8217;re looking for your ability to take your potential to its limits and have fun along the way (not just yours, push our collective potential to higher limits). If you want to build things that matter with people who actually like each other, we want to hear from you.</p><p><strong>Ready to jump in?</strong> Shoot me an email at <strong>danica.lobo@swymcorp.com</strong>. Let&#8217;s build something cool (aka Swym &#128522;) together.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[BFCM 2025 - A Magical time for Shoppers, Merchants and Engineers]]></title><description><![CDATA[How we kept our systems healthy at 1 Million+ RPM]]></description><link>https://stories.getswym.com/p/bfcm-2025-a-magical-time-for-shoppers</link><guid isPermaLink="false">https://stories.getswym.com/p/bfcm-2025-a-magical-time-for-shoppers</guid><dc:creator><![CDATA[Saai Sudarsanan D]]></dc:creator><pubDate>Sat, 13 Dec 2025 07:15:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e00b0f4c-111f-4ee1-b7fb-a24a515e0f74_3360x1899.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You&#8217;ve just had a wonderful thanksgiving dinner, you hit the bed early, and as soon as you wake up, you must be prepared for one of the biggest sales of the year! BFCM, Black Friday - Cyber Monday, is one of the most important periods on the commerce calendar, with an ever-growing YoY revenue. </p><p>When most folks were getting ready to buy all your favorite products, at Swym we took this chance to display our ability and engineering excellence at scale.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This was our 10th BFCM at Swym, poised to be the biggest BFCM yet. We onboarded a lot of merchants BFCM&#8217;24, but we were also the most prepared this year. We moved all of our services to better infra and improved a lot of our infra practices - we handled <strong>1 Million+ RPM</strong> with low turbulence, almost like a breeze, if we daresay.</p><p>Here is a quick recap of what we enabled BFCM 2025 for our merchants</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ea351848-cd58-4494-8d5e-88023e302ebc&quot;,&quot;duration&quot;:null}"></div><p><a href="https://www.linkedin.com/posts/swym-corporation_bfcm2025-ecommercegrowth-swym-activity-7405271587299565568-WR9x?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAMk_uUBi-HKYYbuAfYaY-OZt7iT2HXBPoU">More here</a></p><p>This post is the story behind how we engineered this BFCM at Swym.  </p><p>Let&#8217;s divide and conquer the process, we had multiple focus areas that we worked on to make our systems ready for BFCM, we cover them one by one.</p><div><hr></div><h3>Migrating to Kubernetes</h3><p>Kubernetes was a huge thing in Swym, we were using it for all our queue processors and NodeJS Services, but the bulk of our ecosystem was written in Clojure and they were still on VMs. </p><p>During BFCM 2024, we had to provision new VMs and do some capacity planning to make sure we didn&#8217;t go down under the BFCM load, but this January this year we realized that we have had enough of this manual provisioning (We used Terraform, but still, it was too slow), so we decided to move our Clojure (pseudo) microservices to Kubernetes as well. (<a href="https://stories.getswym.com/p/why-clojure-though">If you are asking Why Clojure? &#129300;</a>)</p><p>A 2-month long consistent effort was required to onboard all our services to Kubernetes. Every service we onboarded presented its own problems. For example, our Clojure Services presented had some statefulness in them, we had to rewrite the stateful parts of the service to make them stateless. There were also changes in the way configuration was loaded into the services, eg: Clojure services used EDN files for configuration (a Clojure native data notation), which wasn&#8217;t the case in NodeJS services.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N_3D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N_3D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg 424w, https://substackcdn.com/image/fetch/$s_!N_3D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg 848w, https://substackcdn.com/image/fetch/$s_!N_3D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!N_3D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N_3D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg" width="800" height="437" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:437,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Why does migrating to Kubernetes feel like digging dead bodies? Migrating  to Kubernetes has become the new norm. It's like we've all bought into the  promise of a silver bullet for our&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Why does migrating to Kubernetes feel like digging dead bodies? Migrating  to Kubernetes has become the new norm. It's like we've all bought into the  promise of a silver bullet for our" title="Why does migrating to Kubernetes feel like digging dead bodies? Migrating  to Kubernetes has become the new norm. It's like we've all bought into the  promise of a silver bullet for our" srcset="https://substackcdn.com/image/fetch/$s_!N_3D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg 424w, https://substackcdn.com/image/fetch/$s_!N_3D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg 848w, https://substackcdn.com/image/fetch/$s_!N_3D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!N_3D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb632c354-ef28-4514-a1f4-0c4a206aa43f_800x437.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But in the end after we fixed all the bugs, we saw light at the end of the tunnel, the K8s Migration was complete and our microservices were autoscaling. </p><p>We tuned the autoscaler according to our needs and waved a fond Goodbye to the days of manual VM creation and management.</p><h3>Observability Overhaul (Prometheus, Jaeger, OpenSearch fixes)</h3><p>When you receive <strong>800-900K requests per minute</strong>, you generate 2 to 4 times the amount of logs and traces. We were processing at least <strong>3000 spans per second</strong> and about <strong>80-100GB of logs per hour</strong>, pre-BFCM. The scale like we anticipated spiked during BFCM.</p><h5>Logging</h5><p>Our logging architecture had to improve exponentially to handle this scale. We shifted from logstash to a <a href="https://fluentbit.io/">fluentbit-fluentd based agent-aggregator architecture</a>, for the log collection mechanism.</p><ul><li><p><strong>Fluentbit pods (agents)</strong>, running as a part of a daemonset collected the logs from the services and just forwarded (using the fluent forward protocol) them to the Fluentd aggregator. The Agents ran as daemon-sets in their respective nodepools. You can configure a daemonset to run only on a specific set of nodes by setting node affinity. </p></li><li><p><strong>The Fluentd aggregator</strong> decided which index on <strong>OpenSearch</strong> to push the logs to, using an custom Lua Script. This helped us ensure that none of the logs were lost</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DV9y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DV9y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png 424w, https://substackcdn.com/image/fetch/$s_!DV9y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png 848w, https://substackcdn.com/image/fetch/$s_!DV9y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png 1272w, https://substackcdn.com/image/fetch/$s_!DV9y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DV9y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png" width="1456" height="1073" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1073,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306909,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/180418424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DV9y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png 424w, https://substackcdn.com/image/fetch/$s_!DV9y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png 848w, https://substackcdn.com/image/fetch/$s_!DV9y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png 1272w, https://substackcdn.com/image/fetch/$s_!DV9y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04e6c2d5-2115-493f-9915-26bdfea6971a_3513x2588.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://opensearch.org/">OpenSearch</a> created the indices and maintained them using <strong>ISM (Index State Management) policies</strong>, which were used to configure <strong>log retention and priority</strong>, thus keeping storage costs and maintenance manageable.</p><h5>Tracing</h5><p><a href="https://www.jaegertracing.io/">Jaeger</a> is the absolute core of our debugging workflow&#8212;losing spans or a Jaeger outage during BFCM would be equivalent to operating blind. Our previous setup wouldn&#8217;t cut it, demanding a much more resilient cluster and an upgrade to <strong>Jaeger V2</strong>.</p><p>To future-proof the system, we introduced redundancy:</p><ol><li><p>Services push spans to <strong><a href="https://opentelemetry.io/">OpenTelemetry</a> (Otel) Collectors</strong>.</p></li><li><p>Otel Collectors push the spans into a temporary <strong>Kafka buffer</strong> (our &#8220;Kafka-Span-Buffer&#8221;).</p></li><li><p>Otel Kafka Consumers read the spans and write them to OpenSearch.</p></li></ol><p>This Kafka buffer was designed to prevent span loss during temporary downstream issues. However, the sheer write load exposed a major bottleneck: the underlying <strong>hard disks (HDDs) reached maximum throughput</strong>, causing critical latency spikes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OvJI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OvJI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png 424w, https://substackcdn.com/image/fetch/$s_!OvJI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png 848w, https://substackcdn.com/image/fetch/$s_!OvJI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png 1272w, https://substackcdn.com/image/fetch/$s_!OvJI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OvJI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png" width="1456" height="582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:582,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1006778,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/180418424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OvJI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png 424w, https://substackcdn.com/image/fetch/$s_!OvJI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png 848w, https://substackcdn.com/image/fetch/$s_!OvJI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png 1272w, https://substackcdn.com/image/fetch/$s_!OvJI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2179636f-83e7-484f-9a7e-a1e23dd2dab9_6530x2608.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>The Fix:</strong> We immediately provisioned a <strong>high-performance SSD</strong> dedicated exclusively for the primary <strong>write index</strong> in OpenSearch. After a brief, high-throughput period (e.g., one hour), the index would automatically roll over, and the data stored on the expensive SSDs was migrated to a low-performance archival node. This tactical use of hardware ensured zero write latency during peak traffic periods, while keeping the costs low.</p><p>This way we were able to process and save 2.5 billion+ spans during the 4 days of BFCM.  </p><h3>JVM Optimization</h3><p>Obvious but requisite context - <strong>Java compiles to byte code and the byte code runs on the Java Virtual Machine, which in-turn runs on bare metal.</strong> This makes Java a versatile and cross-platform programming language. Fun fact, though its heavy, it is faster (comparable to C or C++) when it comes to runtime on a single core CPU. This is because the JVM optimizes your byte code multiple times during runtime. It generates hotpaths for frequently executed code. The JVM can be tuned to give max performance. We missed a very important JVM flag when migrating our services to kubernetes! This caused our services to severely under utilize the available memory. </p><p>We had forgotten the <strong>MaxRAMPercentage Flag</strong> and JVM was <strong>defaulting to 25% </strong>&#129760; &#129760; &#129760; <strong>!!! </strong></p><p>Relearning that from our VM-based deployments quickly, the memory utilization of our VMs became extremely optimal after setting it to 75% and this one flag gave us a lot of perf gains including a significant ART reduction (190-300ms across our services) and a good fistful of dollars saved per hour! </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P-7d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P-7d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg 424w, https://substackcdn.com/image/fetch/$s_!P-7d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg 848w, https://substackcdn.com/image/fetch/$s_!P-7d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!P-7d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P-7d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg" width="500" height="659" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:659,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!P-7d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg 424w, https://substackcdn.com/image/fetch/$s_!P-7d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg 848w, https://substackcdn.com/image/fetch/$s_!P-7d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!P-7d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bc4140-b806-40a0-895d-14ddcfc1e49a_500x659.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Pro tip -</strong> <strong>JVM Flags are critical, if someone tells you otherwise, they&#8217;re probably C# developers &#128521;.</strong></p><p>I cannot do justice to this finding in such a short paragraph, let me explain the different JVM flags we use and why, in a separate post.</p><h3>Queue Processor Optimization</h3><p>A major design choice in our VMs was, the service that was serving API requests was also tasked with processing messages across queues.</p><p>The tight coupling of real-time <strong>API serving</strong> and <strong>asynchronous queue processing</strong> was a major part of our original VM architecture. While it was manageable at a lower scale, this mixing of responsibilities was inefficient and prevented us from maximizing resource utilization. While separation of concerns sounds like an obvious answer that you would get most engineering minds nodding in agreement, the reality of maintaining more sub-systems for little-to-no-value is something we take seriously. Hence the &#8220;why&#8221; we need to do it had to go into first principles alignment without throwing the proverbial baby with the bath water.</p><h5>The Decoupling Strategy</h5><p>To solve this and fully leverage our Kubernetes migration, we implemented a complete separation of concerns:</p><ol><li><p><strong>API Services:</strong> Responsible only for handling synchronous, user-facing requests and pushing asynchronous work onto the queue. These services require high availability and predictable performance.</p></li><li><p><strong>Queue Processors:</strong> Responsible only for consuming messages from the queue and executing short-lived, asynchronous tasks. These services can tolerate disruption and have variable capacity needs.</p></li></ol><h5>Leveraging Azure Spot VMs for Cost Optimization</h5><p>This separation was key to an immediate and substantial <strong>cost optimization</strong>.</p><p>We achieved this by utilizing <strong>Azure Spot Virtual Machines</strong> through Azure Kubernetes Service (AKS) Spot Nodepools:</p><ul><li><p><strong>API Services Deployment:</strong> These were deployed onto <strong>Reserved Instances</strong> (standard, high-availability nodepools) to ensure zero downtime and consistent API performance.</p></li><li><p><strong>Queue Processors Deployment:</strong> These were moved entirely to <strong>Spot Nodepools</strong> (using Azure Spot VMs). The disruptable nature of Spot VMs&#8212;where Azure can reclaim the resource with a short notice&#8212;was entirely acceptable for our queue processors, as the queued messages would simply be picked up by another available Spot VM or, if necessary, a reserved VM once it became available.</p></li></ul><p>Azure Spot Virtual Machines, are basically leftover capacity that Azure wants to use in an effective way.  Say Azure has 100 Virtual Machines, and it has rented out 30 to <strong>Swym</strong> and 20 to <strong>CompanyX</strong>, now, it has <strong>50 unused VMs</strong>. Azure offers these under the Spot Category at fraction of the actual price!! But the caveat is that Azure can reclaim these VMs if it needs them for something else, say, <strong>CompanyZ</strong> wants 50 VMs. Azure gives a 30 second, eviction notice before reclaiming the capacity.</p><p>The above explanation is a very crude one, please read more about Azure Spot VMs <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/spot-vms">here</a>.</p><p>The practical implementation was simple: we used an environment flag within our application to toggle between the API-serving logic and the asynchronous processing logic. By running these two configurations on different nodepools, we effectively:</p><ul><li><p><strong>Improved API Performance:</strong> By dedicating highly available resources solely to low-latency API calls.</p></li><li><p><strong>Optimized Costs:</strong> By running the resource-intensive, interrupt-tolerant asynchronous tasks on highly discounted Spot VMs.</p></li></ul><div><hr></div><h3>Code Freeze!</h3><p>There was a strict code freeze during the entire span of the BFCM period, no deployments or config changes were allowed during this period (unless they were bug fixes). To be our own critic - That doesn&#8217;t sound like a 2025-ready decision. But we chose to stop deploying any new lines of code without a strong reason that can&#8217;t wait for the 5-7 days. This is an area of improvement for 2026, something we keep tinkering on how to enable true CI/CD.</p><p>In the meantime, we upgraded our kubernetes clusters, and applied multiple security patches to the existing codebase, further hardening our systems for the impending fun onslaught &#128526;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oIp9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oIp9!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif 424w, https://substackcdn.com/image/fetch/$s_!oIp9!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif 848w, https://substackcdn.com/image/fetch/$s_!oIp9!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif 1272w, https://substackcdn.com/image/fetch/$s_!oIp9!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oIp9!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif" width="642" height="394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:394,&quot;width&quot;:642,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Prayer Server Meme - Prayer Server Fixing - Discover &amp; Share GIFs&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Prayer Server Meme - Prayer Server Fixing - Discover &amp; Share GIFs" title="Prayer Server Meme - Prayer Server Fixing - Discover &amp; Share GIFs" srcset="https://substackcdn.com/image/fetch/$s_!oIp9!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif 424w, https://substackcdn.com/image/fetch/$s_!oIp9!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif 848w, https://substackcdn.com/image/fetch/$s_!oIp9!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif 1272w, https://substackcdn.com/image/fetch/$s_!oIp9!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5727b271-fd12-4253-b3e0-3c9b68fbe0c2_642x394.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Finally, most of the engineering team (almost all Swymmers are engineers &#128105;&#8205;&#128187;&#128104;&#8205;&#128187;) got together in Bengaluru and kept an eye aka stared at the BFCM Grafana dashboards for days and nights on a shift basis to celebrate every spike and stat that showed how much of the global ecommerce volumes we helped supporting. Thankfully, there were just murmurings of incidents or outages, lots of (welcome) false flags that drove us to finding better ways of monitoring/concluding if a peak/trough was concerning or not.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hyim!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hyim!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hyim!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hyim!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hyim!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hyim!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg" width="500" height="368" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:368,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Computer Guy meme&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Computer Guy meme" title="Computer Guy meme" srcset="https://substackcdn.com/image/fetch/$s_!hyim!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hyim!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hyim!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hyim!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95637c1c-d72b-46c5-8e1c-a6a32176e71d_500x368.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Conclusion</h2><p>True to our core values, we hoped for the best but planned for the worst. And thankfully we surged ahead along with the BFCM rush for our merchants &#8212; and our <strong>engineering held up to the standards we wanted to set for ourselves &#128588;</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kbSS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kbSS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kbSS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kbSS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kbSS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kbSS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg" width="624" height="416" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:212,&quot;width&quot;:318,&quot;resizeWidth&quot;:624,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Success Kid - Wikipedia&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Success Kid - Wikipedia" title="Success Kid - Wikipedia" srcset="https://substackcdn.com/image/fetch/$s_!kbSS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kbSS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kbSS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kbSS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3118097e-76b4-4a8f-9388-af052aaadd9d_318x212.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The shift to <strong>Kubernetes</strong> turned capacity spikes into non-events, replacing manual firefighting with automated, cost-efficient elasticity that sailed past 1 million+ RPM (repetitive but we are super thrilled &#128516;). Our <strong>Observability Overhaul</strong> paid dividends, processing 2.5 billion+ spans and transforming potential blind spots into clear operational awareness and intelligence across teams.</p><p>From relearning like the critical <strong>JVM MaxRAMPercentage</strong> fix to deploying advanced <strong>Spot VM</strong> cost-optimizations, every strategic move has helped move our platform forward. Our<strong> infrastructure is set for the next phase of our growth.</strong> We are scaling, optimizing and ready for whatever the next peak 2026 throws our way.</p><p>Here are a few episodes from our podcast on pre-BFCM prep and even an episode in the middle of BFCM &#129397; &#128526;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e924aa64-5ed2-4526-b90d-6b05cec86fa9&quot;,&quot;caption&quot;:&quot;In this episode, we take you behind the scenes into Swym&#8217;s pre-BFCM preparation, from infrastructure hardening to real-time monitoring setups, support readiness, incident protocols, and everything our team puts in place before the biggest shopping weekend of the year.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How Swym Prepares for the Biggest Weekend in Retail &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:260109033,&quot;name&quot;:&quot;Sakshi Gupta&quot;,&quot;bio&quot;:&quot;Travel, Technology, Product and Thoughts&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b28faeb6-2b88-476d-89e1-9307bad7eb82_496x496.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-12-01T16:49:51.688Z&quot;,&quot;cover_image&quot;:&quot;https://substack-video.s3.amazonaws.com/video_upload/post/180419960/47a9b710-ae96-4081-b326-7bf4c8dd76fc/transcoded-1764607774.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://stories.getswym.com/p/how-swym-prepares-for-the-biggest&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:&quot;47a9b710-ae96-4081-b326-7bf4c8dd76fc&quot;,&quot;id&quot;:180419960,&quot;type&quot;:&quot;podcast&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:1,&quot;publication_id&quot;:2886569,&quot;publication_name&quot;:&quot;Swym Stories&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!_B_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1092240-7c5c-4cfb-aaf7-ab6ad9f84ffb_270x270.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;b222ddb6-7898-4dfd-bfa8-e69cd706105a&quot;,&quot;caption&quot;:&quot;Part 2 of our BFCM series dives into the live weekend.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Inside BFCM: Real-Time Ops, Monitoring &amp; Support at Scale&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:260109033,&quot;name&quot;:&quot;Sakshi Gupta&quot;,&quot;bio&quot;:&quot;Travel, Technology, Product and Thoughts&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b28faeb6-2b88-476d-89e1-9307bad7eb82_496x496.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-12-01T17:36:54.093Z&quot;,&quot;cover_image&quot;:&quot;https://substack-video.s3.amazonaws.com/video_upload/post/180420657/d07ceda6-3e28-41b7-9237-b32545ef063e/transcoded-1764610592.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://stories.getswym.com/p/inside-bfcm-real-time-ops-monitoring&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:&quot;d07ceda6-3e28-41b7-9237-b32545ef063e&quot;,&quot;id&quot;:180420657,&quot;type&quot;:&quot;podcast&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:1,&quot;publication_id&quot;:2886569,&quot;publication_name&quot;:&quot;Swym Stories&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!_B_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1092240-7c5c-4cfb-aaf7-ab6ad9f84ffb_270x270.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;1da34ade-8cc3-4ea2-a744-15e351bf0cb8&quot;,&quot;caption&quot;:&quot;Join me, as I delve into the intricacies of customer experience with Krishnan, the Director of Customer Experience and Support. Discover how Swym bridges the gap between technical expertise and strategic guidance to transform customer interactions into lasting loyalty. This episode explores the critical role of customer experience in driving growth and &#8230;&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;BFCM &amp; Beyond&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:260109033,&quot;name&quot;:&quot;Sakshi Gupta&quot;,&quot;bio&quot;:&quot;Travel, Technology, Product and Thoughts&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b28faeb6-2b88-476d-89e1-9307bad7eb82_496x496.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null},{&quot;id&quot;:365970212,&quot;name&quot;:&quot;Krishnan A J&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd95aaf5-9dc0-4862-a54b-4ca4d04e39a6_144x144.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-11-10T16:18:29.079Z&quot;,&quot;cover_image&quot;:&quot;https://substack-video.s3.amazonaws.com/video_upload/post/178511525/2669724e-3582-496d-b249-64335a67f703/transcoded-1762872447.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://stories.getswym.com/p/the-customer-experience-engine&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:&quot;2669724e-3582-496d-b249-64335a67f703&quot;,&quot;id&quot;:178511525,&quot;type&quot;:&quot;podcast&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:2886569,&quot;publication_name&quot;:&quot;Swym Stories&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!_B_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1092240-7c5c-4cfb-aaf7-ab6ad9f84ffb_270x270.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Shopify Winter ’26: The Ecosystem's "Renaissance"]]></title><description><![CDATA[What These Updates Really Mean for App Developers]]></description><link>https://stories.getswym.com/p/shopify-winter-26-the-ecosystems</link><guid isPermaLink="false">https://stories.getswym.com/p/shopify-winter-26-the-ecosystems</guid><dc:creator><![CDATA[Sakshi Gupta]]></dc:creator><pubDate>Thu, 11 Dec 2025 14:15:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Svo1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Svo1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Svo1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png 424w, https://substackcdn.com/image/fetch/$s_!Svo1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png 848w, https://substackcdn.com/image/fetch/$s_!Svo1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png 1272w, https://substackcdn.com/image/fetch/$s_!Svo1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Svo1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png" width="1456" height="696" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:696,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1460362,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/181316632?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Svo1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png 424w, https://substackcdn.com/image/fetch/$s_!Svo1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png 848w, https://substackcdn.com/image/fetch/$s_!Svo1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png 1272w, https://substackcdn.com/image/fetch/$s_!Svo1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F208a1c37-6033-4575-a400-5befb4cf1007_1472x704.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">All credits to Shopify for the image and Nano Banana for the Wishlist Fairy </figcaption></figure></div><p></p><p>Every Shopify Editions drops a wave of features, but Winter &#8217;26 feels different. This one wasn&#8217;t just about tooling. It was about a shift in how merchants expect to operate and how Shopify expects its ecosystem to evolve.</p><p>If you&#8217;re building apps on Shopify, this update cycle is a reminder of one thing:<br><strong>The bar is rising, and the opportunity space is widening at the same time.</strong></p><p>A quiet question has started buzzing through developer threads:<br><em>&#8220;Is this the beginning of apps becoming obsolete?&#8221;</em></p><p>Short answer: <strong>no.</strong><br>Long answer: Shopify is expanding the canvas, not closing it. And Winter &#8217;26 proves it.</p><div><hr></div><h2><strong>1. Sidekick Extensibility: The Most Important Developer Update</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!StDI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!StDI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png 424w, https://substackcdn.com/image/fetch/$s_!StDI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png 848w, https://substackcdn.com/image/fetch/$s_!StDI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png 1272w, https://substackcdn.com/image/fetch/$s_!StDI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!StDI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png" width="1444" height="703" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:703,&quot;width&quot;:1444,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:324178,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/181316632?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41bf0f54-d3ba-4ea0-9d68-3a9ad84d41db_1480x752.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!StDI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png 424w, https://substackcdn.com/image/fetch/$s_!StDI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png 848w, https://substackcdn.com/image/fetch/$s_!StDI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png 1272w, https://substackcdn.com/image/fetch/$s_!StDI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eed24bc-98a1-49c8-8c12-93aff55c775a_1444x703.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://shopify.dev/docs/apps/build/sidekick">https://shopify.dev/docs/apps/build/sidekick</a></p><p>If you read only one section of the Editions recap, let it be this.<br><strong>Sidekick Extensions</strong> fundamentally change how merchants interact with apps.</p><p>You&#8217;re no longer building features that live <em>next to</em> merchant workflows.<br>You&#8217;re building intelligence that lives <em>inside</em> their workflows.</p><p>Developers can now:</p><ul><li><p>Expose app capabilities through natural-language prompts</p></li><li><p>Allow merchants to trigger app actions without UI friction</p></li><li><p>Inject their logic directly into Sidekick&#8217;s conversational interface</p></li><li><p>Even construct <strong>custom app behaviors</strong> through Sidekick itself</p></li></ul><p>Yes, merchants can &#8220;build&#8221; with Sidekick now. But that doesn&#8217;t diminish the role of apps.</p><p>If anything, it expands it.</p><p>Merchants can prototype ideas with Sidekick.<br>But when they need scale, reliability, debugging, audits, security, or ongoing evolution, they will turn to apps.</p><p><strong>Sidekick becomes the on-ramp, not the substitute.</strong></p><p>At Swym, we&#8217;re already thinking about what this unlocks.<br>Imagine a merchant asking Sidekick:</p><blockquote><p>&#8220;Show me the top wishlisted items that are back in stock this week and schedule reminders automatically.&#8221;</p></blockquote><p>That type of workflow isn&#8217;t a UI feature.<br>It&#8217;s conversational commerce infrastructure.<br>And apps like Wishlist Plus are uniquely positioned to power it.</p><div><hr></div><h2><strong>2. Native A/B Testing: A Signal About Merchant Maturity</strong></h2><p>Shopify adding first-class A/B testing is not about replacing experimentation apps, it&#8217;s about legitimizing behavioral testing as a core operating model.</p><p>For developers, this means:</p><ul><li><p>Standardized schemas for experiment variants</p></li><li><p>Cleaner integrations for optimization or personalization apps</p></li><li><p>A merchant base newly conditioned to test, measure, and refine</p></li></ul><p>This shift matters.<br>Apps that interpret test results, automate variant creation, or correlate experiments with user behavior will thrive.</p><p>For Swym, this could mean letting merchants:</p><ul><li><p>Test different wishlist CTA styles</p></li><li><p>Understand how nudges perform</p></li><li><p>Optimize back-in-stock timing or messaging</p></li></ul><p>The platform giving merchants testing muscle means apps get to offer more sophisticated strategies on top of it.</p><p>Added bonus is <a href="https://apps.shopify.com/simgym">Simgym</a>, an AI-driven <strong>shopper behavior simulator</strong> that works like a <em>pre-launch predictive testing environment</em>. Instead of only relying on real traffic and A/B experiments after deployment, SimGym lets merchants run AI shopper simulations based on data from billions of past transactions to estimate how changes might perform. </p><div><hr></div><h2><strong>3. Shopify Network: The Unbundled, Everywhere Shopify</strong></h2><p>The introduction of <strong>Shopify Network</strong> makes one thing clear:<br>Shopify knows the ecosystem now lives far beyond the storefront.</p><p>This layer connects shoppers, channels, apps, and stores into a cohesive experience.</p><p>For developers, this unlocks:</p><ul><li><p>More surfaces where your app can provide value</p></li><li><p>More events that flow between touchpoints</p></li><li><p>More opportunities to be part of a shopper&#8217;s journey</p></li></ul><p>Swym has always believed commerce isn&#8217;t linear.<br>A shopper moves between emails, search engines, social feeds, PDPs, and back again.<br>A wishlist event shouldn&#8217;t be siloed, it should fuel the entire network.</p><p>Shopify Network validates this philosophy.</p><div><hr></div><h2><strong>4. Global Catalog Moves Center Stage</strong></h2><p>Global Catalog used to be powerful but peripheral.<br>Winter &#8217;26 brings it into the center of everything.</p><p>It&#8217;s now the authoritative source for:</p><ul><li><p>Global product attributes</p></li><li><p>Multi-market pricing</p></li><li><p>Translations</p></li><li><p>Inventory synchronization</p></li><li><p>Multi-store governance</p></li></ul><p>And this aligns beautifully with the new <strong>Merchant Hub</strong>, built around omnichannel control.</p><p>For app developers, the implications are clear:</p><p><strong>Think global-first, not store-first.</strong></p><p>Apps need to handle:</p><ul><li><p>Cross-market logic</p></li><li><p>Product variants that differ by region</p></li><li><p>Attribute-driven automation</p></li><li><p>Centralized intelligence</p></li></ul><p>For Swym, this shift is huge. A wishlist isn&#8217;t just a &#8220;store&#8221; feature anymore. It&#8217;s a <strong>product affinity layer</strong> across all markets.</p><p>Building on Global Catalog allows wishlist and nudge intelligence to become globally consistent while respecting local rules.</p><div><hr></div><h2><strong>5. Metafield Filtering: Quiet but Transformative</strong></h2><p>One of the quieter updates, metafield filtering and richer querying, is actually a major win for developers.</p><p>You can now:</p><ul><li><p>Query metafields with more precision</p></li><li><p>Filter based on conditions</p></li><li><p>Build richer admin experiences</p></li><li><p>Reduce API overhead</p></li></ul><p>For any app that depends on merchant-defined product attributes (which is most apps), this is a quality-of-life upgrade.</p><div><hr></div><h2><strong>6. Token Expiry for Offline Access Tokens</strong></h2><p>A light-touch update but an important one. Offline access tokens now expire, which means apps need to refresh tokens periodically.</p><p>This is good security practice.<br>It doesn&#8217;t change how apps fundamentally operate, it simply formalizes a more responsible model.</p><p>It&#8217;s not something to highlight to merchants; it&#8217;s just something developers should quietly adopt.</p><div><hr></div><h2><strong>7. So Are Apps Becoming Obsolete? Absolutely Not.</strong></h2><p>With Sidekick, Network, Global Catalog, testing, and new admin surfaces, it&#8217;s easy to wonder if Shopify is closing in on the space apps occupy.</p><p>But the opposite is happening.</p><p><strong>Shopify is strengthening the foundation so apps can build the differentiated value.</strong></p><p>Every update in Winter &#8217;26 signals that:</p><ul><li><p>Shopify wants AI-native workflows</p></li><li><p>Shopify wants globally consistent product data</p></li><li><p>Shopify wants omnichannel-first execution</p></li><li><p>Shopify wants more interconnected flows</p></li><li><p>Shopify wants apps deeply embedded into merchant operations</p></li></ul><p>This is not a land-grab. It&#8217;s a platform uplift.</p><p>When Shopify raises the floor, app developers get to raise the ceiling.</p><p>And Swym&#8217;s perspective here is simple:<br>These updates don&#8217;t reduce the role of apps, <strong>they increase the expectations of what great apps should do.</strong></p><p>Merchants will expect smarter automation, deeper personalization, and intelligence across surfaces.<br>Apps that lean into this will shape the next generation of commerce experiences.</p><div><hr></div><h2><strong>8. The Path Forward for App Developers</strong></h2><p>Here&#8217;s what the next era of Shopify apps will be built around:</p><ul><li><p>Conversational workflows powered by Sidekick</p></li><li><p>Global Catalog as the canonical product data layer</p></li><li><p>Omnichannel orchestration via Merchant Hub</p></li><li><p>Optimization powered by native A/B testing infrastructure</p></li><li><p>Network-informed shopper journeys</p></li><li><p>Richer, cleaner data access</p></li></ul><p>For Swym, this means doubling down on our core belief:<br><strong>helping merchants engage shoppers intelligently, across channels, with minimal workflow friction.</strong></p><p>The platform is giving us the surfaces, it&#8217;s up to apps to bring the intelligence.</p><div><hr></div><h2><strong>Final Thought</strong></h2><p>Winter &#8217;26 isn&#8217;t the story of Shopify replacing apps.<br>It&#8217;s the story of Shopify expanding what apps can be.</p><p>For any team building in this ecosystem, this is the moment to lean in, because merchants are about to expect more intelligence, more automation, more omnichannel visibility, and more embedded experiences than ever.</p><p>And the apps that embrace this shift will define the next cycle of commerce innovation.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Inside BFCM: Real-Time Ops, Monitoring & Support at Scale]]></title><description><![CDATA[BFCM 2025 - Part 2]]></description><link>https://stories.getswym.com/p/inside-bfcm-real-time-ops-monitoring</link><guid isPermaLink="false">https://stories.getswym.com/p/inside-bfcm-real-time-ops-monitoring</guid><dc:creator><![CDATA[Sakshi Gupta]]></dc:creator><pubDate>Mon, 01 Dec 2025 17:36:54 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/180420657/5ebf89de7d29a2e2ae3d88f9b0681ba5.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Part 2 of our BFCM series dives into the <em>live</em> weekend.<br>We break down what happens behind the scenes as Swym powers millions of shopper interactions in real time.BFCM is where preparation meets execution &#8212; and this episode captures that moment.<br>Watch Episode 3 for prep insights, and stay tuned for Episode 5: our post-BFCM Retrospective.#BlackFriday #BlackFridaySale #CyberMonday #HolidayShopping #Ecommerce #OnlineRetail #RetailMarketing #ConversionTips #BFCM</p>]]></content:encoded></item><item><title><![CDATA[How Swym Prepares for the Biggest Weekend in Retail ]]></title><description><![CDATA[BFCM 2025 - Part 1]]></description><link>https://stories.getswym.com/p/how-swym-prepares-for-the-biggest</link><guid isPermaLink="false">https://stories.getswym.com/p/how-swym-prepares-for-the-biggest</guid><dc:creator><![CDATA[Sakshi Gupta]]></dc:creator><pubDate>Mon, 01 Dec 2025 16:49:51 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/180419960/2c74dd090b16ddefb57aba1a89098b95.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>In this episode, we take you behind the scenes into Swym&#8217;s pre-BFCM preparation, from infrastructure hardening to real-time monitoring setups, support readiness, incident protocols, and everything our team puts in place before the biggest shopping weekend of the year.<br><br>This episode opens the series, guiding us from pre-BFCM prep - through the live rush - into the final retrospect.<br>Subscribe to our youtube channel so you don&#8217;t miss the next parts. &#128153;<br><br><a href="https://www.youtube.com/hashtag/blackfriday">#blackfriday</a>  <a href="https://www.youtube.com/hashtag/blackfridaysale">#BlackFridaySale</a> <a href="https://www.youtube.com/hashtag/cybermonday">#CyberMonday</a> <a href="https://www.youtube.com/hashtag/holidayshopping">#HolidayShopping</a> <a href="https://www.youtube.com/hashtag/ecommerce">#Ecommerce</a> <a href="https://www.youtube.com/hashtag/onlineretail">#OnlineRetail</a> <a href="https://www.youtube.com/hashtag/retailmarketing">#RetailMarketing</a> <a href="https://www.youtube.com/hashtag/conversiontips">#ConversionTips</a> <a href="https://www.youtube.com/hashtag/bfcm">#BFCM</a></p>]]></content:encoded></item><item><title><![CDATA[BFCM & Beyond]]></title><description><![CDATA[How Customer Experience Becomes a Superpower]]></description><link>https://stories.getswym.com/p/the-customer-experience-engine</link><guid isPermaLink="false">https://stories.getswym.com/p/the-customer-experience-engine</guid><dc:creator><![CDATA[Sakshi Gupta]]></dc:creator><pubDate>Mon, 10 Nov 2025 16:18:29 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/178511525/fa4a6072d86702df8cbe38f445a0c273.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p></p><p>Join me, as I delve into the intricacies of customer experience with <strong>Krishnan</strong>, the <strong>Director of Customer Experience and Support</strong>. Discover how Swym bridges the gap between technical expertise and strategic guidance to transform customer interactions into lasting loyalty. This episode explores the critical role of customer experience in driving growth and navigating high-pressure environments. Tune in to learn how Swym&#8217;s team turns challenges into opportunities for building trust and delivering exceptional value to merchants.</p><p></p><h3>A Quick Recap of Our Conversation</h3><ul><li><p><strong>Segment 1: The CX Philosophy</strong> We started by defining what &#8220;CustomerExperience&#8221; (CX) truly means. It&#8217;s not just &#8220;support.&#8221; We explored the guiding principles for our team&#8217;s very first interaction with a stressed merchant and why that empathetic, strategic approach is different.</p></li><li><p><strong>Segment 2: The Everyday Practice</strong> We talked about the &#8220;how.&#8221; Krishnan detailed how we&#8217;re structured with Technical Support Engineers (TSEs) and Customer Success Managers (CSMs) to provide a high-touch experience. We also touched on how AI is influencing this practice and the critical importance of hiring for empathy and ownership intent, not just technical skills.</p></li><li><p><strong>Segment 3: The Stress Test (BFCM)</strong> This is where the engine is truly tested. Krishnan shared the playbook for how we <strong>10x</strong> our <em>efficiency</em> (not our staff) for the surge and maintain a human touch under pressure. He also shared a great story from a past BFCM where the team turned a potential disaster into a merchant &#8216;wow&#8217; moment.</p></li><li><p><strong>Segment 4: Advice for Our Partners</strong> We finished by turning our lessons into actionable advice. Krishnan pointed out the single biggest mistake we should avoid making in support. Krishnan<strong> </strong>shared<strong> </strong>what he wishes <em>every</em> product builder understood about what customers <em>really</em> need.</p><p></p></li></ul><h4><strong>Some Key Takeaways</strong></h4><ul><li><p>Customer experience is more than just support; it&#8217;s about building trust.</p></li><li><p>Swym&#8217;s team transforms challenges into opportunities for loyalty.</p></li><li><p>Technical expertise and strategic guidance are key to customer success.</p></li><li><p>Empathy is crucial in customer interactions.</p></li><li><p>AI tools help streamline repetitive tasks, allowing focus on important issues.</p></li><li><p>Customer feedback is a valuable resource for product improvement.</p></li><li><p>Swym&#8217;s customer experience team is integral to company growth.</p></li><li><p>Effective communication is essential in high-pressure situations.</p></li><li><p>Swym&#8217;s approach to customer experience involves multiple functions working together.</p></li><li><p>Building long-term relationships with customers is a priority.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[How Shopify's Next Gen Dev Platform Supercharged Our Workflow at Swym ]]></title><description><![CDATA[Our first-hand take on the massive workflow wins from Shopify's new dev experience.]]></description><link>https://stories.getswym.com/p/how-shopifys-next-gen-dev-platform</link><guid isPermaLink="false">https://stories.getswym.com/p/how-shopifys-next-gen-dev-platform</guid><dc:creator><![CDATA[Ishaan Shettigar]]></dc:creator><pubDate>Mon, 27 Oct 2025 11:22:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F3eF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Here at Swym, we&#8217;re obsessed with creating best-in-class experiences for Shopify merchants. With a team of over 60 dedicated individuals, including a robust engineering team that makes up almost a third of our company, we pour our energy into building powerful apps like <strong>Swym Wishlist Plus</strong>, <strong>Swym Back in Stock Alerts</strong>, and <strong>Swym Gift Lists &amp; Registries</strong> that help brands engage their customers and grow their business.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! Subscribe for more!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>So, when we got the opportunity to get early access to Shopify&#8217;s new Next Gen Developer Platform, we jumped at the chance. We were eager to see what the future of Shopify app development looked like, and we successfully migrated our apps to the new platform even before it was opened up to the entire ecosystem.</p><p>We want to give a huge thank you to the team at Shopify for their incredible support. As we navigated the beta migration to the new platform, their help was instrumental. A special shout-out to <strong>Nick Wesselman</strong> for his guidance, helping to make the transition as smooth as possible.</p><p>Now that we&#8217;re on the other side, we wanted to share our perspective on the new platform, what we love, the massive wins for developers, and why we believe this is a game-changing leap forward for the entire ecosystem.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F3eF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F3eF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F3eF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F3eF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F3eF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F3eF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F3eF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F3eF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F3eF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F3eF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b653bb6-ab57-4064-affd-27fa2ea00f6c_1600x1200.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>The Big Wins: A New Era for App Development</strong></h3><p>This isn&#8217;t just an incremental update; it&#8217;s a fundamental re-engineering of the developer experience. Here are the highlights that got our team most excited.</p><h4><strong>1. Truly Isolated and Parallel Development is Here!</strong></h4><p>This is, without a doubt, the most significant win for our team. Shopify has completely re-engineered the <code>shopify app dev</code> command, and with it comes a new paradigm for app previews.</p><p>To really appreciate the improvement, let&#8217;s look at how things used to work. Our development process involved each developer running their own local instance of the app. However, to test changes in a stable, shared environment that mirrored production, we relied on a single &#8220;Dev&#8221; version of our app in the Shopify Partner Dashboard. This is where the bottleneck appeared.</p><p>Imagine <em>Developer A</em> is building a new checkout extension. They&#8217;d do their work locally, but to properly test it and get feedback, they would need to push their changes&#8212;and update the preview URLs to our central &#8220;Dev&#8221; app. While they were doing this, that &#8220;Dev&#8221; app was effectively &#8216;occupied&#8217;. If <em>Developer B</em> finished their work on an admin dashboard widget and also needed to test it in that same stable environment, they had to wait. Pushing their changes would overwrite <em>Developer A&#8217;s</em> work-in-progress. This forced us into a queue, where only one developer could safely work in our stable dev environment at a time, significantly slowing down our velocity.</p><p><strong>Now, app previews are tied to a specific dev store.</strong> This is a massive improvement!</p><p>With the new platform, <em>Developer A</em> can connect their local environment to <em>their own</em> dev store, and <em>Developer B</em> can connect to a <em>completely separate</em> dev store. They can both work on their features, see live previews, and test their changes simultaneously, in complete isolation. There&#8217;s no more queue and no more risk of overwriting a colleague&#8217;s work.</p><p>This unlocks true parallel development, allowing our team to move faster and more efficiently.</p><p><strong>As a bonus</strong>, it <strong>eliminates the risk of accidentally updating production URLs &#128552;</strong> during development, a welcome relief for any engineering lead.</p><p></p><h4><strong>2. From Scripts to Schemas: A New Way to Manage Metafields &amp; Metaobjects</strong></h4><p>If you&#8217;ve ever had to manage metafields or metaobjects across thousands of merchant stores, you know the pain. With the new platform, this nightmare is over. <strong>Metafield and metaobject definitions are now declarative</strong>, living inside your shopify.app.toml file.</p><p>What does this mean in practice? Let&#8217;s say you need to add a new metafield. Instead of writing code to create it programmatically on app installation, you simply declare its structure in the TOML file. A simple definition can be just one line. Shopify takes on the responsibility of ensuring this definition is migrated and updated across all merchant stores.</p><p>This offloads a huge operational burden from developers to the platform itself. For us, the migration was as simple as removing all our old logic for creating metafields and defining them in the configuration file. The result? Cleaner code, less maintenance, and more time spent building valuable features.</p><p></p><h4><strong>3. App-Scoped Limits: Predictability and Scale</strong></h4><p>Hallelujah! This is a change that will make every developer&#8217;s life easier. Previously, rate limits for resources like metafields and metaobjects were set at the <em>shop</em> level. This meant your app&#8217;s ability to function could be impacted by other apps a merchant had installed. If another app consumed most of the store&#8217;s metafield limit, your app could fail, leading to confusing support tickets.</p><p><strong>Now, every app gets its own set of limits.</strong> This provides predictability and ensures that your app has the resources it needs to operate correctly, regardless of what other apps are installed on a store. It&#8217;s a change that allows us to build more robust and scalable solutions with confidence.</p><p></p><h4><strong>4. Quality-of-Life Improvements Everywhere</strong></h4><p>Beyond the major architectural shifts, there are several smaller changes that make a big difference in the day-to-day workflow:</p><ul><li><p><strong>Improved Partner Dashboard UI:</strong> The user interface in the Partner Dashboard has received a noticeable facelift, making it cleaner and more intuitive to navigate.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6nD8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6nD8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png 424w, https://substackcdn.com/image/fetch/$s_!6nD8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png 848w, https://substackcdn.com/image/fetch/$s_!6nD8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png 1272w, https://substackcdn.com/image/fetch/$s_!6nD8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6nD8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png" width="392" height="310.43232323232326" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:990,&quot;resizeWidth&quot;:392,&quot;bytes&quot;:85153,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/177257215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6nD8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png 424w, https://substackcdn.com/image/fetch/$s_!6nD8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png 848w, https://substackcdn.com/image/fetch/$s_!6nD8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png 1272w, https://substackcdn.com/image/fetch/$s_!6nD8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe696bd97-b068-4c07-ba76-3091c7fdb65c_990x784.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p><strong>Targeted Dev Stores:</strong> You can now easily create dev stores with specific Shopify plans, like Shopify Plus. This is fantastic for testing plan-specific features without complex workarounds. For apps like ours that offer tailored experiences for Plus merchants, this is an invaluable tool.</p></li><li><p><strong>Consistent Extension UUIDs:</strong> The hassle of managing extension UUIDs is a thing of the past. Now, an extension&#8217;s UUID remains the same across your dev and production app versions. This simplifies configuration management and eliminates the confusion of tracking different IDs across environments.</p></li><li><p><strong>Enhanced Webhook Observability:</strong> Troubleshooting webhooks is now much simpler. The ability to quickly filter deliveries by status, shop, or topic makes diagnosing and fixing issues significantly faster.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!domr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!domr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif 424w, https://substackcdn.com/image/fetch/$s_!domr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif 848w, https://substackcdn.com/image/fetch/$s_!domr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif 1272w, https://substackcdn.com/image/fetch/$s_!domr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!domr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif" width="512" height="478.72" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:748,&quot;width&quot;:800,&quot;resizeWidth&quot;:512,&quot;bytes&quot;:2116298,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://stories.getswym.com/i/177257215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!domr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif 424w, https://substackcdn.com/image/fetch/$s_!domr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif 848w, https://substackcdn.com/image/fetch/$s_!domr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif 1272w, https://substackcdn.com/image/fetch/$s_!domr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e742dc7-c023-4d99-9191-f1fbb8bfc3a0_800x748.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>A Minor Hiccup (And a Quick Fix on the Way)</strong></h3><p>No major platform overhaul is without a few growing pains. One small workflow change we noticed is related to team collaboration on dev stores.</p><p>Previously, if a developer on our team created a dev store, anyone else within our Swym Partner organization could easily access it. Now, access is more restricted. The creator of the dev store needs to manually invite other team members as staff members through the store&#8217;s settings. It&#8217;s a few extra clicks in the process.</p><p>The good news? We&#8217;ve already shared this feedback with the team at Shopify, and true to form, they were receptive and confirmed they are actively working on a solution. We don&#8217;t expect this to be an issue for much longer, which is a testament to Shopify&#8217;s commitment to refining the developer experience.</p><p></p><h3><strong>The Verdict: A Huge Leap Forward</strong></h3><p>Shopify&#8217;s Next Gen Developer Platform is more than just an update&#8212;it&#8217;s a clear signal that Shopify is deeply invested in its developer community. The changes they&#8217;ve implemented address long-standing pain points and provide a faster, more robust, and more scalable foundation for building apps.</p><p>For us at Swym, this new platform unlocks a higher level of productivity and allows us to focus on what matters most: building incredible tools that help Shopify merchants succeed. We are incredibly excited for the future and can&#8217;t wait to see what we can build next!</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/p/how-shopifys-next-gen-dev-platform?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Swym Stories! This post is public so feel free to share it!</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://stories.getswym.com/p/how-shopifys-next-gen-dev-platform?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://stories.getswym.com/p/how-shopifys-next-gen-dev-platform?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item></channel></rss>