<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Arjun S · Writing</title><description>Short posts on frontend engineering: things I learn, try and break.</description><link>https://arjunsiv.com/</link><language>en-gb</language><item><title>A card field that respects the caret</title><link>https://arjunsiv.com/writing/a-card-field-that-respects-the-caret/</link><guid isPermaLink="true">https://arjunsiv.com/writing/a-card-field-that-respects-the-caret/</guid><description>Formatting a card number as you type is easy until someone edits the middle of it. Here’s how to keep the caret where the person put it, plus the Luhn check.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Forms</category><category>JavaScript</category><category>Payments</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Writing a migration playbook for an AI agent</title><link>https://arjunsiv.com/writing/a-migration-playbook-for-an-ai-agent/</link><guid isPermaLink="true">https://arjunsiv.com/writing/a-migration-playbook-for-an-ai-agent/</guid><description>Porting a legacy tool screen by screen is repetitive and easy to get subtly wrong. Writing the rules down as an agent skill made every port consistent.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>AI</category><category>Migration</category><category>Process</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>An image budget that fails the build</title><link>https://arjunsiv.com/writing/an-image-budget-that-fails-the-build/</link><guid isPermaLink="true">https://arjunsiv.com/writing/an-image-budget-that-fails-the-build/</guid><description>Large images creep into apps one pull request at a time. A small script that runs before every build stops them at the door.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Performance</category><category>Build tools</category><category>Next.js</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Brand colours and text that stays readable</title><link>https://arjunsiv.com/writing/brand-colours-and-readable-text/</link><guid isPermaLink="true">https://arjunsiv.com/writing/brand-colours-and-readable-text/</guid><description>When every merchant can pick their own header colour, the text on it has to choose its own colour too. Relative luminance does the work.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Accessibility</category><category>CSS</category><category>Theming</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Deadlines in days, then hours, then overdue</title><link>https://arjunsiv.com/writing/deadlines-in-days-then-hours/</link><guid isPermaLink="true">https://arjunsiv.com/writing/deadlines-in-days-then-hours/</guid><description>In dispute management a missed deadline costs real money. Giving the whole product one way of talking about time made it calmer and clearer.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>UX</category><category>Payments</category><category>Copy</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Emails that list many cases at once</title><link>https://arjunsiv.com/writing/emails-that-list-many-cases/</link><guid isPermaLink="true">https://arjunsiv.com/writing/emails-that-list-many-cases/</guid><description>Notes from writing fifteen transactional email templates for dispute management, including bulk emails that loop over rows and a naming scheme that kept them sane.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Email</category><category>HTML</category><category>Templates</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Filter chips that don’t fight you</title><link>https://arjunsiv.com/writing/filter-chips-that-dont-fight-you/</link><guid isPermaLink="true">https://arjunsiv.com/writing/filter-chips-that-dont-fight-you/</guid><description>Two dashboards had each grown their own filter chips, and they had drifted apart. Moving them into a shared design system meant agreeing on a few small rules.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Design systems</category><category>React</category><category>UX</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Guardrails for an AI agent that edits your app</title><link>https://arjunsiv.com/writing/guardrails-for-an-ai-agent/</link><guid isPermaLink="true">https://arjunsiv.com/writing/guardrails-for-an-ai-agent/</guid><description>I built an in-app design agent for a payments codebase. Most of the work went into what it is not allowed to do, enforced in code rather than in the prompt.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>AI</category><category>Security</category><category>Developer tools</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Migrating a console nobody can stop using</title><link>https://arjunsiv.com/writing/migrating-without-a-freeze/</link><guid isPermaLink="true">https://arjunsiv.com/writing/migrating-without-a-freeze/</guid><description>How we moved an operations tool to a new app one screen at a time, with the old and new apps running side by side and talking over postMessage.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Architecture</category><category>Migration</category><category>iframes</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Money inputs show one number and send another</title><link>https://arjunsiv.com/writing/money-inputs/</link><guid isPermaLink="true">https://arjunsiv.com/writing/money-inputs/</guid><description>An amount field should look friendly to a person and stay exact for the API. Notes on grouping, decimals per currency and limits.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Forms</category><category>Payments</category><category>i18n</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>One animation, 80 KB</title><link>https://arjunsiv.com/writing/one-animation-80-kb/</link><guid isPermaLink="true">https://arjunsiv.com/writing/one-animation-80-kb/</guid><description>How a bundle analysis on a hosted checkout found an animation library that drew a single loader, and what replacing it with CSS did for mobile load times.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Performance</category><category>Webpack</category><category>CSS</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>Thirty-five components, one set of shadows</title><link>https://arjunsiv.com/writing/shadows-as-tokens/</link><guid isPermaLink="true">https://arjunsiv.com/writing/shadows-as-tokens/</guid><description>Our design system had shadows picked by hand in every component. Turning them into named elevation tokens made the whole library feel like one thing.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Design systems</category><category>CSS</category><category>Tokens</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>The build that ran twice</title><link>https://arjunsiv.com/writing/the-build-that-ran-twice/</link><guid isPermaLink="true">https://arjunsiv.com/writing/the-build-that-ran-twice/</guid><description>Our dashboard took 12 minutes to deploy and 3 to build on a laptop. Reading the pipeline line by line found the app being built twice.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>CI/CD</category><category>Docker</category><category>AWS</category><author>hi@arjunsiv.com (Arjun S)</author></item><item><title>The crawler that failed real payments</title><link>https://arjunsiv.com/writing/the-crawler-that-failed-real-payments/</link><guid isPermaLink="true">https://arjunsiv.com/writing/the-crawler-that-failed-real-payments/</guid><description>Some payments were ending in SYSTEM_ERROR for no reason we could see. The culprit was a text-to-speech feature loading our payment page on its own servers.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><category>Debugging</category><category>Payments</category><category>Production</category><author>hi@arjunsiv.com (Arjun S)</author></item></channel></rss>