<?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:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Beyond Localhost - Medium]]></title>
        <description><![CDATA[Engineering that ships. War stories first: incidents, migrations, benchmarks and the on-call reality behind the slides. System design, infra, Kubernetes, backend. No hype, no product pitches. Want to write for us? Open the Write for Us tab. - Medium]]></description>
        <link>https://medium.com/beyond-localhost?source=rss----7ab1ae1562b8---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Beyond Localhost - Medium</title>
            <link>https://medium.com/beyond-localhost?source=rss----7ab1ae1562b8---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 21:22:45 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/beyond-localhost" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The Watchmaker: Building a Mechanical Watch in a Database]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/beyond-localhost/the-watchmaker-building-a-mechanical-watch-in-a-database-275dae48e0b5?source=rss----7ab1ae1562b8---4"><img src="https://cdn-images-1.medium.com/max/720/1*FPlM81GuoAE2dYowsgbChA.gif" width="720"></a></p><p class="medium-feed-snippet">The Complete watch assembly created using SQL Spatial Geometry</p><p class="medium-feed-link"><a href="https://medium.com/beyond-localhost/the-watchmaker-building-a-mechanical-watch-in-a-database-275dae48e0b5?source=rss----7ab1ae1562b8---4">Continue reading on Beyond Localhost »</a></p></div>]]></description>
            <link>https://medium.com/beyond-localhost/the-watchmaker-building-a-mechanical-watch-in-a-database-275dae48e0b5?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/275dae48e0b5</guid>
            <category><![CDATA[watches]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[sql]]></category>
            <category><![CDATA[time]]></category>
            <category><![CDATA[mathematics]]></category>
            <dc:creator><![CDATA[Trevor Dwyer]]></dc:creator>
            <pubDate>Thu, 12 Nov 2026 15:10:23 GMT</pubDate>
            <atom:updated>2026-11-13T04:39:05.124Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How the Top 5% of Senior Engineers Become Architects — While Everyone Else Keeps Learning More Tech]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/beyond-localhost/how-the-top-5-of-senior-engineers-become-architects-while-everyone-else-keeps-learning-more-tech-dc7c1231d051?source=rss----7ab1ae1562b8---4"><img src="https://cdn-images-1.medium.com/max/912/1*YKxug_r9p2MNNeDjgfalAA.png" width="912"></a></p><p class="medium-feed-snippet">Waiting for the Architect Title? You&#x2019;re Probably Missing These 7 Conversations.</p><p class="medium-feed-link"><a href="https://medium.com/beyond-localhost/how-the-top-5-of-senior-engineers-become-architects-while-everyone-else-keeps-learning-more-tech-dc7c1231d051?source=rss----7ab1ae1562b8---4">Continue reading on Beyond Localhost »</a></p></div>]]></description>
            <link>https://medium.com/beyond-localhost/how-the-top-5-of-senior-engineers-become-architects-while-everyone-else-keeps-learning-more-tech-dc7c1231d051?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/dc7c1231d051</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[design-thinking]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Lets Learn Now]]></dc:creator>
            <pubDate>Thu, 12 Nov 2026 04:04:57 GMT</pubDate>
            <atom:updated>2026-11-12T15:11:54.344Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Your Docker Container Runs as Root. One Vulnerability Could Turn That Into a Host Problem.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/beyond-localhost/your-docker-container-runs-as-root-one-vulnerability-could-turn-that-into-a-host-problem-485193baf756?source=rss----7ab1ae1562b8---4"><img src="https://cdn-images-1.medium.com/max/1672/1*uvye0T6zpUTARXV9xwb4Zw.png" width="1672"></a></p><p class="medium-feed-snippet">I thought Docker isolation was enough. Then I looked at what actually happens when an attacker gets inside a container.</p><p class="medium-feed-link"><a href="https://medium.com/beyond-localhost/your-docker-container-runs-as-root-one-vulnerability-could-turn-that-into-a-host-problem-485193baf756?source=rss----7ab1ae1562b8---4">Continue reading on Beyond Localhost »</a></p></div>]]></description>
            <link>https://medium.com/beyond-localhost/your-docker-container-runs-as-root-one-vulnerability-could-turn-that-into-a-host-problem-485193baf756?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/485193baf756</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <dc:creator><![CDATA[Lotfi Habbiche]]></dc:creator>
            <pubDate>Wed, 11 Nov 2026 07:34:06 GMT</pubDate>
            <atom:updated>2026-11-11T07:34:05.453Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[You Upgraded MWAA and Now Every DAG Is Broken. Here’s Why. ]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/beyond-localhost/you-upgraded-mwaa-and-now-every-dag-is-broken-heres-why-be29a729fa61?source=rss----7ab1ae1562b8---4"><img src="https://cdn-images-1.medium.com/max/1376/1*3rnvBaaIG9bT4yOlAAQWHg.png" width="1376"></a></p><p class="medium-feed-snippet">You finally scheduled the maintenance window. Months of putting it off, and today&#x2019;s the day: upgrading your MWAA environment from 2.4.3 to&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/beyond-localhost/you-upgraded-mwaa-and-now-every-dag-is-broken-heres-why-be29a729fa61?source=rss----7ab1ae1562b8---4">Continue reading on Beyond Localhost »</a></p></div>]]></description>
            <link>https://medium.com/beyond-localhost/you-upgraded-mwaa-and-now-every-dag-is-broken-heres-why-be29a729fa61?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/be29a729fa61</guid>
            <category><![CDATA[interview-questions]]></category>
            <category><![CDATA[scenario-based-learning]]></category>
            <category><![CDATA[airflow-dag]]></category>
            <category><![CDATA[aws-mwaa]]></category>
            <category><![CDATA[apache-airflow]]></category>
            <dc:creator><![CDATA[Sriw World of Coding]]></dc:creator>
            <pubDate>Wed, 11 Nov 2026 07:14:37 GMT</pubDate>
            <atom:updated>2026-11-11T07:14:35.985Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[My upgrade checker said clean. Twelve services disagreed.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/beyond-localhost/my-upgrade-checker-said-clean-twelve-services-disagreed-d33bb0674d01?source=rss----7ab1ae1562b8---4"><img src="https://cdn-images-1.medium.com/max/1400/1*tnpQ4kK9z_S24mDinv48Rg.png" width="1400"></a></p><p class="medium-feed-snippet">I wrote a tool to catch Kubernetes deprecations before an EKS upgrade. On the 1.36 upgrade it reported nothing, and so did EKS Upgrade&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/beyond-localhost/my-upgrade-checker-said-clean-twelve-services-disagreed-d33bb0674d01?source=rss----7ab1ae1562b8---4">Continue reading on Beyond Localhost »</a></p></div>]]></description>
            <link>https://medium.com/beyond-localhost/my-upgrade-checker-said-clean-twelve-services-disagreed-d33bb0674d01?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/d33bb0674d01</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Heinan Cabouly]]></dc:creator>
            <pubDate>Mon, 09 Nov 2026 17:01:02 GMT</pubDate>
            <atom:updated>2026-11-09T17:01:01.874Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The Model Shouldn’t Own My Desktop. The Execution Boundary Should.]]></title>
            <link>https://medium.com/beyond-localhost/the-model-shouldnt-own-my-desktop-the-execution-boundary-should-49fa38b3f813?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/49fa38b3f813</guid>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[bulutarkan]]></dc:creator>
            <pubDate>Mon, 09 Nov 2026 02:31:01 GMT</pubDate>
            <atom:updated>2026-11-09T02:31:01.663Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Two side-by-side macOS desk setups: a warm, personal workspace on the left and a darker computer workspace on the right, representing separate spaces for a person and an AI agent." src="https://cdn-images-1.medium.com/max/1024/1*gzUhtuTDxA7p8QAFM8htnA.png" /><figcaption>Conceptual illustration of a private macOS workspace and a separate agent workspace. AI-generated; not a product screenshot.</figcaption></figure><p>One of the stranger bugs I ran into while building Mac MCP looked, at first, like a successful browser action. An AI agent entered text in a web editor. The words appeared on the screen, and the tool returned successfully. But the page hadn&#39;t accepted the edit in its own internal state. When it rerendered, the text disappeared.</p><p>That bothered me more than a straightforward error would have. If a tool fails loudly, at least you know where to look. Here the visible result and the real result had parted company, and the agent couldn&#39;t tell.</p><p>I build Mac MCP, a local service that lets AI clients work with macOS apps, browsers, files and commands. At first it&#39;s easy to focus on the model: which one plans better, how many tools it can call, how often a task finishes without help. I care about those things. But the bugs that changed how I think about the product mostly happened after the model had already made its decision.</p><p>That&#39;s what I mean by the execution boundary. The model can ask to type into a page, open a file or run a command. A separate local service has to decide whether the request is allowed, whether the target is still the right one, and what it can honestly say happened afterward. Those are three different questions.</p><p>Say you ask an agent to write a reply and leave it as a draft. It&#39;s a small task: find the field, type the message, stop. One extra click can send it. To the model, that might be a minor mistake in an otherwise reasonable sequence of actions. To the person whose account it is, the consequence is quite different.</p><p>I don&#39;t want the model&#39;s confidence to override that instruction. Permission has to be checked against the actual operation, not against the model&#39;s explanation of why it thinks the operation is harmless. If the user said &quot;don&#39;t send,&quot; a convincing paragraph of reasoning shouldn&#39;t make Send an acceptable button to press.</p><p>The editor bug taught me the same lesson from the other direction. A tool reporting that it typed something doesn&#39;t prove the website saved it. Rich-text editors keep their own state, which doesn&#39;t always agree with the text you can see. In Mac MCP, I&#39;ve worked on distinguishing a visible insertion from a confirmed editor change. When that confirmation isn&#39;t there, the tool can report editor_model_unconfirmed rather than pretending the edit stuck. Even that isn&#39;t proof of a server-side save. It&#39;s a more precise account of what the tool actually checked.</p><p>Working with more than one agent exposed another weak assumption. With a single agent, it&#39;s easy to think the browser tab and focused field you inspected a moment ago still belong to your task. With two agents, one can change the page while the other is deciding what to do. A perfectly sensible click, aimed at yesterday&#39;s version of the page—or even the version from two seconds ago—can land somewhere entirely different.</p><p>I used to think of that mostly as an orchestration problem. It&#39;s also an execution problem. The tool needs to know which tab and element the action belongs to and when its information has gone stale. More reasoning tokens won&#39;t make an old screenshot current. Sometimes the right response is simply to refuse the action and ask the agent to observe again.</p><p>Then there&#39;s the less dramatic but very personal issue of focus. I want an agent to work while I&#39;m using my Mac. I don&#39;t want it dragging Safari to the front halfway through an email or taking over the keyboard while I&#39;m typing. I&#39;ve been testing ways to give agent work its own macOS Desktop instead of making every task compete for the same foreground workspace.</p><p>A separate Desktop helps with the interruption problem, but it doesn&#39;t magically solve permission or verification. The agent can still target the wrong thing. The browser can still reject a change. And some actions genuinely require foreground access. When they do, I&#39;d rather see an honest stop than a clever fallback that steals the screen.</p><p>Shell commands make these distinctions even more important. A delegated AI provider might describe its environment as sandboxed, but that description doesn&#39;t automatically cover what a separate local macOS service can execute. I have to look at where a restriction is actually enforced and which path, if any, can go around it. A sentence in a system prompt is useful guidance. It isn&#39;t an operating-system boundary.</p><p>The practical question I keep coming back to is: what happens if the model makes the wrong choice? Does a check outside the model prevent the action, or are we relying on the model to remember a rule it was told? I don&#39;t think it&#39;s fair to call those two arrangements equally safe.</p><p>I&#39;m also becoming more careful with the word &quot;done.&quot; If an agent submits a form, there is a difference between a click being dispatched, the browser accepting the action, and the server recording the result. A verification check can fail because the expected result isn&#39;t there. It can also fail to run at all because the service is unreachable. The second case is unknown, not proof that the action failed. Retrying the check is sensible; blindly repeating a purchase or a post isn&#39;t.</p><p>All of this makes some demonstrations less impressive. Extra checks add time. Permission prompts are interruptions. A stale-state error means the agent might need to try a different approach. But I&#39;m building something for a computer that belongs to a person, not a benchmark environment where the only thing that matters is a green completion badge.</p><p>I haven&#39;t solved every one of these problems in Mac MCP. Some protections are implemented; others are still being tightened, tested or redesigned. Writing down the boundary has made it easier to notice where I was treating a tool response as stronger evidence than it really was.</p><p>I still enjoy trying a new model. I just care more now about the questions that come after its plan: what was it allowed to touch, did it leave my own work alone, and can it show me what actually changed?</p><p>If the truthful answer is &quot;I tried, but I can&#39;t verify that it worked,&quot; I want the tool to say that. It&#39;s a much better starting point than an agent confidently telling me a job is finished when it isn&#39;t.</p><p>Author&#39;s note: I used AI assistance to edit this article. The examples and technical decisions discussed here come from my work on Mac MCP.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=49fa38b3f813" width="1" height="1" alt=""><hr><p><a href="https://medium.com/beyond-localhost/the-model-shouldnt-own-my-desktop-the-execution-boundary-should-49fa38b3f813">The Model Shouldn’t Own My Desktop. The Execution Boundary Should.</a> was originally published in <a href="https://medium.com/beyond-localhost">Beyond Localhost</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Our Autoscaler Took Down Production. Here’s What I Did in the First 30 Minutes.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/beyond-localhost/our-autoscaler-took-down-production-heres-what-i-did-in-the-first-30-minutes-2e4034307159?source=rss----7ab1ae1562b8---4"><img src="https://cdn-images-1.medium.com/max/1438/1*7-HirxNFE0uNjg3AF8nDVw.png" width="1438"></a></p><p class="medium-feed-snippet">The autoscaler did exactly what we told it to do, and that&#x2019;s what took us down.</p><p class="medium-feed-link"><a href="https://medium.com/beyond-localhost/our-autoscaler-took-down-production-heres-what-i-did-in-the-first-30-minutes-2e4034307159?source=rss----7ab1ae1562b8---4">Continue reading on Beyond Localhost »</a></p></div>]]></description>
            <link>https://medium.com/beyond-localhost/our-autoscaler-took-down-production-heres-what-i-did-in-the-first-30-minutes-2e4034307159?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/2e4034307159</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[site-reliability-engineer]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[postgresql]]></category>
            <dc:creator><![CDATA[DevopsLesson]]></dc:creator>
            <pubDate>Sun, 08 Nov 2026 02:31:01 GMT</pubDate>
            <atom:updated>2026-11-09T14:53:47.100Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Designing an Auction Service: Where I Chose Correctness, and Where I Didn’t]]></title>
            <link>https://medium.com/beyond-localhost/designing-an-auction-service-where-i-chose-correctness-and-where-i-didnt-a8a59347b656?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/a8a59347b656</guid>
            <category><![CDATA[concurrency]]></category>
            <category><![CDATA[system-design-concepts]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[scalability]]></category>
            <category><![CDATA[system-design-interview]]></category>
            <dc:creator><![CDATA[Ashutosh]]></dc:creator>
            <pubDate>Sat, 07 Nov 2026 18:01:02 GMT</pubDate>
            <atom:updated>2026-11-07T18:01:02.357Z</atom:updated>
            <content:encoded><![CDATA[<p>Auction systems look simple — highest bid wins, then the auction closes — until you add concurrency, money, and scale. Then every easy assumption falls apart. Here, the goal is to handle a decent load with <em>reasonable</em> correctness, and to be honest about where “reasonable” means “not perfect.”</p><h3>The problem</h3><p>A user registers. From there they can <strong>create auctions</strong> or <strong>participate as a bidder</strong> on someone else’s. Bids come in, and the highest valid bid at close wins. Simple to state, hard to do well.</p><p>The scale I designed for:</p><ul><li>~1 lakh (100k) running auctions per day</li><li>~10 million users</li><li>Hot auctions peaking around <strong>1k requests/sec on a single auction id</strong></li><li>A long tail of cold auctions nobody’s watching</li><li><strong>Consistency &gt; availability.</strong> If I have to choose, I’d rather reject a bid than accept a wrong one.</li></ul><h3>Out of scope</h3><p><strong>No cancellations.</strong> Once a bid is accepted, it stands. Cancellation of bid is not allowed</p><p><strong>Payment.</strong> I’m not designing the money movement — charging cards, settling with sellers. But I’ll present some ideas on it, because deciding <em>what to keep out of the hot path</em> is itself a core part of the design. “Payment is out of scope” is not the same as “money doesn’t exist.”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PqcbH-2cPNGBdBt1r2F7Dw.png" /><figcaption>Auction Platform</figcaption></figure><h3>The shape of it</h3><p>Rather than one monolith, I split responsibilities into services with genuinely different load profiles and consistency needs:</p><ol><li><strong>CRUD service</strong> — auctions and users</li><li><strong>Search service</strong> — discovery</li><li><strong>Bidding path</strong> — Reverse Proxy → Bidding Service → Post Processor / Notification</li><li><strong>Audit path</strong> — Bids Audit Queue → OLAP consumer</li><li><strong>A CDC backstop</strong> from the Bids DB for added correctness</li></ol><p>Let me walk each one in the order a request actually flows.</p><h3>CRUD service</h3><p>The least interesting part, which is a good thing. It receives and persists auction and user data into a plain relational DB (MySQL is fine). Keeping basic properties of user and auction here (refer diagram)</p><p>No cleverness here. This data is low-write, read-heavy, and perfectly happy on a boring SQL database. Resist the urge to over-engineer the easy parts.</p><h3>Search service</h3><p>Discovery is powered by Elasticsearch, kept in sync with the auction table via CDC. ES will prioritise live and future auctions and actively clean out old ones. Nobody searches for an auction that ended three weeks ago. Keeping the index scoped to “things you can actually bid on” keeps it small, fast, and cheap.</p><p>CDC gatekeeps as a perfect trigger for this, example if status is changed to Done, give it lesser score in search, changed to archived remove from ES.</p><h3>The bidding path — this is the whole game</h3><p>Everything above was a warm-up. Bidding is where correctness and scale collide.</p><p>The first real decision: how do you survive a very hot auction without turning your whole fleet stateful? Stateful service are a headache to manage, stateless service with 1L requests? Good luck handling Db queries at that scale.</p><p>So, let’s build the middle ground.</p><p>Let’s build an approach, where nobody owns the particular auction but knows where to requests should land. So, first questions first, are all auctions same? No. Some receive low traffic, others high (let’s call them <strong>hot_auction</strong>) and other very high (calling <strong>very_hot_auction</strong>). Categorising each one of them and processing accordingly will help us with achieving the scale.<br>And the real bottleneck was never the request handling anyway; it’s the DB writes on very_hot_auctions. Spreading reads around doesn’t fix the thing that’s actually on fire.</p><h3>Reverse Proxy: detect heat early, without going stateful</h3><p>So instead of pushing routing logic into the API gateway, I put a bit of client-side logic on the reverse proxy and deployed it there. The pragmatic reason: it was far easier to maintain and ship changes to a proxy I own than to modify the entire gateway layer. Smaller blast radius, faster iteration.</p><p>What does that logic do? It answers one question cheaply: <em>is this auction hot right now?</em> And crucially, it doesn’t need an exact count to do that. I don’t care whether an auction got 973 or 1,041 requests this second — I care that it’s “heavy enough.” So I just keep an eye on the <em>recent</em> count of requests per auction id, and if it crosses a threshold, I treat it as a hot auction. Approximate, cheap, and — importantly — it keeps the design from going stateful just to make a routing decision.</p><p>The payoff of detecting it <em>here</em>, at the one place that sees all the traffic: no service downstream has to build its own detection logic. The proxy stamps a hot_auction header on the request, and everyone after it just consumes and trusts the header. Dumber downstream services are easier to reason about and test.</p><h4>Very High Load</h4><p>For scenario of very_hot_auction (again deduced from the configured request count), the proxy will add a from a bounded set (e.g. 0–9) of prefixes like ‘2’ to ‘auction_1’ and then process consistent hashing logic on combined key (i.e. 2_auction_1 instead of ‘auction_1’ ) making very_hot_auction to be distributed as ‘hot_auction’ across multiple consistent hashed servers.</p><p>Benefit: we only need to solve for normal and hot_auctions, any scale beyond that gets distributed.</p><h3>Bidding Service: the local-max trick</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YWWJKJhpO0doMIF-EO-5QA.png" /><figcaption>Bidding Service Flow</figcaption></figure><p>Under normal load, a bid is simple: check it beats the current winner, check it’s a valid multiple of the tick price, check the auction hasn’t ended, write winner bid to the Bids DB, respond success/ failure to the client.</p><p>Please note, DB write query is conditional with ‘new_bid_price &gt; current_winning_bid_price’. So among concurrent write attempt, higher bid will win even at DB.</p><p>Under <em>hot_auction</em> load, writing every bid straight to the DB would destroy it. So we buffer it in server memory for minimal period instead:</p><ul><li>Each bidding server keeps the local maximum bid it has seen for that auction, in memory.</li><li>It holds for a short window and only attempts to write its local max to the DB.</li></ul><p>The holding period is configurable, and it commits on <strong>whichever comes first:</strong> a request count on that server (say 100–200 bids buffered) <em>or</em> a time ceiling (100ms wait). Two knobs, two guardrails — the count protects the DB from a sudden burst, and the timer protects the <em>customer experience</em> so nobody waits too long for an answer. Together they cut DB load dramatically while keeping response time bounded.</p><p>Essentially we reduce the DB writes drastically to 100–1000x and protect it. Yes, it can happen server crashes while data is in memory. Well, in defense, first of all that happens in rare cases, we keep server numbers optimal. And even when that happens, for clients it will be a normal BAU retryable failure. Clients can retry.</p><h4>Let’s Add More Load</h4><p>Let’s say you add more load. As discussed above, proxy will distribute the load as ‘hot_auction’ among bidding service. Each service only will care about load locally. You know why? Cause max of (local max) is all we need.</p><p>Now picture a very_hot_auction spread across a few servers. Each holds its own local max. They all try to write to DB. The conditional write means only the true maximum price write succeeds — the others fail, re-read the latest winner, and move on. The invariant that makes this safe is simple:</p><blockquote><em>max(local maxes) is always the real maximum, no matter which server a request landed on.</em></blockquote><p>Correctness rides on that one conditional write at the DB — the single serialization point. That’s the trade I’m happiest with: I spread load across servers <em>and</em> keep a single source of truth, persistent DB.</p><h3>Serving reads from the Bidding Service itself</h3><p>Here’s a choice I’d defend hard: reads for the live bid are served straight from the Bidding Service’s memory. Why build an entire separate read path?</p><p>Every server handling a live auction <em>already has the current bid data in memory</em> — it needs it to validate incoming bids. So the cheapest correct thing is to serve “what’s the current bid?” right out of that in-memory state. I’d much rather do that than stand up a full read-replica fleet and a fancy CQRS pattern for a read that’s already sitting in RAM.</p><h3>Closing the auction correctly</h3><p>If I naively fire a “winner!” notification exactly at end_at.</p><p>So the Post Processor doesn’t trust the instant of end_at. It polls (using a partial index on status, end_at) for auctions whose end time is older than <em>now minus a grace window</em> — say 10 seconds. By then every server&#39;s buffer has drained, the conditional writes have settled, and the Bids DB genuinely holds the final winner. Then, and only then, the notification goes out.</p><p>A 10-second delay on “you won” is invisible to a user. A wrong winner that can’t be taken back is a disaster. Easy call.</p><h3>The audit path: where bid history actually lives</h3><p>Every single bid — winning or not — is published to a Bids Audit Queue.</p><p>That queue feeds an OLAP consumer (think ClickHouse). <em>That’s</em> where user-facing bid history lives: “you bid $400, you were outbid at $450, you bid $500…” By tuning the number of consumers I keep the lag in a comfortable range, and I get a cheap, queryable, append-only record of everything that ever happened — perfect for history views and dispute resolution, kept well off the hot transactional path.</p><p>The OLTP database stays lean (it only tracks the ratchet of the current max), and the “show me everything” workload goes to a store built exactly for it.</p><p>Right tool, right job.</p><h3>CDC as a correctness backstop</h3><p>Buffering bids in memory means a server can crash mid-window and lose bids it hadn’t flushed. I accept this — it’s the price of buffering — and for most auctions, a rare “something went wrong, try again” is a fine answer. Because responses only go out after the batch commits, a crash means the bidder gets an error, not a false “you’re winning.”</p><p>But when I want <em>stronger</em> guarantees, I lean on a CDC pipeline off the Bids DB. It can drive de-duplicated notifications to the user (who could have lost confirmation due to server crash). The point: I treat absolute accuracy as a dial, not a default.</p><h3>A word on the money movement</h3><p>Payment is out of scope, but keeping money <em>out of the hot path</em> is itself a design decision worth showing.</p><p>My preference: a block → confirm → release flow on the wallet service, kept off the live bidding path. Block some amount when a user registers, confirm via CDC when they win, release via TTL or CDC when they don’t. And set each user’s ceiling at registration based on credit/KYC — in a separate, offline flow, never in the hot path.</p><p>I’m not putting a synchronous wallet call in front of a hot auction. Pull funds before, or settle after. The variants you can offer — pre-fund a max bid, pay a token amount to participate, or KYC-only with a credit ceiling — are all just different answers to the same question: <em>what’s the minimum you must check in the hot path, and what can wait?</em></p><h3>Closing thought</h3><p>The interesting engineering isn’t in making the happy path work — it’s in deciding, explicitly, <em>how wrong you’re willing to be, and for how long.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a8a59347b656" width="1" height="1" alt=""><hr><p><a href="https://medium.com/beyond-localhost/designing-an-auction-service-where-i-chose-correctness-and-where-i-didnt-a8a59347b656">Designing an Auction Service: Where I Chose Correctness, and Where I Didn’t</a> was originally published in <a href="https://medium.com/beyond-localhost">Beyond Localhost</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Our CI/CD Pipeline Took 24 Minutes. These 7 GitHub Actions Fixes Got It Under 7.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/beyond-localhost/github-actions-ci-cd-pipeline-speed-62c671d12f3c?source=rss----7ab1ae1562b8---4"><img src="https://cdn-images-1.medium.com/max/2000/1*oFRNvTgjLvZOP5kLwfNNFA.jpeg" width="2000"></a></p><p class="medium-feed-snippet">No new tools and no bigger runners. Just YAML changes you can copy into your repo today.</p><p class="medium-feed-link"><a href="https://medium.com/beyond-localhost/github-actions-ci-cd-pipeline-speed-62c671d12f3c?source=rss----7ab1ae1562b8---4">Continue reading on Beyond Localhost »</a></p></div>]]></description>
            <link>https://medium.com/beyond-localhost/github-actions-ci-cd-pipeline-speed-62c671d12f3c?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/62c671d12f3c</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[github-actions]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[ci-cd-pipeline]]></category>
            <category><![CDATA[docker]]></category>
            <dc:creator><![CDATA[DevopsLesson]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 01:01:03 GMT</pubDate>
            <atom:updated>2026-11-05T16:45:27.597Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Festive Sales 2026: Digital Shelf Analytics and AI Optimization]]></title>
            <link>https://medium.com/beyond-localhost/festive-sales-2026-digital-shelf-analytics-and-ai-optimization-d1926c986eed?source=rss----7ab1ae1562b8---4</link>
            <guid isPermaLink="false">https://medium.com/p/d1926c986eed</guid>
            <category><![CDATA[ecommerce-intelligence]]></category>
            <category><![CDATA[ai-optimization]]></category>
            <category><![CDATA[ecommerce-solution]]></category>
            <category><![CDATA[digital-shelf]]></category>
            <category><![CDATA[digital-shelf-analytics]]></category>
            <dc:creator><![CDATA[Minakshi Kushwaha]]></dc:creator>
            <pubDate>Sat, 31 Oct 2026 15:01:02 GMT</pubDate>
            <atom:updated>2026-10-31T15:01:02.549Z</atom:updated>
            <content:encoded><![CDATA[<h3>Win the Festive Season Sales with Digital Shelf Analytics &amp; Agentic Media Optimization by mFilterIt</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JTEV75ihWUrw5WVo.png" /></figure><p>The festive season is here, and once again it is the most demanding stretch of the year for ecommerce brands. Traffic peaks during the wave of sales on ecommerce and quick commerce platforms. Shopper intent is at its highest; the battle for the digital shelf, and ultimately the conversion, is real.</p><p>This year, the stakes are bigger. Redseer expected festive 2026 to be the strongest in five years, with online festive GMV of USD 15–16 billion, around 25% growth and 180–185 million shoppers. (<a href="https://redseer.com/reports/india-online-retail-2026-the-fastest-year-in-five-and-the-new-engines-behind-it/">Source: Redseer</a>) The first two days of sales alone crossed ₹24,000 crore, nearly six times a normal day. And two in every three online shoppers in those first two days came from smaller towns.</p><p>But the shape of the season has changed. Demand is spreading well beyond the metros, with online sales expected to grow by up to 29%. (<a href="https://www.fortuneindia.com/amp/story/business-news/up-to-29-growth-in-online-sales-expected-as-festive-demand-spreads-across-india/166095">Source: Fortune India</a>) Quick commerce is projected to grow 110–120% this festive period.</p><p>The season hasn’t been a straight line up, either. After the opening rush, sales fizzled as higher prices in the electronics category made shoppers hold back. Brands now have to win a shopper who is spread across more towns and compares prices harder than ever.</p><p>That means more shelves to watch, prices moving every hour, and more ad decisions than any team can make manually. Every missed keyword, every out-of-stock product and every lost rank still hands the sale to a competitor. What has changed is how fast it happens.</p><p>In this article, we look at the challenges brands face during festive sales in 2026, and how data-driven <a href="https://www.mfilterit.com/blog/power-of-digital-shelf-analytics">digital shelf analytics</a>, now paired with agentic AI, helps brands move from spotting a problem to fixing it in time.</p><h3>Challenges Ecommerce Brands Face During Festive Season Sales</h3><h3>Too Many Shelves, Too Little Visibility</h3><p>Your share of shelf is no longer one search page. It is Amazon, Flipkart, Myntra and Nykaa, plus Blinkit, Zepto, Instamart and newer quick commerce apps, each showing different results by city and even by dark store. A SKU can rank first in Bengaluru and be missing in Pune. Without SKU-level, location-level visibility, these gaps surface only after the sales are lost.</p><h3>Stockouts at the Worst Possible Moment</h3><p>Quick commerce transforms festive demand into quick decisions measured in minutes. If your product is not in stock in an important pin code during high-demand times, people will not stop; they will go with the next available item from the list. Moreover, many brands are spending money on advertising campaigns that bring them no profit.</p><h3>Competitive Pricing That Move by the Hour</h3><p>Flash deals, reseller undercutting and MAP violations spike during sales. Shoppers are better armed too: AI assistants like Amazon’s Rufus now show price history, so inflated “discounts” get exposed quickly. Brands need real-time visibility into their own and competitors’ pricing to respond without eroding margins or brand value.</p><h3>Product Pages Written for People, Now Read by AI</h3><p>AI shopping assistants and review summaries increasingly shape what shoppers see first. Incomplete titles, missing attributes, low-quality images and inconsistent content across sellers hurt both search ranking and how AI tools describe your product. Your PDP and reviews are now part of discovery, not just conversion.</p><h3>Media That Can’t See the Digital Shelf</h3><p>This is the biggest gap. Media sees the campaign: spend, clicks and ROAS. Ecommerce sees the market: rank, share of shelf, price and availability. During festive peaks, the two rarely meet. Bids keep climbing on keywords where you’re out of stock, budget stays locked on a platform where your price is uncompetitive, and a rival overtakes your hero keyword while campaigns run on autopilot. The result is wasted spend on low-intent areas and missed revenue where demand is real.</p><p>Click Here to Read Full Blog: <a href="https://tinyurl.com/2kr4hz9h">https://tinyurl.com/2kr4hz9h</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d1926c986eed" width="1" height="1" alt=""><hr><p><a href="https://medium.com/beyond-localhost/festive-sales-2026-digital-shelf-analytics-and-ai-optimization-d1926c986eed">Festive Sales 2026: Digital Shelf Analytics and AI Optimization</a> was originally published in <a href="https://medium.com/beyond-localhost">Beyond Localhost</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>