<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: soontimes</title><link>https://news.ycombinator.com/user?id=soontimes</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 09 Sep 2026 13:46:40 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=soontimes" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by soontimes in "I-have-ADHD: A skill to stop coding agents from burying the answer"]]></title><description><![CDATA[
<p>I have such hook, and it works well. It increases time, but it’s negligible if agent works for 10+ mins before the final output. The hook is only on stop event, so agent is not interrupted during the session. I didn’t have luck in putting it to skill / md files, as agent just ignores it after a couple of iterations. The solution is not perfect, sometimes it compresses too much, and I have to reread both versions, but at least I don’t have to read load bearing stuff anymore</p>
]]></description><pubDate>Tue, 08 Sep 2026 17:46:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=49613857</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49613857</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49613857</guid></item><item><title><![CDATA[New comment by soontimes in "Ask HN: What are you working on? (August 2026)"]]></title><description><![CDATA[
<p>I'm working on a platform that aggregates a business's operational and financial data and builds a causal model on top, deriving target metrics like FCF or EBITDA. With that model we can forecast different scenarios — what happens if we open a new shop, raise prices, take a loan. We also generate reports: weekly overviews, anomaly detection, deviations from targets. All of this is essentially a harness for an AI agent that customizes the platform for a specific business and integrates its data sources. Large companies have dedicated teams and sophisticated tooling for this; my bet is that small and medium businesses would benefit just as much, and with recent progress in AI it's finally possible to deliver it tailored to each case at very low cost.<p>My primary target right now is e-commerce due to rich data streams, however if you think your business would benefit from this tool, I would be happy to connect and discuss it.</p>
]]></description><pubDate>Sun, 09 Aug 2026 20:48:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=49235691</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49235691</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49235691</guid></item><item><title><![CDATA[New comment by soontimes in "We replaced Redis with MySQL for inventory reservations and it scaled"]]></title><description><![CDATA[
<p>> re concurrency, it is not a big issue at all<p>> LMAX Disruptor<p>If anything this article shows that concurrency is a big issue. It is such a big issue you have to write in-memory single threaded processor with custom journaling. If you have established workflows with MySQL and a team knowing how to work with it, throwing all that to do LMAX is not cost efficient. While there are domains where such approach is suitable and even required due to strict transaction ordering, Shopify case doesn’t look like one of them.</p>
]]></description><pubDate>Sun, 09 Aug 2026 20:15:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=49235351</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49235351</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49235351</guid></item><item><title><![CDATA[New comment by soontimes in "We replaced Redis with MySQL for inventory reservations and it scaled"]]></title><description><![CDATA[
<p>> But if a seller has 5k inventory in one location, has a spike of 2k orders, but only 1k of the orders can successfully reserve inventory, then isn't that an argument that you lost the revenue of the 2nd 1k orders that error out before the replenishment process succeeds?<p>They explicitly cover this in the article, saying they do reservation inline. It does increase latency for these orders, but it doesn’t result in an error<p>> But you can have a batch transaction whereby the transaction decreases inventory by 100 (thus touching the high-contention inventory row once) and credits each of 100 different customer cart database rows (which are not under heavy contention and can be on a different disk entirely).<p>They mention this as well, checkout batching increased implementation complexity.<p>> Arguing that "slow reservations trigger throttling and a worse buyer experience", without an actual number for what counts as "slow" to serve as an SLO and as a design target, is a cop-out inviting over-engineering.<p>True. The article would’ve been better if they included such numbers. However the fact that they didn’t mention this doesn’t imply they haven’t done research. I haven’t found anything related to checkout specifically, however there are in general articles, indicating that increased latency correlates with revenue drop.</p>
]]></description><pubDate>Sun, 09 Aug 2026 20:03:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=49235215</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49235215</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49235215</guid></item><item><title><![CDATA[New comment by soontimes in "We replaced Redis with MySQL for inventory reservations and it scaled"]]></title><description><![CDATA[
<p>> re concurrency, it is not a big issue at all<p>I would really appreciate it if you could write this up as an article. It would be an extremely interesting and valuable read</p>
]]></description><pubDate>Sun, 09 Aug 2026 12:16:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=49230721</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49230721</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49230721</guid></item><item><title><![CDATA[New comment by soontimes in "We replaced Redis with MySQL for inventory reservations and it scaled"]]></title><description><![CDATA[
<p>They never said they don’t shard it, however this doesn’t solve the problem they were facing. Even if they have a single store (therefore a single shard), the burst demand may be high for the item in that shop, which creates contention for “remaining item quantity” resource. Their solution spreads this contention across several rows.<p>> Also, I wonder why they could not have a row status (available/reserved) and UPDATE it instead of deleting the rows.<p>This requires a row per item unit, doesn’t it? If you have 50k units you’ll have to track status of every item, meaning 50k rows. They also mention this as a rationale to use at most 1k rows, and treat it as a buffer.</p>
]]></description><pubDate>Sun, 09 Aug 2026 12:08:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=49230678</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49230678</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49230678</guid></item><item><title><![CDATA[New comment by soontimes in "Shopify replaced Redis with MySQL for inventory reservations–and it scaled"]]></title><description><![CDATA[
<p>> if I were to solve the problem, I would have solved it differently, at the Checkout state, before user clicks PAY. This removes the race condition at the user UI level, before any request lands in backend/db:<p>In order to avoid races you need to insert reservation and decrement availability atomically. Your proposed approach is not atomic. For it to be atomic you will need to lock whole range, to make sure no new rows appeared between the points “check for availability” and “record reservation”. Actors will be effectively competing for the single aggregate row. This is the same as having a single inventory row with quantity field, which they rejected in the beginning of the article<p>> now let's think again, do we need to lock 900 rows to place order on 900 items? or can we insert a single row where order_quantity=900 ?<p>In the proposed schema nobody is waiting for these locks, they’re skipped by concurrent queries. In your schema actors would have to wait before they can insert without breaking invariants.</p>
]]></description><pubDate>Sun, 09 Aug 2026 08:53:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=49229656</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49229656</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49229656</guid></item><item><title><![CDATA[New comment by soontimes in "We replaced Redis with MySQL for inventory reservations and it scaled"]]></title><description><![CDATA[
<p>> how does current design resolve concurrent actors fighting for the last item ?<p>It resolves with skip locked. Assuming we have only 1 item left. First query scans the buffer table, locks as many rows as needed (1 in our case), and moves rows to another table. Second query scans the table, finds no rows (even if first one hasn’t finished yet, the row is locked and ignored), checks if it can increase buffer, finds out that it’s fully sold and aborts. Db guarantees that you can’t oversold.<p>> my design is the same, except it does not need this dance with moving rows between tables, locking them, and the cludge with replenishment process.<p>I can’t evaluate whether it’s the same or not, because you still haven’t clarified when exactly you’re going to insert the row. In the article they’re inserting in the same transaction. Would you also do it in the transaction? Because if you’ll introduce a separate global mechanism to resolve conflicts, on a high level it would be the same as their approach with redis (you need to have 2 systems)<p>EDIT: wording</p>
]]></description><pubDate>Sun, 09 Aug 2026 05:01:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=49228579</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49228579</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49228579</guid></item><item><title><![CDATA[New comment by soontimes in "Shopify replaced Redis with MySQL for inventory reservations–and it scaled"]]></title><description><![CDATA[
<p>I don’t understand how this should prevent oversold. You have a check that reports empty or oversold inventory. But how does that check prevent 2 concurrent actors fighting for the last item from inserting 2 rows?</p>
]]></description><pubDate>Sun, 09 Aug 2026 04:38:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=49228490</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49228490</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49228490</guid></item><item><title><![CDATA[New comment by soontimes in "Shopify replaced Redis with MySQL for inventory reservations–and it scaled"]]></title><description><![CDATA[
<p>Ok, but before inserting you must ensure that inventory is not depleted, which means you need to know the count and you need to lock the row. So you still have contention on that item. Them having a 1k buffer allows not to take a lock on a single row every time, and only do it when buffer is empty</p>
]]></description><pubDate>Sun, 09 Aug 2026 04:16:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=49228393</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49228393</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49228393</guid></item><item><title><![CDATA[New comment by soontimes in "Shopify replaced Redis with MySQL for inventory reservations–and it scaled"]]></title><description><![CDATA[
<p>> Instead of having 1000 rows per shop<i>SKU, why not just have one row per shopping cart</i>SKU?<p>At what point that row is inserted?</p>
]]></description><pubDate>Sun, 09 Aug 2026 04:06:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=49228358</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49228358</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49228358</guid></item><item><title><![CDATA[New comment by soontimes in "Shopify replaced Redis with MySQL for inventory reservations–and it scaled"]]></title><description><![CDATA[
<p>Yes, the point is to spread contention across multiple rows. They also mention this in the beginning of the article</p>
]]></description><pubDate>Sun, 09 Aug 2026 03:49:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=49228273</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49228273</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49228273</guid></item><item><title><![CDATA[New comment by soontimes in "Shopify replaced Redis with MySQL for inventory reservations–and it scaled"]]></title><description><![CDATA[
<p>Can you clarify why this involves no locking? There can still be 2 actors fighting for the same row.</p>
]]></description><pubDate>Sun, 09 Aug 2026 02:55:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=49228012</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=49228012</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49228012</guid></item><item><title><![CDATA[New comment by soontimes in "Z-Image: Powerful and highly efficient image generation model with 6B parameters"]]></title><description><![CDATA[
<p>If that’s your website please check GitHub link - it has a typo (gitub) and goes to a malicious site</p>
]]></description><pubDate>Sat, 06 Dec 2025 23:21:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=46177543</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=46177543</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46177543</guid></item><item><title><![CDATA[New comment by soontimes in "Operating Margins"]]></title><description><![CDATA[
<p>I like your style - clear, on point, and no attempts to sell me anything. It’s honestly refreshing to read</p>
]]></description><pubDate>Fri, 14 Nov 2025 10:09:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=45925533</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=45925533</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45925533</guid></item><item><title><![CDATA[New comment by soontimes in "Ask HN: What are you working on? (July 2025)"]]></title><description><![CDATA[
<p>I noticed this for some companies: there are 10+ spreadsheets which should have the same structure, but different data. For example one spreadsheet per country for purposes of budgeting, modeling, or just inputs. These spreadsheets tend to break and it’s hard to update them centrally. There is of course an option with moving to a proper admin app, but it requires development and quite often results in less UX, because users are familiar with spreadsheets - they can write formulas, analyze the data, or connect with other systems.<p>This is why I’m writing a tool to simplify administrative work with these files, so you can quickly see where spreadsheets diverge, propagate updates, make them version controlled, and many other good things, which we have in typical app development, but still miss in spreadsheets management.</p>
]]></description><pubDate>Mon, 28 Jul 2025 10:52:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=44709481</link><dc:creator>soontimes</dc:creator><comments>https://news.ycombinator.com/item?id=44709481</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44709481</guid></item></channel></rss>