A breakpoint is a context, not a property
I co-authored Complete Farmer's design system in 2024 and rebuilt it in 2026. The fault that shaped the whole re-architecture was one I had helped ship.
I co-authored Complete Farmer’s design system in 2024 with two other designers. In 2026 I took it over and rebuilt it alone.
Some of what I found was mine.

The component that could not be a drawer

The product had three screen sizes, so we built three variants. That was right in 2024 and it held for two years.
What it could not do was express a fourth width. A drawer is a modal at a different width, so a drawer meant another variant and another hardcoded number. Nobody added one. Instead, everyone who needed a drawer built a one-off in their own file.

Then I found it three more times

Four components treating a breakpoint as a property of the component rather than a context the component sits in. One instance is a bug. Four is a principle, and it is now written into the system rules.
The numbers said everything was fine

Detaching is what a designer does when a component nearly fits. At that volume, almost nobody was fighting the system.
But detaching only measures components that exist. Nobody detached a modal to make a drawer. They opened an empty frame. The biggest gap in the system was invisible to the metric that looked healthiest.

Two years in, I had built a UI kit. It supplied parts, and every product pattern was being rebuilt per screen.
What was actually wrong
Two years of changes with no changelog. Figma version history records that something was published and when, and never why.
Nobody was careless. The Modal header decision was correct when we made it.
A good decision with no recorded reasoning has no expiry date on it.
Nobody could tell which constraints were still load-bearing and which were simply old.
The rebuild






1,483 → 1
colour styles into one collection, six modes
64 → 36
Time picker variants, period modelled as content
0.002%
detach rate across the foundation
84
components across four products
Governance, which had not existed


Marketing asked for bigger buttons on the website. Product asked to skip loading, disabled and error states to ship faster. I said no to both, for different reasons.
What it cost

Time picker ships web only. The iOS pinwheel and Android clock face were cut.
And during the rebuild I republished eight or nine times in a few days, several of them correcting the one before. Workable with one maintainer. Not workable with teams depending on the output, which is exactly why there is now a separate work-in-progress space.
Too early to say it worked
v1.2 published in August and migrated into the organisation in September. Six weeks is not evidence, and any number I put here now would be noise.
What I am watching at the first checkpoint: whether the new pattern components get used at all, whether the detach rate holds as the component layer takes more load, whether anyone actually selects the Buyer and Storefront themes, and whether every publish has a changelog row behind it.
If the new patterns read zero after a month, I built them for one dashboard rather than for the system. I would rather find that out early than defend them later.
What I would tell whoever inherits this next
Adoption tells you how people use what exists. It tells you nothing about what they stopped asking for.
Read the components nobody built before you read the ones they did. And record why, not what. The why is the only part that expires.
Keep reading
BookflowOne product, two readers, and only one of them gets the defaults
React Native app live on Google Play. Solo founder, paid closed beta.
Parley