
Analytics Is Architecture: Stop Sprinkling track() Everywhere
This cluster has been about how the parts of an app communicate — event buses for ambient signals, feature flags for toggling behavior. Both articles ...

This cluster has been about how the parts of an app communicate — event buses for ambient signals, feature flags for toggling behavior. Both articles ...

The event bus article ended on a warning about a certain kind of switch teams sprinkle everywhere with a casual "it's just a toggle" attitude — and th...

The last cluster was about making state inside a feature explicit and well-modeled. This one is about what happens between features — how the parts of...

Look at a component you wrote recently and count its status booleans. isLoading, isError, isSuccess, isEditing, isSubmitting. Five of them. That's not...

The optimistic UI article ended on a small observation that turns out to be a big one. The rollback in onError was a single-step reversal: snapshot th...

At the end of the last article I said that once you hold one coherent copy of server state and can invalidate it precisely, a door opens that used to ...

The previous article drew a hard line: state the client owns versus data it doesn't. Everything there was about the stuff you own — theme, drafts, pre...

At the end of the last article I said I wanted to start this run with the deceptively simple persistence question: what belongs in localStorage, what ...

The hardest part of a UI kit is not writing the components. That's the trap. You can build a clean <Button>, a flexible <Select>, a beauti...

At the end of the last article I told you to go find the one component everyone reimplements slightly differently. So let's say you found it. You know...

Here's a thing that took me too long to internalize: the most reusable UI code I've ever written renders nothing. No <div>, no class name, no ma...

You build a <Select>. It starts clean — options in, value out. Then the requests arrive. Someone needs a divider between groups. Someone needs a...

Somewhere around 2019, "container vs presentational components" got quietly filed under obsolete. Hooks had landed, the man who popularized the patter...

Every code review eventually gets the comment: "this component is too big, split it up." It's good advice roughly half the time. The other half, someo...

Draw your app's architecture on a whiteboard and it always looks clean. Neat boxes, sensible names, tidy layers stacked top to bottom. Everyone nods. ...

There's a specific kind of import that feels like good engineering: import { Button, Card, Modal, Tooltip } from '@/shared/ui'; One line. One path. Cl...

Open the shared/ folder in almost any React app that's been alive for a year. Count the files. Then try to explain, out loud, what the folder is for —...

The first time someone tells you that you can build a 3D scene — a rotating model, a lit environment, a VR world — using React, it sounds like a categ...

The single most useful thing to get straight about React Native is a slogan, and it's one people consistently misquote. The promise was never "write o...

There's a specific moment where the desktop pitch becomes irresistible. You've built a genuinely good React app, it lives in a browser tab, and someon...

Every team I've watched try to document their components starts in the same place: a page in the wiki. Someone writes up the Button — here are the var...

The way most engineers relate to a design file is as a target to hit. The designer hands over a Figma frame, and the job — as everyone tacitly agrees ...

"When someone signs up, just send them a welcome email." It's the kind of request that gets tossed into a standup like it's nothing, and the person sa...

Adding a file upload feels like a solved problem. You drop an <input type="file"> on the page, grab the file in an onChange, POST it to an endpo...

A date is just a value. It sits there in your data looking as harmless as a string or a number, and for a while it behaves. Then one day a user in ano...

On the surface, taking a payment looks like the most ordinary thing in the world: a form with some fields, a submit button, a success message. You've ...

Ask most developers what internationalization means and you'll get the same answer: instead of writing "Save" in your JSX, you look up a key in a dict...

I've been writing code since 2003. That's over twenty years of watching patterns come and go — and occasionally making the same mistakes the patterns ...

Everything in this series so far has had the same conversation shape: the client asks a question, the server answers. You call useQuery, the request g...

The first AI demo you build feels like cheating. A text input, a fetch to a model, a response on screen — thirty lines, maybe less, and suddenly your ...

Two developers look at the same untested codebase and reach opposite conclusions. One says "this is reckless, we need 100% coverage before we ship any...

The first time I deployed something to production, it took a week and a person whose entire job was making deployments happen. There was a server to c...

There's a specific fear a lot of frontend developers have, and I had it too: the database is where I'm not supposed to go. Tables, indexes, connection...

For most of this series I've drawn a clean line: React runs in the browser, the backend runs on a server, and the contract between them is where the i...

"That's a backend concern" is one of the most expensive sentences a frontend developer can say. I understand the instinct. There's a clean line in mos...

Authentication always starts as a login form. Two fields and a button. You could build that in an afternoon, and that afternoon is exactly the trap. B...

A few weeks ago I wrote about giving your AI agent a persistent memory — a simple system of markdown files the agent reads and writes across sessions....

The chart looked perfect in the demo. Clean line, smooth animation, a tooltip that felt expensive. Then real data showed up — forty thousand points in...

Every codebase has one file everyone is a little afraid of. In the apps I've worked on, it's usually a form. Not a login form. Those are fine. I mean ...

The demo always goes well. That's the trap. You're evaluating a component library. You drop in their date picker, their data table, their modal. In tw...

Ask ten React developers how to style a component and you'll start a fight. Not a discussion. A fight. Tailwind people and CSS-in-JS people don't disa...

The company had a legacy PHP application, and we were not brought in to rebuild it. We were brought in to add one module. One module. A self-contained...

I was mass-scrolling LinkedIn and almost missed it. A post from Dmytro Sergiev — a Product Manager, not an engineer — about how he gives his AI agent ...

The policy builder did not look dangerous at first. It was "just a form." A few sections, some conditional fields, a Save Draft button, a final Submit...

I recently wrote a detailed article on this topic. It came out long because I wanted to cover every nuance — the full story, detailed interview exampl...

I have failed interviews. Multiple times. Not because I did not know my craft — I have been shipping production frontend for well over a decade. I fai...

The policy list bug started as a support ticket. An agent filtered policies by status, page, and renewal date. She copied the URL and sent it to anoth...

Three months into the insurance CRM, we had a page that felt haunted. The policy list would load. Then it would blink. Then it would refetch after swi...

The first serious error-handling conversation on the insurance CRM happened after a demo. We had built the policy detail page. It fetched the policy, ...

At the insurance company, our React app started with a structure I still like for small projects. src/ api/ components/ hooks/ layouts/ pages/ types/ ...

Six weeks into the insurance CRM project, we had a production incident. The backend team renamed a field — policy_number became policyNumber — as part...

I joined a project where everyone was writing code. Not just developers — project managers, analysts, even a designer who had never seen a terminal in...

Static export remains the simplest deployment model for content-focused sites. This article documents the setup behind this very site — ma-x.im — a Ne...

I remember the exact moment I realized I couldn't go back. I had been writing TypeScript for a while, got used to it, and then joined a project that w...

I was three weeks into a new client engagement — a mid-sized insurance company building a policy administration CRM from scratch. No legacy code, no i...

At Motorola Solutions I built a multi-step contract wizard where users selected products, services, additional options, and pricing tiers — dozens of ...

At Motorola Solutions I walked into a codebase with hundreds of internal projects. Every team followed the brand book — in theory. In practice, it was...

I joined a large Canadian automotive company as one of three senior frontend engineers. The site was public-facing — a product catalog where users bro...

I learned to love monorepos the hard way — by suffering through the alternative. At a large Canadian automotive company, we had a repository for basic...