AriesDevs engineering team Engineering notes
4 min read
Most design systems fail quietly. The Figma library is beautiful, the documentation site launches with a party, and six months later half the product still uses hand-rolled buttons. The design team blames engineers for not caring. The engineers say the components never quite fit. Both are partly right.
Adoption is a product problem, and the users are developers. These are the four decisions that most often separate systems that spread from systems that stall.
Ship code first, and keep it as the source of truth
A design file is a picture of a component. An engineer cannot import a picture. We build the coded component and the design component together, and treat the code as authoritative. If the two disagree, the code wins and the design file is corrected. This avoids the common pattern where designers maintain a system that production never matches.
Start small. Ten well-made components used everywhere do more than eighty used rarely. We usually begin with button, input, select, modal, toast, table, tabs and the layout primitives, then add components only when two teams ask for the same thing.
Make tokens the shared language
Colour, spacing, type scale, radius and shadow should live in one token file that both design tools and code read from. Names should describe purpose, not value. A token called color-text-muted can change shade in a rebrand; a token called grey-600 forces a search and replace.
:root {
--color-text: #12201C;
--color-text-muted: #44534F;
--color-action: #0F766E;
--color-action-hover: #115E59;
--space-2: 0.5rem;
--space-4: 1rem;
--radius-control: 0.75rem;
} Design for the escape hatch
Every real product has screens that do not fit the system. If the only options are "use the component exactly as designed" or "write your own", people choose the second. Give engineers supported ways out: a className or style slot, composition instead of a long list of props, and a documented process for proposing a variant.
We track detached components the way a library maintainer tracks issues. If three teams override the same thing, that is a request for a new variant, not a discipline problem.
Treat adoption as a measured outcome
Decide at the start how you will know the system is working, then measure it. Useful numbers are cheap to collect.
- Coverage: the share of UI elements in production rendered by system components. A code scan finds this in minutes.
- Time to first screen: how long a new engineer needs to build a standard page using the system.
- Override rate: how often components are restyled or wrapped.
- Support load: the questions arriving in the design system channel, grouped by topic.
Publish these every month, even when they are unflattering. A flat coverage line for two months is a reason for a conversation with the teams not using it, and those conversations are where the real requirements show up.
Give it an owner and a release rhythm
A system with no named maintainers decays within a year. It needs at least one engineer and one designer with protected time, a visible changelog, semantic versioning and a predictable release day. Engineers will trust a library that does not surprise them. A quarterly deprecation window, with codemods where possible, lets the system improve without stranding the teams that depend on it.
None of this is glamorous. But a small, boring, reliable system that people can rely on will outlast an ambitious one that nobody trusts.