Writing · 14 posts
Things I’ve learned
Short posts on frontend engineering, written when I figure something out. Most have a demo you can poke at.
A card field that respects the caretFormatting 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.29 Oct 2026 · Forms, JavaScript, PaymentsWriting a migration playbook for an AI agentPorting 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.29 Oct 2026 · AI, Migration, ProcessAn image budget that fails the buildLarge images creep into apps one pull request at a time. A small script that runs before every build stops them at the door.29 Oct 2026 · Performance, Build tools, Next.jsBrand colours and text that stays readableWhen every merchant can pick their own header colour, the text on it has to choose its own colour too. Relative luminance does the work.29 Oct 2026 · Accessibility, CSS, ThemingDeadlines in days, then hours, then overdueIn dispute management a missed deadline costs real money. Giving the whole product one way of talking about time made it calmer and clearer.29 Oct 2026 · UX, Payments, CopyEmails that list many cases at onceNotes from writing fifteen transactional email templates for dispute management, including bulk emails that loop over rows and a naming scheme that kept them sane.29 Oct 2026 · Email, HTML, TemplatesFilter chips that don’t fight youTwo 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.29 Oct 2026 · Design systems, React, UXGuardrails for an AI agent that edits your appI 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.29 Oct 2026 · AI, Security, Developer toolsMigrating a console nobody can stop usingHow 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.29 Oct 2026 · Architecture, Migration, iframesMoney inputs show one number and send anotherAn amount field should look friendly to a person and stay exact for the API. Notes on grouping, decimals per currency and limits.29 Oct 2026 · Forms, Payments, i18nOne animation, 80 KBHow 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.29 Oct 2026 · Performance, Webpack, CSSThirty-five components, one set of shadowsOur design system had shadows picked by hand in every component. Turning them into named elevation tokens made the whole library feel like one thing.29 Oct 2026 · Design systems, CSS, TokensThe build that ran twiceOur 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.29 Oct 2026 · CI/CD, Docker, AWSThe crawler that failed real paymentsSome 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.29 Oct 2026 · Debugging, Payments, Production
Nothing under that topic yet.