<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hilman Haikal — Writing</title><description>Write-ups of real problems from production: what broke, why, and what I changed.</description><link>https://hlmnhkl.my/</link><language>en</language><atom:link href="https://hlmnhkl.my/rss.xml" rel="self" type="application/rss+xml"/><item><title>It worked until the hundred and first</title><link>https://hlmnhkl.my/writing/it-worked-until-the-hundred-and-first/</link><guid isPermaLink="true">https://hlmnhkl.my/writing/it-worked-until-the-hundred-and-first/</guid><description>Permissions were being read one page at a time. Nobody noticed for a year, because nobody had more than a hundred of them.</description><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><category>pagination</category><category>bugs</category></item><item><title>Picking fields is not access control</title><link>https://hlmnhkl.my/writing/picking-fields-is-not-access-control/</link><guid isPermaLink="true">https://hlmnhkl.my/writing/picking-fields-is-not-access-control/</guid><description>If the only reason a client never sees a number is that the app forgot to ask for it, that is not a boundary. That is a habit.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><category>access control</category><category>multi-tenant</category></item><item><title>Ten that looked like a thousand</title><link>https://hlmnhkl.my/writing/ten-that-looked-like-a-thousand/</link><guid isPermaLink="true">https://hlmnhkl.my/writing/ten-that-looked-like-a-thousand/</guid><description>Prices are stored in the smallest unit, so the number in the database is a hundred times the price. Miss the conversion once and a cheap extra looks expensive.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>money</category><category>bugs</category></item><item><title>Nobody could pay</title><link>https://hlmnhkl.my/writing/nobody-could-pay/</link><guid isPermaLink="true">https://hlmnhkl.my/writing/nobody-could-pay/</guid><description>A safety check meant to protect customers was the thing blocking them. The server had the wrong idea about its own address.</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><category>payments</category><category>nginx</category><category>nuxt</category></item><item><title>Paid, but the order never finished</title><link>https://hlmnhkl.my/writing/paid-but-not-finished/</link><guid isPermaLink="true">https://hlmnhkl.my/writing/paid-but-not-finished/</guid><description>The money went through. The order stayed a draft, because finishing it depended on the customer coming back to our page.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><category>payments</category><category>webhooks</category></item></channel></rss>